|
@@ -53,16 +53,23 @@ except AttributeError:
|
|
|
pass
|
|
|
|
|
|
|
|
|
-def mro_lookup(cls, attr, stop=()):
|
|
|
+def mro_lookup(cls, attr, stop=(), monkey_patched=[]):
|
|
|
"""Returns the first node by MRO order that defines an attribute.
|
|
|
|
|
|
:keyword stop: A list of types that if reached will stop the search.
|
|
|
+ :keyword monkey_patched: Use one of the stop classes if the attr's
|
|
|
+ module origin is not in this list, this to detect monkey patched
|
|
|
+ attributes.
|
|
|
|
|
|
:returns None: if the attribute was not found.
|
|
|
|
|
|
"""
|
|
|
for node in cls.mro():
|
|
|
if node in stop:
|
|
|
+ attr = node.__dict__.get(attr)
|
|
|
+ module_origin = getattr(attr, '__module__', None)
|
|
|
+ if module_origin not in monkey_patched:
|
|
|
+ return node
|
|
|
return
|
|
|
if attr in node.__dict__:
|
|
|
return node
|
|
@@ -71,7 +78,8 @@ def mro_lookup(cls, attr, stop=()):
|
|
|
def task_has_custom(task, attr):
|
|
|
"""Returns true if the task or one of its bases
|
|
|
defines ``attr`` (excluding the one in BaseTask)."""
|
|
|
- return mro_lookup(task.__class__, attr, stop=(BaseTask, object))
|
|
|
+ return mro_lookup(task.__class__, attr, stop=(BaseTask, object),
|
|
|
+ monkey_patched=['celery.app.task'])
|
|
|
|
|
|
|
|
|
class TraceInfo(object):
|