testutils: úpravy funkcí k větší čitelnosti
This commit is contained in:
		
							parent
							
								
									869b58f35a
								
							
						
					
					
						commit
						97240a4103
					
				
					 1 changed files with 118 additions and 89 deletions
				
			
		|  | @ -173,13 +173,12 @@ def gen_organizatori(rnd, osoby, last_rocnik, users): | |||
| 			if do.year > datetime.datetime.now().year: | ||||
| 				do = None | ||||
| 			organizatori.append(Organizator.objects.create(osoba=os, | ||||
| 					organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga)) | ||||
| 				organizuje_od=od, organizuje_do=do, strucny_popis_organizatora = popis_orga)) | ||||
| 	return organizatori | ||||
| 
 | ||||
| def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): | ||||
| 	logger.info('Generuji úlohy do čísla (size={})...'.format(size)) | ||||
| def gen_zadani_ulohy(rnd, cisla, organizatori, pocet_oboru, poradi_cisla, poradi_problemu): | ||||
| 	 | ||||
| 	# 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č", | ||||
|  | @ -189,7 +188,47 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) | |||
| 	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"] | ||||
| 	obory = ["M", "F", "I", "O", "B"] | ||||
| 	 | ||||
| 	p = Uloha.objects.create( | ||||
| 		# atributy třídy Problem | ||||
| 		nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), | ||||
| 		stav=Problem.STAV_ZADANY, | ||||
| 		zamereni=rnd.sample(obory, pocet_oboru), | ||||
| 		autor=rnd.choice(organizatori), | ||||
| 		garant=rnd.choice(organizatori), | ||||
| 		kod=str(poradi_problemu), | ||||
| 		# atributy třídy Uloha | ||||
| 		cislo_zadani=cisla[poradi_cisla-2-1], | ||||
| 		cislo_reseni=cisla[poradi_cisla-1], | ||||
| 		cislo_deadline=cisla[poradi_cisla-1], | ||||
| 		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( | ||||
| 		[rnd.choice(sloveso), | ||||
| 		rnd.choice(koho), | ||||
| 		rnd.choice(ceho), | ||||
| 		rnd.choice(jmeno), | ||||
| 		rnd.choice(kde)] | ||||
| 		) | ||||
| 	) | ||||
| 	zad = TextNode.objects.create(text = text_zadani) | ||||
| 	uloha_zadani = UlohaZadaniNode.objects.create(uloha = p, first_child = zad) | ||||
| 	p.ulohazadaninode = uloha_zadani | ||||
| 	otec_syn(cisla[poradi_cisla-2-1].cislonode, uloha_zadani) | ||||
| 
 | ||||
| 	return p | ||||
| 
 | ||||
| def gen_vzoroveho_reseni_ulohy(rnd, cisla, organizatori, uloha, pocet_opravovatelu, poradi_cisla): | ||||
| 	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", | ||||
|  | @ -197,96 +236,81 @@ def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size) | |||
| 		"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í"] | ||||
| 
 | ||||
| 	# Generování vzorového řešení. | ||||
| 	text_vzoraku = Text.objects.create( | ||||
| 		na_web = rnd.choice(reseni), | ||||
| 		do_cisla = rnd.choice(reseni) | ||||
| 	) | ||||
| 	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 | ||||
| 
 | ||||
| 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í. | ||||
| 		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 | ||||
| 
 | ||||
| def gen_ulohy_do_cisla(rnd, organizatori, resitele, rocnik_cisla, rocniky, size): | ||||
| 	logger.info('Generuji úlohy do čísla (size={})...'.format(size)) | ||||
| 
 | ||||
| 	k = 0 | ||||
| 	for rocnik in rocniky: | ||||
| 		k+=1 | ||||
| 		k += 1 | ||||
| 		print("Generuji {}. číslo.".format(k)) | ||||
| 		cisla = rocnik_cisla[k-1] | ||||
| 		for ci in range(3, len(cisla)+1): # pro všechna čísla | ||||
| 		cisla = rocnik_cisla[k - 1] | ||||
| 		for ci in range(3, len(cisla) + 1): # pro všechna čísla | ||||
| 			resitele_size = round(7/8 * 30 * size) # očekáváný celkový počet řešitelů | ||||
| 			poc_res = rnd.randint(round(resitele_size/8), round(resitele_size/4)) | ||||
| 			poc_res = rnd.randint(resitele_size//8, resitele_size//4) | ||||
|  			# dané číslo řeší něco mezi osminou a čtvrtinou všech řešitelů | ||||
| 			# (náhodná hausnumera, možno změnit) | ||||
| 			# účelem je, aby se řešení generovala z menší množiny řešitelů a tedy | ||||
| 			# bylo více řešení od jednoho řešitele daného čísla | ||||
| 			resitele_cisla = rnd.sample(resitele, poc_res) | ||||
| 			for pi in range(1, ((size + 1) // 2) + 1): | ||||
| 			for pi in range(1, ((size + 1) // 2) + 1): # počet problémů | ||||
| 
 | ||||
| 				poc_op = rnd.randint(1, 4) # počet opravovatelů | ||||
| 				poc_oboru = rnd.randint(1, 2) | ||||
| 				p = Uloha.objects.create( | ||||
| 					# atributy třídy Problem | ||||
| 					nazev=" ".join([rnd.choice(jaka), rnd.choice(co)]), | ||||
| 					stav=Problem.STAV_ZADANY, | ||||
| 					zamereni=rnd.sample(["M", "F", "I", "O", "B"], poc_oboru), | ||||
| 					autor=rnd.choice(organizatori), | ||||
| 					garant=rnd.choice(organizatori), | ||||
| 					kod=str(pi), | ||||
| 					# atributy třídy Uloha | ||||
| 					cislo_zadani=cisla[ci-2-1], | ||||
| 					cislo_reseni=cisla[ci-1], | ||||
| 					cislo_deadline=cisla[ci-1], | ||||
| 					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( | ||||
| 					[rnd.choice(sloveso), | ||||
| 					rnd.choice(koho), | ||||
| 					rnd.choice(ceho), | ||||
| 					rnd.choice(jmeno), | ||||
| 					rnd.choice(kde)] | ||||
| 					) | ||||
| 				) | ||||
| 				zad = TextNode.objects.create(text = text_zadani) | ||||
| 				uloha_zadani = UlohaZadaniNode.objects.create(uloha=p, first_child = zad) | ||||
| 				p.ulohazadaninode = uloha_zadani | ||||
| 				otec_syn(cisla[ci-2-1].cislonode, uloha_zadani) | ||||
| 
 | ||||
| 				# generování vzorového textu | ||||
| 				text_vzoraku = Text.objects.create( | ||||
| 					na_web = rnd.choice(reseni), | ||||
| 					do_cisla = rnd.choice(reseni) | ||||
| 				) | ||||
| 				vzorak = TextNode.objects.create(text = text_vzoraku) | ||||
| 				uloha_vzorak = UlohaVzorakNode.objects.create(uloha=p, first_child = vzorak) | ||||
| 				p.ulohavzoraknode = uloha_vzorak | ||||
| 				otec_syn(cisla[ci-1].cislonode, uloha_vzorak) | ||||
| 
 | ||||
| 				p.opravovatele.set(rnd.sample(organizatori,poc_op)) | ||||
| 				p.save() | ||||
| 
 | ||||
| 				# generování řešení | ||||
| 				poc_reseni = rnd.randint(poc_res, poc_res * 4) | ||||
| 				# generujeme náhodný počet řešení vzhledem k počtu řešitelů čísla | ||||
| 				for ri in range(poc_reseni): | ||||
| 					#print("Generuji {}-té řešení".format(ri)) | ||||
| 					if rnd.randint(1, 10) == 6: | ||||
| 					# 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: | ||||
| 						res_vyber.remove(resitele[0]) | ||||
| 					res = Reseni.objects.create(forma=rnd.choice(Reseni.FORMA_CHOICES)[0]) | ||||
| 					# problem a resitele přiřadíme později, ManyToManyField | ||||
| 					# se nedá vyplnit v create() | ||||
| 					res.resitele.set(res_vyber) | ||||
| 					res.save() | ||||
| 					hod = Hodnoceni.objects.create( | ||||
| 						body=rnd.randint(0, p.max_body), | ||||
| 						cislo_body=cisla[ci-1], | ||||
| 						reseni=res, | ||||
| 						problem=p | ||||
| 					) | ||||
| 				# Generování zadání úlohy a UlohaZadaniNode,  | ||||
| 				# 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)				 | ||||
| 				# Generování řešení a hodnocení k úloze | ||||
| 				gen_reseni_ulohy(rnd, cisla, p, poc_res, ci,  | ||||
| 					resitele_cisla, resitele)  | ||||
| 
 | ||||
| 	return | ||||
| 
 | ||||
|  | @ -482,8 +506,10 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) | |||
| 					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í. | ||||
| 			# 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: | ||||
|  | @ -505,7 +531,8 @@ def gen_ulohy_k_tematum(rnd, rocniky, rocnik_cisla, rocnik_temata, organizatori) | |||
| 				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) | ||||
| 				# 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 | ||||
| 					 | ||||
|  | @ -581,8 +608,10 @@ def gen_novinky(rnd, organizatori): | |||
| 	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])) | ||||
| 		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 | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Anet
						Anet