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

Při zadávání bodů kontrolujeme maximální počet bodů

Při bodování v:
* importu
* tabulce úlohy
* jednotlivém řešení

Issue #115
parent 6df209de
No related branches found
No related tags found
1 merge request!47Maximální počet bodů pro úlohu
...@@ -228,6 +228,10 @@ class Import: ...@@ -228,6 +228,10 @@ class Import:
if pts < 0: if pts < 0:
return self.error('Body nesmí být záporné') return self.error('Body nesmí být záporné')
assert self.task is not None
if self.task.max_points is not None and pts > self.task.max_points:
return self.error(f'Body převyšují maximální počet bodů pro tuto úlohu ({self.task.max_points})')
return pts return pts
def find_or_create_participant(self, user: db.User, year: int, school_id: int, birth_year: int, grade: str) -> Optional[db.Participant]: def find_or_create_participant(self, user: db.User, year: int, school_id: int, birth_year: int, grade: str) -> Optional[db.Participant]:
......
...@@ -26,6 +26,7 @@ from mo.web.util import PagerForm ...@@ -26,6 +26,7 @@ from mo.web.util import PagerForm
from mo.web.table import CellCheckbox, Table, Row, Column, cell_pion_link, cell_place_link, cell_email_link from mo.web.table import CellCheckbox, Table, Row, Column, cell_pion_link, cell_place_link, cell_email_link
import wtforms.validators as validators import wtforms.validators as validators
from wtforms.fields.html5 import IntegerField from wtforms.fields.html5 import IntegerField
from wtforms.widgets.html5 import NumberInput
class ImportForm(FlaskForm): class ImportForm(FlaskForm):
...@@ -637,7 +638,8 @@ def get_solution_context(contest_id: int, user_id: Optional[int], task_id: Optio ...@@ -637,7 +638,8 @@ def get_solution_context(contest_id: int, user_id: Optional[int], task_id: Optio
class SubmitForm(FlaskForm): class SubmitForm(FlaskForm):
note = wtforms.TextAreaField("Poznámka pro účastníka", description="Viditelná účastníkovi po uzavření kola") note = wtforms.TextAreaField("Poznámka pro účastníka", description="Viditelná účastníkovi po uzavření kola")
org_note = wtforms.TextAreaField("Interní poznámka", description="Viditelná jen organizátorům") org_note = wtforms.TextAreaField("Interní poznámka", description="Viditelná jen organizátorům")
points = IntegerField('Body', description="Účastník po uzavření kola uvidí jen naposledy zadané body", render_kw={'min': 0}, validators=[validators.Optional()]) # Validátory k points budou přidány podle počtu maximálních bodů úlohy v org_submit_list
points = IntegerField('Body', description="Účastník po uzavření kola uvidí jen naposledy zadané body")
submit = wtforms.SubmitField('Uložit') submit = wtforms.SubmitField('Uložit')
file = flask_wtf.file.FileField("Soubor") file = flask_wtf.file.FileField("Soubor")
...@@ -715,6 +717,11 @@ def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Option ...@@ -715,6 +717,11 @@ def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Option
return redirect(self_url) return redirect(self_url)
form = SubmitForm(obj=sol) form = SubmitForm(obj=sol)
form.points.validators = [
validators.Optional(),
validators.NumberRange(min=0, max=sc.task.max_points, message="Počet bodů musí být mezi %(min)s a %(max)s")
]
form.points.widget = NumberInput(min=0, max=sc.task.max_points) # min a max v HTML
if form.validate_on_submit(): if form.validate_on_submit():
if sol and form.delete.data: if sol and form.delete.data:
if sol.final_submit or sol.final_feedback: if sol.final_submit or sol.final_feedback:
...@@ -736,9 +743,6 @@ def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Option ...@@ -736,9 +743,6 @@ def org_submit_list(contest_id: int, user_id: int, task_id: int, site_id: Option
points = form.points.data points = form.points.data
# Checks # Checks
if sol and sc.allow_edit_points and points and points < 0:
flash('Nelze zadat záporné body, žádné změny nebyly uloženy', 'danger')
return redirect(self_url)
if (form.submit_sol.data or form.submit_fb.data) and form.file.data is None: if (form.submit_sol.data or form.submit_fb.data) and form.file.data is None:
flash('Schází soubor k nahrání, žádné změny nebyly uloženy', 'danger') flash('Schází soubor k nahrání, žádné změny nebyly uloženy', 'danger')
return redirect(self_url) return redirect(self_url)
...@@ -982,6 +986,10 @@ def org_contest_task(contest_id: int, task_id: int, site_id: Optional[int] = Non ...@@ -982,6 +986,10 @@ def org_contest_task(contest_id: int, task_id: int, site_id: Optional[int] = Non
flash('Nelze zadat záporné body', 'danger') flash('Nelze zadat záporné body', 'danger')
ok = False ok = False
break break
elif points and sc.task.max_points is not None and points > sc.task.max_points:
flash(f'Maximální počet bodů za úlohu je {sc.task.max_points}, nelze zadat více', 'danger')
ok = False
break
if points != sol.points: if points != sol.points:
# Save points # Save points
......
...@@ -85,7 +85,7 @@ finální (ve výchozím stavu poslední nahrané).{% elif sc.allow_upload_solut ...@@ -85,7 +85,7 @@ finální (ve výchozím stavu poslední nahrané).{% elif sc.allow_upload_solut
{% if sol.org_note %} <span class="icon" title="Interní poznámka: {{ sol.org_note }}">🗩</span>{% endif %} {% if sol.org_note %} <span class="icon" title="Interní poznámka: {{ sol.org_note }}">🗩</span>{% endif %}
<td> <td>
{% if points_form %} {% if points_form %}
<input type="number" class="form-control" name="points_{{u.user_id}}" value="{{ request_form.get("points_{}".format(u.user_id)) or sol.points }}" size="4"> <input type="number" min=0 {% if task.max_points is not none %}max={{ task.max_points }}{% endif %} class="form-control" name="points_{{u.user_id}}" value="{{ request_form.get("points_{}".format(u.user_id)) or sol.points }}" size="4">
{% else %} {% else %}
{% if sol.points is not none %}{{ sol.points}}{% else %}<span class="unknown">?</span>{% endif %} {% if sol.points is not none %}{{ sol.points}}{% else %}<span class="unknown">?</span>{% endif %}
{% endif %} {% endif %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment