Advertisement
Guest User

Untitled

a guest
Mar 26th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. from collections import defaultdict
  2. from functools import wraps
  3. from django.db.models import signals
  4.  
  5.  
  6. class disable_signals:
  7. def __init__(self, disabled_signals=None):
  8. self.stashed_signals = defaultdict(list)
  9.  
  10. self.disabled_signals = disabled_signals or [
  11. signals.pre_init, signals.post_init,
  12. signals.pre_save, signals.post_save,
  13. signals.pre_delete, signals.post_delete,
  14. signals.pre_migrate, signals.post_migrate,
  15. ]
  16.  
  17. def __call__(self, func):
  18. @wraps(func)
  19. def wrapper(*args, **kwargs):
  20. self.__enter__()
  21. result = func(*args, **kwargs)
  22. self.__exit__(None, None, None)
  23. return result
  24.  
  25. return wrapper
  26.  
  27. def __enter__(self):
  28. for signal in self.disabled_signals:
  29. self.disconnect(signal)
  30.  
  31. def __exit__(self, exc_type, exc_val, exc_tb):
  32. for signal in list(self.stashed_signals):
  33. self.reconnect(signal)
  34.  
  35. def disconnect(self, signal):
  36. self.stashed_signals[signal] = signal.receivers
  37. signal.receivers = []
  38.  
  39. def reconnect(self, signal):
  40. signal.receivers = self.stashed_signals.get(signal, [])
  41. del self.stashed_signals[signal]
  42.  
  43.  
  44. if __name__ == '__main__':
  45. # as decorator
  46. @disable_signals()
  47. def func():
  48. print('signals are disabled 1')
  49.  
  50.  
  51. func()
  52.  
  53. # as contextmanager
  54. with disable_signals():
  55. print('signals are disabled 2')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement