diff options
Diffstat (limited to 'kpov_judge/web/kpov_judge/kpov_judge.py')
-rwxr-xr-x | kpov_judge/web/kpov_judge/kpov_judge.py | 75 |
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']) |