123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- from django.contrib import messages
- from django.db.transaction import atomic
- from django.shortcuts import render
- from django.utils.translation import ugettext_lazy, ugettext as _, ungettext
- from misago.forums.lists import get_forum_path
- from misago.threads import moderation
- from misago.threads.forms.moderation import MoveThreadsForm
- from misago.threads.views.generic.threads import Actions
- __all__ = ['ForumActions']
- class ForumActions(Actions):
- def get_available_actions(self, kwargs):
- self.forum = kwargs['forum']
- actions = []
- if self.forum.acl['can_change_threads_labels'] == 2:
- for label in self.forum.labels:
- actions.append({
- 'action': 'label:%s' % label.slug,
- 'icon': 'tag',
- 'name': _('Label as "%(label)s"') % {'label': label.name}
- })
- if self.forum.labels:
- actions.append({
- 'action': 'unlabel',
- 'icon': 'times-circle',
- 'name': _("Remove labels")
- })
- if self.forum.acl['can_change_threads_weight'] == 2:
- actions.append({
- 'action': 'announce',
- 'icon': 'star',
- 'name': _("Change to announcements")
- })
- if self.forum.acl['can_change_threads_weight']:
- actions.append({
- 'action': 'pin',
- 'icon': 'bookmark',
- 'name': _("Change to pinned")
- })
- actions.append({
- 'action': 'reset',
- 'icon': 'circle',
- 'name': _("Reset weight")
- })
- if self.forum.acl['can_review_moderated_content']:
- actions.append({
- 'action': 'approve',
- 'icon': 'check',
- 'name': _("Approve threads")
- })
- if self.forum.acl['can_move_threads']:
- actions.append({
- 'action': 'move',
- 'icon': 'arrow-right',
- 'name': _("Move threads")
- })
- if self.forum.acl['can_merge_threads']:
- actions.append({
- 'action': 'merge',
- 'icon': 'reply-all',
- 'name': _("Merge threads")
- })
- if self.forum.acl['can_close_threads']:
- actions.append({
- 'action': 'open',
- 'icon': 'unlock-alt',
- 'name': _("Open threads")
- })
- actions.append({
- 'action': 'close',
- 'icon': 'lock',
- 'name': _("Close threads")
- })
- if self.forum.acl['can_hide_threads']:
- actions.append({
- 'action': 'unhide',
- 'icon': 'eye',
- 'name': _("Unhide threads")
- })
- actions.append({
- 'action': 'hide',
- 'icon': 'eye-slash',
- 'name': _("Hide threads")
- })
- if self.forum.acl['can_hide_threads'] == 2:
- actions.append({
- 'action': 'delete',
- 'icon': 'times',
- 'name': _("Delete threads"),
- 'confirmation': _("Are you sure you want to delete selected "
- "threads? This action can't be undone.")
- })
- return actions
- def action_label(self, request, threads, label_slug):
- for label in self.forum.labels:
- if label.slug == label_slug:
- break
- else:
- raise ModerationError(_("Requested action is invalid."))
- changed_threads = 0
- for thread in threads:
- if moderation.label_thread(request.user, thread, label):
- changed_threads += 1
- if changed_threads:
- message = ungettext(
- '%(changed)d thread was labeled "%(label)s".',
- '%(changed)d threads were labeled "%(label)s".',
- changed_threads)
- messages.success(request, message % {
- 'changed': changed_threads,
- 'label': label.name
- })
- else:
- message = _("No threads were labeled.")
- messages.info(request, message)
- def action_unlabel(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.unlabel_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- message = ungettext(
- '%(changed)d thread label was remoded.',
- '%(changed)d threads labels were removed.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were unlabeled.")
- messages.info(request, message)
- def action_announce(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.announce_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- message = ungettext(
- '%(changed)d thread was changed to announcement.',
- '%(changed)d threads were changed to announcements.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were changed to announcements.")
- messages.info(request, message)
- def action_pin(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.pin_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- message = ungettext(
- '%(changed)d thread was pinned.',
- '%(changed)d threads were pinned.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were pinned.")
- messages.info(request, message)
- def action_reset(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.reset_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- message = ungettext(
- '%(changed)d thread weight was reset.',
- '%(changed)d threads weight was reset.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads weight was reset.")
- messages.info(request, message)
- move_threads_template = 'misago/threads/move.html'
- def action_move(self, request, threads):
- form = MoveThreadsForm(acl=request.user.acl, forum=self.forum)
- if request.method == "POST" and 'submit' in request.POST:
- form = MoveThreadsForm(
- request.POST, acl=request.user.acl, forum=self.forum)
- if form.is_valid():
- new_forum = form.cleaned_data['new_forum']
- for thread in threads:
- moderation.move_thread(request.user, thread, new_forum)
- with atomic():
- self.forum.synchronize()
- self.forum.save()
- new_forum.synchronize()
- new_forum.save()
- changed_threads = len(threads)
- message = ungettext(
- '%(changed)d thread was moved to %(forum)s.',
- '%(changed)d threads were moved to %(forum)s.',
- changed_threads)
- messages.success(request, message % {
- 'changed': changed_threads,
- 'forum': new_forum.name
- })
- return None # trigger threads list refresh
- return render(request, self.move_threads_template, {
- 'form': form,
- 'forum': self.forum,
- 'path': get_forum_path(self.forum),
- 'threads': threads
- })
- def action_close(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.close_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- message = ungettext(
- '%(changed)d thread was closed.',
- '%(changed)d threads were closed.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were closed.")
- messages.info(request, message)
- def action_open(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.open_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- message = ungettext(
- '%(changed)d thread was opened.',
- '%(changed)d threads were opened.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were opened.")
- messages.info(request, message)
- def action_unhide(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.unhide_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- with atomic():
- self.forum.synchronize()
- self.forum.save()
- message = ungettext(
- '%(changed)d thread was made visible.',
- '%(changed)d threads were made visible.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were made visible.")
- messages.info(request, message)
- def action_hide(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.hide_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- with atomic():
- self.forum.synchronize()
- self.forum.save()
- message = ungettext(
- '%(changed)d thread was hidden.',
- '%(changed)d threads were hidden.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were hidden.")
- messages.info(request, message)
- def action_delete(self, request, threads):
- changed_threads = 0
- for thread in threads:
- if moderation.delete_thread(request.user, thread):
- changed_threads += 1
- if changed_threads:
- with atomic():
- self.forum.synchronize()
- self.forum.save()
- message = ungettext(
- '%(changed)d thread was deleted.',
- '%(changed)d threads were deleted.',
- changed_threads)
- messages.success(request, message % {'changed': changed_threads})
- else:
- message = _("No threads were deleted.")
- messages.info(request, message)
|