Byrokracie Sklené 2023
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

262 lines
7.5 KiB

from random import random
from typing import Callable, Iterable
from django.conf import settings
from .models import Tym, Zadost
from .utils.doba import Doba
# Velká část logiky je přímo na `.models.Tym`!
def zadosti(tym: Tym, akce: str, choices: list, zadost: str = "Žádost", suffix: str = ""):
choices.append(f"{akce} {zadost}{suffix}")
if tym.zadosti.filter(typ=Zadost.TYP_BANAN, vyzvednuta=True).count() == 0:
choices.append(f"{akce} {zadost} o banán{suffix}")
if tym.vi_o_mase and tym.zadosti.filter(typ=Zadost.TYP_VEGE, vyzvednuta=True).count() == 0:
choices.append(f"{akce} {zadost} o více vegetariánskou stravu v jídelně{suffix}")
if tym.vi_o_zadosti and tym.zadosti.filter(typ=Zadost.TYP_TK, vyzvednuta=True, plati=True).count() == 0:
choices.append(f"{akce} {zadost} o přístup k záznamům o třídní knize{suffix}")
def get_posible_choices_casovy_vyr(doba: Doba, tym: Tym) -> list[str]:
choices = ["Dopředu o hodinu", "Dopředu o 3 hodiny"]
if doba > 3*doba.DEN:
choices.append("Dopředu o den")
if doba > doba.TYDEN:
choices.append("Dopředu o týden")
if tym.tk_nalezena is not None:
choices += ["Dozadu o hodinu", "Dozadu o 3 hodiny", "Dozadu o den", "Dozadu o týden"]
return choices
def get_posible_choices_domov(doba: Doba, tym: Tym) -> list[str]:
choices = []
if tym.nevyzvednute_zadosti.count() > 0:
choices.append("Vyzvednout poštu")
if doba.je_noc:
choices.append("Spát")
if not tym.ma_penize:
choices.append("Vzít si chechtáky")
zadosti(tym, "Tisk", choices, zadost="Žádosti")
if tym.ma_ds:
zadosti(tym, "Podat", choices, suffix=" datovou schránkou")
return choices
def get_posible_choices_posta(doba: Doba, tym: Tym) -> list[str]:
if tym.ds_bad is not None and doba - tym.ds_bad < 5:
return []
choices = []
if tym.zadosti.filter(vytistena=True).count() > 0:
choices.append("Poslat vytištěné žádosti")
if tym.nevyzvednute_zadosti.count() > 0:
choices.append("Zeptat se, zda pro nás mají dopis")
if not tym.ma_ds:
choices.append("Zažádat o datovou schránku")
if tym.ds_bad is not None:
choices.append("Zažádat o datovou schránku (šeptem)")
return choices
def get_posible_choices_studijni(doba: Doba, tym: Tym) -> list[str]:
if (
doba.cas < 8 or
doba.cas > 15 or
doba.den_v_tydnu >= 6 or
(doba.den_v_tydnu == 5 and doba.cas > 13)
):
return []
choices = []
zadosti(tym, "Podat", choices)
if tym.nevyzvednute_zadosti.count():
choices.append("Zeptat se na poslané žádosti")
return choices
def get_posible_choices_jidelna(doba: Doba, tym: Tym) -> list[str]:
if doba.cas < 8 or doba.cas > 22:
return []
choices = ["Klábosit"]
if tym.pocet_bananu < settings.POCET_BANANU:
choices.append("Poprosit o banán")
return choices
def get_posible_choices_archiv(doba: Doba, tym: Tym) -> list[str]:
choices = []
if not (
doba.cas < 8 or
doba.cas > 16 or
doba.den_v_tydnu >= 6 or
(doba.den_v_tydnu == 5 and doba.cas > 14)
):
if tym.ma_penize:
choices.append("Uplatit knihovníka penězi")
if tym.pocet_bananu > 0 and not tym.vi_o_zadosti:
choices.append("Dát banán knihovníkovi")
if tym.ma_platnou_zadost(Zadost.TYP_TK) and tym.tk_nalezena is None:
choices.append("Ukázat knihovníkovi povolení k náhledu do záznamů o třídní knize")
choices.append("Přelézt pult a sami si vzít záznamy o třídní knize")
choices.append("Pokusit se sami projít kartotéku")
return choices
def banan(_: Doba, tym: Tym) -> None:
if (tym.pocet_bananu == 0 and tym.ma_platnou_zadost(Zadost.TYP_BANAN)) or tym.ma_platnou_zadost(Zadost.TYP_VEGE):
tym.pocet_bananu += 1
tym.save()
if tym.pocet_bananu == 1:
print("ALERT: BANÁN!!!")
return (True,)
elif tym.pocet_bananu == 1:
tym.vi_o_mase = True
tym.save()
elif tym.pocet_bananu == 0:
tym.ovesna_kase += 1
tym.save()
return (True,)
get_posible_choices: list[Callable[[Doba, Tym], list[str]]] = [
# 0:
None, # poradi začíná od 1
# 1:
get_posible_choices_casovy_vyr,
# 2:
get_posible_choices_domov,
# 3:
get_posible_choices_posta,
# 4:
get_posible_choices_studijni,
# 5:
get_posible_choices_jidelna,
# 6:
get_posible_choices_archiv,
]
apply_choice: list[dict[str, Callable[[Doba, Tym], Iterable[Zadost] | None]]] = [
# 0:
{}, # poradi začíná od 1
# 1:
{
"Dopředu o hodinu":
lambda _, tym: tym.pricti_cas_a_uloz(1),
"Dopředu o 3 hodiny":
lambda _, tym: tym.pricti_cas_a_uloz(3),
"Dopředu o den":
lambda _, tym: tym.pricti_cas_a_uloz(Doba.DEN),
"Dopředu o týden":
lambda _, tym: tym.pricti_cas_a_uloz(Doba.TYDEN),
"Dozadu o hodinu":
lambda _, tym: tym.pricti_cas_a_uloz(-1),
"Dozadu o 3 hodiny":
lambda _, tym: tym.pricti_cas_a_uloz(-3),
"Dozadu o den":
lambda _, tym: tym.pricti_cas_a_uloz(-Doba.DEN),
"Dozadu o týden":
lambda _, tym: tym.pricti_cas_a_uloz(-Doba.TYDEN),
},
# 2:
{
"Vyzvednout poštu":
lambda doba, tym: tym.vyzvedni_internat(doba),
"Spát":
lambda doba, tym: tym.pricti_cas_a_uloz((settings.DEN[0] - doba.cas + 24) % 24),
"Vzít si chechtáky":
lambda _, tym: tym.nastav_a_uloz("ma_penize", True),
"Tisk Žádosti":
lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_ZADOST),
"Tisk Žádosti o banán":
lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_BANAN),
"Tisk Žádosti o více vegetariánskou stravu v jídelně":
lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_VEGE),
"Tisk Žádosti o přístup k záznamům o třídní knize":
lambda _, tym: tym.vytiskni_zadost(Zadost.TYP_TK),
"Podat Žádost datovou schránkou":
lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_ZADOST),
"Podat Žádost o banán datovou schránkou":
lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_BANAN),
"Podat Žádost o více vegetariánskou stravu v jídelně datovou schránkou":
lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_VEGE),
"Podat Žádost o přístup k záznamům o třídní knize datovou schránkou":
lambda doba, tym: tym.posli_zadost_ds(doba, Zadost.TYP_TK),
},
# 3:
{
"Poslat vytištěné žádosti":
lambda doba, tym: tym.poslat_vytistene_zadosti(doba),
"Zeptat se, zda pro nás mají dopis":
lambda doba, tym: tym.vyzvedni_postu(doba),
"Zažádat o datovou schránku":
lambda doba, tym: tym.nastav_a_uloz("ds_bad", doba),
"Zažádat o datovou schránku (šeptem)":
lambda doba, tym: tym.nastav_a_uloz("ma_ds", True),
},
# 4:
{
"Podat Žádost":
lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_ZADOST),
"Podat Žádost o banán":
lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_BANAN),
"Podat Žádost o více vegetariánskou stravu v jídelně":
lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_VEGE),
"Podat Žádost o přístup k záznamům o třídní knize":
lambda doba, tym: tym.posli_zadost_studijni(doba, Zadost.TYP_TK),
"Zeptat se na poslané žádosti":
lambda doba, tym: tym.nevyzvednute_zadosti.filter(studijni__lte=doba)
},
# 5:
{
"Klábosit":
lambda *_: None, # NOOP
"Poprosit o banán":
banan,
},
# 6:
{
"Uplatit knihovníka penězi":
lambda *_: None, # NOOP
"Dát banán knihovníkovi":
lambda _, tym: tym.nastav_a_uloz("vi_o_zadosti", tym.pocet_bananu == settings.POCET_BANANU),
"Ukázat knihovníkovi povolení k náhledu do záznamů o třídní knize":
lambda doba, tym: tym.nastav_a_uloz("tk_nalezena", doba),
"Přelézt pult a sami si vzít záznamy o třídní knize":
lambda _, tym: tym.pricti_cas_a_uloz(random()*5),
"Pokusit se sami projít kartotéku":
lambda _, tym: tym.pricti_cas_a_uloz(5),
},
]