Jonas Havelka
3 months ago
6 changed files with 443 additions and 368 deletions
@ -0,0 +1,27 @@ |
|||||
|
import logging |
||||
|
|
||||
|
from .models import Novinky |
||||
|
|
||||
|
logger = logging.getLogger(__name__) |
||||
|
|
||||
|
|
||||
|
def gen_novinky(rnd, organizatori): |
||||
|
logger.info('Generuji novinky...') |
||||
|
|
||||
|
jake = ["zábavné", "veselé", "dobrodružné", "skvělé"] |
||||
|
co = ["soustředění", "Fyziklání", "víkendové setkání"] |
||||
|
kde = ["na Šumavě", "v Praze", "u Plzně", "na Marsu"] |
||||
|
kdy = ["Zítra bude", "10. 10. 2020 bude", "V prosinci bude", "V létě bude"] |
||||
|
|
||||
|
for i in range(5): |
||||
|
text_novinky = " ".join([ |
||||
|
rnd.choice(kdy), rnd.choice(kde), |
||||
|
rnd.choice(jake), rnd.choice(co), |
||||
|
]) |
||||
|
novinka = Novinky.objects.create( |
||||
|
id=i, autor=rnd.choice(organizatori), |
||||
|
text=(text_novinky+", těšíme se na vás!"), |
||||
|
zverejneno=rnd.choice([True, False]), |
||||
|
) |
||||
|
novinka.save() |
||||
|
return |
@ -0,0 +1,40 @@ |
|||||
|
import datetime |
||||
|
import random |
||||
|
|
||||
|
from seminar.models.odevzdavatko import Reseni, Hodnoceni |
||||
|
|
||||
|
|
||||
|
def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele): |
||||
|
pocet_reseni = rnd.randint(pocet_resitelu//4, pocet_resitelu * 4) |
||||
|
# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla |
||||
|
for _ in range(pocet_reseni): |
||||
|
#print("Generuji {}-té řešení".format(reseni)) |
||||
|
if rnd.randint(1, 10) == 1: |
||||
|
# cca desetina řešení od více řešitelů |
||||
|
res_vyber = rnd.sample(resitele_cisla, rnd.randint(2, 5)) |
||||
|
else: |
||||
|
res_vyber = rnd.sample(resitele_cisla, 1) |
||||
|
if resitele[0] in res_vyber: # speciální řešitel, který nemá žádné body |
||||
|
res_vyber.remove(resitele[0]) |
||||
|
|
||||
|
# Vytvoření řešení. |
||||
|
if uloha.cislo_zadani.zlomovy_deadline_pro_papirove_cislo() is not None: |
||||
|
# combine, abychom dostali plný čas a ne jen datum |
||||
|
cas_doruceni = uloha.cislo_zadani.deadline_v_cisle.first().deadline - datetime.timedelta(days=random.randint(0, 40)) - datetime.timedelta(minutes=random.randint(0, 60*24)) |
||||
|
# astimezone, protože jinak vyhazuje warning o nenastavené TZ |
||||
|
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0], cas_doruceni=cas_doruceni.astimezone(datetime.timezone.utc)) |
||||
|
else: |
||||
|
res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0]) |
||||
|
# Problém a řešitele přiřadíme později, ManyToManyField |
||||
|
# se nedá vyplnit v create(). |
||||
|
res.resitele.set(res_vyber) |
||||
|
res.save() |
||||
|
|
||||
|
# Vytvoření hodnocení. |
||||
|
hod = Hodnoceni.objects.create( |
||||
|
body=rnd.randint(0, uloha.max_body), |
||||
|
cislo_body=cisla[poradi_cisla - 1], |
||||
|
reseni=res, |
||||
|
problem=uloha |
||||
|
) |
||||
|
return |
@ -0,0 +1,235 @@ |
|||||
|
import datetime |
||||
|
import logging |
||||
|
import unidecode |
||||
|
|
||||
|
from django.contrib.auth.models import Permission |
||||
|
from django.contrib.auth.models import Group |
||||
|
import django.contrib.auth |
||||
|
|
||||
|
from .models import Osoba, Skola, Organizator, Resitel, Prijemce |
||||
|
|
||||
|
logger = logging.getLogger(__name__) |
||||
|
|
||||
|
User = django.contrib.auth.get_user_model() |
||||
|
|
||||
|
zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu |
||||
|
|
||||
|
|
||||
|
# testuje unikátnost vygenerovaného jména |
||||
|
def __unikatni_jmeno(osoby, jmeno, prijmeni): |
||||
|
for os in osoby: |
||||
|
if os.jmeno == jmeno and os.prijmeni == prijmeni: |
||||
|
return 0 |
||||
|
else: |
||||
|
return 1 |
||||
|
|
||||
|
|
||||
|
def gen_osoby(rnd, size): |
||||
|
logger.info('Generuji osoby (size={})...'.format(size)) |
||||
|
|
||||
|
jmena_m = ['Aleš', 'Tomáš', 'Martin', 'Jakub', 'Petr', 'Lukáš', 'Cyril', 'Pavel Karel'] |
||||
|
jmena_f = ['Eva', 'Karolína', 'Zuzana', 'Sylvie', 'Iva', 'Jana', 'Marie', 'Marta Iva', 'Shu Shan'] |
||||
|
prijmeni_m = ['Novotný', 'Svoboda', 'Pecha', 'Kořen', 'Holan', 'Uhlíř', 'Chytráček', 'Pokora', 'Koch', 'Szegedy', 'Rudý', "von Neumann", "d'Este"] |
||||
|
prijmeni_f = ['Novotná', 'Svobodová', 'Machová', 'Zelená', 'Yu-Xin', 'Mlsná', 'Dubná', 'Mrkvová', 'Suchá', 'Lovelace', 'Holcová', 'Rui', "Nováčková Tydlitátová"] |
||||
|
prezdivky = ['Kaki', 'Hurdur', 'Maracuja', 'Bobbo', "", "", "", "", "", "", "", 'Riki', 'Sapa', "", '', '---', 'Koko'] |
||||
|
domain = ['example.com', 'dolujeme.eu', 'mff.cuni.cz', 'strcprstskrzkrk.cz', 'british.co.uk', 'splachni.to', 'haha.org'] |
||||
|
seznam_ulic = ['Krátká', 'Vlhká', 'Jungmanova', '17. listopadu', '4. října', 'Roztocká', 'Forstova', 'Generála Františka Janouška', 'Náměstí Války', 'Svratecké náměstí', 'Zelená lhota', 'Z Plynu', 'K Jezeru', 'U Kocourkova', 'Uštěpačná', 'Ostrorepská', 'Zubří'] |
||||
|
seznam_mest = ['Praha', 'Brno', 'Ostrava', 'Horní Jelení', 'Dolní Zábrdovice', 'Prdelkov', 'Stará myslivna', 'Kocourkov', 'Šalingrad', 'Medvědí hora', 'Basilej', 'Unterschiedlich', 'Old York', 'Lancastershire', 'Vóloďháza'] |
||||
|
|
||||
|
osoby = [] |
||||
|
# 30 je náhodná konstanta, size je použité na víc místech a |
||||
|
# říká, jak velká asi chceme testovací data |
||||
|
for i in range(30 * size): |
||||
|
pohlavi_idx = rnd.randint(0, 2) # 2 = nebinární |
||||
|
osloveni = [Osoba.OSLOVENI_MUZSKE, Osoba.OSLOVENI_ZENSKE, Osoba.OSLOVENI_ZADNE][pohlavi_idx] |
||||
|
jmeno = rnd.choice([jmena_m, jmena_f, jmena_m + jmena_f][pohlavi_idx]) |
||||
|
prijmeni = rnd.choice([prijmeni_m, prijmeni_f, prijmeni_m + prijmeni_f][pohlavi_idx]) |
||||
|
if pohlavi_idx == 2: logger.debug(f'Testdata: nebinární osoba: {jmeno} {prijmeni}.') |
||||
|
pokusy = 0 |
||||
|
max_pokusy = 120*size |
||||
|
while not __unikatni_jmeno and pokusy < max_pokusy: |
||||
|
# pokud jméno a příjmení není unikátní, zkoušíme generovat nová |
||||
|
# do daného limitu (abychom se nezacyklili do nekonečna při málo jménech a příjmeních |
||||
|
# ze kterých se generuje) |
||||
|
jmeno = rnd.choice([jmena_m, jmena_f, jmena_m + jmena_f][pohlavi_idx]) |
||||
|
prijmeni = rnd.choice([prijmeni_m, prijmeni_f, prijmeni_m + prijmeni_f][pohlavi_idx]) |
||||
|
pokusy += 1 |
||||
|
if pokusy >= max_pokusy: |
||||
|
print("Chyba, na danou velikost testovacích dat příliš málo možných jmen a příjmení") |
||||
|
exit() |
||||
|
prezdivka = rnd.choice(prezdivky) |
||||
|
email = "@".join([unidecode.unidecode(jmeno), rnd.choice(domain)]) |
||||
|
telefon = "".join([str(rnd.choice([k for k in range(10)])) for _ in range(9)]) |
||||
|
narozeni = datetime.date( |
||||
|
rnd.randint(1980, datetime.datetime.now().year), |
||||
|
rnd.randint(1, 12), |
||||
|
rnd.randint(1, 28) |
||||
|
) |
||||
|
ulic = rnd.choice(seznam_ulic) |
||||
|
cp = rnd.randint(1, 99) |
||||
|
ulice = " ".join([ulic, str(cp)]) |
||||
|
mesto = rnd.choice(seznam_mest) |
||||
|
psc = "".join([str(rnd.choice([k for k in range(10)])) for _ in range(5)]) |
||||
|
|
||||
|
osoby.append(Osoba.objects.create( |
||||
|
jmeno=jmeno, prijmeni=prijmeni, |
||||
|
prezdivka=prezdivka, osloveni=osloveni, |
||||
|
email=email, telefon=telefon, |
||||
|
datum_narozeni=narozeni, |
||||
|
ulice=ulice, mesto=mesto, psc=psc, |
||||
|
datum_registrace=datetime.date( |
||||
|
rnd.randint(2019, 2029), rnd.randint(1, 12), rnd.randint(1, 28) |
||||
|
) |
||||
|
)) |
||||
|
|
||||
|
# TODO pridat foto male a velke. Jak? |
||||
|
# Pavel tvrdí, že to necháme a přidáme až do adminu |
||||
|
|
||||
|
return osoby |
||||
|
|
||||
|
|
||||
|
def gen_skoly(): # TODO někdy to přepsat, aby jich bylo více |
||||
|
logger.info('Generuji školy...') |
||||
|
|
||||
|
skoly = [] |
||||
|
prvnizs = Skola.objects.create( |
||||
|
mesto='Praha', stat='CZ', psc='101 00', |
||||
|
ulice='Krátká 5', nazev='První ZŠ', je_zs=True, je_ss=False, |
||||
|
) |
||||
|
skoly.append(prvnizs) |
||||
|
skoly.append(Skola.objects.create( |
||||
|
mesto='Praha', stat='CZ', psc='101 00', |
||||
|
ulice='Krátká 5', nazev='První SŠ', je_zs=False, je_ss=True, |
||||
|
)) |
||||
|
skoly.append(Skola.objects.create( |
||||
|
mesto='Praha', stat='CZ', psc='102 00', |
||||
|
ulice='Dlouhá 5', nazev='Druhá SŠ', je_zs=False, je_ss=True, |
||||
|
)) |
||||
|
skoly.append(Skola.objects.create( |
||||
|
mesto='Praha', stat='CZ', psc='103 00', |
||||
|
ulice='Široká 3', nazev='Třetí SŠ a ZŠ', je_zs=True, je_ss=True, |
||||
|
)) |
||||
|
skoly.append(Skola.objects.create( |
||||
|
mesto='Ostrava', stat='CZ', psc='700 00', |
||||
|
ulice='Hluboká 42', nazev='Hutní gympl', je_zs=False, je_ss=True, |
||||
|
)) |
||||
|
skoly.append(Skola.objects.create( |
||||
|
mesto='Humenné', stat='SK', psc='012 34', |
||||
|
ulice='Pltká 1', nazev='Sredná škuola', je_zs=False, je_ss=True, |
||||
|
)) |
||||
|
global zlinska |
||||
|
zlinska = Skola.objects.create( |
||||
|
mesto='Zlín', stat='CZ', psc='76001', |
||||
|
ulice='náměstí T.G. Masaryka 2734-9', |
||||
|
nazev='Gymnázium a Střední jazyková škola s právem SJZ', |
||||
|
kratky_nazev="GaSJŠspSJZ", je_zs=True, je_ss=True, |
||||
|
) |
||||
|
skoly.append(zlinska) |
||||
|
return skoly |
||||
|
|
||||
|
|
||||
|
def gen_resitele(rnd, osoby, skoly): |
||||
|
logger.info('Generuji řešitele...') |
||||
|
|
||||
|
resitele = [] |
||||
|
x = 0 |
||||
|
resitel_perm = Permission.objects.filter(codename__exact='resitel').first() |
||||
|
resitel_group = Group.objects.filter(name__exact='resitel').first() |
||||
|
for os in osoby: |
||||
|
rand = rnd.randint(0, 8) |
||||
|
if not (rand % 8 == 0): |
||||
|
if not os.user: |
||||
|
if x: |
||||
|
user = User.objects.create_user( |
||||
|
username='r'+str(x), email=os.email, password='r', |
||||
|
) |
||||
|
else: |
||||
|
user = User.objects.create_user( |
||||
|
username='r', email=os.email, password='r', |
||||
|
) |
||||
|
x += 1 |
||||
|
os.user = user |
||||
|
os.save() |
||||
|
os.user.user_permissions.add(resitel_perm) |
||||
|
os.user.groups.add(resitel_group) |
||||
|
resitele.append(Resitel.objects.create( |
||||
|
osoba=os, skola=rnd.choice(skoly), |
||||
|
rok_maturity=os.datum_narozeni.year + rnd.randint(18, 21), |
||||
|
zasilat=rnd.choice(Resitel.ZASILAT_CHOICES)[0], |
||||
|
)) |
||||
|
return resitele |
||||
|
|
||||
|
|
||||
|
def gen_prijemci(rnd, osoby, kolik=10): |
||||
|
logger.info('Generuji příjemce (kolik={})...'.format(kolik)) |
||||
|
prijemci = [] |
||||
|
for i in rnd.sample(osoby, kolik): |
||||
|
prijemci.append(Prijemce.objects.create(osoba=i)) |
||||
|
|
||||
|
global zlinska |
||||
|
if zlinska is not None: |
||||
|
zlinska.kontaktni_osoba=rnd.choice(osoby) |
||||
|
zlinska.save() |
||||
|
|
||||
|
return prijemci |
||||
|
|
||||
|
|
||||
|
def gen_organizatori(rnd, osoby, last_rocnik): |
||||
|
logger.info('Generuji organizátory...') |
||||
|
organizatori = [] |
||||
|
|
||||
|
|
||||
|
seznam_konicku = ["vařím", "jezdím na kole", "řeším diferenciální rovnice", "koukám z okna", "tancuji", "programuji", "jezdím vlakem", "nedělám nic"] |
||||
|
seznam_oboru = ["matematiku", "matematiku", "matematiku", "fyziku", "literaturu", "informatiku", "informatiku", "běhání dokolečka"] |
||||
|
|
||||
|
x = 0 |
||||
|
org_perm = Permission.objects.filter(codename__exact='org').first() |
||||
|
org_group = Group.objects.filter(name__exact='org').first() |
||||
|
for os in osoby: |
||||
|
rand = rnd.randint(0, 8) |
||||
|
if rand % 8 == 0: |
||||
|
pusobnost = rnd.randint(1, last_rocnik) |
||||
|
od = datetime.datetime( |
||||
|
year=1993 + pusobnost, |
||||
|
month=rnd.randint(1, 12), |
||||
|
day=rnd.randint(1, 28), |
||||
|
tzinfo=datetime.timezone.utc, |
||||
|
) |
||||
|
do = datetime.datetime( |
||||
|
year=od.year + rnd.randint(1, 6), |
||||
|
month=rnd.randint(1, 12), |
||||
|
day=rnd.randint(1, 28), |
||||
|
tzinfo=datetime.timezone.utc, |
||||
|
) |
||||
|
# aktualni organizatori jeste nemaji vyplnene organizuje_do |
||||
|
|
||||
|
# popis orga |
||||
|
konicek1 = rnd.choice(seznam_konicku) |
||||
|
konicek2 = rnd.choice(seznam_konicku) |
||||
|
obor = rnd.choice(seznam_oboru) |
||||
|
popis_orga = "Ve volném čase " + konicek1 + " a také " + konicek2 + ". Studuji " + obor + " a moc mě to baví." |
||||
|
|
||||
|
if do.year > datetime.datetime.now().year: |
||||
|
do = None |
||||
|
if not os.user: |
||||
|
if x: |
||||
|
user = User.objects.create_user( |
||||
|
username='o'+str(x), email=os.email, password='o', |
||||
|
) |
||||
|
else: |
||||
|
user = User.objects.create_user( |
||||
|
username='o', email=os.email, password='o', |
||||
|
) |
||||
|
x += 1 |
||||
|
os.user = user |
||||
|
os.save() |
||||
|
os.user.user_permissions.add(org_perm) |
||||
|
os.user.groups.add(org_group) |
||||
|
os.user.is_staff = True |
||||
|
os.user.save() |
||||
|
organizatori.append(Organizator.objects.create( |
||||
|
osoba=os, |
||||
|
organizuje_od=od, organizuje_do=do, |
||||
|
strucny_popis_organizatora=popis_orga, |
||||
|
)) |
||||
|
return organizatori |
@ -0,0 +1,135 @@ |
|||||
|
import datetime |
||||
|
import random |
||||
|
import logging |
||||
|
|
||||
|
import django.contrib.auth |
||||
|
from django.contrib.flatpages.models import FlatPage |
||||
|
from django.contrib.sites.models import Site |
||||
|
from django.db import transaction |
||||
|
|
||||
|
from seminar.models import Rocnik, Cislo, Nastaveni, Osoba, Organizator |
||||
|
|
||||
|
from korektury.testutils import create_test_pdf |
||||
|
from novinky.testutils import gen_novinky |
||||
|
from personalni.testutils import gen_organizatori, gen_osoby, gen_prijemci, gen_resitele, gen_skoly |
||||
|
from soustredeni.testutils import gen_soustredeni, gen_konfery |
||||
|
from tvorba.testutils import gen_cisla, gen_clanek, gen_dlouhe_tema, gen_rocniky, gen_temata, gen_ulohy_do_cisla, gen_ulohy_k_tematum |
||||
|
|
||||
|
logger = logging.getLogger(__name__) |
||||
|
|
||||
|
User = django.contrib.auth.get_user_model() |
||||
|
|
||||
|
|
||||
|
@transaction.atomic |
||||
|
def create_test_data(size=6, rnd=None): |
||||
|
logger.info('Vyrábím testovací data (size={})...'.format(size)) |
||||
|
|
||||
|
assert size >= 1 |
||||
|
# pevna pseudo-nahodnost |
||||
|
rnd = rnd or random.Random(x=42) |
||||
|
|
||||
|
# static URL stranky |
||||
|
# FIXME: nakopirovat sem vsechny z produkcni databaze |
||||
|
s = Site.objects.filter(name="example.com") |
||||
|
f = FlatPage.objects.create( |
||||
|
url="/", title="Seminář M&M", |
||||
|
content="<p>Vítejte na stránce semináře MaM!</p>", |
||||
|
) |
||||
|
print(s) |
||||
|
f.sites.add(s[0]) |
||||
|
f.save() |
||||
|
|
||||
|
# users |
||||
|
admin = User.objects.create_superuser( |
||||
|
username='admin', email='', password='admin', |
||||
|
) |
||||
|
os_admin = Osoba.objects.create( |
||||
|
user=admin, jmeno='admin', prijmeni='admin', |
||||
|
prezdivka='admin', osloveni='', email='admin@admin.admin', |
||||
|
telefon='123 456 789', datum_narozeni=datetime.date(2000, 1, 1), |
||||
|
ulice='admin', mesto='admin', psc='100 00', |
||||
|
datum_registrace=datetime.date(2020, 9, 6), |
||||
|
) |
||||
|
or_admin = Organizator.objects.create( |
||||
|
osoba=os_admin, organizuje_od=None, organizuje_do=None, |
||||
|
strucny_popis_organizatora="Organizátor k uživateli Admin", |
||||
|
) |
||||
|
|
||||
|
usernames = ['anet', 'bara', 'cyril', 'david', 'eva', 'filip'] |
||||
|
users = [] |
||||
|
for usr in usernames[:size]: |
||||
|
u = User.objects.create_user(username=usr, password=usr) |
||||
|
u.first_name = usr.capitalize() |
||||
|
u.save() |
||||
|
users.append(u) |
||||
|
print(users) |
||||
|
|
||||
|
# skoly |
||||
|
skoly = gen_skoly() |
||||
|
|
||||
|
# osoby |
||||
|
osoby = gen_osoby(rnd, size) |
||||
|
|
||||
|
# resitele a organizatori |
||||
|
last_rocnik = 25 |
||||
|
organizatori = gen_organizatori(rnd, osoby, last_rocnik) |
||||
|
resitele = gen_resitele(rnd, osoby, skoly) |
||||
|
|
||||
|
# generování novinek |
||||
|
novinky = gen_novinky(rnd, organizatori) |
||||
|
|
||||
|
# prijemci |
||||
|
prijemci = gen_prijemci(rnd, osoby) |
||||
|
|
||||
|
# rocniky |
||||
|
rocniky = gen_rocniky(last_rocnik, size) |
||||
|
|
||||
|
# cisla |
||||
|
# rocnik_cisla je pole polí čísel (typ Cislo), vnitřní pole odpovídají jednotlivým ročníkům. |
||||
|
rocnik_cisla = gen_cisla(rnd, rocniky) |
||||
|
|
||||
|
# generování obyčejných úloh do čísel |
||||
|
gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) |
||||
|
|
||||
|
# generování témat, zatím v prvních třech číslech po jednom |
||||
|
# FIXME: více témat |
||||
|
# rocnik_temata je pole polí trojic (první číslo :int, poslední číslo :int, téma:Tema), přičemž každé vnitřní pole odpovídá ročníku a FIXME: je to takhle fuj a když to někdo vidí poprvé, tak je z toho smutný, protože vůbec neví, co se děje a co má čekat. |
||||
|
rocnik_temata = gen_temata(rnd, rocniky, rocnik_cisla, organizatori) |
||||
|
|
||||
|
rocnik = Rocnik.objects.filter(rocnik=23).first() |
||||
|
dlouhe_tema = gen_dlouhe_tema( |
||||
|
rnd, organizatori, rocnik, "Strašně dlouhé téma", |
||||
|
"MFI", 8, |
||||
|
) |
||||
|
|
||||
|
# generování úloh k tématům ve všech číslech |
||||
|
gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori, resitele) |
||||
|
|
||||
|
# generování soustředění |
||||
|
soustredeni = gen_soustredeni(size, resitele, organizatori, rnd=rnd) |
||||
|
|
||||
|
# generování konfer |
||||
|
konfery = gen_konfery(size, organizatori, soustredeni, rnd=rnd) |
||||
|
|
||||
|
# vytvoreni pdf ke korekturam |
||||
|
create_test_pdf(rnd, organizatori) |
||||
|
|
||||
|
# TODO: nastavi správně, kolik se čeho generuje, aby rozsahy přibližně odpovídaly |
||||
|
# FIXME: misto typu ruzne typy objektu a vnoreni do sebe (Tom nechápe, co je tímto fixme míněno) |
||||
|
# TODO: vytvorit temata s ruznymi vlakny |
||||
|
# TODO: nagenerovat starsim rocnikum pohadku |
||||
|
# TODO: nagenerovat články |
||||
|
# TODO: vecpat obrázky všude, kde to jde |
||||
|
# TODO: mezičíslo node |
||||
|
# TODO: přidat ke konferám řešení a dát je do čísel |
||||
|
|
||||
|
# Dohackované vytvoření jednoho článku |
||||
|
gen_clanek(rnd, organizatori, resitele) |
||||
|
|
||||
|
# TODO: přidat články včetně zařazení do struktury treenodů, |
||||
|
# a následně otestovat konsistency check databáze z utils.py |
||||
|
# pomocí stránky /stav |
||||
|
|
||||
|
# obecné nastavení semináře, musí být už přidané ročníky a čísla, jinak se nastaví divně |
||||
|
nastaveni = Nastaveni.objects.create( |
||||
|
aktualni_cislo=Cislo.objects.all()[1]) |
Loading…
Reference in new issue