code: def ensure_self(func):
      
  
      @wraps(func)
      def inner(*args, **kwargs):
          try:
              self = kwargs.pop('this')
              if len(args) >= 1 and self == args[0]:
                  # Make the assumption that the first argument hasn't been passed in twice...
                  raise KeyError()
              return func(self, *args, **kwargs)
          except KeyError:
              # 'this' wasn't passed, all we can do is assume normal innovation
              return func(*args, **kwargs)
      return inner
docs: Decorator that can be used to ensure 'self' is the first argument on a task method.
  
      This only needs to be used with task methods that are used as a callback to
      a chord or in link_error and is really just a hack to get around https://github.com/celery/celery/issues/2137
  
      Usage:
  
      .. code-block:: python
  
          class Foo(models.Model):
  
              def __init__(self):
                  self.bar = 1
  
              @task
              def first(self):
                  pass
  
              @task
              @ensure_self
              def last(self, results=None):
                  print self.bar
  
      Then the following is performed:
  
      .. code-block:: python
  
          f = Foo()
          (f.first.s() | f.last.s(this=f)).apply_async()
          # prints 1
  
      The important part here is that 'this' is passed into the last.s subtask.
  
      Hopefully issue 2137 is recognized as an issue and fixed and this hack is
      no longer required.