예제 #1
0
class ViewTopic(MethodView):
    decorators = [allows.requires(CanAccessTopic())]

    def get(self, topic_id, slug=None):
        page = request.args.get('page', 1, type=int)

        # Fetch some information about the topic
        topic = Topic.get_topic(topic_id=topic_id, user=real(current_user))

        # Count the topic views
        topic.views += 1
        topic.save()

        # Update the topicsread status if the user hasn't read it
        forumsread = None
        if current_user.is_authenticated:
            forumsread = ForumsRead.query.filter_by(
                user_id=current_user.id, forum_id=topic.forum_id).first()

        topic.update_read(real(current_user), topic.forum, forumsread)

        # fetch the posts in the topic
        posts = Post.query.outerjoin(User, Post.user_id == User.id).filter(
            Post.topic_id == topic.id).add_entity(User).order_by(
                Post.id.asc()).paginate(page, flaskbb_config['POSTS_PER_PAGE'],
                                        False)

        # Abort if there are no posts on this page
        if len(posts.items) == 0:
            abort(404)

        return render_template('forum/topic.html',
                               topic=topic,
                               posts=posts,
                               last_seen=time_diff(),
                               form=self.form())

    @allows.requires(CanPostReply)
    def post(self, topic_id, slug=None):
        topic = Topic.get_topic(topic_id=topic_id, user=real(current_user))
        form = self.form()

        if not form:
            flash(_('Cannot post reply'), 'warning')
            return redirect('forum.view_topic', topic_id=topic_id, slug=slug)

        elif form.validate_on_submit():
            post = form.save(real(current_user), topic)
            return redirect(url_for('forum.view_post', post_id=post.id))

        else:
            for e in form.errors.get('content', []):
                flash(e, 'danger')
            return redirect(
                url_for('forum.view_topic', topic_id=topic_id, slug=slug))

    def form(self):
        if Permission(CanPostReply):
            return QuickreplyForm()
        return None
예제 #2
0
    topics = Forum.get_topics(forum_id=forum_instance.id,
                              user=current_user,
                              page=page,
                              per_page=flaskbb_config["TOPICS_PER_PAGE"])

    return render_template(
        "forum/forum.html",
        forum=forum_instance,
        topics=topics,
        forumsread=forumsread,
    )


@forum.route("/topic/<int:topic_id>", methods=["POST", "GET"])
@forum.route("/topic/<int:topic_id>-<slug>", methods=["POST", "GET"])
@allows.requires(CanAccessTopic())
def view_topic(topic_id, slug=None):
    page = request.args.get('page', 1, type=int)

    # Fetch some information about the topic
    topic = Topic.get_topic(topic_id=topic_id, user=current_user)

    # Count the topic views
    topic.views += 1
    topic.save()

    # fetch the posts in the topic
    posts = Post.query.\
        join(User, Post.user_id == User.id).\
        filter(Post.topic_id == topic.id).\
        add_entity(User).\