# HG changeset patch # User Peter Sanchez # Date 1308871368 25200 # Thu Jun 23 16:22:48 2011 -0700 # Node ID 0fb7fc65d81c7bc9f8d1546d65f6ded77c5ef94c # Parent 03bebd48d1e6eba95d43890a18e6eebd520a4685 Added managers and store_callback functionality diff --git a/callback/callback.py b/callback/callback.py --- a/callback/callback.py +++ b/callback/callback.py @@ -1,4 +1,5 @@ from django.db import models +from models import CallbackMap from base import CallbackException, CallbackBase @@ -26,15 +27,18 @@ for model, cls in self._callbacks.items(): if isinstance(dest_model, model): return cls() - return None + raise CallbackException('Model class is not registered.') + + def store_callback(self, model_instance): + if not model_instance.pk: + model_instance.save() + + cls = self.get_callback_class(model_instance) + return CallbackMap.objects.store_callback(model_instance) def process_callback(self, callback_instance): model = callback_instance.content_object cls = self.get_callback_class(model) - if cls is None: - raise CallbackException( - 'Model class is not registered.' - ) try: cls.process(model) except: diff --git a/callback/managers.py b/callback/managers.py new file mode 100644 --- /dev/null +++ b/callback/managers.py @@ -0,0 +1,17 @@ +import random +import hashlib +from django.db import models +from django.contrib.auth.models import User + + +class CallbackMapManager(models.Manager): + def generate_hash(self): + salt = hashlib.sha1(str(random.random())).hexdigest()[:5] + random_string = User.objects.make_random_password() + return hashlib.sha1(salt + random_string).hexdigest() + + def store_callback(self, model_instance): + hash_id = self.generate_hash() + while self.get_query_set().filter(hash_id=hash_id).exists(): + hash_id = self.generate_hash() + return self.create(hash_id=hash_id, content_object=model_instance) diff --git a/callback/models.py b/callback/models.py --- a/callback/models.py +++ b/callback/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic +from managers import CallbackMapManager class CallbackMap(models.Model): @@ -13,6 +14,8 @@ created_on = models.DateTimeField(default=datetime.datetime.now) updated_on = models.DateTimeField(default=datetime.datetime.now) + objects = CallbackMapManager() + # Methods def save(self, *args, **kwargs): if self.id: