Browse Source

App now supports fixups argument, which is also pickled

Ask Solem 12 years ago
parent
commit
0e0042f697
2 changed files with 18 additions and 13 deletions
  1. 11 6
      celery/app/base.py
  2. 7 7
      celery/fixups/django.py

+ 11 - 6
celery/app/base.py

@@ -39,9 +39,9 @@ from .utils import (
     AppPickler, Settings, bugreport, _unpickle_app, _unpickle_app_v2,
 )
 
-DEFAULT_FIXUPS = (
-    'celery.fixups.django:DjangoFixup',
-)
+BUILTIN_FIXUPS = frozenset([
+    'celery.fixups.django:fixup',
+])
 
 
 def app_has_custom(app, attr):
@@ -73,7 +73,8 @@ class Celery(object):
     def __init__(self, main=None, loader=None, backend=None,
             amqp=None, events=None, log=None, control=None,
             set_as_current=True, accept_magic_kwargs=False,
-            tasks=None, broker=None, include=None, **kwargs):
+            tasks=None, broker=None, include=None, fixups=None,
+            changes=None, **kwargs):
         self.clock = LamportClock()
         self.main = main
         self.amqp_cls = amqp or self.amqp_cls
@@ -110,8 +111,11 @@ class Celery(object):
             self._preconf['BROKER_URL'] = broker
         if include:
             self._preconf['CELERY_IMPORTS'] = include
-        self.fixups = list(filter(None, (symbol_by_name(f).include(self)
-                                        for f in DEFAULT_FIXUPS)))
+
+        # Apply fixups.
+        self.fixups = set(fixups or ())
+        for fixup in self.fixups | BUILTIN_FIXUPS:
+            symbol_by_name(fixup)(self)
 
         if self.set_as_current:
             self.set_current()
@@ -428,6 +432,7 @@ class Celery(object):
             'log': self.log_cls,
             'control': self.control_cls,
             'accept_magic_kwargs': self.accept_magic_kwargs,
+            'fixups': self.fixups,
         }
 
     def __reduce_args__(self):

+ 7 - 7
celery/fixups/django.py

@@ -19,16 +19,14 @@ def _maybe_close_fd(fh):
         pass
 
 
+def fixup(app):
+    if SETTINGS_MODULE:
+        return DjangoFixup(app).install()
+
+
 class DjangoFixup(object):
     _db_recycles = 0
 
-    @classmethod
-    def include(cls, app):
-        if SETTINGS_MODULE:
-            self = cls(app)
-            self.install()
-            return self
-
     def __init__(self, app):
         from django import db
         from django.core import cache
@@ -100,6 +98,8 @@ class DjangoFixup(object):
         self.app.loader.now = self.now
         self.app.loader.mail_admins = self.mail_admins
 
+        return self
+
     def now(self, utc=False):
         return datetime.utcnow() if utc else self._now()