浏览代码

Remove yadayada dependency. that means we've copy+pasted the
PickledObjectField, when will djangosnippets ever die? :( Closes #3. Thansk
gregoirecachet!

Ask Solem 16 年之前
父节点
当前提交
fb58231290
共有 4 个文件被更改,包括 52 次插入7 次删除
  1. 47 0
      celery/fields.py
  2. 1 1
      celery/models.py
  3. 1 3
      setup.py
  4. 3 3
      testproj/settings.py

+ 47 - 0
celery/fields.py

@@ -0,0 +1,47 @@
+from django.db import models
+
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+
+class PickledObject(str):
+    """A subclass of string so it can be told whether a string is
+       a pickled object or not (if the object is an instance of this class
+       then it must [well, should] be a pickled one)."""
+    pass
+
+
+class PickledObjectField(models.Field):
+    __metaclass__ = models.SubfieldBase
+
+    def to_python(self, value):
+        if isinstance(value, PickledObject):
+            # If the value is a definite pickle; and an error is raised in de-pickling
+            # it should be allowed to propogate.
+            return pickle.loads(str(value))
+        else:
+            try:
+                return pickle.loads(str(value))
+            except:
+                # If an error was raised, just return the plain value
+                return value
+    
+    def get_db_prep_save(self, value):
+        if value is not None and not isinstance(value, PickledObject):
+            value = PickledObject(pickle.dumps(value))
+        return value
+    
+    def get_internal_type(self): 
+        return 'TextField'
+    
+    def get_db_prep_lookup(self, lookup_type, value):
+        if lookup_type == 'exact':
+            value = self.get_db_prep_save(value)
+            return super(PickledObjectField, self).get_db_prep_lookup(lookup_type, value)
+        elif lookup_type == 'in':
+            value = [self.get_db_prep_save(v) for v in value]
+            return super(PickledObjectField, self).get_db_prep_lookup(lookup_type, value)
+        else:
+            raise TypeError('Lookup type %s is not supported.' % lookup_type)

+ 1 - 1
celery/models.py

@@ -1,7 +1,7 @@
 from django.db import models
 from celery.registry import tasks
 from celery.managers import TaskManager, PeriodicTaskManager
-from yadayada.models import PickledObjectField
+from celery.fields import PickledObjectField
 from django.utils.translation import ugettext_lazy as _
 from Queue import Queue
 

+ 1 - 3
setup.py

@@ -62,10 +62,8 @@ setup(
     scripts=["bin/celeryd"],
     zip_safe=False,
     install_requires=[
-        'django-unittest-depth',
         'simplejson',
-        'yadayada',
-        'carrot>=0.3.8',
+        'carrot>=0.3.9',
         'django',
     ],
     cmdclass = {"test": RunTests},

+ 3 - 3
testproj/settings.py

@@ -19,9 +19,9 @@ TEST_APPS = (
 
 AMQP_SERVER = "localhost"
 AMQP_PORT = 5672
-AMQP_VHOST = "celery"
-AMQP_USER = "celery"
-AMQP_PASSWORD = "celery"
+AMQP_VHOST = "/"
+AMQP_USER = "guest"
+AMQP_PASSWORD = "guest"
 
 CELERY_AMQP_EXCHANGE = "testcelery"
 CELERY_AMQP_ROUTING_KEY = "testcelery"