def action_label(self, request, threads, label_slug): for label in self.forum.labels: if label.slug == label_slug: break else: raise moderation.ModerationError(self.invalid_action_message) 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_merge(self, request, threads): if len(threads) == 1: message = _("You have to select at least two threads to merge.") raise moderation.ModerationError(message) form = MergeThreadsForm() if 'submit' in request.POST: form = MergeThreadsForm(request.POST) if form.is_valid(): with atomic(): merged_thread = Thread() merged_thread.forum = self.forum merged_thread.set_title( form.cleaned_data['merged_thread_title']) merged_thread.starter_name = "-" merged_thread.starter_slug = "-" merged_thread.last_poster_name = "-" merged_thread.last_poster_slug = "-" merged_thread.started_on = timezone.now() merged_thread.last_post_on = timezone.now() merged_thread.is_pinned = max(t.is_pinned for t in threads) merged_thread.is_closed = max(t.is_closed for t in threads) merged_thread.save() for thread in threads: moderation.merge_thread( request.user, merged_thread, thread) merged_thread.synchronize() merged_thread.save() self.forum.lock() self.forum.synchronize() self.forum.save() changed_threads = len(threads) message = ungettext( '%(changed)d thread was merged into "%(thread)s".', '%(changed)d threads were merged into "%(thread)s".', changed_threads) messages.success(request, message % { 'changed': changed_threads, 'thread': merged_thread.title }) return None # trigger threads list refresh if request.is_ajax(): template = self.merge_threads_modal_template else: template = self.merge_threads_full_template return render(request, template, { 'form': form, 'forum': self.forum, 'path': get_forum_path(self.forum), 'threads': threads })
def action_label(self, request, thread, label_slug): for label in self.forum.labels: if label.slug == label_slug: break else: raise moderation.ModerationError(self.invalid_action_message) moderation.label_thread(request.user, thread, label) message = _('Thread was labeled "%(label)s".') messages.success(request, message % {'label': label.name})
def action_move(self, request, posts): if posts[0].id == self.thread.first_post_id: message = _("You can't move thread's first post.") raise moderation.ModerationError(message) form = MovePostsForm(user=request.user, thread=self.thread) if 'submit' in request.POST or 'follow' in request.POST: form = MovePostsForm(request.POST, user=request.user, thread=self.thread) if form.is_valid(): for post in posts: post.move(form.new_thread) post.save() form.new_thread.lock() form.new_thread.synchronize() form.new_thread.save() if form.new_thread.forum != self.forum: form.new_thread.forum.lock() form.new_thread.forum.synchronize() form.new_thread.forum.save() changed_posts = len(posts) message = ungettext( '%(changed)d post was moved to "%(thread)s".', '%(changed)d posts were moved to "%(thread)s".', changed_posts) messages.success(request, message % { 'changed': changed_posts, 'thread': form.new_thread.title }) if 'follow' in request.POST: return redirect(form.new_thread.get_absolute_url()) else: return None # trigger thread refresh if request.is_ajax(): template = self.move_posts_modal_template else: template = self.move_posts_full_template return render(request, template, { 'form': form, 'forum': self.forum, 'thread': self.thread, 'path': get_forum_path(self.forum), 'posts': posts })
def action_merge(self, request, posts): first_post = posts[0] changed_posts = len(posts) if changed_posts < 2: message = _("You have to select at least two posts to merge.") raise moderation.ModerationError(message) for post in posts: if not post.poster_id or first_post.poster_id != post.poster_id: message = _("You can't merge posts made by different authors.") raise moderation.ModerationError(message) for post in posts[1:]: post.merge(first_post) post.delete() first_post.save() message = ungettext( '%(changed)d post was merged.', '%(changed)d posts were merged.', changed_posts) messages.success(request, message % {'changed': changed_posts})
def action_split(self, request, posts): if posts[0].id == self.thread.first_post_id: message = _("You can't split thread's first post.") raise moderation.ModerationError(message) form = SplitThreadForm(acl=request.user.acl) if 'submit' in request.POST or 'follow' in request.POST: form = SplitThreadForm(request.POST, acl=request.user.acl) if form.is_valid(): split_thread = Thread() split_thread.forum = form.cleaned_data['forum'] split_thread.set_title( form.cleaned_data['thread_title']) split_thread.starter_name = "-" split_thread.starter_slug = "-" split_thread.last_poster_name = "-" split_thread.last_poster_slug = "-" split_thread.started_on = timezone.now() split_thread.last_post_on = timezone.now() split_thread.save() for post in posts: post.move(split_thread) post.save() split_thread.synchronize() split_thread.save() if split_thread.forum != self.forum: split_thread.forum.lock() split_thread.forum.synchronize() split_thread.forum.save() changed_posts = len(posts) message = ungettext( '%(changed)d post was split to "%(thread)s".', '%(changed)d posts were split to "%(thread)s".', changed_posts) messages.success(request, message % { 'changed': changed_posts, 'thread': split_thread.title }) if 'follow' in request.POST: return redirect(split_thread.get_absolute_url()) else: return None # trigger thread refresh if request.is_ajax(): template = self.split_thread_modal_template else: template = self.split_thread_full_template return render(request, template, { 'form': form, 'forum': self.forum, 'thread': self.thread, 'path': get_forum_path(self.forum), 'posts': posts })