Deadliny u řešení
This commit is contained in:
parent
862ee994dc
commit
e30ae81854
7 changed files with 25 additions and 35 deletions
|
@ -66,7 +66,7 @@ $(document).ready(function(){
|
||||||
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
|
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
|
||||||
<p>Forma: {{ object.get_forma_display }}</p>
|
<p>Forma: {{ object.get_forma_display }}</p>
|
||||||
|
|
||||||
<p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.cas_doruceni | deadline_html }}</p>
|
<p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.deadline_reseni | deadline_html }}</p>
|
||||||
|
|
||||||
{# Soubory: #}
|
{# Soubory: #}
|
||||||
<h3>Přílohy:</h3>
|
<h3>Přílohy:</h3>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
|
{# https://docs.djangoproject.com/en/3.1/ref/models/instances/#django.db.models.Model.get_FOO_display #}
|
||||||
<p>Forma: {{ object.get_forma_display }}</p>
|
<p>Forma: {{ object.get_forma_display }}</p>
|
||||||
|
|
||||||
<p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.cas_doruceni | deadline_html }}</p>
|
<p>Doručeno {{ object.cas_doruceni }}, deadline: {{object.deadline_reseni | deadline_html }}</p>
|
||||||
|
|
||||||
{# Soubory: #}
|
{# Soubory: #}
|
||||||
<h3>Přílohy:</h3>
|
<h3>Přílohy:</h3>
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
<td class="problem odevzdanareseni_small"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:27 }}</span></td>
|
<td class="problem odevzdanareseni_small"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:27 }}</span></td>
|
||||||
<td class="problem odevzdanareseni_mini"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:10 }}</span></td>
|
<td class="problem odevzdanareseni_mini"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:10 }}</span></td>
|
||||||
<td>{{ hodn.body|default_if_none:"---" }}</td>
|
<td>{{ hodn.body|default_if_none:"---" }}</td>
|
||||||
<td>{{ hodn.reseni.cas_doruceni | deadline_html }}</td>
|
<td>{{ hodn.deadline_body | deadline_html }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
{% for dl, mnozina_reseni in reseni_podle_deadlinu.items %}
|
{% for dl, mnozina_reseni in reseni_podle_deadlinu.items %}
|
||||||
<h1>{{ dl.2 | deadline_html }}</h1>
|
<h1>{{ dl | deadline_html }}</h1>
|
||||||
<ul>
|
<ul>
|
||||||
{% for obj in mnozina_reseni %}
|
{% for obj in mnozina_reseni %}
|
||||||
<li>{{ obj.sum_body }} b za <a href="{% url 'odevzdavatko_detail_reseni' pk=obj.id %}">{{ obj }}</a> ({{ obj.get_forma_display }} {{ obj.cas_doruceni }})
|
<li>{{ obj.sum_body }} b za <a href="{% url 'odevzdavatko_detail_reseni' pk=obj.id %}">{{ obj }}</a> ({{ obj.get_forma_display }} {{ obj.cas_doruceni }})
|
||||||
|
|
|
@ -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
|
# 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
|
# 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)
|
# 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:
|
# Pro sitetree:
|
||||||
ctx["resitel_id"] = self.kwargs['resitel']
|
ctx["resitel_id"] = self.kwargs['resitel']
|
||||||
|
@ -320,9 +320,8 @@ class PrehledOdevzdanychReseni(ListView):
|
||||||
ctx = super().get_context_data(*args, **kwargs)
|
ctx = super().get_context_data(*args, **kwargs)
|
||||||
# Ročník určujeme podle čísla, do jehož deadlinu došlo řešení.
|
# 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 :-/
|
# 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 = []
|
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)))
|
podle_rocniku.append((rocnik, list(hodnoceni)))
|
||||||
ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku
|
ctx['podle_rocniku'] = reversed(podle_rocniku) # Od nejnovějšího ročníku
|
||||||
# TODO: Umožnit stažení / zobrazení řešení
|
# TODO: Umožnit stažení / zobrazení řešení
|
||||||
|
|
|
@ -78,6 +78,9 @@ class Reseni(bm.SeminarModelBase):
|
||||||
return "{}({}): {}({})".format(self.resitele.first(),len(self.resitele.all()), self.problem.first() ,len(self.problem.all()))
|
return "{}({}): {}({})".format(self.resitele.first(),len(self.resitele.all()), self.problem.first() ,len(self.problem.all()))
|
||||||
# NOTE: Potenciální DB HOG (bez select_related)
|
# 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:
|
## Pravdepodobne uz nebude potreba:
|
||||||
# def save(self, *args, **kwargs):
|
# def save(self, *args, **kwargs):
|
||||||
# if ((self.cislo_body is None) and (self.problem.cislo_reseni) and
|
# if ((self.cislo_body is None) and (self.problem.cislo_reseni) and
|
||||||
|
|
|
@ -1,44 +1,32 @@
|
||||||
from django import template
|
from django import template
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from seminar.utils import TypDeadline, deadline
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
import seminar.models as m
|
||||||
@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]
|
|
||||||
|
|
||||||
@register.filter(name='deadline_kratseji')
|
@register.filter(name='deadline_kratseji')
|
||||||
def deadline_kratsi_text(datum):
|
def deadline_kratsi_text(deadline: m.Deadline):
|
||||||
if deadline(datum) is None:
|
if deadline is None:
|
||||||
return 'NONE'
|
return 'NONE'
|
||||||
typ, cislo, dl = deadline(datum)
|
|
||||||
strings = {
|
strings = {
|
||||||
TypDeadline.PredDeadline: f"{cislo} ♲",
|
m.Deadline.TYP_PRVNI: f"{deadline.cislo} ♲",
|
||||||
TypDeadline.SousDeadline: f"{cislo} Ⓢ",
|
m.Deadline.TYP_SOUS: f"{deadline.cislo} Ⓢ",
|
||||||
TypDeadline.FinalDeadline: f"{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')
|
@register.filter(name='deadline_html')
|
||||||
def deadline_html(datum):
|
def deadline_html(deadline: m.Deadline):
|
||||||
if deadline(datum) is None:
|
if deadline is None:
|
||||||
return 'Neznámý deadline'
|
return 'Neznámý deadline'
|
||||||
typ, _, _ = deadline(datum)
|
text = deadline_kratsi_text(deadline)
|
||||||
text = deadline_kratsi_text(datum)
|
|
||||||
classes = {
|
classes = {
|
||||||
TypDeadline.PredDeadline: 'preddeadline',
|
m.Deadline.TYP_PRVNI: 'preddeadline',
|
||||||
TypDeadline.SousDeadline: 'sous_deadline',
|
m.Deadline.TYP_SOUS: 'sous_deadline',
|
||||||
TypDeadline.FinalDeadline: 'final_deadline',
|
m.Deadline.TYP_PRVNI_A_SOUS: 'sous_deadline',
|
||||||
|
m.Deadline.TYP_CISLA: 'final_deadline',
|
||||||
}
|
}
|
||||||
return mark_safe(f'<span class="{classes[typ]}">{text}</span>')
|
return mark_safe(f'<span class="{classes[deadline.typ]}">{text}</span>')
|
||||||
|
|
||||||
@register.filter(name='zkrat_nazev_problemu')
|
@register.filter(name='zkrat_nazev_problemu')
|
||||||
def zkrat_nazev_problemu(nazev,width):
|
def zkrat_nazev_problemu(nazev,width):
|
||||||
|
|
Loading…
Reference in a new issue