summaryrefslogtreecommitdiff
path: root/kpov_judge/web/kpov_judge/kpov_judge.py
diff options
context:
space:
mode:
Diffstat (limited to 'kpov_judge/web/kpov_judge/kpov_judge.py')
-rwxr-xr-xkpov_judge/web/kpov_judge/kpov_judge.py75
1 files changed, 48 insertions, 27 deletions
diff --git a/kpov_judge/web/kpov_judge/kpov_judge.py b/kpov_judge/web/kpov_judge/kpov_judge.py
index 1085b9b..c0bf885 100755
--- a/kpov_judge/web/kpov_judge/kpov_judge.py
+++ b/kpov_judge/web/kpov_judge/kpov_judge.py
@@ -1,18 +1,33 @@
#!/usr/bin/env python3
-import flask
-from flask import Flask, g, session, redirect, url_for, abort, render_template, flash, app, request, Response
-import pymongo
+import collections
+import datetime
import json
import random
import settings
-import datetime
-import kpov_util
-from kpov_draw_setup import draw_setup
import traceback
+from kpov_draw_setup import draw_setup
+import kpov_util
+
+import pymongo
+import flask
+from flask import Flask, g, session, redirect, url_for, abort, render_template, flash, app, request, Response
+from flask.ext.babel import Babel, gettext, ngettext, format_datetime, _
+import jinja2
+
app = Flask(__name__)
app.config.from_object(settings)
+babel = Babel(app)
+
+@babel.localeselector
+def get_locale():
+ # terrible hack, should store as user preference in the DB
+ if '/en/' in request.path:
+ return 'en'
+ if '/si/' in request.path:
+ return 'sl'
+ return request.accept_languages.best_match(['sl', 'en'])
dummy_task = """
def task(neznano_ime_naloge):
@@ -36,9 +51,9 @@ def before_request():
@app.route('/')
-def root():
+@app.route('/classes/')
+def index():
student_id = flask.app.request.environ.get('REMOTE_USER', 'Nobody')
- # env = flask.app.request.environ
classes = g.db.classes.find({}, {'class_id': 1, 'name': 1}).sort('class_id')
return render_template('index.html', student_id=student_id, classes=classes)
@@ -46,7 +61,6 @@ def root():
@app.route('/classes/<class_id>/')
def class_tasks(class_id):
student_id = flask.app.request.environ.get('REMOTE_USER', 'Nobody')
- # env = flask.app.request.environ
clas = g.db.classes.find_one({'class_id': class_id})
tasks = g.db.tasks.find({'class_id': class_id}, {'task_id': 1}).sort('task_id')
if tasks is not None:
@@ -56,14 +70,6 @@ def class_tasks(class_id):
return render_template('class_tasks.html', student_id=student_id, tasks=task_list, clas=clas)
-@app.route('/classes/')
-def class_list():
- student_id = flask.app.request.environ.get('REMOTE_USER', 'Nobody')
- # env = flask.app.request.environ
- classes = g.db.classes.find({}, {'class_id': 1, 'name': 1,}).sort('name')
- return render_template('class_list.html', student_id=student_id, classes=classes)
-
-
def results_post(class_id, task_id, results):
student_id = flask.app.request.environ.get('REMOTE_USER', 'Nobody')
db = g.db
@@ -86,8 +92,7 @@ def results_post(class_id, task_id, results):
task_check_source = db.task_checkers.find_one({'class_id': class_id, 'task_id': task_id})['source']
d = {}
exec(compile(task_check_source, 'checker.py', 'exec'), globals(), d)
- # raise Exception(str(params))
- res, hints = d['task_check'](results, params)
+ res, hints = d['task_check'](collections.defaultdict(str, results), params)
except Exception as e:
hints = ["Checker died: " + str(e)]
res = 0
@@ -240,14 +245,14 @@ def task_greeting(class_id, task_id, lang):
instr_ok = False
if instr_ok:
try:
- public_params = {}
+ public_params = []
for k, v in meta.items():
if v.get('public', False):
- public_params[k] = params.get(k, "???")
- # instructions = instructions.format(**public_params).decode('utf8')
- instructions = instructions.format(**public_params)
-
- # instructions = instructions.format(**public_params).encode('utf8')
+ public_params += [{
+ 'name': k,
+ 'value': params.get(k),
+ 'description': v.get('descriptions', {}).get(lang)
+ }]
except Exception as e:
instructions = str(e)
computer_list = list(db.student_computers.find({'class_id': class_id, 'task_id': task_id, 'student_id': student_id}))
@@ -265,13 +270,29 @@ def task_greeting(class_id, task_id, lang):
openstackCreated = True
else:
openstackCreated = False
+
+ try:
+ result = db.results.find_one(
+ {'$query': {'class_id': class_id, 'task_id': task_id, 'student_id': student_id},
+ '$orderby': collections.OrderedDict([('result', -1), ('time', 1)])},
+ {'result': 1, 'status': 1, 'hints': 1, 'time': True, '_id': 0})
+ result['time'] = format_datetime(result['time'])
+ print(result)
+ except Exception:
+ result = None
+
return render_template('task_greeting.html',
disk_base_url='/'.join([app.config['STUDENT_DISK_URL'], student_id, class_id, task_id, '']),
+ class_id=class_id,
+ task_id=task_id,
computers=computer_list,
backing_images=sorted(backing_images),
- lang=lang,
+ lang='sl' if lang == 'si' else lang, # TODO s/si/sl in all tasks (and maybe elsewhere)
openstack=openstackCreated,
- instructions=instructions)
+ instructions=jinja2.Template(instructions),
+ params=public_params,
+ result=result,
+ **{p['name']: p['value'] for p in public_params})
@app.route('/tasks/<class_id>/<task_id>/params.json', methods=['GET', 'POST'])