예제 #1
0
파일: models.py 프로젝트: Anyson/forum
    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()
예제 #2
0
    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()
예제 #3
0
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,
    })
예제 #4
0
파일: views.py 프로젝트: techylax/forum
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,
        })
예제 #5
0
파일: views.py 프로젝트: Anyson/forum
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,
        },
    )
예제 #6
0
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,
    })
예제 #7
0
파일: views.py 프로젝트: Anyson/forum
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,
        },
    )
예제 #8
0
파일: views.py 프로젝트: techylax/forum
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,
        })
예제 #9
0
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,
    })
예제 #10
0
파일: views.py 프로젝트: Anyson/forum
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,
        },
    )
예제 #11
0
파일: views.py 프로젝트: techylax/forum
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,
        })