123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- 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
- 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.")
- is_mass_action = True
- def get_available_actions(self, kwargs):
- self.thread = kwargs['thread']
- self.forum = self.thread.forum
- actions = []
- if self.forum.acl['can_hide_posts']:
- actions.append({
- 'action': 'unhide',
- 'icon': 'eye',
- 'name': _("Unhide posts")
- })
- actions.append({
- 'action': 'hide',
- 'icon': 'eye-slash',
- 'name': _("Hide posts")
- })
- if self.forum.acl['can_hide_posts'] == 2:
- actions.append({
- 'action': 'delete',
- 'icon': 'times',
- 'name': _("Delete posts"),
- 'confirmation': _("Are you sure you want to delete selected "
- "posts? This action can't be undone.")
- })
- return actions
- @atomic_post_action
- def action_unhide(self, request, posts):
- 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):
- 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)
|