The U and D part of CRUD

This commit is contained in:
crunk 2022-03-04 19:08:55 +01:00
parent ed9e9af4ac
commit fc4b1a5c75
5 changed files with 183 additions and 88 deletions

View File

@ -1,20 +1,11 @@
from flask import ( import os
render_template, import shutil
redirect, from flask import flash
request,
flash,
url_for,
abort,
)
from usermodel import User
from flask_login import current_user from flask_login import current_user
from forms.loginform import LoginForm from usermodel import User
from forms.uploadform import UploadForm from distribusimodel import Distribusis
from forms.distribusiform import DistribusiForm
from forms.themeform import ThemeForm
from forms.editorform import EditorForm
from forms.selectorform import SelectorForm from forms.selectorform import SelectorForm
from statuspengguna.helper import HasDistribusi from statuspengguna.helper import HasDistribusi
@ -25,30 +16,50 @@ from app import db
def SelectNewDistribusi(): def SelectNewDistribusi():
print("make a new distribusi") print("make a new distribusi")
selectorform = SelectorForm()
user = User.query.filter_by(email=current_user.email).first() user = User.query.filter_by(email=current_user.email).first()
try: try:
user.currentdistribusi = "new" user.currentdistribusi = "new"
db.session.commit() db.session.commit()
except: except:
db.session.rollback() db.session.rollback()
selectorform.new.errors.append("Unknown error occured!") selectorform.distribusis.errors.append("Unknown error occured!")
flash("An error occured !", "danger") flash("An error occured !", "danger")
return selectorform
def SelectUpdateDistribusi(distribusiname): def SelectUpdateDistribusi(distribusiname):
print(f"Update this distribusi {distribusiname}") print(f"Update this distribusi {distribusiname}")
selectorform = SelectorForm()
user = User.query.filter_by(email=current_user.email).first() user = User.query.filter_by(email=current_user.email).first()
try: try:
user.currentdistribusi = distribusiname user.currentdistribusi = distribusiname
db.session.commit() db.session.commit()
except: except:
db.session.rollback() db.session.rollback()
selectorform.new.errors.append("Unknown error occured!") selectorform.distribusis.errors.append("Unknown error occured!")
flash("An error occured !", "danger") flash("An error occured !", "danger")
return selectorform
def DeleteDistribusi(distribusiname): def DeleteDistribusi(distribusiname):
print(f"delete this distribusi {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)
shutil.rmtree(userfolder)
except:
db.session.rollback()
selectorform.distribusis.errors.append("Unknown error occured!")
flash("An error occured !", "danger")
return selectorform
def SelectorVisible(): def SelectorVisible():

View File

@ -8,15 +8,10 @@ from datetime import timedelta
from flask import ( from flask import (
render_template, render_template,
redirect, redirect,
flash,
url_for, url_for,
session, session,
send_from_directory, send_from_directory,
) )
from sqlalchemy.exc import (
IntegrityError,
InvalidRequestError,
)
from flask_login import ( from flask_login import (
logout_user, logout_user,
login_required, login_required,
@ -42,9 +37,14 @@ from selector import SelectUpdateDistribusi
from selector import DeleteDistribusi from selector import DeleteDistribusi
from selector import SelectorVisible from selector import SelectorVisible
# Upload
from upload import UploadNewDistribusi
from upload import UploadUpdatedFiles
from statuspengguna.helper import AreFilesUploaded # UserPengguna
from statuspengguna.helper import IsZipUploaded
from statuspengguna.helper import CurrentDistribusi from statuspengguna.helper import CurrentDistribusi
from statuspengguna.helper import ResetUserState
from statuspengguna.loginuser import LoginUser from statuspengguna.loginuser import LoginUser
from statuspengguna.registeruser import RegisterUser from statuspengguna.registeruser import RegisterUser
@ -63,6 +63,7 @@ def session_handler():
@APP.route("/") @APP.route("/")
def index(): def index():
ResetUserState()
distribusis = Distribusis.query.filter( distribusis = Distribusis.query.filter(
Distribusis.distribusiname.isnot(None) Distribusis.distribusiname.isnot(None)
).all() ).all()
@ -82,10 +83,9 @@ def distribusi():
selectorform = SelectorForm() selectorform = SelectorForm()
selectorform.distribusis.choices = distribusisfields() selectorform.distribusis.choices = distribusisfields()
files_uploaded = AreFilesUploaded()
selectorvisible = SelectorVisible() selectorvisible = SelectorVisible()
current_distribusi = CurrentDistribusi() current_distribusi = CurrentDistribusi()
files_uploaded = IsZipUploaded(current_distribusi)
user = User.query.filter_by(email=current_user.email).first() user = User.query.filter_by(email=current_user.email).first()
distribusi = Distribusis.query.filter_by( distribusi = Distribusis.query.filter_by(
distribusiname=current_distribusi distribusiname=current_distribusi
@ -130,53 +130,20 @@ def distribusi():
@APP.route("/upload", methods=["POST"]) @APP.route("/upload", methods=["POST"])
@login_required @login_required
def upload(): def upload():
uploadform = UploadForm()
distribusiform = DistribusiForm() distribusiform = DistribusiForm()
themeform = ThemeForm() themeform = ThemeForm()
selectorform = SelectorForm() selectorform = SelectorForm()
selectorform.distribusis.choices = distribusisfields() selectorform.distribusis.choices = distribusisfields()
files_uploaded = AreFilesUploaded()
selectorvisible = SelectorVisible() selectorvisible = SelectorVisible()
if uploadform.validate_on_submit(): current_distribusi = CurrentDistribusi()
user = User.query.filter_by(email=current_user.email).first() if current_distribusi == "new":
uploadform = UploadNewDistribusi(APP.config["UPLOAD_FOLDER"])
else:
uploadform = UploadUpdatedFiles(APP.config["UPLOAD_FOLDER"])
files_uploaded = IsZipUploaded(uploadform.sitename.data)
try:
newdistribusi = Distribusis(
distribusiname=uploadform.sitename.data,
userid=user.id,
term=uploadform.term.data,
course=uploadform.course.data,
year=uploadform.academicyear.data,
tags=uploadform.tags.data,
)
user.currentdistribusi = uploadform.sitename.data
db.session.add(newdistribusi)
db.session.commit()
except InvalidRequestError:
db.session.rollback()
uploadform.sitename.errors.append("Something went wrong!")
flash("Something went wrong!", "danger")
except IntegrityError:
db.session.rollback()
uploadform.sitename.errors.append(
"distribusi name already exists!"
)
flash("distribusi name already exists!", "warning")
zipfilename = "{}.zip".format(newdistribusi.distribusiname)
zipfile = uploadform.zipfile.data
zipfile.save(os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename))
newuserfolder = os.path.join("stash", newdistribusi.distribusiname)
if not os.path.exists(newuserfolder):
os.mkdir(newuserfolder)
copyzipfile = os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename)
shutil.copy(copyzipfile, newuserfolder)
os.remove(os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename))
files_uploaded = AreFilesUploaded()
template = render_template( template = render_template(
"distribusi.html", "distribusi.html",
uploadform=uploadform, uploadform=uploadform,
@ -198,9 +165,9 @@ def theme():
selectorform = SelectorForm() selectorform = SelectorForm()
selectorform.distribusis.choices = distribusisfields() selectorform.distribusis.choices = distribusisfields()
files_uploaded = AreFilesUploaded()
selectorvisible = SelectorVisible() selectorvisible = SelectorVisible()
current_distribusi = CurrentDistribusi() current_distribusi = CurrentDistribusi()
files_uploaded = IsZipUploaded(current_distribusi)
if themeform.validate_on_submit(): if themeform.validate_on_submit():
newuserfolder = os.path.join("stash", current_distribusi) newuserfolder = os.path.join("stash", current_distribusi)
@ -226,9 +193,8 @@ def theme():
@login_required @login_required
def editor(): def editor():
editorform = EditorForm() editorform = EditorForm()
files_uploaded = AreFilesUploaded()
current_distribusi = CurrentDistribusi() current_distribusi = CurrentDistribusi()
files_uploaded = IsZipUploaded(current_distribusi)
if editorform.validate_on_submit(): if editorform.validate_on_submit():
userfolder = os.path.join("stash", current_distribusi) userfolder = os.path.join("stash", current_distribusi)
cssfilename = "{}.css".format(editorform.cssname.data) cssfilename = "{}.css".format(editorform.cssname.data)
@ -253,17 +219,31 @@ def selector():
themeform = ThemeForm() themeform = ThemeForm()
selectorform = SelectorForm() selectorform = SelectorForm()
selectorform.distribusis.choices = distribusisfields() selectorform.distribusis.choices = distribusisfields()
current_distribusi = CurrentDistribusi()
files_uploaded = AreFilesUploaded()
selectorvisible = SelectorVisible()
if selectorform.validate_on_submit(): if selectorform.validate_on_submit():
if selectorform.new.data: if selectorform.new.data:
SelectNewDistribusi() selectorform = SelectNewDistribusi()
if selectorform.delete.data: if selectorform.delete.data:
DeleteDistribusi(selectorform.distribusis.data) selectorform = DeleteDistribusi(selectorform.distribusis.data)
selectorform.distribusis.choices = distribusisfields()
if selectorform.update.data: if selectorform.update.data:
SelectUpdateDistribusi(selectorform.distribusis.data) selectorform = SelectUpdateDistribusi(
selectorform.distribusis.data
)
current_distribusi = CurrentDistribusi()
distribusi = Distribusis.query.filter_by(
distribusiname=current_distribusi
).first()
uploadform.sitename.data = distribusi.distribusiname
uploadform.sitename.render_kw = {"readonly": True}
uploadform.term.data = distribusi.term
uploadform.course.data = distribusi.course
uploadform.academicyear.data = distribusi.year
uploadform.tags.data = distribusi.tags
files_uploaded = IsZipUploaded(current_distribusi)
selectorvisible = SelectorVisible()
template = render_template( template = render_template(
"distribusi.html", "distribusi.html",
uploadform=uploadform, uploadform=uploadform,

View File

@ -1,19 +1,20 @@
import os import os
from flask_login import current_user from flask_login import current_user
from flask import flash
from usermodel import User from usermodel import User
from distribusimodel import Distribusis from distribusimodel import Distribusis
from app import db
def AreFilesUploaded(): def IsZipUploaded(distribusiname):
user = User.query.filter_by(email=current_user.email).first() userfolder = os.path.join("stash", distribusiname)
distribusi = Distribusis.query.filter_by(userid=user.id).first() if os.path.exists(userfolder):
if distribusi is None: zipfilename = "{}.zip".format(distribusiname)
if os.path.exists(os.path.join(userfolder, zipfilename)):
print("folder with zipfile found, file uploaded")
return True
print("distribusi folder is empty") print("distribusi folder is empty")
return False return False
userfolder = os.path.join("stash", distribusi.distribusiname)
if os.path.exists(userfolder):
print("folder found, files are uploaded")
return True
def HasDistribusi(): def HasDistribusi():
@ -32,7 +33,7 @@ def CurrentDistribusi():
user = User.query.filter_by(email=current_user.email).first() user = User.query.filter_by(email=current_user.email).first()
if user.currentdistribusi is None: if user.currentdistribusi is None:
return "None" return "None"
if user.currentdistribusi is "new": if user.currentdistribusi == "new":
return "new" return "new"
return user.currentdistribusi return user.currentdistribusi
@ -43,6 +44,19 @@ def DistribusiSelected():
return False return False
return True return True
def ResetUserState():
"""reset user state upon visiting index, so that distribusi workflow can
be done correctly"""
try:
user = User.query.filter_by(email=current_user.email).first()
user.currentdistribusi = None
db.session.commit()
except:
db.session.rollback()
flash("An error occured !", "danger")
# def IsThemeSelected # def IsThemeSelected
# def IsCustomThemePresent # def IsCustomThemePresent
# def IsDistribusiLive # def IsDistribusiLive

View File

@ -1,5 +1,5 @@
<div id="distribusi" class="workflow"> <div id="distribusi" class="workflow">
<h3>Welcome back to your Distribusi</h3> <h2>Welcome back to your Distribusi</h2>
<p>You have already uploaded a distribusi website, do you want to make a new one, update or delete?</p> <p>You have already uploaded a distribusi website, do you want to make a new one, update or delete?</p>
<form method="POST" enctype="multipart/form-data" action="{{ url_for('selector') }}"> <form method="POST" enctype="multipart/form-data" action="{{ url_for('selector') }}">
{{ selectorform.csrf_token }} {{ selectorform.csrf_token }}
@ -13,13 +13,15 @@
</div> </div>
</fieldset> </fieldset>
<fieldset class="button required multiselect"> <fieldset class="button required multiselect">
{{ selectorform.new }}
</fieldset>
<fieldset class="button required multiselect">
{{ selectorform.update }} {{ selectorform.update }}
</fieldset> </fieldset>
<fieldset class="button required multiselect warning"> <fieldset class="button required multiselect warning">
{{ selectorform.delete }} {{ selectorform.delete }}
</fieldset> </fieldset>
<p>Alternatively you can make a new site</p>
<fieldset class="button required multiselect">
{{ selectorform.new }}
</fieldset>
</form> </form>
</div> </div>

88
verse/upload.py Normal file
View File

@ -0,0 +1,88 @@
import os
import shutil
from flask import flash
from sqlalchemy.exc import (
IntegrityError,
InvalidRequestError,
)
from usermodel import User
from distribusimodel import Distribusis
from flask_login import current_user
from statuspengguna.helper import CurrentDistribusi
from forms.uploadform import UploadForm
from app import db
def UploadNewDistribusi(uploadfolder):
uploadform = UploadForm()
if uploadform.validate_on_submit():
user = User.query.filter_by(email=current_user.email).first()
try:
newdistribusi = Distribusis(
distribusiname=uploadform.sitename.data,
userid=user.id,
term=uploadform.term.data,
course=uploadform.course.data,
year=uploadform.academicyear.data,
tags=uploadform.tags.data,
)
user.currentdistribusi = uploadform.sitename.data
db.session.add(newdistribusi)
db.session.commit()
except InvalidRequestError:
db.session.rollback()
uploadform.sitename.errors.append("Something went wrong!")
flash("Something went wrong!", "danger")
except IntegrityError:
db.session.rollback()
uploadform.sitename.errors.append(
"distribusi name already exists!"
)
flash("distribusi name already exists!", "warning")
zipfilename = "{}.zip".format(newdistribusi.distribusiname)
zipfile = uploadform.zipfile.data
zipfile.save(os.path.join(uploadfolder, zipfilename))
newuserfolder = os.path.join("stash", newdistribusi.distribusiname)
if not os.path.exists(newuserfolder):
os.mkdir(newuserfolder)
copyzipfile = os.path.join(uploadfolder, zipfilename)
shutil.copy(copyzipfile, newuserfolder)
os.remove(os.path.join(uploadfolder, zipfilename))
return uploadform
def UploadUpdatedFiles(uploadfolder):
uploadform = UploadForm()
if uploadform.validate_on_submit():
try:
current_distribusi = CurrentDistribusi()
distribusi = Distribusis.query.filter_by(
distribusiname=current_distribusi
).first()
distribusi.term = uploadform.term.data
distribusi.course = uploadform.course.data
distribusi.year = uploadform.academicyear.data
distribusi.tags = uploadform.tags.data
db.session.commit()
except:
db.session.rollback()
uploadform.sitename.errors.append("Something went wrong!")
flash("Something went wrong!", "danger")
zipfilename = "{}.zip".format(distribusi.distribusiname)
zipfile = uploadform.zipfile.data
zipfile.save(os.path.join(uploadfolder, zipfilename))
newuserfolder = os.path.join("stash", distribusi.distribusiname)
shutil.rmtree(newuserfolder)
os.mkdir(newuserfolder)
copyzipfile = os.path.join(uploadfolder, zipfilename)
shutil.copy(copyzipfile, newuserfolder)
os.remove(os.path.join(uploadfolder, zipfilename))
return uploadform