savechanges.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. from collections import OrderedDict
  2. from misago.categories.models import Category
  3. from . import PostingMiddleware
  4. class SaveChangesMiddleware(PostingMiddleware):
  5. def __init__(self, **kwargs):
  6. super().__init__(**kwargs)
  7. self.reset_state()
  8. def reset_state(self):
  9. self.user.update_all = False
  10. self.thread.update_all = False
  11. self.post.update_all = False
  12. self.user.update_fields = []
  13. self.thread.update_fields = []
  14. self.post.update_fields = []
  15. try:
  16. self.thread.category.update_all = False
  17. self.thread.category.update_fields = []
  18. except Category.DoesNotExist:
  19. # Exception for cases when thread has no category associated
  20. # If this is the case, its Category's middleware job to set those flags
  21. pass
  22. def save_models(self):
  23. self.save_model(self.user)
  24. self.save_model(self.thread.category)
  25. self.save_model(self.thread)
  26. self.save_model(self.post)
  27. self.reset_state()
  28. def save_model(self, model):
  29. if model.update_all:
  30. model.save()
  31. elif model.update_fields:
  32. update_fields = list(OrderedDict.fromkeys(model.update_fields))
  33. model.save(update_fields=update_fields)
  34. def save(self, serializer):
  35. self.save_models()
  36. def post_save(self, serializer):
  37. self.save_models()