diff --git a/README.md b/README.md index 4489dd8..fd0d347 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ This particular work in progress project is an attempt to make distribusi into a This project is made for Autonomous Practices at the WDKA in Rotterdam. ## Work in progress -Nothing is working yet but I need to do this project in smaller steps then everything in one go. +~~Nothing is working yet but I need to do this project in smaller steps then everything in one go.~~ +So far, in this project you can make a user, upload a zip, make a website name and have distribusi +run it for you. ## Start your engines! diff --git a/verse/deploydb.py b/verse/deploydb.py index 8c4c49c..fb49da9 100644 --- a/verse/deploydb.py +++ b/verse/deploydb.py @@ -2,7 +2,9 @@ def deploy(): """Run deployment of database.""" from app import create_app, db from flask_migrate import upgrade, migrate, init, stamp - from usermodel import User + + # This model is required for flask_migrate to make the table + from usermodel import User # noqa: F401 app = create_app() app.app_context().push() diff --git a/verse/distribusiform.py b/verse/distribusiform.py new file mode 100644 index 0000000..6373162 --- /dev/null +++ b/verse/distribusiform.py @@ -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!") diff --git a/verse/start.py b/verse/start.py index f56cdd0..366caa5 100644 --- a/verse/start.py +++ b/verse/start.py @@ -1,7 +1,10 @@ """This is the main flask distribusi page""" import os +import zipfile +import shutil from datetime import timedelta + from flask import ( render_template, redirect, @@ -31,9 +34,12 @@ from flask_wtf.csrf import CSRFError from app import create_app, db, login_manager from usermodel import User + +# Forms! from loginform import LoginForm from registerform import RegisterForm from uploadform import UploadForm +from distribusiform import DistribusiForm # Tada! from distribusi.cli import build_argparser @@ -112,21 +118,64 @@ def register(): return render_template("register.html", registerform=registerform) -@APP.route("/distribusi") +@APP.route("/distribusi", methods=["GET", "POST"]) @login_required def distribusi(): uploadform = UploadForm() - return render_template("distribusi.html", uploadform=uploadform) + distribusiform = DistribusiForm() + user = User.query.filter_by(email=current_user.email).first() + if user.distribusiname is None: + print("nothing to deploy!") + if distribusiform.validate_on_submit(): + zipfilename = "{}.zip".format(user.distribusiname) + copyzipfile = os.path.join(APP.config["UPLOAD_FOLDER"], 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: + # To do, replace extractall with inspection and extract + zip_ref.extractall(newuserfolder) + + 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() + args = parser.parse_args() + distribusify(args, newuserfolder) + return render_template("index.html") + template = render_template( + "distribusi.html", + uploadform=uploadform, + distribusiform=distribusiform, + ) + return template @APP.route("/upload", methods=["POST"]) @login_required def upload(): + success = False uploadform = UploadForm() - if (uploadform.validate_on_submit()): + distribusiform = DistribusiForm() + if uploadform.validate_on_submit(): + user = User.query.filter_by(email=current_user.email).first() + user.distribusiname = uploadform.sitename.data + db.session.commit() + + zipfilename = "{}.zip".format(user.distribusiname) zipfile = uploadform.zipfile.data - zipfile.save(os.path.join(APP.config['UPLOAD_FOLDER'], zipfile.filename)) - return render_template("distribusi.html", uploadform=uploadform) + zipfile.save(os.path.join(APP.config["UPLOAD_FOLDER"], zipfilename)) + + success = True + template = render_template( + "distribusi.html", + uploadform=uploadform, + distribusiform=distribusiform, + success=success, + ) + return template @APP.route("/admin") diff --git a/verse/static/css/style.css b/verse/static/css/style.css index 89e6457..abeb30d 100644 --- a/verse/static/css/style.css +++ b/verse/static/css/style.css @@ -5,7 +5,7 @@ body color:#E0B0FF; } -section#login{ +div#login{ width: 30%; margin-left: auto; margin-right: auto; @@ -13,26 +13,34 @@ section#login{ text-decoration: none; } -section#login form { +div#login form { width: 200px; margin: 0 auto; padding-left: 15%; padding-right: 15%; } -fieldset.required { - padding: 6px; - border: none; - float: left; -} - -section#login input[type=text], input[type=password]{ +div#login input[type=text], input[type=password]{ background-color: #383C4A; color: white; border: 1px solid #E0B0FF; } -section#buttons{ +div#upload form { + padding-right: 15%; +} + +.workflow{ + margin-top: 1em; + padding: 0.5em; + width: 25em; + border: 3px solid #E0B0FF; + background-color:#383C4A; + text-decoration: none; +} + + +div#buttons{ position: fixed; top: 0.5em; right: 0.5em; @@ -42,27 +50,31 @@ section#buttons{ align-items: center; } -section#buttons .logout input{ +div#buttons .logout input{ border: none; background: #E0B0FF; text-decoration: none; margin: 1px; } -section#buttons .distribusi input{ +div#buttons .distribusi input{ border: none; background: #fff600; text-decoration: none; margin: 1px; } -.signin input { +fieldset.required { + border: none; +} + +.button input { border: none; background: #E0B0FF; text-decoration: none; margin: 1px; } -.signin input:hover { +.button input:hover { background: #60337F; } diff --git a/verse/templates/distribusi.html b/verse/templates/distribusi.html index cca85af..d26cfb7 100644 --- a/verse/templates/distribusi.html +++ b/verse/templates/distribusi.html @@ -1,8 +1,8 @@ {% extends "base.html" %} {% block main %} -
-

Upload

-

Upload button

+
+

Step 1: Upload

+

Upload your files here, the only accepted file type is a zip file

{{ uploadform.csrf_token }}
@@ -19,20 +19,32 @@
{{ message }}
{% endfor %}
+
{{ uploadform.submit }} +
-
-
-

Theme

+ {% if success %} +

Your file has been uploaded successfully + {% endif %} + +

+

Step 2: Theme

dropdown css file selector

-
-
-

Edit

+ +
+

Step 3: Edit

go to CSS editor

-
-
-

Distribusi

-

run distribusi on your files

-
+ +
+

Step 4: Distribusi

+

run distribusi on your files, this will generate your website and make + your content public.

+
+ {{ distribusiform.csrf_token }} +
+ {{ distribusiform.submit }} +
+
+
{% endblock main %} diff --git a/verse/templates/index.html b/verse/templates/index.html index ee0e993..f75ccdb 100644 --- a/verse/templates/index.html +++ b/verse/templates/index.html @@ -1,6 +1,6 @@ {% extends "base.html" %} {% block main %} -
+
{% if not current_user.is_authenticated %} {% endif %} -
+ {% if current_user.is_authenticated %}

Hi {{ current_user.email }}!

{% endif %} - -
+ +

List of distribusis

-
+ {% endblock %} diff --git a/verse/templates/login.html b/verse/templates/login.html index d435098..b21c11f 100644 --- a/verse/templates/login.html +++ b/verse/templates/login.html @@ -1,6 +1,6 @@ {% extends "base.html" %} {% block main %} -
+
{{ loginform.csrf_token }}
@@ -17,10 +17,10 @@
{{ message }}
{% endfor %}
-
+ {% endblock main %} diff --git a/verse/templates/register.html b/verse/templates/register.html index d2c4338..f031169 100644 --- a/verse/templates/register.html +++ b/verse/templates/register.html @@ -1,6 +1,6 @@ {% extends "base.html" %} {% block main %} -
+
{{ registerform.csrf_token }}
@@ -24,9 +24,9 @@
{{ message }}
{% endfor %}
-
+ {% endblock main %} diff --git a/verse/uploadform.py b/verse/uploadform.py index 6921f45..433ca51 100644 --- a/verse/uploadform.py +++ b/verse/uploadform.py @@ -3,7 +3,6 @@ from flask_wtf.file import FileField, FileAllowed from wtforms import validators from wtforms.validators import Length from wtforms import ( - FileField, SubmitField, StringField, ) @@ -11,14 +10,14 @@ from wtforms import ( 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!')] + "Upload your zip file with content here:", + validators=[FileAllowed(["zip"], "Zip archives only!")], ) submit = SubmitField("Upload") diff --git a/verse/usermodel.py b/verse/usermodel.py index 1d8ef39..158c2c3 100644 --- a/verse/usermodel.py +++ b/verse/usermodel.py @@ -14,4 +14,4 @@ class User(UserMixin, db.Model): visible = db.Column(db.Boolean, server_default=u'false') def __repr__(self): - return "" % self.username + return "" % self.email