import os import shutil from flask import render_template, Blueprint from flask_login import login_required from sqlalchemy.exc import ( DatabaseError, DataError, InterfaceError, InvalidRequestError, ) from app import db from admin import is_adminuser from distribusikan.distribusis_info import DistribusisInfo from admin_page.forms.admindistribusiform import AdminDistribusiForm from admin_page.forms.adminuserform import AdminUserForm from models.distribusi_model import Distribusis from models.user_model import User admin_page = Blueprint( "admin", __name__, template_folder="templates/describe_files", static_folder="static", ) @admin_page.route("/admin", methods=["GET", "POST"]) @login_required def admin(): if not is_adminuser(): return redirect(url_for("index")) adminuserform = add_users_to_form(AdminUserForm()) admindistribusiform = add_distribusis_to_form(AdminDistribusiForm()) if admindistribusiform.validate_on_submit(): delete_distribusis(admindistribusiform) if adminuserform.validate_on_submit(): if adminuserform.delete.data: delete_users(adminuserform) template = render_template( "admin.html", adminuserform=adminuserform, admindistribusiform=admindistribusiform, ) return template def delete_users(adminuserform): for userform in adminuserform: if "user" in userform.id: if userform.data: useremail = userform.label.text user = User.query.filter_by(email=useremail).first() delete_User_distribusis(user) delete_user_from_db(user) userform.errors.append(f"User {useremail} deleted!") def delete_user_from_db(user): try: db.session.delete(user) db.session.commit() except (InvalidRequestError, DataError, InterfaceError, DatabaseError): db.session.rollback() def delete_User_distribusis(user): distribusis = DistribusisInfo.get_user_distribusis(user.email) for distribusi in distribusis: delete_distribusi_files(distribusi.distribusiname) delete_distribusi_from_db(distribusi) def delete_distribusis(admindistribusiform): for distribusiform in admindistribusiform: if "distribusi" in distribusiform.id: if distribusiform.data: distribusiname = distribusiform.label.text distribusi = Distribusis.query.filter_by( distribusiname=distribusiname ).first() delete_distribusi_from_db(distribusi) delete_distribusi_files(distribusiname) distribusiform.errors.append("Deleted distribusi") def delete_distribusi_from_db(distribusi): try: db.session.delete(distribusi) db.session.commit() except (InvalidRequestError, DataError, InterfaceError, DatabaseError): db.session.rollback() def delete_distribusi_files(distribusiname): userfolder = os.path.join("stash", distribusiname) if os.path.exists(userfolder): shutil.rmtree(userfolder) cssfolder = os.path.join("themes/userthemes", distribusiname) if os.path.exists(cssfolder): shutil.rmtree(cssfolder) def add_distribusis_to_form(admindistribusiform): distribusis = DistribusisInfo.visible_distribusis() admindistribusiform = AdminDistribusiForm.distribusi_list_form_builder( distribusis ) return admindistribusiform def add_users_to_form(adminuserform): users = User.query.all() adminuserform = AdminUserForm.user_list_form_builder(users) return adminuserform