deconstruct.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. def deconstructible(*args, **kwargs):
  2. """
  3. Class decorator that allow the decorated class to be serialized
  4. by the migrations subsystem.
  5. Accepts an optional kwarg `path` to specify the import path.
  6. """
  7. path = kwargs.pop('path', None)
  8. def decorator(klass):
  9. def __new__(cls, *args, **kwargs):
  10. # We capture the arguments to make returning them trivial
  11. obj = super(klass, cls).__new__(cls)
  12. obj._constructor_args = (args, kwargs)
  13. return obj
  14. def deconstruct(obj):
  15. """
  16. Returns a 3-tuple of class import path, positional arguments,
  17. and keyword arguments.
  18. """
  19. return (
  20. path or '%s.%s' % (obj.__class__.__module__, obj.__class__.__name__),
  21. obj._constructor_args[0],
  22. obj._constructor_args[1],
  23. )
  24. klass.__new__ = staticmethod(__new__)
  25. klass.deconstruct = deconstruct
  26. return klass
  27. if not args:
  28. return decorator
  29. return decorator(*args, **kwargs)