from urllib.parse import urlparse as url_parse from flask import Flask, render_template, request, redirect, url_for, flash from markdown import markdown, Markdown from config import config from models import ( Post, db, get_replies, Faccet, get_previous, get_attribed_posts, get_tview, ) from models import User as NewUser from forms import PostForm, LoginForm from flask_login import ( login_user, logout_user, login_required, current_user, LoginManager, ) from template_filters import format_datetime, svsbbcode import os app = Flask(__name__) app.config.from_object("config") SECRET_KEY = os.urandom(32) app.config["SECRET_KEY"] = SECRET_KEY app.jinja_options = app.jinja_options.copy() app.jinja_env.add_extension(Markdown) app.jinja_env.filters["markdown"] = markdown app.jinja_env.filters["bbcode"] = svsbbcode app.jinja_env.filters["datetime"] = format_datetime login = LoginManager(app) login.login_view = "login" @login.user_loader def load_user(uid): return NewUser.get(NewUser.id == uid) @app.route("/login", methods=["GET", "POST"]) def login(): form = LoginForm() if form.validate_on_submit(): # noqa user = NewUser.get(NewUser.username == form.username.data) if user is None or not user.check_password(form.password.data): flash("Invalid username or password") return redirect(url_for("login")) login_user(user, remember=form.remember_me.data) next_page = request.args.get("next") if not next_page or url_parse(next_page).netloc != "": next_page = url_for("index") return redirect(next_page) return render_template("login.html", form=form) @app.before_request def before_request(): db.connect() @app.after_request def after_request(response): db.close() return response @app.route("/") @login_required def index(): posts = Post.select().where(Post.parent == 0).order_by(Post.created_at.desc()) return render_template("index.html", posts=posts) @app.route("/logout") @login_required def logout(): flash("Goodbye!") logout_user() return redirect(url_for("login")) @app.route("/post/") @login_required def post(post_id): post = Post.get(Post.id == post_id) previous = get_previous(post_id) replies = get_replies(post_id) return render_template("post.html", post=post, replies=replies, previous=previous) @app.route("/create", methods=["GET", "POST"]) @login_required def create(): replyto = request.args.get("reply", 0) userctx = NewUser.get(NewUser.username == current_user.username) asfaccet = ( Faccet.select() .where(Faccet.user_belongs == userctx) .order_by(Faccet.birth.asc()) ) form = PostForm(faccets=asfaccet) if request.method == "GET": return render_template("create.html", form=form) if form.validate_on_submit(): Post.create( title=form.title.data, content=form.content.data, authour=form.faccets.data, parent=replyto, ) return redirect(url_for("index")) else: return str(form.faccets.data), 504 return "you shouldn't be here", 420 @app.route("/details/") @login_required def details(light): cfaccet = Faccet.get(Faccet.name == light) faccet_uctx = NewUser.get(NewUser.id == cfaccet.user_belongs) fposts = get_attribed_posts(cfaccet.id) return render_template( "details.html", faccet=cfaccet, creator=faccet_uctx, posts=fposts ) @app.route("/faccets") @login_required def faccets(): userctx = NewUser.get(NewUser.username == current_user.username) faccet_list = ( Faccet.select() .where(Faccet.user_belongs == userctx) .order_by(Faccet.birth.asc()) ) return render_template("faccet_list.html", faccet=faccet_list) @app.route("/thread/") @login_required def thread(post_id): thread = Post.get(Post.id == post_id) pdx = get_tview(post_id) return render_template("view_thread.html", thread=thread, pdx=pdx) if __name__ == "__main__": app.run(debug=True, port=5052)