from flask_login import current_user from flask import redirect, url_for, flash, abort from sqlalchemy import desc from app import app, db from config import V5Config from app.utils.render import render from app.forms.forum import CommentForm, AnonymousCommentForm from app.models.thread import Thread from app.models.comment import Comment from app.models.user import Guest from app.models.attachment import Attachment from datetime import datetime @app.route('/forum//', methods=['GET', 'POST']) def forum_topic(f, page): t, page = page if not f.is_default_accessible() and not ( current_user.is_authenticated and current_user.can_access_forum(f)): abort(403) # Quick n' dirty workaround to converters if f != t.forum: abort(404) if current_user.is_authenticated: form = CommentForm() else: form = AnonymousCommentForm() if form.validate_on_submit() and ( V5Config.ENABLE_GUEST_POST or \ (current_user.is_authenticated and current_user.can_post_in_forum(f))): # Manage author if current_user.is_authenticated: author = current_user else: author = Guest(form.pseudo.data) db.session.add(author) # Create comment c = Comment(author, form.message.data, t.thread) db.session.add(c) db.session.commit() c.create_attachments(form.attachments.data) # Update member's xp and trophies if current_user.is_authenticated: current_user.add_xp(1) # 1 point for a comment current_user.update_trophies('new-post') flash('Message envoyé', 'ok') # Redirect to empty the form return redirect(url_for('forum_topic', f=f, page=(t, "fin"), _anchor=c.id)) # Update views t.views += 1 db.session.merge(t) db.session.commit() if page == -1: page = (t.thread.comments.count() - 1) // Thread.COMMENTS_PER_PAGE + 1 comments = t.thread.comments.order_by(Comment.date_created.asc()) \ .paginate(page, Thread.COMMENTS_PER_PAGE, True) # Anti-necropost last_com = t.thread.comments.order_by(desc(Comment.date_modified)).first() inactive = datetime.now() - last_com.date_modified outdated = inactive.days if inactive >= V5Config.NECROPOST_LIMIT else None return render('/forum/topic.html', t=t, form=form, comments=comments, outdated=outdated)