patch_post.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.core.exceptions import PermissionDenied
  2. from django.utils.translation import gettext as _
  3. from misago.acl import add_acl
  4. from misago.core.apipatch import ApiPatch
  5. from ...moderation import posts as moderation
  6. from ...permissions.threads import allow_hide_post, allow_unhide_post
  7. post_patch_dispatcher = ApiPatch()
  8. def patch_acl(request, post, value):
  9. """useful little op that updates post acl to current state"""
  10. if value:
  11. add_acl(request.user, post)
  12. return {'acl': post.acl}
  13. else:
  14. return {'acl': None}
  15. post_patch_dispatcher.add('acl', patch_acl)
  16. def patch_is_hidden(request, post, value):
  17. if value is True:
  18. allow_hide_post(request.user, post)
  19. moderation.hide_post(request.user, post)
  20. elif value is False:
  21. allow_unhide_post(request.user, post)
  22. moderation.unhide_post(request.user, post)
  23. return {'is_hidden': post.is_hidden}
  24. post_patch_dispatcher.replace('is-hidden', patch_is_hidden)
  25. def post_patch_endpoint(request, post):
  26. old_is_hidden = post.is_hidden
  27. old_is_unapproved = post.is_unapproved
  28. old_thread = post.thread
  29. old_category = post.category
  30. response = post_patch_dispatcher.dispatch(request, post)
  31. # diff posts's state against pre-patch and resync category if necessary
  32. hidden_changed = old_is_hidden != post.is_hidden
  33. unapproved_changed = old_is_unapproved != post.is_unapproved
  34. thread_changed = old_thread != post.thread
  35. category_changed = old_category != post.category
  36. if hidden_changed or unapproved_changed or thread_changed or category_changed:
  37. post.thread.synchronize()
  38. post.thread.save()
  39. post.category.synchronize()
  40. post.category.save()
  41. if thread_changed:
  42. old_thread.synchronize()
  43. old_thread.save()
  44. if category_changed:
  45. old_category.synchronize()
  46. old_category.save()
  47. return response