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 ) @bp.get("//edit") @login_required @mod_only(".topic", slug = lambda slug: slug) def edit(slug): topic = Topics.find({"slug": slug}) if not topic: return "no" return render_template("topics/edit.html", topic=topic) @bp.post("//edit") @login_required @mod_only(".topic", slug = lambda slug: slug) def edit_post(slug): topic = Topics.find({"slug": slug}) if not topic: return "no" topic.update({ "name": request.form.get('name', default = topic.name).strip(), "description": request.form.get('description', default = topic.description), "is_locked": int(request.form.get("is_locked", default = topic.is_locked)), }) return redirect(url_for("topics.topic", slug=slug)) @bp.post("//delete") @login_required @mod_only(".topic", slug = lambda slug: slug) def delete(slug): topic = Topics.find({"slug": slug}) if not topic: return "no" topic.delete() flash("Topic deleted.", InfoboxKind.INFO) return redirect(url_for("topics.all_topics"))