diff --git a/.gitignore b/.gitignore index c9cee1c..15e162e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,7 @@ node_modules/ *.yaml *.html *.png -.env/ \ No newline at end of file +.env/ +zips/* +flaskapp/build/* +*.pyc \ No newline at end of file diff --git a/bsp.service b/bsp.service new file mode 100644 index 0000000..339eede --- /dev/null +++ b/bsp.service @@ -0,0 +1,13 @@ +[Unit] +Description=uWSGI Simple Sample for Flat Page with Index Default +After=network.target + +[Service] +#User=www-data +#Group=www-data +WorkingDirectory=/srv/andis_test/testw3m/ +Environment="PATH=/srv/andis_test/testw3m/.env/bin" +ExecStart=/srv/andis_test/testw3m/.env/bin/uwsgi --ini uwsgi.ini + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/flaskapp/__init__.py b/flaskapp/__init__.py index 4f44d08..b57ed6c 100644 --- a/flaskapp/__init__.py +++ b/flaskapp/__init__.py @@ -3,7 +3,7 @@ """ import logging import sys -from flask import Flask, Blueprint,render_template, send_from_directory,jsonify, url_for, abort +from flask import Flask, Blueprint,render_template, send_from_directory,jsonify,redirect, url_for, abort,flash from flask_frozen import Freezer from config import Config import os @@ -15,13 +15,18 @@ from flask_mail import Mail,Message from zipfile import ZipFile from .token import TokenCollection from flask import request +from cachetools import TTLCache, cached +from werkzeug.utils import secure_filename # Initialize application app = Flask(__name__) app.config['MAIL_SERVER']= "buran.htu.tuwien.ac.at" app.config['MAIL_DEFAULT_SENDER']="andis@fet.at" -app.config['FREEZER_DESTINATION_IGNORE']=['*.zip',"intern"] +app.config['FREEZER_DESTINATION_IGNORE']=['*.zip',"*intern*"] +app.config['FREEZER_STATIC_IGNORE']=['*.zip',"*intern*"] + mail=Mail(app) -app.config["url_prefix"]="" +app.secret_key = b'_5#y2L"F4Q8z\n\xec]/' +app.config["url_prefix"]="/bsp" app.logger.setLevel(logging.DEBUG) # Initialize FlatPages Index tokens = TokenCollection("tokens.yaml") @@ -31,41 +36,48 @@ tokens = TokenCollection("tokens.yaml") # recipients=["andis@fet.at"]) #mail.send(msg) +UPLOAD_FOLDER = 'uploads' +ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} + +app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER + +def allowed_file(filename): + return '.' in filename and \ + filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + +@cached(cache=TTLCache(maxsize=1024, ttl=3600)) +def load_lvas_folders_studien(): + lvas=[] + studien={} + #search the data directory for yaml files + for base,_, files in os.walk("data"): + for fn in files: + if re.match(".*yaml$", fn): + with open(os.path.join("data",fn),"r") as f: + data=yaml.load(f.read(),yaml.Loader) + studien[fn]=data - -lvas=[] -studien={} -#search the data directory for yaml files -for base,_, files in os.walk("data"): - for fn in files: - if re.match(".*yaml$", fn): - with open(os.path.join("data",fn),"r") as f: - data=yaml.load(f.read(),yaml.Loader) - studien[fn]=data - - -with open(os.path.join("test.yaml"),"w") as f: - f.write(yaml.dump(studien)) + with open(os.path.join("test.yaml"),"w") as f: + f.write(yaml.dump(studien)) # create a lva list from the structure -for studium, lvaliste in studien.items(): - for k,lva in lvaliste.items(): - if len(lva)>3: - lvas+=[lva] + for studium, lvaliste in studien.items(): + for k,lva in lvaliste.items(): + if len(lva)>3: + lvas+=[lva] + folders={} -folders={} - -with open(os.path.join("testlvaliste.yaml"),"w") as f: + with open(os.path.join("testlvaliste.yaml"),"w") as f: f.write(yaml.dump(lvas)) # make folders compact in lva -for lva in lvas: - for l in lva["courses"]: - if "folders" in l: - for folder in l["folders"]: - folders[folder["folder"]]= folder["folderpath"] - + for lva in lvas: + for l in lva["courses"]: + if "folders" in l: + for folder in l["folders"]: + folders[folder["folder"]]= folder["folderpath"] + return lvas, folders, studien app.logger.info('Initialize FET BSP Sammlung') @@ -92,23 +104,40 @@ def send_a_mail(): return "Done", 200 #@page_blueprint.route('//',strict_slashes=False) -@page_blueprint.route('/') +@page_blueprint.route('/', methods=['GET', 'POST']) def index(): + if request.method == 'POST': + # check if the post request has the file part + if 'file' not in request.files: + flash('No file part') + return redirect(request.url) + file = request.files['file'] + # if user does not select file, browser also + # submit an empty part without filename + if file.filename == '': + flash('No selected file') + return redirect(request.url) + if file and allowed_file(file.filename): + filename = secure_filename(file.filename) + folder=os.path.join(app.config['UPLOAD_FOLDER'],secure_filename(request.form["lva"])) + os.makedirs(folder) + file.save(os.path.join(folder, filename)) + flash('Vielen Dank für deinen Upload') + return redirect(request.url) + lvas,folders,studien=load_lvas_folders_studien() return render_template("lva_liste.html", lvas=lvas,zip=False) -@page_blueprint.route('/intern/zips.html') -def indexzips(): - return render_template("lva_liste.html", lvas=lvas,zip=True) -@page_blueprint.route('intern/createtoken.html') -def createtoken(): +@page_blueprint.route('intern/index.html') +def indexzips(): t=tokens.create() + lvas,folders,studien=load_lvas_folders_studien() return render_template("lva_liste.html", lvas=lvas,zip=True, token=t) -@page_blueprint.route('intern/zips//.zip') +@page_blueprint.route('zips//.zip') def files(name): - + lvas, folders =load_lvas_folders_studien() token = request.args.get('token') # create a ZipFile objec if not name in folders: @@ -133,7 +162,9 @@ def api_index(name='index'): return jsonify(page={}), 200, {'Content-Type': 'application/json; charset=utf-8'} - +@freezer.register_generator +def url_freeze(): + yield "/" app.register_blueprint(page_blueprint, url_prefix=app.config["url_prefix"],static_folder='static') app.register_blueprint(api_blueprint, url_prefix=app.config["url_prefix"]+"/api/",static_folder='static') diff --git a/htpasswd b/htpasswd new file mode 100644 index 0000000..e69de29 diff --git a/run b/run index 9c72dff..9a73300 100755 --- a/run +++ b/run @@ -1,4 +1,3 @@ #!/bin/bash source .env/bin/activate node fetch_curricula.js -python run.py build \ No newline at end of file diff --git a/test_tokens.py b/test_tokens.py new file mode 100644 index 0000000..56cd33c --- /dev/null +++ b/test_tokens.py @@ -0,0 +1,7 @@ +from flaskapp.token import TokenCollection + + +tc=TokenCollection("tokens.yaml") +t=tc.create() +print(t) +print(tc.is_valid(t)) diff --git a/uwsgi.log b/uwsgi.log new file mode 100644 index 0000000..e69de29 diff --git a/uwsgibsp.ini b/uwsgibsp.ini new file mode 100644 index 0000000..d37e600 --- /dev/null +++ b/uwsgibsp.ini @@ -0,0 +1,22 @@ +[uwsgi] +# User and group www-data on debian +uid = 33 +gid = 33 +master = true +# No. of processes can be increased +processes = 3 +chown-socket =www-data:www-data +virtualenv = /srv/andis_test/testw3m/.env +pythonpath = /srv/andis_test/testw3m/ +pidfile=/var/run/bsp.pid +socket = /var/run/bsp.sock +chmod-socket = 666 +module = flaskapp +callable= app +wsgi-file = run.py +logdate = true +logger = file:/srv/andis_test/testw3m/uwsgi.log +loglevel = debug +gevent = 100 +vacuum=true +#plugins=python3,logfile \ No newline at end of file