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

Z přehledu řešení úlohy jde i odevzdávat

V tabulce už jsou všichni účastníci, i ti, kteří úlohu neodevzdali.
Opraveny kontroly práv.
parent d7e1b326
Branches
No related tags found
1 merge request!9WIP: Zárodek uživatelské části webu a submitování
...@@ -5,7 +5,7 @@ import flask_wtf.file ...@@ -5,7 +5,7 @@ import flask_wtf.file
import locale import locale
import os import os
import secrets import secrets
from sqlalchemy import func from sqlalchemy import func, and_
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, Dict from typing import List, Tuple, Optional, Sequence, Dict
...@@ -675,17 +675,19 @@ def get_solutions_query( ...@@ -675,17 +675,19 @@ def get_solutions_query(
for_contest: Optional[db.Contest] = None, for_contest: Optional[db.Contest] = None,
for_site: Optional[db.Place] = None) -> Query: for_site: Optional[db.Place] = None) -> Query:
sess = db.get_session() sess = db.get_session()
pions_filter = sess.query(db.Participation.user_id) query = (sess.query(db.Participation, db.Solution)
.select_from(db.Participation)
.outerjoin(db.Solution, and_(db.Solution.task_id == task.task_id, db.Solution.user_id == db.Participation.user_id))
.options(joinedload(db.Solution.user),
joinedload(db.Solution.final_submit_obj),
joinedload(db.Solution.final_feedback_obj)))
if for_contest: if for_contest:
pions_filter = pions_filter.filter_by(contest=for_contest) query = query.filter(db.Participation.contest == for_contest)
if for_site: if for_site:
pions_filter = pions_filter.filter_by(place=for_site) query = query.filter(db.Participation.place == for_site)
solutions = sess.query(db.Solution).filter_by(task=task) return query
if for_contest or for_site:
solutions = solutions.filter(db.Solution.user_id.in_(pions_filter))
return solutions
@app.route('/org/contest/c/<int:contest_id>/task/<int:task_id>/') @app.route('/org/contest/c/<int:contest_id>/task/<int:task_id>/')
...@@ -695,7 +697,7 @@ def org_contest_task_submits(contest_id: int, task_id: int, site_id: Optional[in ...@@ -695,7 +697,7 @@ def org_contest_task_submits(contest_id: int, task_id: int, site_id: Optional[in
assert sc.task is not None assert sc.task is not None
q = get_solutions_query(sc.task, for_contest=sc.contest, for_site=sc.site) q = get_solutions_query(sc.task, for_contest=sc.contest, for_site=sc.site)
solutions: List[db.Solution] = q.all() rows: List[Tuple[db.Participation, db.Solution]] = q.all()
def paper_link(paper: db.Paper) -> str: def paper_link(paper: db.Paper) -> str:
return url_for('org_submit_paper', return url_for('org_submit_paper',
...@@ -706,7 +708,7 @@ def org_contest_task_submits(contest_id: int, task_id: int, site_id: Optional[in ...@@ -706,7 +708,7 @@ def org_contest_task_submits(contest_id: int, task_id: int, site_id: Optional[in
return render_template( return render_template(
"org_contest_task.html", "org_contest_task.html",
sc=sc, solutions=solutions, sc=sc, rows=rows,
paper_link=paper_link, paper_link=paper_link,
) )
......
...@@ -13,19 +13,12 @@ ...@@ -13,19 +13,12 @@
» {{ task.code }} {{ task.name }} » {{ task.code }} {{ task.name }}
</h2> </h2>
<div class="btn-group">
{% if can_upload_feedback %}
<a class="btn btn-primary" href="{{ url_for('org_contest_task_feedback', id=contest.contest_id, task_id=task.task_id) }}">Nahrávání oprav</a>
{% endif %}
{% if can_edit_points %}
<a class="btn btn-primary" href="{{ url_for('org_contest_task_points', id=contest.contest_id, task_id=task.task_id) }}">Zadávání bodů</a>
{% endif %}
</div>
<h3>Přehled odevzdaných řešení</h3> <h3>Přehled odevzdaných řešení</h3>
<p><i>U každého účastníka je zobrazeno jeho poslední odevzdané řešení a přidělené body. Historii všech odevzdání, oprav a bodů <p><i>U každého účastníka je zobrazeno jeho poslední odevzdané řešení a přidělené body. Historii všech odevzdání, oprav a bodů
{% if can_upload_feedback or can_edit_points %} a možnost jejich změny{% endif %} naleznete v detailu řešení.</i></p> naleznete v detailu řešení.
{% if sc.allow_upload_feedback or sc.allow_edit_points %}Tamtéž můžete odevzdávat nové verze.{% endif %}
</i></p>
<table class="data full"> <table class="data full">
<thead> <thead>
...@@ -37,10 +30,11 @@ ...@@ -37,10 +30,11 @@
<th>Akce <th>Akce
</tr> </tr>
</thead> </thead>
{% for sol in solutions %} {% for pion, sol in rows %}
{% set u = sol.user %} {% set u = pion.user %}
<tr> <tr>
<td><a href="{{ url_for('org_user', id=u.user_id) }}">{{ u.full_name() }}</a> <td><a href="{{ url_for('org_user', id=u.user_id) }}">{{ u.full_name() }}</a>
{% if sol %}
<td>{% if sol.final_submit_obj %} <td>{% if sol.final_submit_obj %}
{% set p = sol.final_submit_obj %} {% set p = sol.final_submit_obj %}
{% set late = p.check_deadline(round) %} {% set late = p.check_deadline(round) %}
...@@ -60,7 +54,10 @@ ...@@ -60,7 +54,10 @@
<a href="{{ url_for('org_user', id=p.uploaded_by) }}" title="nahrál {{ p.uploaded_by_obj.full_name() }}" ><b>🛈</b></a> <a href="{{ url_for('org_user', id=p.uploaded_by) }}" title="nahrál {{ p.uploaded_by_obj.full_name() }}" ><b>🛈</b></a>
{% else %}–{% endif %} {% else %}–{% endif %}
<td>{{ sol.points if sol.points != None else '–' }} <td>{{ sol.points if sol.points != None else '–' }}
<td><a class="btn btn-xs btn-primary" href="{{ url_for('org_submit_list', contest_id=ct_id, user_id=u.user_id, task_id=task.task_id, site_id=site_id) }}">Detail řešení</a> {% else %}
<td><td>
{% endif %}
<td><a class="btn btn-xs btn-primary" href="{{ url_for('org_submit_list', contest_id=ct_id, user_id=u.user_id, task_id=task.task_id, site_id=site_id) }}">Detail</a>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment