From dd5d8886ee064553b26a12512ddda6493eef1d7f Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 21:27:04 +0200 Subject: [PATCH 01/13] =?UTF-8?q?Trocha=20popisu=20TabulkaOdevzdanychResen?= =?UTF-8?q?iView,=20a=C5=A5=20se=20v=20tom=20d=C3=A1=20vyznat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index d3c74812..684b790b 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -125,7 +125,7 @@ class TabulkaOdevzdanychReseniView(ListView): ctx = super().get_context_data(*args, **kwargs) ctx['problemy'] = self.problemy ctx['resitele'] = self.resitele - tabulka = dict() + tabulka: dict[m.Problem, dict[m.Resitel, SouhrnReseni]] = dict() def pridej_reseni(problem, resitel, body, cas): if problem not in tabulka: @@ -145,11 +145,11 @@ class TabulkaOdevzdanychReseniView(ListView): for resitel in hodnoceni.reseni.resitele.all(): pridej_reseni(hodnoceni.problem, resitel, hodnoceni.body, hodnoceni.reseni.cas_doruceni) - hodnoty = [] - resitele_do_tabulky = [] + hodnoty: list[list[SouhrnReseni]] = [] + resitele_do_tabulky: list[m.Resitel] = [] for resitel in self.resitele: dostal_body = False - resiteluv_radek = [] + resiteluv_radek: list[SourhnReseni] = [] # podle pořadí v self.problemy, pokud daný problém neřešil, pak None for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: resiteluv_radek.append(tabulka[problem][resitel]) From dd49c0e1ba65a51cc8da54f35e52ed0ed476f850 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 21:47:27 +0200 Subject: [PATCH 02/13] =?UTF-8?q?Mal=C3=A1=20=C3=BAprava=20TabulkaOdevzdan?= =?UTF-8?q?ychReseniView.get=5Fcontext=5Fdata.pridej=5Freseni?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/views.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index 684b790b..6d8013ca 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -127,7 +127,10 @@ class TabulkaOdevzdanychReseniView(ListView): ctx['resitele'] = self.resitele tabulka: dict[m.Problem, dict[m.Resitel, SouhrnReseni]] = dict() - def pridej_reseni(problem, resitel, body, cas): + def pridej_reseni(resitel, hodnoceni): + problem = hodnoceni.problem + body = hodnoceni.body + cas = hodnoceni.reseni.cas_doruceni if problem not in tabulka: tabulka[problem] = dict() if resitel not in tabulka[problem]: @@ -143,7 +146,7 @@ class TabulkaOdevzdanychReseniView(ListView): for hodnoceni in self.get_queryset(): for resitel in hodnoceni.reseni.resitele.all(): - pridej_reseni(hodnoceni.problem, resitel, hodnoceni.body, hodnoceni.reseni.cas_doruceni) + pridej_reseni(resitel, hodnoceni) hodnoty: list[list[SouhrnReseni]] = [] resitele_do_tabulky: list[m.Resitel] = [] From 659ad62b52a522f658df4b0e9cdb6329612d5756 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 22:15:07 +0200 Subject: [PATCH 03/13] =?UTF-8?q?Je=C5=A1t=C4=9B=20docstring=20k=20ReseniP?= =?UTF-8?q?roblemuView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index 6d8013ca..e3715891 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -177,6 +177,11 @@ class TabulkaOdevzdanychReseniView(ListView): # Velmi silně inspirováno zdrojáky, FIXME: Nedá se to udělat smysluplněji? class ReseniProblemuView(MultipleObjectTemplateResponseMixin, MultipleObjectMixin, View): + """Rozskok mezi více řešeními téhož problému od téhož řešitele. + + Asi už bude zastaralý v okamžiku, kdy se tenhle komentář nasadí na produkci :-) + + V případě, že takové řešení existuje jen jedno, tak na něj přesměruje.""" model = m.Reseni template_name = 'odevzdavatko/seznam.html' From 96bc21a727f78c1f1e5943e1b7bc63b56629f9e9 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 22:15:27 +0200 Subject: [PATCH 04/13] =?UTF-8?q?Zru=C5=A1en=20SourhnReseni?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Už není potřeba, v tabulce stejně jsou už přímo řešení. --- odevzdavatko/views.py | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index e3715891..e9bedcbd 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -37,14 +37,6 @@ logger = logging.getLogger(__name__) # Taky se může hodit: # - Tabulka všech řešitelů x všech problémů? -@dataclass -class SouhrnReseni: - """Dataclass reprezentující data o odevzdaných řešeních pro zobrazení v tabulce.""" - pocet_reseni : int - posledni_odevzdani : datetime.datetime - body : float - - class TabulkaOdevzdanychReseniView(ListView): template_name = 'odevzdavatko/tabulka.html' model = m.Hodnoceni @@ -120,26 +112,25 @@ class TabulkaOdevzdanychReseniView(ListView): return qs def get_context_data(self, *args, **kwargs): + # TODO: refactor asi. Přepisoval jsem to jen syntakticky, nejspíš půlka kódu přestala dávat smysl… # self.resitele, self.reseni a self.problemy jsou již nastavené ctx = super().get_context_data(*args, **kwargs) ctx['problemy'] = self.problemy ctx['resitele'] = self.resitele - tabulka: dict[m.Problem, dict[m.Resitel, SouhrnReseni]] = dict() + tabulka: dict[m.Problem, dict[m.Resitel, list[m.Reseni]]] = dict() def pridej_reseni(resitel, hodnoceni): problem = hodnoceni.problem body = hodnoceni.body cas = hodnoceni.reseni.cas_doruceni + reseni = hodnoceni.reseni if problem not in tabulka: tabulka[problem] = dict() if resitel not in tabulka[problem]: - tabulka[problem][resitel] = SouhrnReseni(pocet_reseni=1, posledni_odevzdani=cas, body=body) + tabulka[problem][resitel] = [reseni] else: - tabulka[problem][resitel].posledni_odevzdani = max(tabulka[problem][resitel].posledni_odevzdani, cas) - # Zvětšení počtu bodů o aktuální počet, pokud se tam někde nevyskytuje None – pak je součet taky None ("Pozor, nezadané body") - tabulka[problem][resitel].body = tabulka[problem][resitel].body + body if body is not None and tabulka[problem][resitel].body is not None else None - tabulka[problem][resitel].pocet_reseni += 1 + tabulka[problem][resitel].append(reseni) # Pro jednoduchost template si ještě poznamenáme ID problému a řešitele tabulka[problem][resitel].problem_id = problem.id tabulka[problem][resitel].resitel_id = resitel.id @@ -148,17 +139,17 @@ class TabulkaOdevzdanychReseniView(ListView): for resitel in hodnoceni.reseni.resitele.all(): pridej_reseni(resitel, hodnoceni) - hodnoty: list[list[SouhrnReseni]] = [] + hodnoty: list[list[list[m.Reseni]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy, v každé buňce seznam řešení k danému řešiteli a problému. resitele_do_tabulky: list[m.Resitel] = [] for resitel in self.resitele: dostal_body = False - resiteluv_radek: list[SourhnReseni] = [] # podle pořadí v self.problemy, pokud daný problém neřešil, pak None + resiteluv_radek: list[list[m.Resitel]] = [] # podle pořadí v self.problemy for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: resiteluv_radek.append(tabulka[problem][resitel]) dostal_body = True else: - resiteluv_radek.append(None) + resiteluv_radek.append([]) if self.chteni_resitele != FiltrForm.RESITELE_RELEVANTNI or dostal_body: hodnoty.append(resiteluv_radek) resitele_do_tabulky.append(resitel) From ed5e7a1d9f33c27e383644e000d5992a39786ab6 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 22:16:02 +0200 Subject: [PATCH 05/13] =?UTF-8?q?Template=20pro=20zobrazen=C3=AD=20=C5=99e?= =?UTF-8?q?=C5=A1en=C3=AD=20p=C5=99=C3=ADmo=20v=20tabulce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Snad, ještě jsem to netestoval :-) --- odevzdavatko/templates/odevzdavatko/tabulka.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/odevzdavatko/templates/odevzdavatko/tabulka.html b/odevzdavatko/templates/odevzdavatko/tabulka.html index 6d1232d2..b751b9a5 100644 --- a/odevzdavatko/templates/odevzdavatko/tabulka.html +++ b/odevzdavatko/templates/odevzdavatko/tabulka.html @@ -36,13 +36,13 @@ Do data (včetně): {{ filtr.reseni_do }} {# TODO: Chceme mít view i na řešení konkrétního řešitele ke všem problémům? #} {{ resitel }} - {% for hodn in hodnoty %} + {% for bunka in hodnoty %} - {% if hodn %} - - {{ hodn.pocet_reseni }} řeš.
{{ hodn.body }} b
{{ hodn.posledni_odevzdani|kratke_datum|default_if_none:"Nikdy"|default:"???"}} -
- {% endif %} + {% for reseni in bunka %} + + {{reseni.datum_doruceni | date 'j. n.'}}({{ hodn.body }}b) + + {% endfor %} {% endfor %} From 8f2aa72f6d64f8a7f338da0891bae7d3ba3f2795 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 22:21:42 +0200 Subject: [PATCH 06/13] =?UTF-8?q?Fix=20zapomenut=C3=A9=20fieldy=20v=20tabu?= =?UTF-8?q?lce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO: rebase squash --- odevzdavatko/views.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index e9bedcbd..d5c4f3a1 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -131,9 +131,6 @@ class TabulkaOdevzdanychReseniView(ListView): tabulka[problem][resitel] = [reseni] else: tabulka[problem][resitel].append(reseni) - # Pro jednoduchost template si ještě poznamenáme ID problému a řešitele - tabulka[problem][resitel].problem_id = problem.id - tabulka[problem][resitel].resitel_id = resitel.id for hodnoceni in self.get_queryset(): for resitel in hodnoceni.reseni.resitele.all(): From 53032a49d8c9aed533fd925fff9050e5944b8a71 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 22:23:15 +0200 Subject: [PATCH 07/13] =?UTF-8?q?Neum=C3=ADm=20ps=C3=A1t=20filtry.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit todo squash --- odevzdavatko/templates/odevzdavatko/tabulka.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odevzdavatko/templates/odevzdavatko/tabulka.html b/odevzdavatko/templates/odevzdavatko/tabulka.html index b751b9a5..0dad11e1 100644 --- a/odevzdavatko/templates/odevzdavatko/tabulka.html +++ b/odevzdavatko/templates/odevzdavatko/tabulka.html @@ -40,7 +40,7 @@ Do data (včetně): {{ filtr.reseni_do }} {% for reseni in bunka %} - {{reseni.datum_doruceni | date 'j. n.'}}({{ hodn.body }}b) + {{reseni.datum_doruceni | date:"j. n."}}({{ hodn.body }}b) {% endfor %} From 468443e0621cfcd1eebaa909c48f470017ccd73d Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 22:46:47 +0200 Subject: [PATCH 08/13] =?UTF-8?q?V=20tabulce=20pot=C5=99ebujeme=20zn=C3=A1?= =?UTF-8?q?t=20i=20Hodnocen=C3=AD,=20kv=C5=AFli=20bod=C5=AFm=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/templates/odevzdavatko/tabulka.html | 6 +++--- odevzdavatko/views.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/odevzdavatko/templates/odevzdavatko/tabulka.html b/odevzdavatko/templates/odevzdavatko/tabulka.html index 0dad11e1..f318789a 100644 --- a/odevzdavatko/templates/odevzdavatko/tabulka.html +++ b/odevzdavatko/templates/odevzdavatko/tabulka.html @@ -38,10 +38,10 @@ Do data (včetně): {{ filtr.reseni_do }} {% for bunka in hodnoty %} - {% for reseni in bunka %} + {% for reseni,hodnoceni in bunka %} - {{reseni.datum_doruceni | date:"j. n."}}({{ hodn.body }}b) - + {{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body }}b) +
{% endfor %} {% endfor %} diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index d5c4f3a1..9fda18a8 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -118,7 +118,7 @@ class TabulkaOdevzdanychReseniView(ListView): ctx = super().get_context_data(*args, **kwargs) ctx['problemy'] = self.problemy ctx['resitele'] = self.resitele - tabulka: dict[m.Problem, dict[m.Resitel, list[m.Reseni]]] = dict() + tabulka: dict[m.Problem, dict[m.Resitel, list[tuple[m.Reseni, m.Hodnoceni]]]] = dict() def pridej_reseni(resitel, hodnoceni): problem = hodnoceni.problem @@ -128,19 +128,19 @@ class TabulkaOdevzdanychReseniView(ListView): if problem not in tabulka: tabulka[problem] = dict() if resitel not in tabulka[problem]: - tabulka[problem][resitel] = [reseni] + tabulka[problem][resitel] = [(reseni, hodnoceni)] else: - tabulka[problem][resitel].append(reseni) + tabulka[problem][resitel].append((reseni, hodnoceni)) for hodnoceni in self.get_queryset(): for resitel in hodnoceni.reseni.resitele.all(): pridej_reseni(resitel, hodnoceni) - hodnoty: list[list[list[m.Reseni]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy, v každé buňce seznam řešení k danému řešiteli a problému. + hodnoty: list[list[list[tuple[m.Reseni, m.Hodnoceni]]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy, v každé buňce seznam řešení k danému řešiteli a problému. resitele_do_tabulky: list[m.Resitel] = [] for resitel in self.resitele: dostal_body = False - resiteluv_radek: list[list[m.Resitel]] = [] # podle pořadí v self.problemy + resiteluv_radek: list[list[tuple[m.Resitel, m.Hodnoceni]]] = [] # podle pořadí v self.problemy for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: resiteluv_radek.append(tabulka[problem][resitel]) From bef932345c676fe73ba034b93254dd582f8fab28 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 22:47:13 +0200 Subject: [PATCH 09/13] Kladivoo! --- odevzdavatko/templates/odevzdavatko/tabulka.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odevzdavatko/templates/odevzdavatko/tabulka.html b/odevzdavatko/templates/odevzdavatko/tabulka.html index f318789a..c108c7d8 100644 --- a/odevzdavatko/templates/odevzdavatko/tabulka.html +++ b/odevzdavatko/templates/odevzdavatko/tabulka.html @@ -40,7 +40,7 @@ Do data (včetně): {{ filtr.reseni_do }} {% for reseni,hodnoceni in bunka %} - {{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body }}b) + {{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body|default:"🔨"}}b)
{% endfor %} From 86f6d47f1019a289702b72f2a477ccad17d5e945 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 23:30:57 +0200 Subject: [PATCH 10/13] =?UTF-8?q?Sou=C4=8Dty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hnusně, ale přece… --- odevzdavatko/templates/odevzdavatko/tabulka.html | 7 +++++-- odevzdavatko/views.py | 13 +++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/odevzdavatko/templates/odevzdavatko/tabulka.html b/odevzdavatko/templates/odevzdavatko/tabulka.html index c108c7d8..6f3a0540 100644 --- a/odevzdavatko/templates/odevzdavatko/tabulka.html +++ b/odevzdavatko/templates/odevzdavatko/tabulka.html @@ -36,13 +36,16 @@ Do data (včetně): {{ filtr.reseni_do }} {# TODO: Chceme mít view i na řešení konkrétního řešitele ke všem problémům? #} {{ resitel }} - {% for bunka in hodnoty %} + {% for soucet,bunka in hodnoty %} {% for reseni,hodnoceni in bunka %} - {{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body|default:"🔨"}}b) + {{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body|default_if_none:"🔨"}} b)
{% endfor %} + {% if bunka|length > 1 %} + Σ: {{soucet}} b + {% endif %} {% endfor %} diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index 9fda18a8..d5c7e4bc 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -13,6 +13,7 @@ from django.db.models import Q from dataclasses import dataclass import datetime +from decimal import Decimal from itertools import groupby import logging @@ -119,6 +120,7 @@ class TabulkaOdevzdanychReseniView(ListView): ctx['problemy'] = self.problemy ctx['resitele'] = self.resitele tabulka: dict[m.Problem, dict[m.Resitel, list[tuple[m.Reseni, m.Hodnoceni]]]] = dict() + soucty: dict[m.Problem, dict[m.Resitel, Decimal]] = dict() def pridej_reseni(resitel, hodnoceni): problem = hodnoceni.problem @@ -127,26 +129,29 @@ class TabulkaOdevzdanychReseniView(ListView): reseni = hodnoceni.reseni if problem not in tabulka: tabulka[problem] = dict() + soucty[problem] = dict() if resitel not in tabulka[problem]: tabulka[problem][resitel] = [(reseni, hodnoceni)] + soucty[problem][resitel] = hodnoceni.body or 0 # Neobodované neřešíme else: tabulka[problem][resitel].append((reseni, hodnoceni)) + soucty[problem][resitel] += hodnoceni.body or 0 # Neobodované neřešíme for hodnoceni in self.get_queryset(): for resitel in hodnoceni.reseni.resitele.all(): pridej_reseni(resitel, hodnoceni) - hodnoty: list[list[list[tuple[m.Reseni, m.Hodnoceni]]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy, v každé buňce seznam řešení k danému řešiteli a problému. + hodnoty: list[list[tuple[Decimal,list[tuple[m.Reseni, m.Hodnoceni]]]]] = [] # Seznam řádků výsledné tabulky podle self.resitele, v každém řádku buňky v pořadí podle self.problemy + jejich součty, v každé buňce seznam řešení k danému řešiteli a problému. resitele_do_tabulky: list[m.Resitel] = [] for resitel in self.resitele: dostal_body = False - resiteluv_radek: list[list[tuple[m.Resitel, m.Hodnoceni]]] = [] # podle pořadí v self.problemy + resiteluv_radek: list[tuple[Decimal,list[tuple[m.Resitel, m.Hodnoceni]]]] = [] # podle pořadí v self.problemy for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: - resiteluv_radek.append(tabulka[problem][resitel]) + resiteluv_radek.append((soucty[problem][resitel], tabulka[problem][resitel])) dostal_body = True else: - resiteluv_radek.append([]) + resiteluv_radek.append((Decimal(0),[])) if self.chteni_resitele != FiltrForm.RESITELE_RELEVANTNI or dostal_body: hodnoty.append(resiteluv_radek) resitele_do_tabulky.append(resitel) From fe144e6de77440b8c58dd1f7e818ffd5111998fe Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Mon, 22 May 2023 23:58:04 +0200 Subject: [PATCH 11/13] =?UTF-8?q?Barvi=C4=8Dkyyy!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mamweb/static/css/mamweb.css | 1 + odevzdavatko/templates/odevzdavatko/tabulka.html | 3 ++- odevzdavatko/templatetags/barvy_reseni.py | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 odevzdavatko/templatetags/barvy_reseni.py diff --git a/mamweb/static/css/mamweb.css b/mamweb/static/css/mamweb.css index 63c5f527..b1b192d6 100644 --- a/mamweb/static/css/mamweb.css +++ b/mamweb/static/css/mamweb.css @@ -1233,6 +1233,7 @@ div.gdpr { .dosla_reseni tr th, .dosla_reseni tr td { padding: 1px 10px 1px 10px; border-collapse: collapse; + min-width: 8em; /*Nastřeleno, aby se řádky s řešeními nezalamovaly. Teoreticky není potřeba pro th, ale whatever.*/ } .dosla_reseni tr:nth-child(even) { diff --git a/odevzdavatko/templates/odevzdavatko/tabulka.html b/odevzdavatko/templates/odevzdavatko/tabulka.html index 6f3a0540..5fd3b8db 100644 --- a/odevzdavatko/templates/odevzdavatko/tabulka.html +++ b/odevzdavatko/templates/odevzdavatko/tabulka.html @@ -1,6 +1,7 @@ {% extends "base.html" %} {% load utils %} {# Možná by mohlo být někde výš v hierarchii templatů... #} +{% load barvy_reseni %} {% block content %} @@ -39,7 +40,7 @@ Do data (včetně): {{ filtr.reseni_do }} {% for soucet,bunka in hodnoty %} {% for reseni,hodnoceni in bunka %} - + {{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body|default_if_none:"🔨"}} b)
{% endfor %} diff --git a/odevzdavatko/templatetags/barvy_reseni.py b/odevzdavatko/templatetags/barvy_reseni.py new file mode 100644 index 00000000..5a3791fd --- /dev/null +++ b/odevzdavatko/templatetags/barvy_reseni.py @@ -0,0 +1,15 @@ +from django import template +register = template.Library() + +from functools import cache +import seminar.models as m + +@register.filter +@cache +def barva_reseni(r: m.Reseni): + """Vrátí nějakou barvu pro daný problém, ve tvaru '#RRGGBB' + + Efektivně hešujeme do barev.""" + + #TODO: ne všechny barvy jsou dobře rozlišitelné a vidět… + return f'#{hash(str(r.id)) & 0xffffff:06x}' From d304e46ceb3499aed5e62b7f6a53aa4f41522ce8 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 23 May 2023 00:28:13 +0200 Subject: [PATCH 12/13] =?UTF-8?q?Barvi=C4=8Dky=20jdou=20vypnout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/forms.py | 2 ++ odevzdavatko/templates/odevzdavatko/tabulka.html | 3 ++- odevzdavatko/views.py | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/odevzdavatko/forms.py b/odevzdavatko/forms.py index 223d807f..8fdd1e21 100644 --- a/odevzdavatko/forms.py +++ b/odevzdavatko/forms.py @@ -196,6 +196,7 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): 'reseni_od': terminy[-2] if rocnik is None else terminy[0], 'reseni_do': terminy[-1], 'neobodovane': False, + 'barvicky': True, } return initial @@ -220,3 +221,4 @@ class OdevzdavatkoTabulkaFiltrForm(forms.Form): reseni_od = forms.DateField(input_formats=[DATE_FORMAT]) reseni_do = forms.DateField(input_formats=[DATE_FORMAT]) neobodovane = forms.BooleanField(required=False) + barvicky = forms.BooleanField(required=False) diff --git a/odevzdavatko/templates/odevzdavatko/tabulka.html b/odevzdavatko/templates/odevzdavatko/tabulka.html index 5fd3b8db..7cd317e5 100644 --- a/odevzdavatko/templates/odevzdavatko/tabulka.html +++ b/odevzdavatko/templates/odevzdavatko/tabulka.html @@ -12,6 +12,7 @@ Od data (vyjma): {{ filtr.reseni_od }} Do data (včetně): {{ filtr.reseni_do }} 🔨? {{ filtr.neobodovane }} +🎨? {{ filtr.barvicky }} @@ -40,7 +41,7 @@ Do data (včetně): {{ filtr.reseni_do }} {% for soucet,bunka in hodnoty %} {% for reseni,hodnoceni in bunka %} - + {{reseni.cas_doruceni | date:"j. n."}} ({{ hodnoceni.body|default_if_none:"🔨"}} b)
{% endfor %} diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index d5c7e4bc..a3838285 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -63,6 +63,7 @@ class TabulkaOdevzdanychReseniView(ListView): reseni_od = fcd["reseni_od"] reseni_do = fcd["reseni_do"] jen_neobodovane = fcd["neobodovane"] + self.barvicky = fcd["barvicky"] else: initial = FiltrForm.gen_initial(self.aktualni_rocnik) resitele = initial['resitele'] @@ -70,6 +71,7 @@ class TabulkaOdevzdanychReseniView(ListView): reseni_od = initial['reseni_od'][0] reseni_do = initial['reseni_do'][0] jen_neobodovane = initial["neobodovane"] + self.barvicky = initial["barvicky"] # Chceme jen letošní problémy @@ -161,6 +163,7 @@ class TabulkaOdevzdanychReseniView(ListView): ctx['form'] = ctx['filtr'] # Pro maximum v přesměrovátku ročníků ctx['aktualni_rocnik'] = m.Nastaveni.get_solo().aktualni_rocnik + ctx['barvicky'] = self.barvicky if 'rocnik' in self.kwargs: ctx['rocnik'] = self.kwargs['rocnik'] else: From feffa99d793e76a78c4dca8d0633e56d27613bb2 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 20 Jun 2023 00:26:40 +0200 Subject: [PATCH 13/13] =?UTF-8?q?Fix=20typu=20v=20hodnot=C3=ADtku?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- odevzdavatko/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/odevzdavatko/views.py b/odevzdavatko/views.py index a3838285..781ff8bc 100644 --- a/odevzdavatko/views.py +++ b/odevzdavatko/views.py @@ -147,7 +147,7 @@ class TabulkaOdevzdanychReseniView(ListView): resitele_do_tabulky: list[m.Resitel] = [] for resitel in self.resitele: dostal_body = False - resiteluv_radek: list[tuple[Decimal,list[tuple[m.Resitel, m.Hodnoceni]]]] = [] # podle pořadí v self.problemy + resiteluv_radek: list[tuple[Decimal,list[tuple[m.Reseni, m.Hodnoceni]]]] = [] # podle pořadí v self.problemy for problem in self.problemy: if problem in tabulka and resitel in tabulka[problem]: resiteluv_radek.append((soucty[problem][resitel], tabulka[problem][resitel]))