forked from crunk/distribusi-verse
crunk
6 months ago
7 changed files with 176 additions and 17 deletions
@ -0,0 +1,8 @@ |
|||||
|
from flask_login import current_user |
||||
|
from models.user_model import User |
||||
|
|
||||
|
def is_adminuser(): |
||||
|
if not current_user.is_authenticated: |
||||
|
return False |
||||
|
user = User.query.filter_by(email=current_user.email).first() |
||||
|
return user.admin |
@ -0,0 +1,118 @@ |
|||||
|
import os |
||||
|
import shutil |
||||
|
|
||||
|
from flask import render_template, Blueprint |
||||
|
from flask_login import current_user, login_required |
||||
|
from sqlalchemy.exc import ( |
||||
|
DatabaseError, |
||||
|
DataError, |
||||
|
InterfaceError, |
||||
|
InvalidRequestError, |
||||
|
) |
||||
|
|
||||
|
from app import db |
||||
|
from admin import is_adminuser |
||||
|
from distribusikan.distribusisinfo 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.getuserdistribusis(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.visibledistribusis() |
||||
|
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 |
@ -0,0 +1,23 @@ |
|||||
|
"""Form object declaration.""" |
||||
|
|
||||
|
from flask_wtf import FlaskForm |
||||
|
from wtforms import BooleanField, SubmitField |
||||
|
|
||||
|
|
||||
|
class AdminDistribusiForm(FlaskForm): |
||||
|
"""Admin Distribusi form.""" |
||||
|
|
||||
|
delete = SubmitField("Delete") |
||||
|
|
||||
|
def distribusi_list_form_builder(distribusis): |
||||
|
class DistribusiListForm(AdminDistribusiForm): |
||||
|
pass |
||||
|
|
||||
|
for i, distribusi in enumerate(distribusis): |
||||
|
setattr( |
||||
|
DistribusiListForm, |
||||
|
f"distribusi_{i}", |
||||
|
BooleanField(label=distribusi.distribusiname), |
||||
|
) |
||||
|
|
||||
|
return DistribusiListForm() |
@ -0,0 +1,23 @@ |
|||||
|
"""Form object declaration.""" |
||||
|
|
||||
|
from flask_wtf import FlaskForm |
||||
|
from wtforms import BooleanField, SubmitField |
||||
|
|
||||
|
|
||||
|
class AdminUserForm(FlaskForm): |
||||
|
"""Admin Userform form.""" |
||||
|
|
||||
|
def user_list_form_builder(users): |
||||
|
class UserListForm(AdminUserForm): |
||||
|
pass |
||||
|
|
||||
|
for i, user in enumerate(users): |
||||
|
setattr( |
||||
|
UserListForm, |
||||
|
f"user_{i}", |
||||
|
BooleanField(label=user.email), |
||||
|
) |
||||
|
|
||||
|
return UserListForm() |
||||
|
|
||||
|
delete = SubmitField("Delete") |
Loading…
Reference in new issue