Add file upload for releases

This commit is contained in:
rubenwardy 2018-03-23 17:05:07 +00:00
parent 5a9fc51ffc
commit 73a79d5eef
5 changed files with 56 additions and 28 deletions

2
.gitignore vendored
View File

@ -1,7 +1,7 @@
config.cfg config.cfg
*.sqlite *.sqlite
main.css main.css
tmp
# Created by https://www.gitignore.io/api/linux,macos,python,windows # Created by https://www.gitignore.io/api/linux,macos,python,windows

View File

@ -6,7 +6,7 @@
{% block content %} {% block content %}
{% from "macros/forms.html" import render_field, render_submit_field %} {% from "macros/forms.html" import render_field, render_submit_field %}
<form method="POST" action=""> <form method="POST" action="" enctype="multipart/form-data">
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
{{ render_field(form.title) }} {{ render_field(form.title) }}

View File

@ -14,11 +14,16 @@ cache = SimpleCache()
def domain(url): def domain(url):
return urlparse(url).netloc return urlparse(url).netloc
# TODO: remove on production! # Use nginx to serve files on production instead
@app.route("/static/<path:path>") @app.route("/static/<path:path>")
def send_static(path): def send_static(path):
return send_from_directory("static", path) return send_from_directory("static", path)
@app.route("/uploads/<path:path>")
def send_upload(path):
import os
return send_from_directory(os.path.abspath(app.config["UPLOAD_FOLDER"]), path)
@app.route("/") @app.route("/")
@menu.register_menu(app, ".", "Home") @menu.register_menu(app, ".", "Home")
def home_page(): def home_page():

View File

@ -8,8 +8,12 @@ from flask_wtf import FlaskForm
from wtforms import * from wtforms import *
from wtforms.validators import * from wtforms.validators import *
def isFilenameAllowed(filename, exts):
return "." in filename and \
filename.rsplit(".", 1)[1].lower() in exts
# TODO: the following could be made into one route, except I'm not sure how
# TODO: the following could be made into one route, except I"m not sure how
# to do the menu # to do the menu
def doPackageList(type): def doPackageList(type):
@ -197,8 +201,10 @@ def create_release_page(type, author, name):
return redirect(package.getDetailsURL()) return redirect(package.getDetailsURL())
# Initial form class from post data and default data # Initial form class from post data and default data
form = CreatePackageReleaseForm(formdata=request.form) form = CreatePackageReleaseForm()
if request.method == "POST" and form.validate(): if request.method == "POST" and form.validate():
for key, value in request.files.items() :
print (key, value)
if form["uploadOpt"].data == "vcs": if form["uploadOpt"].data == "vcs":
rel = PackageRelease() rel = PackageRelease()
rel.package = package rel.package = package
@ -206,9 +212,24 @@ def create_release_page(type, author, name):
rel.url = form["vcsLabel"].data rel.url = form["vcsLabel"].data
# TODO: get URL to commit from branch name # TODO: get URL to commit from branch name
db.session.commit() db.session.commit()
return redirect(package.getDetailsURL()) # redirect return redirect(package.getDetailsURL())
else: else:
raise Exception("Unimplemented option = file upload") file = form.fileUpload.data
if not file or file.filename == "":
flash("No selected file", "error")
elif not isFilenameAllowed(file.filename, ["zip"]):
flash("Please select a zip file", "error")
else:
import random, string, os
filename = ''.join(random.choice(string.ascii_lowercase + string.ascii_uppercase + string.digits) for _ in range(10)) + ".zip"
file.save(os.path.join(app.config["UPLOAD_FOLDER"], filename))
rel = PackageRelease()
rel.package = package
rel.title = form["title"].data
rel.url = "/uploads/" + filename
db.session.commit()
return redirect(package.getDetailsURL())
return render_template("packages/release_new.html", package=package, form=form) return render_template("packages/release_new.html", package=package, form=form)

View File

@ -7,3 +7,5 @@ SQLALCHEMY_DATABASE_URI = "sqlite:///../db.sqlite"
GITHUB_CLIENT_ID = "" GITHUB_CLIENT_ID = ""
GITHUB_CLIENT_SECRET = "" GITHUB_CLIENT_SECRET = ""
UPLOAD_FOLDER="tmp"