patch_post.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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_approve_post, allow_hide_post, allow_protect_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_protected(request, post, value):
  17. allow_protect_post(request.user, post)
  18. if value:
  19. moderation.protect_post(request.user, post)
  20. else:
  21. moderation.unprotect_post(request.user, post)
  22. return {'is_protected': post.is_protected}
  23. post_patch_dispatcher.replace('is-protected', patch_is_protected)
  24. def patch_is_unapproved(request, post, value):
  25. if value:
  26. allow_approve_post(request.user, post)
  27. moderation.approve_post(request.user, post)
  28. return {'is_unapproved': post.is_unapproved}
  29. post_patch_dispatcher.replace('is-unapproved', patch_is_unapproved)
  30. def patch_is_hidden(request, post, value):
  31. if value is True:
  32. allow_hide_post(request.user, post)
  33. moderation.hide_post(request.user, post)
  34. elif value is False:
  35. allow_unhide_post(request.user, post)
  36. moderation.unhide_post(request.user, post)
  37. return {'is_hidden': post.is_hidden}
  38. post_patch_dispatcher.replace('is-hidden', patch_is_hidden)
  39. def post_patch_endpoint(request, post):
  40. old_is_hidden = post.is_hidden
  41. old_is_unapproved = post.is_unapproved
  42. old_thread = post.thread
  43. old_category = post.category
  44. response = post_patch_dispatcher.dispatch(request, post)
  45. # diff posts's state against pre-patch and resync category if necessary
  46. hidden_changed = old_is_hidden != post.is_hidden
  47. unapproved_changed = old_is_unapproved != post.is_unapproved
  48. thread_changed = old_thread != post.thread
  49. category_changed = old_category != post.category
  50. if hidden_changed or unapproved_changed or thread_changed or category_changed:
  51. post.thread.synchronize()
  52. post.thread.save()
  53. post.category.synchronize()
  54. post.category.save()
  55. if thread_changed:
  56. old_thread.synchronize()
  57. old_thread.save()
  58. if category_changed:
  59. old_category.synchronize()
  60. old_category.save()
  61. return response