distribusi-verse/verse/adminpage.py

127 lines
3.9 KiB
Python

import os
import shutil
from flask import render_template
from sqlalchemy.exc import (
DataError,
DatabaseError,
InterfaceError,
InvalidRequestError,
)
from app import db
from usermodel import User
from distribusimodel import Distribusis
from distribusisinfo import DistribusisInfo
from forms.adminuserform import AdminUserForm
from forms.admindistribusiform import AdminDistribusiForm
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)
shutil.rmtree(userfolder)
cssfolder = os.path.join("themes/userthemes", distribusiname)
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