From 4d299d54ef9c8bc86dae4864ae6a1c1586885962 Mon Sep 17 00:00:00 2001 From: "Pavel \"LEdoian\" Turinsky" Date: Tue, 30 Mar 2021 22:01:16 +0200 Subject: [PATCH] =?UTF-8?q?Utils:=20funkce=20na=20dohled=C3=A1v=C3=A1n?= =?UTF-8?q?=C3=AD=20deadlin=C5=AF=20k=20dat=C5=AFm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- seminar/utils.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/seminar/utils.py b/seminar/utils.py index 26d52665..9b291b24 100644 --- a/seminar/utils.py +++ b/seminar/utils.py @@ -11,6 +11,8 @@ from django.contrib.auth.models import AnonymousUser from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist +from enum import Enum + import seminar.models as m import seminar.treelib as t @@ -282,3 +284,58 @@ def podproblemy_v_cislu(cislo, problemy=None, hlavni_problemy=None): podproblemy[-1].append(problem) return podproblemy + +class TypDeadline(Enum): + PredDeadline = auto() + SousDeadline = auto() + FinalDeadline = auto() + +def deadline_v_rocniku(datum, rocnik): + """Funkce pro dohledání, ke kterému deadlinu daného ročníku se datum váže. + + Vrací trojici (TypDeadline, Cislo, datumDeadline: date). + + V případě nevalidního volání není aktuálně chování definováno(!) + """ + cisla = m.Cislo.objects.filter(rocnik=rocnik) + deadliny = [] + for c in cisla: + if c.datum_preddeadline is not None: + deadliny.append((TypDeadline.PredDeadline, c, c.datum_preddeadline)) + if c.datum_deadline_soustredeni is not None: + deadliny.append((TypDeadline.SousDeadline, c, c.datum_deadline_soustredeni)) + if c.datum_deadline is not None: + deadliny.append((TypDeadline.FinalDeadline, c, c.datum_deadline)) + deadliny = sorted(deadliny, key=lambda x: x[2]) # podle data + for dl in deadliny: + if datum <= dl: + # První takový deadline je ten nejtěsnější + return dl + +def deadline(datum): + """Funkce pro dohledání, ke kterému deadlinu se datum váže. + + Vrací trojici (TypDeadline, Cislo, datumDeadline: date). + """ + + rok = datum.year + # Dva ročníky podezřelé z obsahování dat + pozdejsi_rocnik = m.Rocnik.filter(prvni_rok=rok) + drivejsi_rocnik = m.Rocnik.filter(druhy_rok=rok) + if any( + pozdejsi_rocnik.count() > 1, + drivejsi_rocnik.count() > 1, + ): + raise ValueError(f"Více ročníků začíná/končí stejným rokem: {rok}") + pozdejsi_rocnik = pozdejsi_rocnik.first() if pozdejsi_rocnik.count() > 0 else None + drivejsi_rocnik = drivejsi_rocnik.first() if drivejsi_rocnik.count() > 0 else None + + # Předpokládáme, že neexistuje číslo, které má deadline ale nemá finální deadline. + posledni_deadline_drivejsiho_rocniku = m.Cislo.objects.get(rocnik=drivejsi_rocnik, datum_deadline__isnull=False).datum_deadline + + if datum <= posledni_deadline_drivejsiho_rocniku: + return deadline_v_rocniku(datum, drivejsi_rocnik) + else: + return deadline_v_rocniku(datum, pozdejsi_rocnik) + +