testutils: zkrácení a rozsekání funkce gen_ulohy_k_tematum
This commit is contained in:
		
							parent
							
								
									ef62622be3
								
							
						
					
					
						commit
						4240fa787f
					
				
					 1 changed files with 73 additions and 94 deletions
				
			
		|  | @ -13,6 +13,8 @@ from seminar.models import Skola, Resitel, Rocnik, Cislo, Problem, Reseni, Prilo | ||||||
| 
 | 
 | ||||||
| from django.contrib.flatpages.models import FlatPage | from django.contrib.flatpages.models import FlatPage | ||||||
| from django.contrib.sites.models import Site | from django.contrib.sites.models import Site | ||||||
|  | from seminar.treelib import all_children, insert_last_child, all_children_of_type | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| User = django.contrib.auth.get_user_model() | User = django.contrib.auth.get_user_model() | ||||||
| zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu | zlinska = None # tohle bude speciální škola, které později dodáme kontaktní osobu | ||||||
|  | @ -189,7 +191,7 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi | ||||||
| 	jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] | 	jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] | ||||||
| 	kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] | 	kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] | ||||||
| 	obory = ["M", "F", "I", "O", "B"] | 	obory = ["M", "F", "I", "O", "B"] | ||||||
| 	 | 
 | ||||||
| 	p = Uloha.objects.create( | 	p = Uloha.objects.create( | ||||||
| 		# atributy třídy Problem | 		# atributy třídy Problem | ||||||
| 		nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), | 		nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), | ||||||
|  | @ -205,21 +207,16 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi | ||||||
| 		max_body = rnd.randint(1, 8) | 		max_body = rnd.randint(1, 8) | ||||||
| 	) | 	) | ||||||
| 
 | 
 | ||||||
| 	text_zadani = Text.objects.create( | 	text = " ".join( | ||||||
| 		na_web = " ".join( |  | ||||||
| 		[rnd.choice(sloveso), |  | ||||||
| 		rnd.choice(koho), |  | ||||||
| 		rnd.choice(ceho), |  | ||||||
| 		rnd.choice(jmeno), |  | ||||||
| 		rnd.choice(kde)] |  | ||||||
| 		), |  | ||||||
| 		do_cisla = " ".join( |  | ||||||
| 		[rnd.choice(sloveso), | 		[rnd.choice(sloveso), | ||||||
| 		rnd.choice(koho), | 		rnd.choice(koho), | ||||||
| 		rnd.choice(ceho), | 		rnd.choice(ceho), | ||||||
| 		rnd.choice(jmeno), | 		rnd.choice(jmeno), | ||||||
| 		rnd.choice(kde)] | 		rnd.choice(kde)] | ||||||
| 		) | 		) | ||||||
|  | 	text_zadani = Text.objects.create( | ||||||
|  | 		na_web = text, | ||||||
|  | 		do_cisla = text, | ||||||
| 	) | 	) | ||||||
| 	zad = TextNode.objects.create(text = text_zadani) | 	zad = TextNode.objects.create(text = text_zadani) | ||||||
| 	uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad) | 	uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad) | ||||||
|  | @ -228,7 +225,7 @@ def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi | ||||||
| 
 | 
 | ||||||
| 	return p | 	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," | 	reseni = ["to je přece jasné", "triviální", "omlouváme se," | ||||||
| 		"otevřený problém", "neřešitelné", "triviálně triviální", | 		"otevřený problém", "neřešitelné", "triviálně triviální", | ||||||
| 		"použitím věty z prvního semestru na matfyzu", | 		"použitím věty z prvního semestru na matfyzu", | ||||||
|  | @ -238,18 +235,18 @@ def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovate | ||||||
| 		"tak jste fakt hloupí"] | 		"tak jste fakt hloupí"] | ||||||
| 
 | 
 | ||||||
| 	# Generování vzorového řešení. | 	# Generování vzorového řešení. | ||||||
|  | 	obsah = rnd.choice(reseni) | ||||||
| 	text_vzoraku = Text.objects.create( | 	text_vzoraku = Text.objects.create( | ||||||
| 		na_web = rnd.choice(reseni), | 		na_web = obsah, | ||||||
| 		do_cisla = rnd.choice(reseni) | 		do_cisla = obsah | ||||||
| 	) | 	) | ||||||
| 	vzorak = TextNode.objects.create(text = text_vzoraku) | 	vzorak = TextNode.objects.create(text = text_vzoraku) | ||||||
| 	uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak) | 	uloha_vzorak = UlohaVzorakNode.objects.create(uloha = uloha, first_child = vzorak) | ||||||
| 	uloha.ulohavzoraknode = uloha_vzorak | 	uloha.ulohavzoraknode = uloha_vzorak | ||||||
| 	otec_syn(cisla[poradi_cisla-1].cislonode, uloha_vzorak) |  | ||||||
| 
 | 
 | ||||||
| 	uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu)) | 	uloha.opravovatele.set(rnd.sample(organizatori, pocet_opravovatelu)) | ||||||
| 	uloha.save() | 	uloha.save() | ||||||
| 	return | 	return uloha_vzorak | ||||||
| 
 | 
 | ||||||
| def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele): | def gen_reseni_ulohy(rnd, cisla, uloha, pocet_resitelu, poradi_cisla, resitele_cisla, resitele): | ||||||
| 	 | 	 | ||||||
|  | @ -307,7 +304,10 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) | ||||||
| 				# přivěšení pod dané číslo | 				# přivěšení pod dané číslo | ||||||
| 				p = gen_zadani_ulohy(rnd, cisla, organizatori, poc_oboru, ci, pi)	 | 				p = gen_zadani_ulohy(rnd, cisla, organizatori, poc_oboru, ci, pi)	 | ||||||
| 				# Generování vzorového řešení | 				# 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 | 				# Generování řešení a hodnocení k úloze | ||||||
| 				gen_reseni_ulohy(rnd, cisla, p, poc_res, ci,  | 				gen_reseni_ulohy(rnd, cisla, p, poc_res, ci,  | ||||||
| 					resitele_cisla, resitele)  | 					resitele_cisla, resitele)  | ||||||
|  | @ -474,11 +474,10 @@ def gen_temata(rnd, rocniky, rocnik_cisla, organizatori): | ||||||
| 		rocnik_temata.append(letosni_temata) | 		rocnik_temata.append(letosni_temata) | ||||||
| 	return rocnik_temata | 	return rocnik_temata | ||||||
| 
 | 
 | ||||||
| 
 | def gen_ulohy_tematu(rnd, organizatori, tema, kod, cislo, cislo_se_vzorakem): | ||||||
| def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori): | 	""" Generování úlohy k danému tématu. """ | ||||||
| 	logger.info('Generuji úlohy k tématům...') | 	 | ||||||
| 
 | 	# Proměnné pro náhodné generování názvů a zadání. | ||||||
| 	# ulohy resene v cisle |  | ||||||
| 	jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", | 	jaka = ["Šachová", "Černá", "Větrná", "Dlouhá", "Křehká", "Rychlá", | ||||||
| 		"Zákeřná", "Fyzikální"] | 		"Zákeřná", "Fyzikální"] | ||||||
| 	co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč", | 	co = ["kostka", "smršť", "díra", "zrada", "toulka", "tyč", | ||||||
|  | @ -488,14 +487,45 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) | ||||||
| 	ceho = ["všech", "správných", "konstatních", "zelených"] | 	ceho = ["všech", "správných", "konstatních", "zelených"] | ||||||
| 	jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] | 	jmeno = ["řešení", "tahů", "čísel", "kalhot", "koulí", "hadů"] | ||||||
| 	kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] | 	kde = ["na zemi", "ve vesmíru", "ve vzduchu", "na šňůře", "v letadle"] | ||||||
| 	obor = ["M", "F", "I", "O", "B"] | 	obory = ["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í", | 	uloha = Uloha.objects.create( | ||||||
| 		"použitím věty z prvního semestru na matfyzu", | 		nazev=": ".join([tema.nazev,  | ||||||
| 		"jednoduše pomocí látky z druhého semestru na matfyzu", | 			"úloha {}.".format(kod)]), | ||||||
| 		"netriviální aplikace diferenciálních rovnic", "zadání je vnitřně" | 		nadproblem=tema, | ||||||
| 		"sporné", "nepopsatelně jednoduché", "pokud jste na to nepřišli," | 		stav=Problem.STAV_ZADANY, | ||||||
| 		"tak jste fakt hloupí"] | 		zamereni=tema.zamereni, | ||||||
|  | 		autor=tema.autor, | ||||||
|  | 		garant=tema.garant, | ||||||
|  | 		kod=str(kod), | ||||||
|  | 		cislo_zadani=cislo, | ||||||
|  | 		cislo_reseni=cislo_se_vzorakem, | ||||||
|  | 		cislo_deadline=cislo_se_vzorakem, | ||||||
|  | 		max_body = rnd.randint(1, 8) | ||||||
|  | 	) | ||||||
|  | 	 | ||||||
|  | 	# Samotný obsah následně vzniklého Textu zadání | ||||||
|  | 	obsah = " ".join( | ||||||
|  | 		[rnd.choice(sloveso),  | ||||||
|  | 		rnd.choice(koho),  | ||||||
|  | 		rnd.choice(ceho),  | ||||||
|  | 		rnd.choice(jmeno),  | ||||||
|  | 		rnd.choice(kde)] | ||||||
|  | 		) | ||||||
|  | 	text_zadani = Text.objects.create( | ||||||
|  | 		na_web = obsah, | ||||||
|  | 		do_cisla = obsah, | ||||||
|  | 		) | ||||||
|  | 	zad = TextNode.objects.create(text = text_zadani) | ||||||
|  | 	uloha_zadani = UlohaZadaniNode.objects.create(uloha=uloha, first_child = zad) | ||||||
|  | 	uloha.ulohazadaninode = uloha_zadani | ||||||
|  | 
 | ||||||
|  | 	return uloha, uloha_zadani | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 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 | 	# 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): | 	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 | 		# Do každého čísla nagenerujeme ke každému témátku pár úložek | ||||||
|  | @ -515,19 +545,7 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) | ||||||
| 			else: | 			else: | ||||||
| 				cislo_se_vzorakem = cislo_se_vzorakem.first() | 				cislo_se_vzorakem = cislo_se_vzorakem.first() | ||||||
| 
 | 
 | ||||||
| 			# FIXME: Tenhle generátor dát asi někam jinam | 			for tema_node in all_children_of_type(cislo.cislonode, TemaVCisleNode): | ||||||
| 			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 | 				tema = tema_node.tema | ||||||
| 					 | 					 | ||||||
| 				# Pokud už témátko skončilo, žádné úložky negenerujeme | 				# Pokud už témátko skončilo, žádné úložky negenerujeme | ||||||
|  | @ -536,65 +554,26 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) | ||||||
| 				if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi): | 				if not temata[int(tema.kod)-1][1] >= int(cislo_se_vzorakem.poradi): | ||||||
| 					continue | 					continue | ||||||
| 					 | 					 | ||||||
| 				# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla | 				# Generujeme 1 až 4 úložky k tomuto témátku do tohoto čísla. | ||||||
| 				for kod in range(1, rnd.randint(1, 4)): | 				for kod in range(1, rnd.randint(1, 4)): | ||||||
| 					u = Uloha.objects.create( | 					u, uz = gen_ulohy_tematu(rnd, organizatori, tema, kod,  | ||||||
| 						nazev=": ".join([tema.nazev,  | 						cislo, cislo_se_vzorakem) | ||||||
| 							"úloha {}.".format(kod)]), |  | ||||||
| 						nadproblem=tema, |  | ||||||
| 						stav=Problem.STAV_ZADANY, |  | ||||||
| 						zamereni=tema.zamereni, |  | ||||||
| 						autor=tema.autor, |  | ||||||
| 						garant=tema.garant, |  | ||||||
| 						kod=str(kod), |  | ||||||
| 						cislo_zadani=cislo, |  | ||||||
| 						cislo_reseni=cislo_se_vzorakem, |  | ||||||
| 						cislo_deadline=cislo_se_vzorakem, |  | ||||||
| 						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),  |  | ||||||
| 						rnd.choice(koho),  |  | ||||||
| 						rnd.choice(ceho),  |  | ||||||
| 						rnd.choice(jmeno),  |  | ||||||
| 						rnd.choice(kde)] |  | ||||||
| 						) |  | ||||||
| 					text_zadani = Text.objects.create( |  | ||||||
| 						na_web = obsah, |  | ||||||
| 						do_cisla = obsah, |  | ||||||
| 						) |  | ||||||
| 					zad = TextNode.objects.create(text = text_zadani) |  | ||||||
| 					uloha_zadani = UlohaZadaniNode.objects.create(uloha=u, first_child = zad) |  | ||||||
| 					u.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 | 					insert_last_child(tema_node, uz) | ||||||
| 					otec_syn(tema_node, uloha_zadani) | 				 | ||||||
|  | 					poc_op = rnd.randint(1, 4) | ||||||
|  | 					uvz = gen_vzoroveho_reseni_ulohy(rnd, organizatori,  | ||||||
|  | 						u, poc_op)  | ||||||
| 					 | 					 | ||||||
| 					# Text vzoráku stejně |  | ||||||
| 					obsah = rnd.choice(reseni) |  | ||||||
| 					text_vzoraku = Text.objects.create( |  | ||||||
| 						na_web = obsah, |  | ||||||
| 						do_cisla = obsah, |  | ||||||
| 					) |  | ||||||
| 					vzorak = TextNode.objects.create(text = text_vzoraku) |  | ||||||
| 					uloha_vzorak = UlohaVzorakNode.objects.create(uloha=u, first_child = vzorak) |  | ||||||
| 					u.UlohaVzorakNode = uloha_vzorak |  | ||||||
| 
 |  | ||||||
| 					# Najdeme správný TemaVCisleNode pro vložení vzoráku | 					# Najdeme správný TemaVCisleNode pro vložení vzoráku | ||||||
| 					res_tema_node = None; | 					res_tema_node = None; | ||||||
| 					for node in potomci(cislo_se_vzorakem.cislonode): | 					for node in all_children(cislo_se_vzorakem.cislonode): | ||||||
| 						if isinstance(node, TemaVCisleNode) and node.tema == tema: | 						if isinstance(node, TemaVCisleNode):  | ||||||
| 							res_tema_node = node | 							if node.tema == tema: | ||||||
|  | 								res_tema_node = node | ||||||
| 					if res_tema_node is None: | 					if res_tema_node is None: | ||||||
| 						raise LookupError("Nenalezen Node pro vložení vzoráku") | 						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í. | 					insert_last_child(res_tema_node, uvz) | ||||||
| 					otec_syn(res_tema_node, uloha_vzorak) |  | ||||||
| 					 |  | ||||||
| 					u.save() | 					u.save() | ||||||
| 	return | 	return | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Anet
						Anet