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
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),
|
|
},
|
|
]
|
|
|