Browse Source

Deadliny u řešení

pull/3/head
Jonas Havelka 2 years ago
parent
commit
e30ae81854
  1. 2
      odevzdavatko/templates/odevzdavatko/detail.html
  2. 2
      odevzdavatko/templates/odevzdavatko/detail_resitele.html
  3. 2
      odevzdavatko/templates/odevzdavatko/prehled_reseni.html
  4. 2
      odevzdavatko/templates/odevzdavatko/seznam.html
  5. 5
      odevzdavatko/views.py
  6. 3
      seminar/models/odevzdavatko.py
  7. 44
      seminar/templatetags/deadliny.py

2
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 #}
<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: #}
<h3>Přílohy:</h3>

2
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 #}
<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: #}
<h3>Přílohy:</h3>

2
odevzdavatko/templates/odevzdavatko/prehled_reseni.html

@ -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_mini"><span title="{{ hodn.problem.nazev }}">{{ hodn.problem.nazev | zkrat_nazev_problemu:10 }}</span></td>
<td>{{ hodn.body|default_if_none:"---" }}</td>
<td>{{ hodn.reseni.cas_doruceni | deadline_html }}</td>
<td>{{ hodn.deadline_body | deadline_html }}</td>
</tr>
{% endfor %}
</table>

2
odevzdavatko/templates/odevzdavatko/seznam.html

@ -4,7 +4,7 @@
{% block content %}
{% for dl, mnozina_reseni in reseni_podle_deadlinu.items %}
<h1>{{ dl.2 | deadline_html }}</h1>
<h1>{{ dl | deadline_html }}</h1>
<ul>
{% 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 }})

5
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í

3
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

44
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'<span class="{classes[typ]}">{text}</span>')
return mark_safe(f'<span class="{classes[deadline.typ]}">{text}</span>')
@register.filter(name='zkrat_nazev_problemu')
def zkrat_nazev_problemu(nazev,width):

Loading…
Cancel
Save