diff --git a/odevzdavatko/templates/odevzdavatko/detail.html b/odevzdavatko/templates/odevzdavatko/detail.html
index b5402001..cf4e394a 100644
--- a/odevzdavatko/templates/odevzdavatko/detail.html
+++ b/odevzdavatko/templates/odevzdavatko/detail.html
@@ -66,7 +66,7 @@ $(document).ready(function(){
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
Forma: {{ object.get_forma_display }}
-Doručeno {{ object.cas_doruceni }}, deadline: {{object.cas_doruceni | deadline_html }}
+Doručeno {{ object.cas_doruceni }}, deadline: {{object.deadline_reseni | deadline_html }}
{# Soubory: #}
Přílohy:
diff --git a/odevzdavatko/templates/odevzdavatko/detail_resitele.html b/odevzdavatko/templates/odevzdavatko/detail_resitele.html
index c1741f1c..1c7622a7 100644
--- a/odevzdavatko/templates/odevzdavatko/detail_resitele.html
+++ b/odevzdavatko/templates/odevzdavatko/detail_resitele.html
@@ -12,7 +12,7 @@
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
Forma: {{ object.get_forma_display }}
-Doručeno {{ object.cas_doruceni }}, deadline: {{object.cas_doruceni | deadline_html }}
+Doručeno {{ object.cas_doruceni }}, deadline: {{object.deadline_reseni | deadline_html }}
{# Soubory: #}
Přílohy:
diff --git a/odevzdavatko/templates/odevzdavatko/prehled_reseni.html b/odevzdavatko/templates/odevzdavatko/prehled_reseni.html
index 8c91a92a..f5b0608f 100644
--- a/odevzdavatko/templates/odevzdavatko/prehled_reseni.html
+++ b/odevzdavatko/templates/odevzdavatko/prehled_reseni.html
@@ -29,7 +29,7 @@
{{ hodn.problem.nazev | zkrat_nazev_problemu:27 }} |
{{ hodn.problem.nazev | zkrat_nazev_problemu:10 }} |
{{ hodn.body|default_if_none:"---" }} |
- {{ hodn.reseni.cas_doruceni | deadline_html }} |
+ {{ hodn.deadline_body | deadline_html }} |
{% endfor %}
diff --git a/odevzdavatko/templates/odevzdavatko/seznam.html b/odevzdavatko/templates/odevzdavatko/seznam.html
index bb2e4f38..b33f0ca0 100644
--- a/odevzdavatko/templates/odevzdavatko/seznam.html
+++ b/odevzdavatko/templates/odevzdavatko/seznam.html
@@ -4,7 +4,7 @@
{% block content %}
{% for dl, mnozina_reseni in reseni_podle_deadlinu.items %}
-{{ dl.2 | deadline_html }}
+{{ dl | deadline_html }}
{% for obj in mnozina_reseni %}
- {{ obj.sum_body }} b za {{ obj }} ({{ obj.get_forma_display }} {{ obj.cas_doruceni }})
diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py
index 04db1e5b..de737ad1 100644
--- a/odevzdavatko/views.py
+++ b/odevzdavatko/views.py
@@ -202,7 +202,7 @@ class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixi
# XXX: Předat groupby do template nejde: https://stackoverflow.com/questions/6906593/itertools-groupby-in-a-django-template
# Django má {% regroup %}, ale ten potřebuje, aby klíč byl atribut položky: https://docs.djangoproject.com/en/3.2/ref/templates/builtins/#regroup
# Takže rozbalíme groupby do slovníku klíč → seznam sami (dictionary comphrehension)
- ctx['reseni_podle_deadlinu'] = {k: list(v) for k,v in groupby(ctx['object_list'], lambda r: deadline(r.cas_doruceni))}
+ ctx['reseni_podle_deadlinu'] = {k: list(v) for k,v in groupby(ctx['object_list'], lambda r: r.deadline_reseni)}
# Pro sitetree:
ctx["resitel_id"] = self.kwargs['resitel']
@@ -320,9 +320,8 @@ class PrehledOdevzdanychReseni(ListView):
ctx = super().get_context_data(*args, **kwargs)
# Ročník určujeme podle čísla, do jehož deadlinu došlo řešení.
# Chceme to mít seřazené, takže místo comphrerehsion ručně postavíme pole polí. Django templates neumí použít OrderedDict :-/
- # TODO: Funkce deadline vrací deadliny v jiném ročníku, zvlášť pokud se vyrobí řešení až po deadlinu (třeba při poslání mailem)
podle_rocniku = []
- for rocnik, hodnoceni in groupby(ctx['object_list'], lambda ho: deadline(ho.reseni.cas_doruceni)[1].rocnik if deadline(ho.reseni.cas_doruceni) is not None else None):
+ for rocnik, hodnoceni in groupby(ctx['object_list'], lambda ho: ho.deadline_body.cislo.rocnik if ho.deadline_body is not None else None):
podle_rocniku.append((rocnik, list(hodnoceni)))
ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku
# TODO: Umožnit stažení / zobrazení řešení
diff --git a/seminar/models/odevzdavatko.py b/seminar/models/odevzdavatko.py
index ed16166f..2fef5a09 100644
--- a/seminar/models/odevzdavatko.py
+++ b/seminar/models/odevzdavatko.py
@@ -78,6 +78,9 @@ class Reseni(bm.SeminarModelBase):
return "{}({}): {}({})".format(self.resitele.first(),len(self.resitele.all()), self.problem.first() ,len(self.problem.all()))
# NOTE: Potenciální DB HOG (bez select_related)
+ def deadline_reseni(self):
+ return am.Deadline.objects.filter(deadline__gte=self.cas_doruceni).order_by("deadline").first()
+
## Pravdepodobne uz nebude potreba:
# def save(self, *args, **kwargs):
# if ((self.cislo_body is None) and (self.problem.cislo_reseni) and
diff --git a/seminar/templatetags/deadliny.py b/seminar/templatetags/deadliny.py
index 9cf0f7f4..a8674917 100644
--- a/seminar/templatetags/deadliny.py
+++ b/seminar/templatetags/deadliny.py
@@ -1,44 +1,32 @@
from django import template
from django.utils.safestring import mark_safe
-from seminar.utils import TypDeadline, deadline
register = template.Library()
-
-@register.filter(name='deadline')
-def deadline_text(datum):
- if deadline(datum) is None:
- return 'Neznámý deadline'
- typ, cislo, dl = deadline(datum)
- strings = {
- TypDeadline.PredDeadline: f"1. deadline čísla {cislo} ({dl})",
- TypDeadline.SousDeadline: f"Soustřeďkový deadline čísla {cislo} ({dl})",
- TypDeadline.FinalDeadline: f"Finální deadline čísla {cislo} ({dl})",
- }
- return strings[typ]
+import seminar.models as m
@register.filter(name='deadline_kratseji')
-def deadline_kratsi_text(datum):
- if deadline(datum) is None:
+def deadline_kratsi_text(deadline: m.Deadline):
+ if deadline is None:
return 'NONE'
- typ, cislo, dl = deadline(datum)
strings = {
- TypDeadline.PredDeadline: f"{cislo} ♲",
- TypDeadline.SousDeadline: f"{cislo} Ⓢ",
- TypDeadline.FinalDeadline: f"{cislo} ✓",
+ m.Deadline.TYP_PRVNI: f"{deadline.cislo} ♲",
+ m.Deadline.TYP_SOUS: f"{deadline.cislo} Ⓢ",
+ m.Deadline.TYP_PRVNI_A_SOUS: f"{deadline.cislo} ♲Ⓢ",
+ m.Deadline.TYP_CISLA: f"{deadline.cislo} ✓",
}
- return strings[typ]
+ return strings[deadline.typ]
@register.filter(name='deadline_html')
-def deadline_html(datum):
- if deadline(datum) is None:
+def deadline_html(deadline: m.Deadline):
+ if deadline is None:
return 'Neznámý deadline'
- typ, _, _ = deadline(datum)
- text = deadline_kratsi_text(datum)
+ text = deadline_kratsi_text(deadline)
classes = {
- TypDeadline.PredDeadline: 'preddeadline',
- TypDeadline.SousDeadline: 'sous_deadline',
- TypDeadline.FinalDeadline: 'final_deadline',
+ m.Deadline.TYP_PRVNI: 'preddeadline',
+ m.Deadline.TYP_SOUS: 'sous_deadline',
+ m.Deadline.TYP_PRVNI_A_SOUS: 'sous_deadline',
+ m.Deadline.TYP_CISLA: 'final_deadline',
}
- return mark_safe(f'{text}')
+ return mark_safe(f'{text}')
@register.filter(name='zkrat_nazev_problemu')
def zkrat_nazev_problemu(nazev,width):