import os import shutil from flask import render_template from sqlalchemy.exc import ( DatabaseError, DataError, InterfaceError, InvalidRequestError, ) from app import db from distribusikan.distribusisinfo import DistribusisInfo from forms.admindistribusiform import AdminDistribusiForm from forms.adminuserform import AdminUserForm from models.distribusimodel import Distribusis from models.usermodel import User def AdminPage(): adminuserform = AddUsersToForm(AdminUserForm()) admindistribusiform = AddDistribusisToForm(AdminDistribusiForm()) if admindistribusiform.validate_on_submit(): DeleteDistribusis(admindistribusiform) if adminuserform.validate_on_submit(): if adminuserform.delete.data: DeleteUsers(adminuserform) if adminuserform.tutors.data: ToggleUsersAsTutors(adminuserform, True) if adminuserform.nottutors.data: ToggleUsersAsTutors(adminuserform, False) template = render_template( "admin.html", adminuserform=adminuserform, admindistribusiform=admindistribusiform, ) return template def DeleteUsers(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() DeleteUserDistribusis(user) DeleteUserFromDb(user) userform.errors.append(f"User {useremail} deleted!") def ToggleUsersAsTutors(adminuserform, is_tutor): for userform in adminuserform: if "user" in userform.id: if userform.data: useremail = userform.label.text user = User.query.filter_by(email=useremail).first() ToggleUserTutorinDb(user, is_tutor) userform.errors.append(f"Is User {useremail} tutor {is_tutor}") def ToggleUserTutorinDb(user, is_tutor): try: user.tutor = is_tutor db.session.commit() except (InvalidRequestError, DataError, InterfaceError, DatabaseError): db.session.rollback() def DeleteUserFromDb(user): try: db.session.delete(user) db.session.commit() except (InvalidRequestError, DataError, InterfaceError, DatabaseError): db.session.rollback() def DeleteUserDistribusis(user): distribusis = DistribusisInfo.getuserdistribusis(user.email) for distribusi in distribusis: DeleteDistribusiFiles(distribusi.distribusiname) DeleteDistribusiFromDb(distribusi) def DeleteDistribusis(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() DeleteDistribusiFromDb(distribusi) DeleteDistribusiFiles(distribusiname) distribusiform.errors.append("Deleted distribusi") def DeleteDistribusiFromDb(distribusi): try: db.session.delete(distribusi) db.session.commit() except (InvalidRequestError, DataError, InterfaceError, DatabaseError): db.session.rollback() def DeleteDistribusiFiles(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 AddDistribusisToForm(admindistribusiform): distribusis = DistribusisInfo.visibledistribusis() admindistribusiform = AdminDistribusiForm.distribusi_list_form_builder( distribusis ) return admindistribusiform def AddUsersToForm(adminuserform): users = User.query.all() adminuserform = AdminUserForm.user_list_form_builder(users) return adminuserform