from flask import ( Blueprint, render_template, request, redirect, url_for, flash, session ) from .users import login_required, mod_only from ..models import Users, Topics, Threads from ..constants import InfoboxKind from slugify import slugify import time import math bp = Blueprint("topics", __name__, url_prefix = "/topics/") @bp.get("/") def all_topics(): admin = Users.find({"id": 1}) return render_template("topics/topics.html", topic_list = Topics.get_list(), active_threads = Topics.get_active_threads()) @bp.get("/create") @login_required @mod_only(".all_topics") def create(): return render_template("topics/create.html") @bp.post("/create") @login_required @mod_only(".all_topics") def create_post(): topic_name = request.form['name'].strip() now = int(time.time()) slug = f"{slugify(topic_name)}-{now}" topic_count = Topics.count() topic = Topics.create({ "name": topic_name, "description": request.form['description'], "slug": slug, "sort_order": topic_count + 1, }) flash("Topic created.", InfoboxKind.INFO) return redirect(url_for("topics.topic", slug = slug)) @bp.get("/") def topic(slug): THREADS_PER_PAGE = 10 target_topic = Topics.find({ "slug": slug }) if not target_topic: return "no" threads_count = Threads.count({ "topic_id": target_topic.id }) sort_by = session.get('sort_by', default="activity") page_count = max(math.ceil(threads_count / THREADS_PER_PAGE), 1) page = max(1, min(int(request.args.get('page', default=1)), page_count)) return render_template( "topics/topic.html", threads_list = target_topic.get_threads(THREADS_PER_PAGE, page, sort_by), topic = target_topic, current_page = page, page_count = page_count )