Css Theme selector buggy as hell, but it works for a bit.

This commit is contained in:
crunk 2022-01-09 17:22:38 +01:00
parent 384964410c
commit fbd1887753
10 changed files with 196 additions and 24 deletions

View File

@ -0,0 +1,8 @@
from flask_wtf import FlaskForm
from wtforms import SubmitField
class DistribusiForm(FlaskForm):
"""Distribusi class to launch your distribusi website"""
submit = SubmitField("Distribusi!")

23
verse/forms/loginform.py Normal file
View File

@ -0,0 +1,23 @@
"""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
class LoginForm(FlaskForm):
"""Login distribusiverse form class."""
email = StringField(
"Email address:",
validators=[validators.InputRequired(), Email(), Length(6, 64)],
)
password = PasswordField(
"Password:", validators=[validators.InputRequired(), Length(12, 72)]
)
submit = SubmitField("Sign In")

View File

@ -0,0 +1,32 @@
"""Register form to make a new user."""
from wtforms import (
StringField,
SubmitField,
PasswordField,
)
from wtforms import validators
from wtforms.validators import Length, Email, EqualTo
from flask_wtf import FlaskForm
class RegisterForm(FlaskForm):
"""Register for distribusi-verse form class"""
email = StringField(
"Email address:",
validators=[validators.InputRequired(), Email(), Length(6, 64)],
)
password = PasswordField(
"New password:",
validators=[validators.InputRequired(), Length(12, 72)],
)
confirmpassword = PasswordField(
"Confirm your password:",
validators=[
validators.InputRequired(),
Length(12, 72),
EqualTo("password", message="Passwords must match !"),
],
)
submit = SubmitField("Register to Distribusi-verse")

21
verse/forms/themeform.py Normal file
View File

@ -0,0 +1,21 @@
"""Form object declaration."""
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import validators
from wtforms import (
RadioField,
SubmitField,
)
class ThemeForm(FlaskForm):
"""Publication upload form."""
theme = RadioField(
"Select your theme:",
choices=[
("hacking", "Hacking"),
("peachsunset", "Peach sunset"),
("wdka", "WdkA")
],
)
save = SubmitField("Save")

23
verse/forms/uploadform.py Normal file
View File

@ -0,0 +1,23 @@
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import validators
from wtforms.validators import Length
from wtforms import (
SubmitField,
StringField,
)
class UploadForm(FlaskForm):
"""File upload class for a new site in distribusi-verse"""
sitename = StringField(
"Name of your website:",
validators=[validators.InputRequired(), Length(6, 100)],
)
zipfile = FileField(
"Upload your zip file with content here:",
validators=[FileAllowed(["zip"], "Zip archives only!")],
)
submit = SubmitField("Upload")

View File

@ -37,10 +37,11 @@ from app import create_app, db, login_manager
from usermodel import User from usermodel import User
# Forms! # Forms!
from loginform import LoginForm from forms.loginform import LoginForm
from registerform import RegisterForm from forms.registerform import RegisterForm
from uploadform import UploadForm from forms.uploadform import UploadForm
from distribusiform import DistribusiForm from forms.distribusiform import DistribusiForm
from forms.themeform import ThemeForm
# Tada! # Tada!
from distribusi.cli import build_argparser from distribusi.cli import build_argparser
@ -129,32 +130,35 @@ def register():
def distribusi(): def distribusi():
uploadform = UploadForm() uploadform = UploadForm()
distribusiform = DistribusiForm() distribusiform = DistribusiForm()
themeform = ThemeForm()
user = User.query.filter_by(email=current_user.email).first() user = User.query.filter_by(email=current_user.email).first()
if user.distribusiname is None: if user.distribusiname is None:
print("nothing to deploy!") print("nothing to deploy!")
if distribusiform.validate_on_submit(): if distribusiform.validate_on_submit():
zipfilename = "{}.zip".format(user.distribusiname) zipfilename = "{}.zip".format(user.distribusiname)
copyzipfile = os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename) userfolder = os.path.join("stash", user.distribusiname)
unzipfile = os.path.join(userfolder, zipfilename)
newuserfolder = os.path.join("stash", user.distribusiname)
os.mkdir(newuserfolder)
shutil.copy(copyzipfile, newuserfolder)
unzipfile = os.path.join(newuserfolder, zipfilename)
with zipfile.ZipFile(unzipfile, "r") as zip_ref: with zipfile.ZipFile(unzipfile, "r") as zip_ref:
# To do, replace extractall with inspection and extract # To do, replace extractall with inspection and extract
zip_ref.extractall(newuserfolder) zip_ref.extractall(userfolder)
os.remove(os.path.join(userfolder, zipfilename))
# To Do: Make sure nothing can be executed from the upload folder
# add the css file
cssfile = ""
for filename in os.listdir(userfolder):
if filename.endswith('.css'):
cssfile = os.path.join(userfolder, filename)
os.remove(os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename))
os.remove(os.path.join(newuserfolder, zipfilename))
# Make sure nothing can be executed from the upload folder
parser = build_argparser() parser = build_argparser()
args = parser.parse_args() args = parser.parse_args(['-s', cssfile])
distribusify(args, newuserfolder) distribusify(args, userfolder)
return redirect(url_for("index")) return redirect(url_for("index"))
template = render_template( template = render_template(
"distribusi.html", "distribusi.html",
uploadform=uploadform, uploadform=uploadform,
distribusiform=distribusiform, distribusiform=distribusiform,
themeform=themeform,
) )
return template return template
@ -165,6 +169,7 @@ def upload():
success = False success = False
uploadform = UploadForm() uploadform = UploadForm()
distribusiform = DistribusiForm() distribusiform = DistribusiForm()
themeform = ThemeForm()
if uploadform.validate_on_submit(): if uploadform.validate_on_submit():
user = User.query.filter_by(email=current_user.email).first() user = User.query.filter_by(email=current_user.email).first()
user.distribusiname = uploadform.sitename.data user.distribusiname = uploadform.sitename.data
@ -174,14 +179,45 @@ def upload():
zipfile = uploadform.zipfile.data zipfile = uploadform.zipfile.data
zipfile.save(os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename)) zipfile.save(os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename))
newuserfolder = os.path.join("stash", user.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))
success = True success = True
template = render_template( template = render_template(
"distribusi.html", "distribusi.html",
uploadform=uploadform, uploadform=uploadform,
distribusiform=distribusiform, distribusiform=distribusiform,
success=success, success=success,
themeform=themeform,
)
return template
@APP.route("/theme", methods=["POST"])
@login_required
def theme():
uploadform = UploadForm()
distribusiform = DistribusiForm()
themeform = ThemeForm()
if themeform.validate_on_submit():
user = User.query.filter_by(email=current_user.email).first()
newuserfolder = os.path.join("stash", user.distribusiname)
copycssfile = os.path.join(
"themes",
"{}.css".format(themeform.theme.data),
) )
return template shutil.copy(copycssfile, newuserfolder)
template = render_template(
"distribusi.html",
uploadform=uploadform,
distribusiform=distribusiform,
themeform=themeform,
)
return template
@APP.route("/stash/<path:path>") @APP.route("/stash/<path:path>")

View File

@ -31,8 +31,19 @@
</div> </div>
<img src="{{ url_for('static', filename='svg/arrow_1.svg')}}" /> <img src="{{ url_for('static', filename='svg/arrow_1.svg')}}" />
<div id="theme" class="workflow"> <div id="theme" class="workflow">
<h3>Step 2: Theme</h3> <h3>(Optional) Step 2: Theme</h3>
<p>dropdown css file selector</p> <p>Select your Theme here. If you want your own custom css, skip and go to
step 3. Don't forget to press Save</p>
<form method="POST" enctype="multipart/form-data" action="{{ url_for('theme') }}">
{{ themeform.csrf_token }}
<fieldset class="required">
{{ themeform.theme.label }}
{{ themeform.theme }}
</fieldset>
<fieldset class="button required">
{{ themeform.save }}
</fieldset>
</form>
</div> </div>
<img src="{{ url_for('static', filename='svg/arrow_2.svg')}}" /> <img src="{{ url_for('static', filename='svg/arrow_2.svg')}}" />
<div id="edit" class="workflow"> <div id="edit" class="workflow">

6
verse/themes/hacking.css Normal file
View File

@ -0,0 +1,6 @@
body {
font-family: courier monospace;
background-color: black;
color: rgb(0, 255, 0);
border: 3px solid rgb(0, 255, 0);
}

View File

@ -0,0 +1,4 @@
body {
background:linear-gradient(to top, #040308, #AD4A28, #DD723C, #FC7001, #DCB697, #9BA5AE, #3E5879, #020B1A);
color: white;
}

8
verse/themes/wdka.css Normal file
View File

@ -0,0 +1,8 @@
body {
color: black;
font-family: Arial;
font-style: italic;
font-weight: 900;
letter-spacing: 0;
background-color: #FFD300;
}