sort, format and move models to folder

This commit is contained in:
crunk 2024-04-21 20:44:08 +02:00
parent dca9666984
commit 9e48758767
31 changed files with 244 additions and 317 deletions

View File

@ -1,21 +1,16 @@
import os
import shutil
from flask import render_template
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
InvalidRequestError)
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
from forms.adminuserform import AdminUserForm
from models.distribusimodel import Distribusis
from models.usermodel import User
def AdminPage():

View File

@ -1,13 +1,11 @@
import sys
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
InvalidRequestError)
from app import create_app, db
from sqlalchemy.exc import (
InvalidRequestError,
InterfaceError,
DataError,
DatabaseError,
)
from usermodel import User # noqa: F401
from distribusimodel import Distribusis # noqa: F401
from models.distribusimodel import Distribusis # noqa: F401
from models.usermodel import User # noqa: F401
def admintool():

View File

@ -1,12 +1,11 @@
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from flask_wtf.csrf import CSRFProtect
from flask_login import (
LoginManager,
)
db = SQLAlchemy()
migrate = Migrate()
@ -26,7 +25,7 @@ def create_app():
APP.config["MAIL_PORT"] = 587
APP.config["MAIL_USE_SSL"] = False
APP.config["MAIL_USE_TLS"] = True
APP.config['MAIL_USERNAME'] = "noreply@vvvvvvaria.org"
APP.config["MAIL_USERNAME"] = "noreply@vvvvvvaria.org"
login_manager.session_protection = "strong"
login_manager.login_view = "index"

View File

@ -1,11 +1,11 @@
def deploy():
"""Run deployment of database."""
from app import create_app, db
from flask_migrate import upgrade, migrate, init, stamp
from flask_migrate import init, migrate, stamp, upgrade
from app import create_app, db
from models.distribusimodel import Distribusis # noqa: F401
# This model is required for flask_migrate to make the table
from usermodel import User # noqa: F401
from distribusimodel import Distribusis # noqa: F401
from models.usermodel import User # noqa: F401
app = create_app()
app.app_context().push()

View File

@ -1,28 +1,22 @@
import os
import shutil
from flask import flash, render_template
from flask_login import current_user
from sqlalchemy.exc import (
DataError,
DatabaseError,
InterfaceError,
InvalidRequestError,
)
from usermodel import User
from distribusimodel import Distribusis
from distribusisinfo import DistribusisInfo
from forms.selectorform import SelectorForm
from forms.uploadform import UploadForm
from forms.distribusiform import DistribusiForm
from forms.themeform import ThemeForm
from forms.publicthemeform import PublicThemeForm
# UserPengguna
from statuspengguna.helper import UserHelper
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
InvalidRequestError)
from app import db
from 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():

View File

@ -1,7 +1,7 @@
from flask_login import current_user
from usermodel import User
from distribusimodel import Distribusis
from models.distribusimodel import Distribusis
from models.usermodel import User
class DistribusisInfo:

View File

@ -1,40 +1,28 @@
import os
import shutil
import zipfile
from flask_login import current_user
from flask import (
render_template,
redirect,
url_for,
flash,
)
from sqlalchemy.exc import (
InvalidRequestError,
DataError,
InterfaceError,
DatabaseError,
)
from app import db
from usermodel import User
from distribusimodel import Distribusis
# UserPengguna
from statuspengguna.helper import UserHelper
from distribusiselector import SelectorVisible
# Forms!
from forms.uploadform import UploadForm
from forms.distribusiform import DistribusiForm
from forms.themeform import ThemeForm
from forms.publicthemeform import PublicThemeForm
from forms.selectorform import SelectorForm
from distribusisinfo import DistribusisInfo
# Tada!
from distribusi.cli import build_argparser
from distribusi.distribusi import distribusify
from flask import flash, redirect, render_template, url_for
from flask_login import current_user
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
InvalidRequestError)
from app import db
from distribusiselector import SelectorVisible
from distribusisinfo import DistribusisInfo
from forms.distribusiform import DistribusiForm
from forms.publicthemeform import PublicThemeForm
from forms.selectorform import SelectorForm
from forms.themeform import ThemeForm
# Forms!
from forms.uploadform import UploadForm
from models.distribusimodel import Distribusis
from models.usermodel import User
# UserPengguna
from statuspengguna.helper import UserHelper
def DistribusiWorkflow():
@ -78,7 +66,7 @@ def CleanUpDistribusiFiles(userfolder):
def RemoveMacFolders(path):
for filename in os.listdir(path):
fullpath = os.path.join(path, filename)
if filename.startswith('.'):
if filename.startswith("."):
if os.path.isdir(fullpath):
shutil.rmtree(fullpath)
else:

View File

@ -1,28 +1,23 @@
import os
import shutil
import bleach
from bleach_allowlist import all_styles
import shutil
from flask import render_template
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
InvalidRequestError)
from werkzeug.utils import secure_filename
from sqlalchemy.exc import (
DataError,
DatabaseError,
InterfaceError,
InvalidRequestError,
)
from app import db
from distribusimodel import Distribusis
from statuspengguna.helper import UserHelper
from distribusisinfo import DistribusisInfo
from forms.uploadform import UploadForm
from forms.distribusiform import DistribusiForm
from forms.themeform import ThemeForm
from forms.publicthemeform import PublicThemeForm
from forms.editorform import EditorForm
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 statuspengguna.helper import UserHelper
def Editor():
@ -68,7 +63,7 @@ def SaveUploadCssFile(editorform, newcssfolder):
cssfile.save(os.path.join(newcssfolder, cssfilename))
openfile = open(os.path.join(newcssfolder, cssfilename), "r")
cleancss = bleach.clean(openfile.read(), all_styles)
cleancss = cleancss.replace('>', '>')
cleancss = cleancss.replace(">", ">")
openfile.close()
cleanfile = open(os.path.join(newcssfolder, cssfilename), "w")
cleanfile.write(cleancss)
@ -81,7 +76,7 @@ def WriteCssToFile(editorform, newcssfolder):
cssfilename = f"{secure_filename(editorform.cssname.data)}.css"
cleancss = bleach.clean(editorform.css.data, all_styles)
cleancss = cleancss.replace('>', '>')
cleancss = cleancss.replace(">", ">")
with open(os.path.join(newcssfolder, cssfilename), "w") as cssfile:
cssfile.write(cleancss)
cssfile.close
@ -91,8 +86,7 @@ def CopyPublicToUserFolder(editorform, publicfolder, newcssfolder):
if not os.path.exists(newcssfolder):
os.mkdir(newcssfolder)
copycssfile = os.path.join(
publicfolder,
f"{secure_filename(editorform.cssname.data)}.css"
publicfolder, f"{secure_filename(editorform.cssname.data)}.css"
)
print(f"copying file: {copycssfile}")
print(f"to folder: {newcssfolder}")

View File

@ -1,9 +1,7 @@
"""Form object declaration."""
from flask_wtf import FlaskForm
from wtforms import (
BooleanField,
SubmitField,
)
from wtforms import BooleanField, SubmitField
class AdminDistribusiForm(FlaskForm):
@ -15,7 +13,7 @@ class AdminDistribusiForm(FlaskForm):
class DistribusiListForm(AdminDistribusiForm):
pass
for (i, distribusi) in enumerate(distribusis):
for i, distribusi in enumerate(distribusis):
setattr(
DistribusiListForm,
f"distribusi_{i}",

View File

@ -1,9 +1,7 @@
"""Form object declaration."""
from flask_wtf import FlaskForm
from wtforms import (
SubmitField,
BooleanField,
)
from wtforms import BooleanField, SubmitField
class AdminUserForm(FlaskForm):
@ -13,7 +11,7 @@ class AdminUserForm(FlaskForm):
class UserListForm(AdminUserForm):
pass
for (i, user) in enumerate(users):
for i, user in enumerate(users):
setattr(
UserListForm,
f"user_{i}",

View File

@ -1,15 +1,10 @@
"""Form to save your CSS editor work."""
from wtforms import (
StringField,
TextAreaField,
BooleanField,
SubmitField,
)
from wtforms import validators
from wtforms.validators import Length
from flask_wtf.file import FileField, FileAllowed, FileSize
from flask_wtf import FlaskForm
from flask_wtf.file import FileAllowed, FileField, FileSize
from wtforms import (BooleanField, StringField, SubmitField, TextAreaField,
validators)
from wtforms.validators import Length
class EditorForm(FlaskForm):

View File

@ -1,12 +1,8 @@
"""Forgotten password form to help user."""
from wtforms import (
StringField,
SubmitField,
)
from wtforms import validators
from wtforms.validators import Length, Email
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, validators
from wtforms.validators import Email, Length
class ForgotPasswordForm(FlaskForm):

View File

@ -1,13 +1,8 @@
"""Login form to validate user."""
from wtforms import (
StringField,
SubmitField,
PasswordField,
)
from wtforms import validators
from wtforms.validators import Length, Email
from flask_wtf import FlaskForm
from wtforms import PasswordField, StringField, SubmitField, validators
from wtforms.validators import Email, Length
class LoginForm(FlaskForm):

View File

@ -1,9 +1,7 @@
"""Form object declaration."""
from flask_wtf import FlaskForm
from wtforms import (
RadioField,
SubmitField,
)
from wtforms import RadioField, SubmitField
class PublicThemeForm(FlaskForm):

View File

@ -1,13 +1,8 @@
"""Register form to make a new user."""
from wtforms import (
StringField,
SubmitField,
PasswordField,
)
from wtforms import validators
from wtforms.validators import Length, Email, EqualTo, ValidationError
from flask_wtf import FlaskForm
from wtforms import PasswordField, StringField, SubmitField, validators
from wtforms.validators import Email, EqualTo, Length, ValidationError
class RegisterForm(FlaskForm):
@ -29,7 +24,7 @@ class RegisterForm(FlaskForm):
Email(),
Length(6, 64),
hremail,
]
],
)
password = PasswordField(

View File

@ -1,12 +1,8 @@
"""Reset Password Form form to reset a users PasswordField."""
from wtforms import (
SubmitField,
PasswordField,
)
from wtforms import validators
from wtforms.validators import Length, EqualTo
from flask_wtf import FlaskForm
from wtforms import PasswordField, SubmitField, validators
from wtforms.validators import EqualTo, Length
class ResetPasswordForm(FlaskForm):

View File

@ -1,5 +1,5 @@
from flask_wtf import FlaskForm
from wtforms import SubmitField, SelectField
from wtforms import SelectField, SubmitField
class SelectorForm(FlaskForm):

View File

@ -1,9 +1,7 @@
"""Form object declaration."""
from flask_wtf import FlaskForm
from wtforms import (
RadioField,
SubmitField,
)
from wtforms import RadioField, SubmitField
class ThemeForm(FlaskForm):

View File

@ -1,18 +1,9 @@
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed, FileRequired, FileSize
from wtforms import validators
from wtforms.validators import (
Length,
NumberRange,
DataRequired,
ValidationError,
)
from wtforms import (
SubmitField,
StringField,
IntegerField,
SelectField,
)
from flask_wtf.file import FileAllowed, FileField, FileRequired, FileSize
from wtforms import (IntegerField, SelectField, StringField, SubmitField,
validators)
from wtforms.validators import (DataRequired, Length, NumberRange,
ValidationError)
class UploadForm(FlaskForm):
@ -24,40 +15,44 @@ class UploadForm(FlaskForm):
sitename = StringField(
"Name of your archive section:",
validators=[validators.InputRequired(), Length(2, 100), _distribusiname],
validators=[
validators.InputRequired(),
Length(2, 100),
_distribusiname,
],
)
year = SelectField(
"Year:",
validate_choice=True,
coerce=str,
choices=[
(u'2017', u'2017'),
(u'2018', u'2018'),
(u'2019', u'2019'),
(u'2020', u'2020'),
(u'2021', u'2021'),
(u'2022', u'2022'),
(u'2023', u'2023'),
(u'2024', u'2024'),
(u'2025', u'2025'),
("2017", "2017"),
("2018", "2018"),
("2019", "2019"),
("2020", "2020"),
("2021", "2021"),
("2022", "2022"),
("2023", "2023"),
("2024", "2024"),
("2025", "2025"),
],
option_widget=None,
validators=[DataRequired()]
validators=[DataRequired()],
)
category = SelectField(
"Category:",
validate_choice=True,
coerce=str,
choices=[
(u'event', u'event'),
(u'gathering', u'gathering'),
(u'work session', u'work session'),
(u'workgroup', u'workgroup'),
(u'performance', u'performance'),
(u'music event', u'music event'),
("event", "event"),
("gathering", "gathering"),
("work session", "work session"),
("workgroup", "workgroup"),
("performance", "performance"),
("music event", "music event"),
],
option_widget=None,
validators=[DataRequired()]
validators=[DataRequired()],
)
tags = StringField(
"Add tags, seperated by commas. No need for the '#' sign:",

View File

@ -3,9 +3,8 @@ from __future__ import with_statement
import logging
from logging.config import fileConfig
from flask import current_app
from alembic import context
from flask import current_app
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
@ -14,17 +13,19 @@ config = context.config
# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)
logger = logging.getLogger('alembic.env')
logger = logging.getLogger("alembic.env")
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
config.set_main_option(
'sqlalchemy.url',
str(current_app.extensions['migrate'].db.get_engine().url).replace(
'%', '%%'))
target_metadata = current_app.extensions['migrate'].db.metadata
"sqlalchemy.url",
str(current_app.extensions["migrate"].db.get_engine().url).replace(
"%", "%%"
),
)
target_metadata = current_app.extensions["migrate"].db.metadata
# other values from the config, defined by the needs of env.py,
# can be acquired:
@ -65,20 +66,20 @@ def run_migrations_online():
# when there are no changes to the schema
# reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html
def process_revision_directives(context, revision, directives):
if getattr(config.cmd_opts, 'autogenerate', False):
if getattr(config.cmd_opts, "autogenerate", False):
script = directives[0]
if script.upgrade_ops.is_empty():
directives[:] = []
logger.info('No changes in schema detected.')
logger.info("No changes in schema detected.")
connectable = current_app.extensions['migrate'].db.get_engine()
connectable = current_app.extensions["migrate"].db.get_engine()
with connectable.connect() as connection:
context.configure(
connection=connection,
target_metadata=target_metadata,
process_revision_directives=process_revision_directives,
**current_app.extensions['migrate'].configure_args
**current_app.extensions["migrate"].configure_args,
)
with context.begin_transaction():

View File

@ -0,0 +1,23 @@
from app import db
class Distribusis(db.Model):
"""distribusi model class for a single distribusi in distribusi-verse"""
__tablename__ = "distribusis"
id = db.Column(db.Integer, primary_key=True)
distribusiname = db.Column(db.String(300), nullable=False, unique=True)
userid = db.Column(db.Integer, db.ForeignKey("users.id"))
term = db.Column(db.String(5), nullable=False, unique=False)
category = db.Column(db.String(500), nullable=True, unique=False)
# Academic year eg:2020-2021, so no need for a Datetime object
year = db.Column(db.String(9), nullable=True, unique=False)
tags = db.Column(db.String(500), nullable=True, unique=False)
publictheme = db.Column(db.String(300), unique=True, nullable=True)
visible = db.Column(db.Boolean, default=False)
def __repr__(self):
return "<Distribusi %r>" % self.distribusiname

23
verse/models/usermodel.py Normal file
View File

@ -0,0 +1,23 @@
from flask_login import UserMixin
from app import db
class User(UserMixin, db.Model):
"""User model class for a user in distribusi-verse"""
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(150), unique=True, nullable=False)
email = db.Column(db.String(150), unique=True, nullable=False)
password = db.Column(db.String(300), nullable=False, unique=False)
currentdistribusi = db.Column(db.String(300), nullable=True, unique=False)
resethash = db.Column(db.String(300), nullable=True, unique=True)
resettime = db.Column(db.DateTime)
# active = db.Column(db.Boolean, default=False)
tutor = db.Column(db.Boolean, default=False)
admin = db.Column(db.Boolean, default=False)
def __repr__(self):
return "<User %r>" % self.email

View File

@ -1,45 +1,33 @@
"""This is the main flask distribusi page"""
from datetime import timedelta
from flask import (
render_template,
redirect,
url_for,
session,
send_from_directory,
Blueprint,
)
from flask_login import (
logout_user,
login_required,
current_user,
)
from flask import (Blueprint, redirect, render_template, send_from_directory,
session, url_for)
from flask_login import current_user, login_required, logout_user
from flask_mail import Mail
from flask_wtf.csrf import CSRFError
from app import create_app, login_manager
from usermodel import User
from distribusimodel import Distribusis
# Use upload form to populate filters
from forms.uploadform import UploadForm
# Interface! these are seperate files in main folder
from adminpage import AdminPage
from editor import Editor
from themeselector import ThemeSelector
from distribusiworkflow import DistribusiWorkflow
from app import create_app, login_manager
from distribusiselector import DistribusiSelector
from uploadpage import UploadPage
# Distribusi Information
from distribusisinfo import DistribusisInfo
from distribusiworkflow import DistribusiWorkflow
from editor import Editor
# Use upload form to populate filters
from forms.uploadform import UploadForm
from models.distribusimodel import Distribusis
from models.usermodel import User
from statuspengguna.forgotpassword import ForgotPassword
# UserPengguna
from statuspengguna.helper import UserHelper
from statuspengguna.loginuser import LoginUser
from statuspengguna.registeruser import RegisterUser
from statuspengguna.forgotpassword import ForgotPassword
from statuspengguna.resetpassword import ResetPassword
# Distribusi Information
from distribusisinfo import DistribusisInfo
from themeselector import ThemeSelector
from uploadpage import UploadPage
APP = create_app()
stash_page = Blueprint("stash_page", __name__, static_folder="stash")
@ -56,7 +44,6 @@ def session_handler():
@APP.route("/")
def index():
UserHelper.reset_user_state()
# http://localhost:5000/themes/publicthemes/RomeroTape/blueskies.css
uploadform = UploadForm()
distribusis = DistribusisInfo.visibledistribusis()
distribusisindex = {}
@ -66,7 +53,6 @@ def index():
"username": user.username,
"publictheme": distribusi.publictheme,
"category": distribusi.term,
"course": distribusi.course,
"year": distribusi.year,
"tags": distribusi.tags.split(","),
}

View File

@ -1,17 +1,14 @@
from uuid import uuid1
from datetime import datetime
from sqlalchemy.exc import (
DataError,
DatabaseError,
InterfaceError,
InvalidRequestError,
)
from uuid import uuid1
from flask import render_template
from flask_mail import Message
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
InvalidRequestError)
from usermodel import User
from forms.forgotpasswordform import ForgotPasswordForm
from app import db
from forms.forgotpasswordform import ForgotPasswordForm
from models.usermodel import User
def ForgotPassword(mail):

View File

@ -1,17 +1,14 @@
import os
from flask_login import current_user
from flask import flash
from sqlalchemy.exc import (
DataError,
DatabaseError,
InterfaceError,
InvalidRequestError,
)
from usermodel import User
from distribusimodel import Distribusis
from distribusisinfo import DistribusisInfo
from flask import flash
from flask_login import current_user
from sqlalchemy.exc import (DatabaseError, DataError, InterfaceError,
InvalidRequestError)
from app import db
from distribusisinfo import DistribusisInfo
from models.distribusimodel import Distribusis
from models.usermodel import User
class UserHelper:

View File

@ -1,15 +1,9 @@
from flask import (
render_template,
redirect,
request,
flash,
url_for,
abort,
)
from usermodel import User
from forms.loginform import LoginForm
from flask_login import login_user
from flask import abort, flash, redirect, render_template, request, url_for
from flask_bcrypt import check_password_hash
from flask_login import login_user
from forms.loginform import LoginForm
from models.usermodel import User
def LoginUser():

View File

@ -1,22 +1,13 @@
from flask import (
render_template,
redirect,
flash,
url_for,
)
from sqlalchemy.exc import (
IntegrityError,
DataError,
DatabaseError,
InterfaceError,
InvalidRequestError,
)
from werkzeug.routing import BuildError
from usermodel import User
from forms.registerform import RegisterForm
from flask_login import login_user
from flask import flash, redirect, render_template, url_for
from flask_bcrypt import generate_password_hash
from flask_login import login_user
from sqlalchemy.exc import (DatabaseError, DataError, IntegrityError,
InterfaceError, InvalidRequestError)
from werkzeug.routing import BuildError
from app import db
from forms.registerform import RegisterForm
from models.usermodel import User
def RegisterUser():

View File

@ -1,23 +1,15 @@
from datetime import datetime
from flask import (
render_template,
redirect,
flash,
url_for,
)
from sqlalchemy.exc import (
IntegrityError,
DataError,
DatabaseError,
InterfaceError,
InvalidRequestError,
)
from werkzeug.routing import BuildError
from usermodel import User
from forms.resetpasswordform import ResetPasswordForm
from flask_login import login_user
from flask import flash, redirect, render_template, url_for
from flask_bcrypt import generate_password_hash
from flask_login import login_user
from sqlalchemy.exc import (DatabaseError, DataError, IntegrityError,
InterfaceError, InvalidRequestError)
from werkzeug.routing import BuildError
from app import db
from forms.resetpasswordform import ResetPasswordForm
from models.usermodel import User
def ResetPassword(path):

View File

@ -1,15 +1,15 @@
import os
import shutil
from flask import render_template
from statuspengguna.helper import UserHelper
from distribusisinfo import DistribusisInfo
from forms.uploadform import UploadForm
from forms.distribusiform import DistribusiForm
from forms.themeform import ThemeForm
from forms.publicthemeform import PublicThemeForm
from forms.selectorform import SelectorForm
from forms.themeform import ThemeForm
from forms.uploadform import UploadForm
from statuspengguna.helper import UserHelper
def ThemeSelector():
@ -30,9 +30,7 @@ def ThemeSelector():
)
MoveCssToUserFolder(current_distribusi, copycssfile)
return RenderDistribusiTemplate(
themeform,
publicthemeform,
current_distribusi
themeform, publicthemeform, current_distribusi
)

View File

@ -1,22 +1,17 @@
import os
import shutil
from flask import flash
from flask_login import current_user
from sqlalchemy.exc import (
IntegrityError,
InvalidRequestError,
DataError,
InterfaceError,
DatabaseError,
)
from sqlalchemy.exc import (DatabaseError, DataError, IntegrityError,
InterfaceError, InvalidRequestError)
from app import db
from usermodel import User
from distribusimodel import Distribusis
from statuspengguna.helper import UserHelper
from distribusiselector import SelectCurrentDistribusi
from forms.uploadform import UploadForm
from models.distribusimodel import Distribusis
from models.usermodel import User
from statuspengguna.helper import UserHelper
def UploadNewDistribusi(uploadfolder):

View File

@ -1,16 +1,14 @@
from flask import render_template
from distribusiselector import SelectorVisible
from distribusisinfo import DistribusisInfo
from forms.distribusiform import DistribusiForm
from forms.themeform import ThemeForm
from forms.publicthemeform import PublicThemeForm
from forms.selectorform import SelectorForm
from forms.themeform import ThemeForm
# UserPengguna
from statuspengguna.helper import UserHelper
from upload import UploadNewDistribusi, UploadUpdatedFiles
from distribusisinfo import DistribusisInfo
from distribusiselector import SelectorVisible
def UploadPage(uploadfolder):