distribusi-verse: medium-tech web app content management system for the web
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

128 lines
3.5 KiB

"""This is the main flask distribusi page"""
from datetime import timedelta
from flask import (
Blueprint,
redirect,
render_template,
send_from_directory,
session,
url_for,
)
from flask_login import current_user, login_required, logout_user
from flask_mail import Mail
from flask_wtf.csrf import CSRFError
# Interface! these are seperate files in main folder
from adminpage import AdminPage
from app import create_app, login_manager
from distribusikan.distribusikan import distribusikan
from distribusikan.distribusisinfo import DistribusisInfo
# Use upload form to populate filters
from forms.uploadform import UploadForm
from models.distribusi_model import Distribusis
from models.user_model import User
from statuspengguna.forgotpassword import forgot_password
from statuspengguna.helper import UserHelper
from statuspengguna.loginuser import login_section
from statuspengguna.registeruser import register_user
APP = create_app()
stash_page = Blueprint("stash_page", __name__, static_folder="stash")
APP.register_blueprint(login_section, url_prefix="/login")
APP.register_blueprint(register_user, url_prefix="/register")
APP.register_blueprint(forgot_password, url_prefix="/login/forgotpassword")
APP.register_blueprint(distribusikan)
APP.register_blueprint(stash_page)
@APP.before_request
def session_handler():
session.permanent = True
APP.permanent_session_lifetime = timedelta(minutes=30)
@APP.route("/")
def index():
UserHelper.reset_user_state()
uploadform = UploadForm()
distribusis = DistribusisInfo.visibledistribusis()
distribusisindex = {}
for distribusi in distribusis:
user = User.query.filter_by(id=distribusi.userid).first()
singledistribusi = {
"username": user.username,
"publictheme": distribusi.publictheme,
"category": distribusi.category,
"year": distribusi.year,
"tags": distribusi.tags.split(","),
}
distribusisindex[distribusi.distribusiname] = singledistribusi
years = uploadform.year.choices
categories = uploadform.category.choices
adminuser = isadminuser()
template = render_template(
"base/index.html",
distribusisindex=distribusisindex,
years=years,
categories=categories,
adminuser=adminuser,
)
return template
@APP.route("/help")
def help():
return render_template("base/help.html")
@APP.route("/publicthemes/<path>")
def publicthemes(path):
distribusi = Distribusis.query.filter_by(distribusiname=path).first()
publicthemefolder = f"publicthemes/{distribusi.distribusiname}/"
cssfile = f"{publicthemefolder}/{distribusi.publictheme}.css"
return send_from_directory("themes", cssfile, as_attachment=True)
@APP.route("/stash")
def shortstashurl():
return redirect(url_for("index"))
@APP.route("/admin", methods=["GET", "POST"])
@login_required
def admin():
if not isadminuser():
return redirect(url_for("index"))
return AdminPage()
@APP.route("/logout")
@login_required
def logout():
logout_user()
return redirect(url_for("index"))
@APP.errorhandler(CSRFError)
def handle_csrf_error(e):
return render_template("csrf_error.html", reason=e.description), 400
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
def isadminuser():
if not current_user.is_authenticated:
return False
user = User.query.filter_by(email=current_user.email).first()
return user.admin
if __name__ == "__main__":
APP.debug = True
APP.run(port=5000)