|
@@ -1,3 +1,5 @@
|
|
|
+from django.contrib import messages
|
|
|
+from django.db.transaction import atomic
|
|
|
from django.utils.translation import ungettext, ugettext_lazy, ugettext as _
|
|
|
|
|
|
from misago.threads import moderation
|
|
@@ -7,6 +9,26 @@ from misago.threads.views.generic.actions import ActionsBase
|
|
|
__all__ = ['PostsActions']
|
|
|
|
|
|
|
|
|
+def atomic_post_action(f):
|
|
|
+ def decorator(self, request, posts):
|
|
|
+ with atomic():
|
|
|
+ self.forum.lock()
|
|
|
+ self.thread.lock()
|
|
|
+
|
|
|
+ for post in posts:
|
|
|
+ post.thread = self.thread
|
|
|
+
|
|
|
+ response = f(self, request, posts)
|
|
|
+
|
|
|
+ self.thread.synchronize()
|
|
|
+ self.thread.save()
|
|
|
+ self.forum.synchronize()
|
|
|
+ self.forum.save()
|
|
|
+
|
|
|
+ return response
|
|
|
+ return decorator
|
|
|
+
|
|
|
+
|
|
|
class PostsActions(ActionsBase):
|
|
|
select_items_message = ugettext_lazy(
|
|
|
"You have to select at least one post.")
|
|
@@ -40,11 +62,60 @@ class PostsActions(ActionsBase):
|
|
|
|
|
|
return actions
|
|
|
|
|
|
+ @atomic_post_action
|
|
|
def action_unhide(self, request, posts):
|
|
|
- pass
|
|
|
+ changed_posts = 0
|
|
|
+ for post in posts:
|
|
|
+ if moderation.unhide_post(request.user, post):
|
|
|
+ changed_posts += 1
|
|
|
|
|
|
+ if changed_posts:
|
|
|
+ message = ungettext(
|
|
|
+ '%(changed)d post was made visible.',
|
|
|
+ '%(changed)d posts were made visible.',
|
|
|
+ changed_posts)
|
|
|
+ messages.success(request, message % {'changed': changed_posts})
|
|
|
+ else:
|
|
|
+ message = _("No posts were made visible.")
|
|
|
+ messages.info(request, message)
|
|
|
+
|
|
|
+ @atomic_post_action
|
|
|
def action_hide(self, request, posts):
|
|
|
+ changed_posts = 0
|
|
|
+ for post in posts:
|
|
|
+ if moderation.hide_post(request.user, post):
|
|
|
+ changed_posts += 1
|
|
|
+
|
|
|
+ if changed_posts:
|
|
|
+ message = ungettext(
|
|
|
+ '%(changed)d post was hidden.',
|
|
|
+ '%(changed)d posts were hidden.',
|
|
|
+ changed_posts)
|
|
|
+ messages.success(request, message % {'changed': changed_posts})
|
|
|
+ else:
|
|
|
+ message = _("No posts were hidden.")
|
|
|
+ messages.info(request, message)
|
|
|
pass
|
|
|
|
|
|
+ @atomic_post_action
|
|
|
def action_delete(self, request, posts):
|
|
|
- pass
|
|
|
+ changed_posts = 0
|
|
|
+ first_deleted = None
|
|
|
+
|
|
|
+ for post in posts:
|
|
|
+ if moderation.delete_post(request.user, post):
|
|
|
+ changed_posts += 1
|
|
|
+ if not first_deleted:
|
|
|
+ first_deleted = post
|
|
|
+
|
|
|
+ if changed_posts:
|
|
|
+ message = ungettext(
|
|
|
+ '%(changed)d post was deleted.',
|
|
|
+ '%(changed)d posts were deleted.',
|
|
|
+ changed_posts)
|
|
|
+ messages.success(request, message % {'changed': changed_posts})
|
|
|
+
|
|
|
+
|
|
|
+ else:
|
|
|
+ message = _("No posts were deleted.")
|
|
|
+ messages.info(request, message)
|