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