85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
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.utils.glados import say, BOLD
|
||
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/<forum:f>/<topicpage:page>', 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 not t.thread.locked 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')
|
||
app.v5logger.info(f"<{c.author.name}> has posted a the comment #{c.id}")
|
||
if f.is_default_accessible():
|
||
say(f"Nouveau commentaire de {author.name} sur le topic : {BOLD}{t.title}{BOLD}")
|
||
say(url_for('forum_topic', f=f, page=(t, "fin"), _anchor=str(c.id), _external=True))
|
||
|
||
# Redirect to empty the form
|
||
return redirect(url_for('forum_topic', f=f, page=(t, "fin"),
|
||
_anchor=str(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)
|