Skip to content
Snippets Groups Projects
Commit 741ca3b0 authored by Martin Mareš's avatar Martin Mareš
Browse files

Velmi nedodělaná stránka s výpisem odevzdaných řešení v soutěži

parent 0cc470b8
No related branches found
No related tags found
1 merge request!9WIP: Zárodek uživatelské části webu a submitování
...@@ -6,7 +6,7 @@ import os ...@@ -6,7 +6,7 @@ import os
import secrets import secrets
from sqlalchemy.orm import joinedload from sqlalchemy.orm import joinedload
from sqlalchemy.orm.query import Query from sqlalchemy.orm.query import Query
from typing import List, Tuple, Optional, Sequence from typing import List, Tuple, Optional, Sequence, Dict
import werkzeug.exceptions import werkzeug.exceptions
import wtforms import wtforms
...@@ -367,6 +367,83 @@ def make_contestant_table(query: Query, add_checkbox: bool = False, add_contest_ ...@@ -367,6 +367,83 @@ def make_contestant_table(query: Query, add_checkbox: bool = False, add_contest_
) )
@app.route('/org/contest/c/<int:id>/reseni')
def org_contest_solutions(id: int):
# FIXME: Práva?
# FIXME: Hlavička stránky podle Jirkova předělání
contest, rr = get_contest_rr(id, mo.rights.Right.manage_contest)
format = request.args.get('format', "")
sess = db.get_session()
pions = (sess.query(db.Participation)
.filter_by(contest=contest)
.options(joinedload(db.Participation.user))
.all())
tasks = (sess.query(db.Task)
.filter_by(round=contest.round)
.order_by(db.Task.code)
.all())
pions_subq = (sess.query(db.Participation.user_id)
.filter_by(contest=contest)
.subquery())
sols = (sess.query(db.Solution)
.filter(db.Solution.user_id.in_(pions_subq))
.options(joinedload(db.Solution.last_submit_obj),
joinedload(db.Solution.last_feedback_obj))
.all())
print('XXX pions:', pions) # FIXME
print('XXX tasks:', tasks)
print('XXX sols:', sols)
cols = [ Column(key='name', name='jmeno', title='Jméno') ]
task_sols: Dict[int, Dict[int, db.Solution]] = {}
for t in tasks:
cols.append(Column(key=f't-{t.task_id}', name=t.code))
task_sols[t.task_id] = {}
for s in sols:
task_sols[s.task_id][s.user_id] = s
rows = []
for pion in pions:
user = pion.user
r = {
'name': user.first_name + ' ' + user.last_name,
}
for t in tasks:
s = task_sols[t.task_id].get(user.user_id, None)
if s is not None:
cell = '*'
else:
cell = ""
r[f't-{t.task_id}'] = cell
rows.append(r)
print('XXX cols:', cols) # FIXME
print('XXX rows:', rows)
table = Table(
columns=cols,
rows=rows,
filename='reseni',
)
if format == "":
return render_template(
'org_contest_solutions.html',
contest=contest,
table=table,
)
else:
return table.send_as(format)
@app.route('/org/contest/c/<int:id>/proctor-import', methods=('GET', 'POST')) @app.route('/org/contest/c/<int:id>/proctor-import', methods=('GET', 'POST'))
def org_proctor_import(id: int): def org_proctor_import(id: int):
contest, rr = get_contest_rr(id, mo.rights.Right.manage_contest) contest, rr = get_contest_rr(id, mo.rights.Right.manage_contest)
... ...
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
</table> </table>
<p><a href='{{ url_for('org_contest_list', id=contest.contest_id) }}'>Seznam účastníků</a> <p><a href='{{ url_for('org_contest_list', id=contest.contest_id) }}'>Seznam účastníků</a>
<p><a href='{{ url_for('org_contest_solutions', id=contest.contest_id) }}'>Odevzdaná řešení</a>
{% if can_manage %} {% if can_manage %}
<div class="btn-group"> <div class="btn-group">
... ...
......
{% extends "base.html" %}
{% block body %}
<h2>Soutěž {{ contest.round.round_code() }}: {{ contest.place.name }}</h2>
{{ table.to_html() }}
{% endblock %}
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
{% for task, sol in task_sols %} {% for task, sol in task_sols %}
<tr> <tr>
<td>{{ task.code }} {{ task.name }} <td>{{ task.code }} {{ task.name }}
<td>{{ (sol.last_submit_obj.uploaded_at if sol.last_submit_obj else None)|timeformat }} <td>{% if sol.last_submit_obj %}
{{- sol.last_submit_obj.uploaded_at|timeformat }} ({{ sol.last_submit_obj.pages|inflected('strana', 'strany', 'stran') }})
{% endif %}
{% if contest.round.state == db.RoundState.closed %} {% if contest.round.state == db.RoundState.closed %}
<td>{{ (sol.last_feedback_obj.uploaded_at if sol.last_feedback_obj else None)|timeformat }} <td>{{ (sol.last_feedback_obj.uploaded_at if sol.last_feedback_obj else None)|timeformat }}
<td>{{ sol.points if sol.points != None else '–' }} <td>{{ sol.points if sol.points != None else '–' }}
... ...
......
...@@ -75,6 +75,7 @@ def user_contest(id: int): ...@@ -75,6 +75,7 @@ def user_contest(id: int):
.filter(or_(db.Solution.user_id == None, db.Solution.user == g.user)) .filter(or_(db.Solution.user_id == None, db.Solution.user == g.user))
.options(joinedload(db.Solution.last_submit_obj), .options(joinedload(db.Solution.last_submit_obj),
joinedload(db.Solution.last_feedback_obj)) joinedload(db.Solution.last_feedback_obj))
.order_by(db.Task.code)
.all()) .all())
return render_template( return render_template(
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment