postsactions.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. from django.contrib import messages
  2. from django.db.transaction import atomic
  3. from django.utils.translation import ungettext, ugettext_lazy, ugettext as _
  4. from misago.threads import moderation
  5. from misago.threads.views.generic.actions import ActionsBase
  6. __all__ = ['PostsActions']
  7. def atomic_post_action(f):
  8. def decorator(self, request, posts):
  9. with atomic():
  10. self.forum.lock()
  11. self.thread.lock()
  12. for post in posts:
  13. post.thread = self.thread
  14. response = f(self, request, posts)
  15. self.thread.synchronize()
  16. self.thread.save()
  17. self.forum.synchronize()
  18. self.forum.save()
  19. return response
  20. return decorator
  21. class PostsActions(ActionsBase):
  22. select_items_message = ugettext_lazy(
  23. "You have to select at least one post.")
  24. is_mass_action = True
  25. def get_available_actions(self, kwargs):
  26. self.thread = kwargs['thread']
  27. self.forum = self.thread.forum
  28. actions = []
  29. if self.forum.acl['can_hide_posts']:
  30. actions.append({
  31. 'action': 'unhide',
  32. 'icon': 'eye',
  33. 'name': _("Unhide posts")
  34. })
  35. actions.append({
  36. 'action': 'hide',
  37. 'icon': 'eye-slash',
  38. 'name': _("Hide posts")
  39. })
  40. if self.forum.acl['can_hide_posts'] == 2:
  41. actions.append({
  42. 'action': 'delete',
  43. 'icon': 'times',
  44. 'name': _("Delete posts"),
  45. 'confirmation': _("Are you sure you want to delete selected "
  46. "posts? This action can't be undone.")
  47. })
  48. return actions
  49. @atomic_post_action
  50. def action_unhide(self, request, posts):
  51. changed_posts = 0
  52. for post in posts:
  53. if moderation.unhide_post(request.user, post):
  54. changed_posts += 1
  55. if changed_posts:
  56. message = ungettext(
  57. '%(changed)d post was made visible.',
  58. '%(changed)d posts were made visible.',
  59. changed_posts)
  60. messages.success(request, message % {'changed': changed_posts})
  61. else:
  62. message = _("No posts were made visible.")
  63. messages.info(request, message)
  64. @atomic_post_action
  65. def action_hide(self, request, posts):
  66. changed_posts = 0
  67. for post in posts:
  68. if moderation.hide_post(request.user, post):
  69. changed_posts += 1
  70. if changed_posts:
  71. message = ungettext(
  72. '%(changed)d post was hidden.',
  73. '%(changed)d posts were hidden.',
  74. changed_posts)
  75. messages.success(request, message % {'changed': changed_posts})
  76. else:
  77. message = _("No posts were hidden.")
  78. messages.info(request, message)
  79. pass
  80. @atomic_post_action
  81. def action_delete(self, request, posts):
  82. changed_posts = 0
  83. first_deleted = None
  84. for post in posts:
  85. if moderation.delete_post(request.user, post):
  86. changed_posts += 1
  87. if not first_deleted:
  88. first_deleted = post
  89. if changed_posts:
  90. message = ungettext(
  91. '%(changed)d post was deleted.',
  92. '%(changed)d posts were deleted.',
  93. changed_posts)
  94. messages.success(request, message % {'changed': changed_posts})
  95. else:
  96. message = _("No posts were deleted.")
  97. messages.info(request, message)