PCv5/app/routes/forum/topic.py

79 lines
2.5 KiB
Python
Raw Normal View History

from flask_login import current_user
2021-01-12 16:40:52 +01:00
from flask import redirect, url_for, flash, abort
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
2020-08-25 22:57:45 +02:00
from app.models.user import Guest
from app.models.attachment import Attachment
2021-01-12 16:40:52 +01:00
import datetime
@app.route('/forum/<forum:f>/<topicpage:page>', methods=['GET', 'POST'])
def forum_topic(f, page):
t, page = page
# 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 \
2021-01-12 16:40:52 +01:00
(V5Config.ENABLE_GUEST_POST or current_user.is_authenticated):
# 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()
# Manage files
attachments = []
for file in form.attachments.data:
if file.filename != "":
a = Attachment(file, c)
attachments.append((a, file))
db.session.add(a)
db.session.commit()
for a, file in attachments:
a.set_file(file)
2019-12-10 11:22:56 +01:00
# 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
2021-01-12 16:40:52 +01:00
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:
2021-01-12 16:40:52 +01:00
page = (t.thread.comments.count() - 1) // Thread.COMMENTS_PER_PAGE + 1
comments = t.thread.comments.paginate(page,
2021-01-12 16:40:52 +01:00
Thread.COMMENTS_PER_PAGE, True)
now_minus = datetime.datetime.now() - datetime.timedelta(days=V5Config.NECROPOST_LIMIT)
last_updated_comment = t.thread.comments.filter(Comment.date_modified <= now_minus).first()
return render('/forum/topic.html', t=t, form=form, comments=comments, last=last_updated_comment)