Skip to content
Snippets Groups Projects
Commit 346839af authored by Jiří Setnička's avatar Jiří Setnička
Browse files

Detail řešení: Nastavování final_submit a final_feedback

parent 14c1cda8
No related branches found
No related tags found
No related merge requests found
......@@ -564,12 +564,20 @@ class SubmitForm(FlaskForm):
submit_fb = wtforms.SubmitField('Odevzdat opravené')
class SetFinalForm(FlaskForm):
type = wtforms.StringField()
paper_id = wtforms.IntegerField()
submit = wtforms.SubmitField("Prohlásit za finální")
@app.route('/org/contest/c/<int:contest_id>/submit/<int:user_id>/<int:task_id>/', methods=('GET', 'POST'))
@app.route('/org/contest/c/<int:contest_id>/site/<int:site_id>/submit/<int:user_id>/<int:task_id>/', methods=('GET', 'POST'))
def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Optional[int] = None):
sc = get_solution_context(contest_id, user_id, task_id, site_id)
sess = db.get_session()
self_url = url_for('org_submit_list', contest_id=contest_id, user_id=user_id, task_id=task_id, site_id=site_id)
form: Optional[SubmitForm] = None
if sc.allow_upload_solutions or sc.allow_upload_feedback:
form = SubmitForm()
......@@ -594,7 +602,6 @@ def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Option
assert sc.task is not None and sc.user is not None
paper = db.Paper(task=sc.task, for_user_obj=sc.user, uploaded_by_obj=g.user, type=type, note=form.note.data)
submitter = mo.submit.Submitter(instance_path=app.instance_path)
self_url = url_for('org_submit_list', contest_id=contest_id, user_id=user_id, task_id=task_id, site_id=site_id)
try:
submitter.submit_paper(paper, tmp_path)
......@@ -632,6 +639,53 @@ def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Option
.filter_by(user_id=user_id, task_id=task_id)
.one_or_none())
set_final_form: Optional[SetFinalForm] = None
if sol and sc.allow_upload_feedback:
set_final_form = SetFinalForm()
if set_final_form.validate_on_submit():
is_submit = set_final_form.type.data == "submit"
is_feedback = set_final_form.type.data == "feedback"
paper = sess.query(db.Paper).get(set_final_form.paper_id.data)
if not paper:
flash('Chyba: Papír s takovým ID neexistuje', 'danger')
elif paper.for_user != user_id or paper.for_task != task_id:
flash('Chyba: Papír nepatří k dané úloze a uživateli', 'danger')
elif (is_submit and sol.final_submit_obj == paper) or (is_feedback and sol.final_feedback_obj == paper):
flash('Žádná změna', 'warning')
elif is_submit:
app.logger.info(f"Finální submit úlohy {task_id} pro uživatele {user_id} změněn na {paper.paper_id}")
mo.util.log(
type=db.LogType.participant,
what=user_id,
details={
'action': 'task-final-submit-changed',
'task': task_id,
'old_paper': sol.final_submit,
'new_paper': paper.paper_id
},
)
sol.final_submit = paper.paper_id
sess.commit()
flash('Finální řešení změněno', 'success')
elif is_feedback:
app.logger.info(f"Finální feedback úlohy {task_id} pro uživatele {user_id} změněn na {paper.paper_id}")
mo.util.log(
type=db.LogType.participant,
what=user_id,
details={
'action': 'task-final-feedback-changed',
'task': task_id,
'old_paper': sol.final_feedback,
'new_paper': paper.paper_id
},
)
sol.final_feedback = paper.paper_id
sess.commit()
flash('Finální oprava změněna', 'success')
else:
flash('Chyba: Neplatná akce', 'danger')
return redirect(self_url)
papers = (sess.query(db.Paper)
.filter_by(for_user_obj=sc.user, task=sc.task)
.options(joinedload(db.Paper.uploaded_by_obj))
......@@ -664,6 +718,7 @@ def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Option
for_site=(site_id is not None),
paper_link=paper_link,
form=form,
set_final_form=set_final_form,
)
......
......@@ -25,6 +25,13 @@
<h3>Odevzdaná řešení</h3>
{% if sol_papers|length > 1 %}
<p><i>Existuje více než jedna verze řešení, finální je podbarvená.
{% if set_final_form %}Pomocí přepínačů u řešení můžete prohlásit za finální řešení i jiné, než naposledy odevzdané.{% endif %}
Účastník vždy vidí všechna svá řešení.
</i></p>
{% endif %}
{% if sol_papers %}
<table class=data>
<thead>
......@@ -49,7 +56,16 @@
<td>{{ p.bytes }}
<td>{{ p.uploaded_by_obj|user_link }}
<td>{% if late %}<span class='sol-late'>({{ late }})</span> {% endif %}{{ p.note }}
<td><a class='btn btn-xs btn-primary' href='{{ paper_link(p) }}'>Stáhnout</a>
<td><div class="btn-group">
<a class='btn btn-xs btn-primary' href='{{ paper_link(p) }}'>Stáhnout</a>
{% if p.paper_id != active_sol_id and set_final_form %}
<form class="btn-group" method="POST">
{{ set_final_form.csrf_token }}
<input type="hidden" name="type" value="submit"><input type="hidden" name="paper_id" value="{{ p.paper_id }}">
{{ wtf.form_field(set_final_form.submit, class="btn btn-xs btn-default") }}
</form>
{% endif %}
</div>
{% endfor %}
</table>
{% else %}
......@@ -58,6 +74,14 @@
<h3>Opravená řešení</h3>
{% if fb_papers|length > 1 %}
<p><i>Existuje více než jedna verze oprav, finální je podbarvená.
{% if set_final_form %}Pomocí přepínačů u oprav můžete prohlásit za finální opravu i jinou, než naposledy nahranou.{% endif %}
Účastník po uzavření kola uvidí
jen finální opravu a ani se nedozví, kolik různých verzí existovalo.
</i></p>
{% endif %}
{% if fb_papers %}
<table class=data>
<thead>
......@@ -81,7 +105,16 @@
<td>{{ p.bytes }}
<td>{{ p.uploaded_by_obj|user_link }}
<td>{{ p.note }}
<td><a class='btn btn-xs btn-primary' href='{{ paper_link(p) }}'>Stáhnout</a>
<td><div class="btn-group">
<a class='btn btn-xs btn-primary' href='{{ paper_link(p) }}'>Stáhnout</a>
{% if p.paper_id != active_fb_id and set_final_form %}
<form class="btn-group" method="POST">
{{ set_final_form.csrf_token }}
<input type="hidden" name="type" value="feedback"><input type="hidden" name="paper_id" value="{{ p.paper_id }}">
{{ wtf.form_field(set_final_form.submit, class="btn btn-xs btn-default") }}
</form>
{% endif %}
</div>
{% endfor %}
</table>
{% else %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment