import os import shutil from flask import flash, render_template from flask_login import current_user from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError, InvalidRequestError) from app import db from distribusikan.distribusisinfo import DistribusisInfo from forms.distribusiform import DistribusiForm from forms.publicthemeform import PublicThemeForm from forms.selectorform import SelectorForm from forms.themeform import ThemeForm from forms.uploadform import UploadForm from models.distribusimodel import Distribusis from models.usermodel import User # UserPengguna from statuspengguna.helper import UserHelper def DistribusiSelector(): uploadform = UploadForm() selectorform = SelectorForm() selectorform.distribusis.choices = DistribusisInfo.userdistribusinames() current_distribusi = UserHelper.current_distribusi() if selectorform.validate_on_submit(): if selectorform.new.data: SelectNewDistribusi() if selectorform.delete.data: selectorform = DeleteDistribusi(selectorform.distribusis.data) selectorform.distribusis.choices = ( DistribusisInfo.userdistribusinames() ) if selectorform.update.data: SelectUpdateDistribusi(selectorform.distribusis.data) current_distribusi = UserHelper.current_distribusi() uploadform = AutoFillInUploadForm(uploadform, current_distribusi) return RenderDistribusiTemplate( selectorform, uploadform, current_distribusi ) def AutoFillInUploadForm(uploadform, current_distribusi): distribusi = Distribusis.query.filter_by( distribusiname=current_distribusi ).first() uploadform.sitename.data = distribusi.distribusiname uploadform.sitename.render_kw = {"readonly": True} uploadform.category.data = distribusi.category uploadform.year.data = distribusi.year uploadform.tags.data = distribusi.tags return uploadform def SelectNewDistribusi(): print("make a new distribusi") SelectCurrentDistribusi("new") def SelectUpdateDistribusi(distribusiname): print(f"Update this distribusi {distribusiname}") SelectCurrentDistribusi(distribusiname) def DeleteDistribusi(distribusiname): print(f"delete this distribusi {distribusiname}") selectorform = SelectorForm() try: user = User.query.filter_by(email=current_user.email).first() distribusi = Distribusis.query.filter_by( distribusiname=distribusiname ).first() if distribusi.userid is user.id: db.session.delete(distribusi) db.session.commit() userfolder = os.path.join("stash", distribusi.distribusiname) if os.path.exists(userfolder): shutil.rmtree(userfolder) cssfolder = os.path.join( "themes/userthemes", distribusi.distribusiname ) if os.path.exists(cssfolder): shutil.rmtree(cssfolder) if distribusi.publictheme is not None: publicthemefolder = os.path.join( "themes/publicthemes", distribusi.distribusiname ) if os.path.exists(publicthemefolder): shutil.rmtree(publicthemefolder) # SelectField error is list is a tuple?? why?? # selectorform.distribusis.errors.append("Distribusi deleted!") except (InvalidRequestError, DataError, InterfaceError, DatabaseError): db.session.rollback() # selectorform.distribusis.errors.append("Unknown error occured!") flash("An error occured !", "danger") return selectorform def SelectCurrentDistribusi(distribusiname): if not current_user.is_authenticated: return user = User.query.filter_by(email=current_user.email).first() try: user.currentdistribusi = distribusiname db.session.commit() except (InvalidRequestError, DataError, InterfaceError, DatabaseError): db.session.rollback() flash("An error occured !", "danger") def DistribusiSelected(): user = User.query.filter_by(email=current_user.email).first() if user.currentdistribusi is None: return False return True def SelectorVisible(): has_distribusi = UserHelper.has_distribusi() distribusi_selected = DistribusiSelected() if distribusi_selected: return False if not has_distribusi: return False return True def RenderDistribusiTemplate(selectorform, uploadform, current_distribusi): distribusiform = DistribusiForm() themeform = ThemeForm() publicthemeform = PublicThemeForm() publicthemeform.publicthemes.choices = DistribusisInfo.publicthemes() files_uploaded = UserHelper.is_zip_uploaded(current_distribusi) distribusi_live = UserHelper.is_distribusi_live(current_distribusi) # because the user has chosen to update his distribusi, we assume # no selected css. css_selected = False selectorvisible = SelectorVisible() limit_reached = UserHelper.distribusi_limit_reached() template = render_template( "distribusi.html", uploadform=uploadform, distribusiform=distribusiform, themeform=themeform, publicthemeform=publicthemeform, selectorform=selectorform, files_uploaded=files_uploaded, distribusi_live=distribusi_live, css_selected=css_selected, selectorvisible=selectorvisible, limit_reached=limit_reached, ) return template