summaryrefslogtreecommitdiffstats
path: root/app.py
diff options
context:
space:
mode:
Diffstat (limited to 'app.py')
-rw-r--r--app.py119
1 files changed, 58 insertions, 61 deletions
diff --git a/app.py b/app.py
index 1d75716..1c9b0d6 100644
--- a/app.py
+++ b/app.py
@@ -1,62 +1,50 @@
#!/usr/bin/python2
# -*- coding: utf-8 -*-
+
import magic, os
from fit import Fit
-from flask import Flask, render_template, request, flash, redirect, \
- url_for,jsonify
+from flask import Flask, render_template, request, flash, redirect, url_for
from flask.ext.wtf import Form, TextField, FileField, SelectField,\
validators, ValidationError
from werkzeug import secure_filename
from datetime import date
-fit = Fit('static/fit.git')
-
app = Flask(__name__)
-app.config.from_object('settings')
-
-ALLOWED_EXTENSIONS = ['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'zip', 'gs', 'gz' ]
-
-FORM_MODULE_LIST= [
- ('alp1', u'ALP1 - Funktionale Programmierung'),
- ('alp2', u'ALP2 - Objektorientierte Programmierung'),
- ('alp3', u'ALP3 - Datenstrukturen'),
- ('alp4', u'ALP4 - Nichtsequentielle Programmierung'),
- ('alp5', u'ALP5 - Netzprogrammierung'),
- ('ti1', u'TI1 - Grundlagen der Technischen Informatik'),
- ('ti2', u'TI2 - Rechnerarchitektur'),
- ('ti3', u'TI3 - Betriebs- und Kommunikationssysteme'),
- ('mafi1', u'MafI1 - Logik und Diskrete Mathematik'),
- ('mafi2', u'MafI2 - Analysis'),
- ('mafi3', u'MafI3 - Lineare Algebra'),
- ('gti', u'Grundlagen der Theoretischen Informatik'),
- ('dbs', u'Datenbanksysteme'),
- ('swt', u'Softwaretechnik'),
- ('aws', u'Anwendungssysteme'),
- ('', u'---'),
- ('new', u'neues Modul hinzufügen')
-]
-
-TERM_START_YEAR = 1999
-YEARS = [(str(x),x) for x in xrange(date.today().year, TERM_START_YEAR, -1)]
-
-
+app.config.from_pyfile('settings.py')
+
+# populate Module-List
+fit = {}
+for i, study in enumerate(app.config['MODULES'].items()):
+ abbr = study[0]
+ fit[abbr] = Fit(os.path.join('static','studies',abbr + '.git'))
+
+ modules = app.config['MODULES'][study[0]]
+ # extend module list with git values
+ for module in fit[abbr].get_modules():
+ # check if module is already listed
+ if all(map(lambda (k,v): v != module, modules)):
+ slug = module.encode('ascii', errors='ignore')
+ app.config['MODULES'][study[0]].append((slug, module))
class UploadForm(Form):
""" Upload Form class for validation """
+ study = TextField('Studiengang')
exam = FileField('Klausur')
- module = SelectField('Kurs', choices = FORM_MODULE_LIST)
+ module = SelectField('Kurs')
module_new = TextField('Modulname', validators=[validators.Optional(),
validators.Length(min=5)])
year = SelectField(
'Jahr',
validators=[validators.Required()],
- choices = YEARS
+ choices = [(str(x),x) for x in xrange(date.today().year, app.config['FORM_START_YEAR'], -1)]
)
def validate_exam(form, field):
- ext = map(lambda x: field.data.filename.endswith(x), ALLOWED_EXTENSIONS)
+ exts = app.config['ALLOWED_EXTENSIONS']
+ ext = map(lambda x: field.data.filename.endswith(x), exts)
+
if not any(ext):
raise ValidationError(u'Ungültiger Dateityp')
@@ -64,8 +52,10 @@ class UploadForm(Form):
raise ValidationError(u'Zu große Datei')
def validate_module(form, field):
- modules = dict(FORM_MODULE_LIST)
+ modules = dict(app.config['MODULES'][form.study.data])
data = form.module.data
+ print(data)
+ print(modules)
if data not in modules or data == '':
raise ValidationError(u'Bitte wähle ein Modul!')
@@ -73,56 +63,71 @@ class UploadForm(Form):
-@app.route('/upload', methods=['GET', 'POST'])
-def upload():
+@app.route('/<study>/upload', methods=['GET', 'POST'])
+def upload(study):
form = UploadForm()
+ form.study.data = study
+
+ form.module.choices = app.config['MODULES'][study]
+ if 'new' not in dict(form.module.choices):
+ if len(form.module.choices) > 0:
+ form.module.choices.append(('', u'---'))
+ form.module.choices.append(('new', u'neues Modul hinzufügen'))
+
if form.validate_on_submit():
if form.module.data == 'new':
module = form.module_new.data
slug = module.encode('ascii', errors='ignore')
- FORM_MODULE_LIST.append((slug,module))
+ app.config['MODULES'][study].append((slug,module))
else:
- module = dict(FORM_MODULE_LIST)[form.module.data]
+ module = dict(app.config['MODULES'][study])[form.module.data]
year = form.year.data
filename = secure_filename(form.exam.data.filename)
path = os.path.join(module,year,filename).encode('ascii', errors='ignore')
try:
- oid = fit.add_file(form.exam.data.stream.getvalue(), path)
+ oid = fit[study].add_file(form.exam.data.stream.getvalue(), path)
except:
- oid = fit.add_file(form.exam.data.stream.read(), path)
+ oid = fit[study].add_file(form.exam.data.stream.read(), path)
flash("Datei %s gespeichert." % filename)
- return redirect(url_for('index', module = module))
+ return redirect(url_for('study_index', study = study, module = module))
- return render_template('upload.html', form = form)
+ return render_template('upload.html', study = study, form = form)
-@app.route('/files/<oid>')
-def show(oid):
- data = fit.get_file(oid)
+@app.route('/<study>/files/<oid>')
+def study_show(study, oid):
+ data = fit[study].get_file(oid)
mime = magic.Magic(mime=True)
header = { 'Content-Type' : mime.from_buffer(data[:1024]) }
return data, 200, header
-@app.route('/')
-@app.route('/modules')
-@app.route('/modules/<module>')
-def index(module=None):
+@app.route('/<study>/modules')
+@app.route('/<study>/modules/<module>')
+def study_index(study, module=None):
if module:
return render_template(
- 'module_show.html', module=module, entries=fit.get_module(module)
+ 'module_show.html', study = study, module=module, entries=fit[study].get_module(module)
)
- return render_template('module_list.html', modules=fit.get_modules())
+ return render_template('module_list.html', study = study, modules=fit[study].get_modules())
+@app.route('/')
+def index():
+ get_img_path = lambda x: os.path.join('images', x +'.png')
+ studies = [(name,get_img_path(name)) for name,m in app.config['MODULES'].items()]
+ return render_template(
+ 'index.html',
+ studies = studies
+ )
@app.route('/403')
@app.errorhandler(403)
@@ -132,12 +137,4 @@ def forbidden():
if __name__ == "__main__":
- modules = dict(FORM_MODULE_LIST)
- # extend module list with git values
- for module in fit.get_modules():
- # check if module is already listed
- if all(map(lambda (k,v): v != module, modules.items())):
- slug = module.encode('ascii', errors='ignore')
- FORM_MODULE_LIST.insert(len(FORM_MODULE_LIST) - 2, (slug, module))
-
app.run()