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

Funkce na formátování a parsování zobecněných bodů

Počet bodů nebo "X" pro neodevzdané řešení.

Časem možná přibude symbol pro odevzdaný papír, na kterém není řešení.
parent a78a1703
Branches
No related tags found
No related merge requests found
...@@ -144,7 +144,7 @@ def parse_points( ...@@ -144,7 +144,7 @@ def parse_points(
) -> Tuple[Optional[decimal.Decimal], Optional[str]]: ) -> Tuple[Optional[decimal.Decimal], Optional[str]]:
"""Naparsuje a zkontroluje body. Vrátí body (jako decimal.Decimal nebo None """Naparsuje a zkontroluje body. Vrátí body (jako decimal.Decimal nebo None
při prázdných bodech) a případný error (None pokud nenastal, jinak text chyby).""" při prázdných bodech) a případný error (None pokud nenastal, jinak text chyby)."""
if not raw_points or raw_points == "": if not raw_points:
return None, None return None, None
try: try:
points = decimal.Decimal(raw_points.replace(',', '.')) points = decimal.Decimal(raw_points.replace(',', '.'))
...@@ -154,6 +154,26 @@ def parse_points( ...@@ -154,6 +154,26 @@ def parse_points(
return points, check_points(points, for_task, for_round) return points, check_points(points, for_task, for_round)
def parse_gen_points(
gen_points: Optional[str], for_task: Optional[db.Task] = None, for_round: Optional[db.Round] = None,
) -> Tuple[str, Optional[decimal.Decimal], Optional[str]]:
"""Zobecnění parse_points(). Naparsuje generalizované body používané při editaci.
Vrátí typ hodnocení, body (decimal.Decimal nebo None) a případný error."""
if gen_points is None or gen_points == 'X':
# Řešení nemá existovat
return 'X', None, None
elif gen_points == "" or gen_points == '?':
# Řešení má existovat, ale nemá přidělené body
return 'N', None, None
else:
# Řešení je ohodnoceno
try:
points = decimal.Decimal(gen_points.replace(',', '.'))
except decimal.InvalidOperation:
return "", decimal.Decimal(0), f"Hodnota '{gen_points}' není číslo ani X"
return 'P', points, check_points(points, for_task, for_round)
def check_points(points: decimal.Decimal, for_task: Optional[db.Task] = None, for_round: Optional[db.Round] = None) -> Optional[str]: def check_points(points: decimal.Decimal, for_task: Optional[db.Task] = None, for_round: Optional[db.Round] = None) -> Optional[str]:
"""Zkontroluje body. Pokud je vše ok, tak vrátí None, jinak vrátí text chyby.""" """Zkontroluje body. Pokud je vše ok, tak vrátí None, jinak vrátí text chyby."""
if points < 0: if points < 0:
......
...@@ -5,7 +5,7 @@ from flask import url_for ...@@ -5,7 +5,7 @@ from flask import url_for
import json import json
from html import escape from html import escape
from markupsafe import Markup from markupsafe import Markup
from typing import Any from typing import Any, Union, Optional
import urllib.parse import urllib.parse
import mo.config as config import mo.config as config
...@@ -135,3 +135,23 @@ def log_url(typ: str, id: int) -> str: ...@@ -135,3 +135,23 @@ def log_url(typ: str, id: int) -> str:
@app.template_filter() @app.template_filter()
def user_flags(u: db.User) -> Markup: def user_flags(u: db.User) -> Markup:
return user_html_flags(u) return user_html_flags(u)
@app.template_filter()
def sol_editable_points(s: Optional[db.Solution]) -> str:
if s is None:
return 'X'
elif s.points is None:
return ""
else:
return util_format.format_decimal(s.points)
@app.template_filter()
def sol_display_points(s: Optional[db.Solution]) -> Union[str, Markup]:
if s is None:
return ''
elif s.points is None:
return Markup('<span class="unknown">?</span>')
else:
return util_format.format_decimal(s.points)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment