context_managers.py 1.4 KB

1234567891011121314151617181920212223242526272829303132
  1. from contextlib import contextmanager
  2. from django.db.models.signals import m2m_changed, pre_delete, post_save
  3. from extras.signals import _handle_changed_object, _handle_deleted_object
  4. from utilities.utils import curry
  5. @contextmanager
  6. def change_logging(request):
  7. """
  8. Enable change logging by connecting the appropriate signals to their receivers before code is run, and
  9. disconnecting them afterward.
  10. :param request: WSGIRequest object with a unique `id` set
  11. """
  12. # Curry signals receivers to pass the current request
  13. handle_changed_object = curry(_handle_changed_object, request)
  14. handle_deleted_object = curry(_handle_deleted_object, request)
  15. # Connect our receivers to the post_save and post_delete signals.
  16. post_save.connect(handle_changed_object, dispatch_uid='handle_changed_object')
  17. m2m_changed.connect(handle_changed_object, dispatch_uid='handle_changed_object')
  18. pre_delete.connect(handle_deleted_object, dispatch_uid='handle_deleted_object')
  19. yield
  20. # Disconnect change logging signals. This is necessary to avoid recording any errant
  21. # changes during test cleanup.
  22. post_save.disconnect(handle_changed_object, dispatch_uid='handle_changed_object')
  23. m2m_changed.disconnect(handle_changed_object, dispatch_uid='handle_changed_object')
  24. pre_delete.disconnect(handle_deleted_object, dispatch_uid='handle_deleted_object')