def save(self, *args, **kwargs): """ This method is overridden to implement the following: - Formatting and escaping the raw Post body as HTML at save time. - Populating or updating non-editable time fields. - Populating denormalised data in related Topic, Forum and ForumProfile objects when this is a new Post. """ self.body = self.body.strip() self.body_html = post_formatter.format_post(self.body, self.emoticons) is_new = False if not self.pk: self.posted_at = datetime.datetime.now() self.num_in_topic = getattr(self.topic, '%spost_count' % \ (self.meta and 'meta' or '',)) + 1 is_new = True else: self.edited_at = datetime.datetime.now() super(Post, self).save(*args, **kwargs) if is_new: if not self.meta: # Includes a non-metapost post count update self.topic.set_last_post(self) else: self.topic.update_post_count(meta=True) # Don't update the forum's last post if the topic is hidden # - this allows moderators to add posts to hidden topics # without them becoming visible on forum listing pages. if not self.meta and not self.topic.hidden: self.topic.forum.set_last_post(self) ForumProfile.objects.get_for_user(self.user).update_post_count() transaction.commit_unless_managed()
def add_reply(request, topic_id, meta=False, quote_post=None): """ Adds a Post to a Topic. If ``quote_post`` is given, the form will be prepopulated with a quoted version of the Post's body. """ filters = {'pk': topic_id} if not auth.is_moderator(request.user): filters['hidden'] = False topic = get_object_or_404(Topic, **filters) if topic.forum.section.is_managed(): if not topic.forum.section.is_corp_authed(request.user): raise Http404 if topic.locked and \ not auth.is_moderator(request.user): return permission_denied(request, message='You do not have permission to post in this topic.') forum = Forum.objects.select_related().get(pk=topic.forum_id) preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, 'Posting in topic:', topic) if request.method == 'POST': form = forms.ReplyForm(not meta, request.POST) if form.is_valid(): if 'preview' in request.POST: preview = post_formatter.format_post( form.cleaned_data['body'], form.cleaned_data['emoticons']) elif 'submit' in request.POST: post = form.save(commit=False) post.topic = topic post.user = request.user # Only force the meta attribute if posting in meta mode, # as otherwise the user can choose to create a meta post. if meta: post.meta = True post.user_ip = request.META['REMOTE_ADDR'] post.save() return redirect_to_post(request, post.id, post) else: initial = {} if quote_post is not None: initial['body'] = post_formatter.quote_post(quote_post) form = forms.ReplyForm(not meta, initial=initial) return render(request, 'forum/add_reply.html', { 'form': form, 'topic': topic, 'section': forum.section, 'forum': forum, 'topic': topic, 'preview': preview, 'meta': meta, 'urls': TopicURLs(topic, meta), 'title': 'Add Reply to %s' % topic.title, 'quick_help_template': post_formatter.QUICK_HELP_TEMPLATE, })
def add_reply(request, topic_id, meta=False, quote_post=None): """ Adds a Post to a Topic. If ``quote_post`` is given, the form will be prepopulated with a quoted version of the Post's body. """ filters = {'pk': topic_id} if not auth.is_moderator(request.user): filters['hidden'] = False topic = get_object_or_404(Topic, **filters) if topic.locked and \ not auth.is_moderator(request.user): return permission_denied( request, message='You do not have permission to post in this topic.') forum = Forum.objects.select_related().get(pk=topic.forum_id) preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, 'Posting in topic:', topic) if request.method == 'POST': form = forms.ReplyForm(not meta, request.POST) if form.is_valid(): if 'preview' in request.POST: preview = post_formatter.format_post( form.cleaned_data['body'], form.cleaned_data['emoticons']) elif 'submit' in request.POST: post = form.save(commit=False) post.topic = topic post.user = request.user # Only force the meta attribute if posting in meta mode, # as otherwise the user can choose to create a meta post. if meta: post.meta = True post.user_ip = request.META['REMOTE_ADDR'] post.save() return redirect_to_post(request, post.id, post) else: initial = {} if quote_post is not None: initial['body'] = post_formatter.quote_post(quote_post) form = forms.ReplyForm(not meta, initial=initial) return render( request, 'forum/add_reply.html', { 'form': form, 'topic': topic, 'section': forum.section, 'forum': forum, 'topic': topic, 'preview': preview, 'meta': meta, 'urls': TopicURLs(topic, meta), 'title': 'Add Reply to %s' % topic.title, 'quick_help_template': post_formatter.QUICK_HELP_TEMPLATE, })
def add_reply(request, topic_id, meta=False, quote_post=None): """ Adds a Post to a Topic. If ``quote_post`` is given, the form will be prepopulated with a quoted version of the Post's body. """ filters = {"pk": topic_id} if not auth.is_moderator(request.user): filters["hidden"] = False topic = get_object_or_404(Topic, **filters) if topic.locked and not auth.is_moderator(request.user): return permission_denied(request, message="You do not have permission to post in this topic.") forum = Forum.objects.select_related().get(pk=topic.forum_id) preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, "Posting in topic:", topic) if request.method == "POST": form = forms.ReplyForm(not meta, request.POST) if form.is_valid(): if "preview" in request.POST: preview = post_formatter.format_post(form.cleaned_data["body"], form.cleaned_data["emoticons"]) elif "submit" in request.POST: post = form.save(commit=False) post.topic = topic post.user = request.user # Only force the meta attribute if posting in meta mode, # as otherwise the user can choose to create a meta post. if meta: post.meta = True post.user_ip = request.META["REMOTE_ADDR"] post.save() return redirect_to_post(request, post.id, post) else: initial = {} if quote_post is not None: initial["body"] = post_formatter.quote_post(quote_post) form = forms.ReplyForm(not meta, initial=initial) return render( request, "forum/add_reply.html", { "form": form, "topic": topic, "section": forum.section, "forum": forum, "topic": topic, "preview": preview, "meta": meta, "urls": TopicURLs(topic, meta), "title": "Add Reply to %s" % topic.title, "quick_help_template": post_formatter.QUICK_HELP_TEMPLATE, }, )
def edit_post(request, post_id): """ Edits the given Post. """ filters = {'pk': post_id} if not auth.is_moderator(request.user): filters['topic__hidden'] = False post = get_object_or_404(Post, **filters) topic = post.topic if not auth.user_can_edit_post(request.user, post, topic): return permission_denied(request, message='You do not have permission to edit this post.') forum = Forum.objects.select_related().get(pk=topic.forum_id) if forum.section.is_managed(): if not forum.section.is_corp_authed(request.user): return permission_denied(request, message="You are not a member of the appropriate corporation, alliance or coalition.") meta_editable = auth.is_moderator(request.user) if meta_editable: was_meta = post.meta preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, 'Editing a post in:', topic) if request.method == 'POST': form = forms.ReplyForm(meta_editable, request.POST, instance=post) if form.is_valid(): if 'preview' in request.POST: preview = post_formatter.format_post( form.cleaned_data['body'], form.cleaned_data['emoticons']) elif 'submit' in request.POST: post = form.save(commit=False) if auth.is_moderator(request.user): if post.meta and not was_meta: moderation.make_post_meta(post, topic, forum) elif not post.meta and was_meta: moderation.make_post_not_meta(post, topic, forum) else: post.save() else: post.save() return redirect_to_post(request, post.id, post) else: form = forms.ReplyForm(meta_editable, instance=post) return render(request, 'forum/edit_post.html', { 'form': form, 'post': post, 'topic': topic, 'forum': forum, 'section': forum.section, 'preview': preview, 'title': 'Edit Post', 'quick_help_template': post_formatter.QUICK_HELP_TEMPLATE, })
def edit_post(request, post_id): """ Edits the given Post. """ filters = {"pk": post_id} if not auth.is_moderator(request.user): filters["topic__hidden"] = False post = get_object_or_404(Post, **filters) topic = post.topic if not auth.user_can_edit_post(request.user, post, topic): return permission_denied(request, message="You do not have permission to edit this post.") forum = Forum.objects.select_related().get(pk=topic.forum_id) meta_editable = auth.is_moderator(request.user) if meta_editable: was_meta = post.meta preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, "Editing a post in:", topic) if request.method == "POST": form = forms.ReplyForm(meta_editable, request.POST, instance=post) if form.is_valid(): if "preview" in request.POST: preview = post_formatter.format_post(form.cleaned_data["body"], form.cleaned_data["emoticons"]) elif "submit" in request.POST: post = form.save(commit=False) if auth.is_moderator(request.user): if post.meta and not was_meta: moderation.make_post_meta(post, topic, forum) elif not post.meta and was_meta: moderation.make_post_not_meta(post, topic, forum) else: post.save() else: post.save() return redirect_to_post(request, post.id, post) else: form = forms.ReplyForm(meta_editable, instance=post) return render( request, "forum/edit_post.html", { "form": form, "post": post, "topic": topic, "forum": forum, "section": forum.section, "preview": preview, "title": "Edit Post", "quick_help_template": post_formatter.QUICK_HELP_TEMPLATE, }, )
def edit_post(request, post_id): """ Edits the given Post. """ filters = {'pk': post_id} if not auth.is_moderator(request.user): filters['topic__hidden'] = False post = get_object_or_404(Post, **filters) topic = post.topic if not auth.user_can_edit_post(request.user, post, topic): return permission_denied( request, message='You do not have permission to edit this post.') forum = Forum.objects.select_related().get(pk=topic.forum_id) meta_editable = auth.is_moderator(request.user) if meta_editable: was_meta = post.meta preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, 'Editing a post in:', topic) if request.method == 'POST': form = forms.ReplyForm(meta_editable, request.POST, instance=post) if form.is_valid(): if 'preview' in request.POST: preview = post_formatter.format_post( form.cleaned_data['body'], form.cleaned_data['emoticons']) elif 'submit' in request.POST: post = form.save(commit=False) if auth.is_moderator(request.user): if post.meta and not was_meta: moderation.make_post_meta(post, topic, forum) elif not post.meta and was_meta: moderation.make_post_not_meta(post, topic, forum) else: post.save() else: post.save() return redirect_to_post(request, post.id, post) else: form = forms.ReplyForm(meta_editable, instance=post) return render( request, 'forum/edit_post.html', { 'form': form, 'post': post, 'topic': topic, 'forum': forum, 'section': forum.section, 'preview': preview, 'title': 'Edit Post', 'quick_help_template': post_formatter.QUICK_HELP_TEMPLATE, })
def add_topic(request, forum_id): """ Adds a Topic to a Forum. """ forum = get_object_or_404(Forum.objects.select_related(), pk=forum_id) if forum.section.is_managed(): if not forum.section.is_corp_authed(request.user): return permission_denied(request, message="You are not a member of the appropriate corporation, alliance or coalition.") preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, 'Adding a new topic') if request.method == 'POST': topic_form = forms.AddTopicForm(request.POST) post_form = forms.TopicPostForm(request.POST) if topic_form.is_valid() and post_form.is_valid(): if 'preview' in request.POST: preview = post_formatter.format_post( post_form.cleaned_data['body'], post_form.cleaned_data['emoticons']) elif 'submit' in request.POST: topic = topic_form.save(commit=False) topic.user = request.user topic.forum = forum topic.save() post = post_form.save(commit=False) post.topic = topic post.user = request.user post.user_ip = request.META['REMOTE_ADDR'] post.save() return HttpResponseRedirect(topic.get_absolute_url()) else: topic_form = forms.AddTopicForm() post_form = forms.TopicPostForm() return render(request, 'forum/add_topic.html', { 'topic_form': topic_form, 'post_form': post_form, 'section': forum.section, 'forum': forum, 'preview': preview, 'title': 'Add Topic in %s' % forum.name, 'quick_help_template': post_formatter.QUICK_HELP_TEMPLATE, })
def add_topic(request, forum_id): """ Adds a Topic to a Forum. """ forum = get_object_or_404(Forum.objects.select_related(), pk=forum_id) preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, "Adding a new topic") if request.method == "POST": topic_form = forms.AddTopicForm(request.POST) post_form = forms.TopicPostForm(request.POST) if topic_form.is_valid() and post_form.is_valid(): if "preview" in request.POST: preview = post_formatter.format_post( post_form.cleaned_data["body"], post_form.cleaned_data["emoticons"] ) elif "submit" in request.POST: topic = topic_form.save(commit=False) topic.user = request.user topic.forum = forum topic.save() post = post_form.save(commit=False) post.topic = topic post.user = request.user post.user_ip = request.META["REMOTE_ADDR"] post.save() return HttpResponseRedirect(topic.get_absolute_url()) else: topic_form = forms.AddTopicForm() post_form = forms.TopicPostForm() return render( request, "forum/add_topic.html", { "topic_form": topic_form, "post_form": post_form, "section": forum.section, "forum": forum, "preview": preview, "title": "Add Topic in %s" % forum.name, "quick_help_template": post_formatter.QUICK_HELP_TEMPLATE, }, )
def add_topic(request, forum_id): """ Adds a Topic to a Forum. """ forum = get_object_or_404(Forum.objects.select_related(), pk=forum_id) preview = None if app_settings.USE_REDIS: redis.seen_user(request.user, 'Adding a new topic') if request.method == 'POST': topic_form = forms.AddTopicForm(request.POST) post_form = forms.TopicPostForm(request.POST) if topic_form.is_valid() and post_form.is_valid(): if 'preview' in request.POST: preview = post_formatter.format_post( post_form.cleaned_data['body'], post_form.cleaned_data['emoticons']) elif 'submit' in request.POST: topic = topic_form.save(commit=False) topic.user = request.user topic.forum = forum topic.save() post = post_form.save(commit=False) post.topic = topic post.user = request.user post.user_ip = request.META['REMOTE_ADDR'] post.save() return HttpResponseRedirect(topic.get_absolute_url()) else: topic_form = forms.AddTopicForm() post_form = forms.TopicPostForm() return render( request, 'forum/add_topic.html', { 'topic_form': topic_form, 'post_form': post_form, 'section': forum.section, 'forum': forum, 'preview': preview, 'title': 'Add Topic in %s' % forum.name, 'quick_help_template': post_formatter.QUICK_HELP_TEMPLATE, })