@ -10,9 +10,12 @@ import unidecode
import logging
from seminar . models import Skola , Resitel , Rocnik , Cislo , Problem , Reseni , PrilohaReseni , Nastaveni , Soustredeni , Soustredeni_Ucastnici , Soustredeni_Organizatori , Osoba , Organizator , Prijemce , Tema , Uloha , Konfera , TextNode , UlohaVzorakNode , RocnikNode , CisloNode , TemaVCisleNode , Text , Hodnoceni , UlohaZadaniNode , Novinky , TreeNode
import seminar . models as m
from django . contrib . flatpages . models import FlatPage
from django . contrib . sites . models import Site
from seminar . treelib import all_children , insert_last_child , all_children_of_type , create_node_after
User = django . contrib . auth . get_user_model ( )
zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu
@ -205,21 +208,16 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi
max_body = rnd . randint ( 1 , 8 )
)
text_zadani = Text . objects . create (
na_web = " " . join (
[ rnd . choice ( sloveso ) ,
rnd . choice ( koho ) ,
rnd . choice ( ceho ) ,
rnd . choice ( jmeno ) ,
rnd . choice ( kde ) ]
) ,
do_cisla = " " . join (
text = " " . join (
[ rnd . choice ( sloveso ) ,
rnd . choice ( koho ) ,
rnd . choice ( ceho ) ,
rnd . choice ( jmeno ) ,
rnd . choice ( kde ) ]
)
text_zadani = Text . objects . create (
na_web = text ,
do_cisla = text ,
)
zad = TextNode . objects . create ( text = text_zadani )
uloha_zadani = UlohaZadaniNode . objects . create ( uloha = p , first_child = zad )
@ -228,7 +226,7 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi
return p
def gen_vzoroveho_reseni_ulohy ( rnd , cisla , organizatori , uloha , pocet_opravovatelu , poradi_cisla ) :
def gen_vzoroveho_reseni_ulohy ( rnd , organizatori , uloha , pocet_opravovatelu ) :
reseni = [ " to je přece jasné " , " triviální " , " omlouváme se, "
" otevřený problém " , " neřešitelné " , " triviálně triviální " ,
" použitím věty z prvního semestru na matfyzu " ,
@ -238,18 +236,18 @@ def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovate
" tak jste fakt hloupí " ]
# Generování vzorového řešení.
obsah = rnd . choice ( reseni )
text_vzoraku = Text . objects . create (
na_web = rnd . choice ( reseni ) ,
do_cisla = rnd . choice ( reseni )
na_web = obsah ,
do_cisla = obsah
)
vzorak = TextNode . objects . create ( text = text_vzoraku )
uloha_vzorak = UlohaVzorakNode . objects . create ( uloha = uloha , first_child = vzorak )
uloha . ulohavzoraknode = uloha_vzorak
otec_syn ( cisla [ poradi_cisla - 1 ] . cislonode , uloha_vzorak )
uloha . opravovatele . set ( rnd . sample ( organizatori , pocet_opravovatelu ) )
uloha . save ( )
return
return uloha_vzorak
def gen_reseni_ulohy ( rnd , cisla , uloha , pocet_resitelu , poradi_cisla , resitele_cisla , resitele ) :
@ -307,7 +305,10 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size)
# přivěšení pod dané číslo
p = gen_zadani_ulohy ( rnd , cisla , organizatori , poc_oboru , ci , pi )
# Generování vzorového řešení
gen_vzoroveho_reseni_ulohy ( rnd , cisla , organizatori , p , poc_op , ci )
uloha_vzorak = gen_vzoroveho_reseni_ulohy ( rnd , organizatori ,
p , poc_op )
insert_last_child ( cisla [ ci - 1 ] . cislonode , uloha_vzorak )
# Generování řešení a hodnocení k úloze
gen_reseni_ulohy ( rnd , cisla , p , poc_res , ci ,
resitele_cisla , resitele )
@ -420,6 +421,85 @@ def gen_cisla(rnd, rocniky):
rocnik_cisla . append ( cisla )
return rocnik_cisla
def add_first_child ( node , child ) :
node . first_child = child
node . save ( )
return
def get_text ( ) :
odstavec = lorem . paragraph ( )
return Text . objects . create ( na_web = odstavec , do_cisla = odstavec )
def gen_dlouhe_tema ( rnd , organizatori , rocnik , nazev , obor , kod ) :
tema = Tema . objects . create (
nazev = nazev ,
stav = Problem . STAV_ZADANY ,
zamereni = " M " ,
autor = rnd . choice ( organizatori ) ,
garant = rnd . choice ( organizatori ) ,
kod = str ( kod ) ,
tema_typ = rnd . choice ( Tema . TEMA_CHOICES ) [ 0 ] ,
rocnik = rocnik ,
abstrakt = lorem . paragraph ( )
)
# Generování struktury k tématu
cisla = sorted ( rocnik . cisla . all ( ) , key = lambda cislo : cislo . poradi )
for cislo in cisla :
# Přidáme TemaVCisleNode do daného čísla
cislo_node = cislo . cislonode
tema_cislo_node = TemaVCisleNode . objects . create ( tema = tema )
insert_last_child ( cislo_node , tema_cislo_node )
# Přidávání obsahu do čísla
cast_node = m . CastNode . objects . create ( nadpis = " Příspěvek k číslu {} " . format ( cislo . kod ) )
add_first_child ( tema_cislo_node , cast_node )
text_node = TextNode . objects . create ( text = get_text ( ) )
add_first_child ( cast_node , text_node )
cast_node2 = m . CastNode . objects . create ( nadpis = " První podproblém " )
add_first_child ( text_node , cast_node2 )
text_node2 = TextNode . objects . create ( text = get_text ( ) )
add_first_child ( cast_node2 , text_node2 )
cast_node3 = m . CastNode . objects . create ( nadpis = " Druhý podproblém " )
add_first_child ( text_node2 , cast_node3 )
text_node3 = TextNode . objects . create ( text = get_text ( ) )
add_first_child ( cast_node3 , text_node3 )
cast_node4 = m . CastNode . objects . create ( nadpis = " Třetí podproblém " )
add_first_child ( text_node3 , cast_node4 )
text_node4 = TextNode . objects . create ( text = get_text ( ) )
add_first_child ( cast_node3 , text_node4 )
cast_node3a = m . CastNode . objects . create ( nadpis = " Podproblém paralelní s "
" druhým podproblémem " )
cast_node3 . succ = cast_node3a
cast_node3 . save ( )
text_node3a = TextNode . objects . create ( text = get_text ( ) )
add_first_child ( cast_node3a , text_node3a )
# Občas přidáme mezičíslo
if rnd . randint ( 1 , 3 ) == 1 :
create_node_after ( cislo_node , m . MezicisloNode )
mezicislo_node = cislo_node . succ
cast_node_mezicislo = m . CastNode . objects . create (
nadpis = " Příspěvek k mezičíslu " . format ( cislo . kod ) )
add_first_child ( mezicislo_node , cast_node_mezicislo )
odstavec = lorem . paragraph ( )
text_mezicislo = Text . objects . create ( na_web = odstavec , do_cisla = odstavec )
text_node_mezicislo = TextNode . objects . create ( text = text_mezicislo )
add_first_child ( cast_node_mezicislo , text_node_mezicislo )
return tema
def gen_temata ( rnd , rocniky , rocnik_cisla , organizatori ) :
logger . info ( ' Generuji témata... ' )
@ -474,11 +554,10 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori):
rocnik_temata . append ( letosni_temata )
return rocnik_temata
def gen_ulohy_tematu ( rnd , organizatori , tema , kod , cislo , cislo_se_vzorakem ) :
""" Generování úlohy k danému tématu. """
def gen_ulohy_k_tematum ( rnd , rocniky , rocnik_cisla , rocnik_temata , organizatori ) :
logger . info ( ' Generuji úlohy k tématům... ' )
# ulohy resene v cisle
# Proměnné pro náhodné generování názvů a zadání.
jaka = [ " Šachová " , " Černá " , " Větrná " , " Dlouhá " , " Křehká " , " Rychlá " ,
" Zákeřná " , " Fyzikální " ]
co = [ " kostka " , " smršť " , " díra " , " zrada " , " toulka " , " tyč " ,
@ -488,57 +567,9 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
ceho = [ " všech " , " správných " , " konstatních " , " zelených " ]
jmeno = [ " řešení " , " tahů " , " čísel " , " kalhot " , " koulí " , " hadů " ]
kde = [ " na zemi " , " ve vesmíru " , " ve vzduchu " , " na šňůře " , " v letadle " ]
obor = [ " M " , " F " , " I " , " O " , " B " ]
reseni = [ " to je přece jasné " , " triviální " , " omlouváme se, "
" otevřený problém " , " neřešitelné " , " triviálně triviální " ,
" použitím věty z prvního semestru na matfyzu " ,
" jednoduše pomocí látky z druhého semestru na matfyzu " ,
" netriviální aplikace diferenciálních rovnic " , " zadání je vnitřně "
" sporné " , " nepopsatelně jednoduché " , " pokud jste na to nepřišli, "
" tak jste fakt hloupí " ]
# Ke každému ročníku si vezmeme příslušná čísla a témata
for rocnik , cisla , temata in zip ( rocniky , rocnik_cisla , rocnik_temata ) :
# Do každého čísla nagenerujeme ke každému témátku pár úložek
for cislo in cisla :
print ( " Generuji úložky do {} -tého čísla " . format ( cislo . poradi ) )
# Vzorák bude o dvě čísla dál
cislo_se_vzorakem = Cislo . objects . filter (
rocnik = rocnik ,
poradi = str ( int ( cislo . poradi ) + 2 ) ,
)
# Pokud není číslo pro vzorák, tak se dá do posledního čísla
# (i kdyby tam mělo být zadání i řešení...)
# Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka,
# ale to nám pro jednoduchost nevadí.
if len ( cislo_se_vzorakem ) == 0 :
cislo_se_vzorakem = cisla [ - 1 ]
else :
cislo_se_vzorakem = cislo_se_vzorakem . first ( )
# FIXME: Tenhle generátor dát asi někam jinam
def potomci ( node ) :
if not isinstance ( node , TreeNode ) :
raise ValueError ( " Typ {} nemá potomky " , type ( node ) )
current_child = node . first_child
while current_child is not None :
yield current_child
current_child = current_child . succ
for mozna_tema_node in potomci ( cislo . cislonode ) :
if not isinstance ( mozna_tema_node , TemaVCisleNode ) :
continue
tema_node = mozna_tema_node
tema = tema_node . tema
# Pokud už témátko skončilo, žádné úložky negenerujeme
# FIXME: Bylo by hezčí, kdyby se čísla předávala jako Cislo a ne
# jako int v té trojici (start, konec, tema)
if not temata [ int ( tema . kod ) - 1 ] [ 1 ] > = int ( cislo_se_vzorakem . poradi ) :
continue
obory = [ " M " , " F " , " I " , " O " , " B " ]
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla
for kod in range ( 1 , rnd . randint ( 1 , 4 ) ) :
u = Uloha . objects . create (
uloha = Uloha . objects . create (
nazev = " : " . join ( [ tema . nazev ,
" úloha {} . " . format ( kod ) ] ) ,
nadproblem = tema ,
@ -553,9 +584,6 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
max_body = rnd . randint ( 1 , 8 )
)
poc_opravovatelu = rnd . randint ( 1 , 4 )
u . opravovatele . set ( rnd . sample ( organizatori , poc_opravovatelu ) )
# Samotný obsah následně vzniklého Textu zadání
obsah = " " . join (
[ rnd . choice ( sloveso ) ,
@ -569,32 +597,63 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori)
do_cisla = obsah ,
)
zad = TextNode . objects . create ( text = text_zadani )
uloha_zadani = UlohaZadaniNode . objects . create ( uloha = u , first_child = zad )
u . ulohazadaninode = uloha_zadani
uloha_zadani = UlohaZadaniNode . objects . create ( uloha = uloha , first_child = zad )
uloha . ulohazadaninode = uloha_zadani
# FIXME: Tohle dává zadání vždy jako prvního potomka témátka, spec. se naskládají v opačném pořadí a nemůže mezi nimi vzniknout žádný (orgo-)text
otec_syn ( tema_node , uloha_zadani )
return uloha , uloha_zadani
# Text vzoráku stejně
obsah = rnd . choice ( reseni )
text_vzoraku = Text . objects . create (
na_web = obsah ,
do_cisla = obsah ,
def gen_ulohy_k_tematum ( rnd , rocniky , rocnik_cisla , rocnik_temata , organizatori ) :
logger . info ( ' Generuji úlohy k tématům... ' )
# Ke každému ročníku si vezmeme příslušná čísla a témata
for rocnik , cisla , temata in zip ( rocniky , rocnik_cisla , rocnik_temata ) :
# Do každého čísla nagenerujeme ke každému témátku pár úložek
for cislo in cisla :
print ( " Generuji úložky do {} -tého čísla " . format ( cislo . poradi ) )
# Vzorák bude o dvě čísla dál
cislo_se_vzorakem = Cislo . objects . filter (
rocnik = rocnik ,
poradi = str ( int ( cislo . poradi ) + 2 ) ,
)
vzorak = TextNode . objects . create ( text = text_vzoraku )
uloha_vzorak = UlohaVzorakNode . objects . create ( uloha = u , first_child = vzorak )
u . UlohaVzorakNode = uloha_vzorak
# Pokud není číslo pro vzorák, tak se dá do posledního čísla
# (i kdyby tam mělo být zadání i řešení...)
# Tohle sice umožňuje vygenerovat vzorák do čísla dávno po konci témátka,
# ale to nám pro jednoduchost nevadí.
if len ( cislo_se_vzorakem ) == 0 :
cislo_se_vzorakem = cisla [ - 1 ]
else :
cislo_se_vzorakem = cislo_se_vzorakem . first ( )
for tema_node in all_children_of_type ( cislo . cislonode , TemaVCisleNode ) :
tema = tema_node . tema
# Pokud už témátko skončilo, žádné úložky negenerujeme
# FIXME: Bylo by hezčí, kdyby se čísla předávala jako Cislo a ne
# jako int v té trojici (start, konec, tema)
if not temata [ int ( tema . kod ) - 1 ] [ 1 ] > = int ( cislo_se_vzorakem . poradi ) :
continue
# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla.
for kod in range ( 1 , rnd . randint ( 1 , 4 ) ) :
u , uz = gen_ulohy_tematu ( rnd , organizatori , tema , kod ,
cislo , cislo_se_vzorakem )
insert_last_child ( tema_node , uz )
poc_op = rnd . randint ( 1 , 4 )
uvz = gen_vzoroveho_reseni_ulohy ( rnd , organizatori ,
u , poc_op )
# Najdeme správný TemaVCisleNode pro vložení vzoráku
res_tema_node = None ;
for node in potomci ( cislo_se_vzorakem . cislonode ) :
if isinstance ( node , TemaVCisleNode ) and node . tema == tema :
for node in all_children ( cislo_se_vzorakem . cislonode ) :
if isinstance ( node , TemaVCisleNode ) :
if node . tema == tema :
res_tema_node = node
if res_tema_node is None :
raise LookupError ( " Nenalezen Node pro vložení vzoráku " )
# FIXME: Stejný problém jako výše: vzoráky se dají na začátek v opačném pořadí.
otec_syn ( res_tema_node , uloha_vzorak )
insert_last_child ( res_tema_node , uvz )
u . save ( )
return
@ -687,6 +746,10 @@ def create_test_data(size = 6, rnd = None):
# 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 )