Browse Source

django.conf.settings always defines __getitem__ in Django 1.6

Ask Solem 11 years ago
parent
commit
6d68cc40bb
2 changed files with 15 additions and 6 deletions
  1. 13 2
      celery/datastructures.py
  2. 2 4
      celery/loaders/base.py

+ 13 - 2
celery/datastructures.py

@@ -23,6 +23,12 @@ from kombu.utils.limits import TokenBucket  # noqa
 from celery.five import items
 from celery.utils.functional import LRUCache, first, uniq  # noqa
 
+try:
+    from django.utils.functional import LazyObject
+except ImportError:
+    class LazyObject(object):  # noqa
+        pass
+
 DOT_HEAD = """
 {IN}{type} {id} {{
 {INp}graph [{attrs}]
@@ -39,6 +45,12 @@ __all__ = ['GraphFormatter', 'CycleError', 'DependencyGraph',
            'ConfigurationView', 'LimitedSet']
 
 
+def force_mapping(m):
+    if isinstance(m, LazyObject):
+        m = m._wrapped
+    return DictAttribute(m) if not isinstance(m, Mapping) else m
+
+
 class GraphFormatter(object):
     _attr = DOT_ATTR.strip()
     _node = DOT_NODE.strip()
@@ -447,8 +459,7 @@ class ConfigurationView(AttributeDictMixin):
                              _order=[changes] + defaults)
 
     def add_defaults(self, d):
-        if not isinstance(d, Mapping):
-            d = DictAttribute(d)
+        d = force_mapping(d)
         self.defaults.insert(0, d)
         self._order.insert(1, d)
 

+ 2 - 4
celery/loaders/base.py

@@ -20,7 +20,7 @@ from datetime import datetime
 from kombu.utils import cached_property
 from kombu.utils.encoding import safe_str
 
-from celery.datastructures import DictAttribute
+from celery.datastructures import DictAttribute, force_mapping
 from celery.five import reraise, string_t
 from celery.utils.functional import maybe_list
 from celery.utils.imports import (
@@ -140,9 +140,7 @@ class BaseLoader(object):
                 if silent:
                     return False
                 raise
-        if not hasattr(obj, '__getitem__'):
-            obj = DictAttribute(obj)
-        self._conf = obj
+        self._conf = force_mapping(obj)
         return True
 
     def _smart_import(self, path, imp=None):