PCv5/app/routes/forum/topic.py

83 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
2021-02-21 20:17:48 +01:00
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
2020-08-25 22:57:45 +02:00
from app.models.user import Guest
from app.models.attachment import Attachment
2021-02-21 20:17:48 +01:00
from datetime import datetime
2021-01-12 16:40:52 +01:00
@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"),
2021-02-21 20:17:48 +01:00
_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-02-21 20:17:48 +01:00
Thread.COMMENTS_PER_PAGE, True)
2021-01-12 16:40:52 +01:00
2021-02-21 20:17:48 +01:00
# 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
2021-02-21 20:17:48 +01:00
return render('/forum/topic.html', t=t, form=form, comments=comments,
outdated=outdated)