127 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Generated by Django 1.11.20 on 2019-05-29 03:26
 | |
| from __future__ import unicode_literals
 | |
| 
 | |
| from django.db import migrations
 | |
| 
 | |
| from django.db.models import Q
 | |
| 
 | |
| def nastav_koren(koren, node):
 | |
| 	node.root = koren
 | |
| 	node.save()
 | |
| 	
 | |
| 	if node.succ:
 | |
| 		nastav_koren(koren, node.succ)
 | |
| 	if node.first_child:
 | |
| 		nastav_koren(koren, node.first_child)
 | |
| 
 | |
| def pridej_potomka(rodic, potomek):
 | |
| 	# Daný vrchol bude posledním potomkem rodiče
 | |
| 	uz_ma_deti = False
 | |
| 	posledni = None
 | |
| 
 | |
| 	# Přidávaný potomek by neměl mít následovníka -- přidáváme potomka, ne podles.
 | |
| 	if potomek.succ:
 | |
| 		raise ValueError("Potomek má následovníka, to je velmi podezřelé!")
 | |
| 
 | |
| 	# Najdeme aktuálně posledního potomka:
 | |
| 	if rodic.first_child:
 | |
| 		uz_ma_deti = True
 | |
| 		posledni = rodic.first_child
 | |
| 		while posledni.succ:
 | |
| 			posledni = posledni.succ
 | |
| 
 | |
| 	# Nastavíme kořen:
 | |
| 	nastav_koren(rodic.root, potomek)
 | |
| 
 | |
| 	# Připojíme vrchol:
 | |
| 	if uz_ma_deti:
 | |
| 		posledni.succ = potomek
 | |
| 		posledni.save()
 | |
| 	else:
 | |
| 		rodic.first_child = potomek
 | |
| 		rodic.save()
 | |
| 
 | |
| def pokacej_les(apps, schema_editor):
 | |
| 	# Teď je potřeba všechny TreeNody příslušející k zadaným problémům připojit
 | |
| 	# do hlavního stromu
 | |
| 	# Tohle je jednoduchá verze: nejdřív témátka a seriály, pak úložky a pohádky,
 | |
| 	# pak články a konfery, pak vzoráky, všechno setříděné podle kódu (FIXME?)
 | |
| 
 | |
| 	# Kopírování je častým zdrojem chyb!
 | |
| 	Cislo = apps.get_model('seminar', 'Cislo')
 | |
| 	Tema = apps.get_model('seminar', 'Tema')
 | |
| 	Konfera = apps.get_model('seminar', 'Konfera')
 | |
| 	Clanek = apps.get_model('seminar', 'Clanek')
 | |
| 	Uloha = apps.get_model('seminar', 'Uloha')
 | |
| 	Problem = apps.get_model('seminar', 'Problem')
 | |
| 	Pohadka = apps.get_model('seminar', 'Pohadka')
 | |
| 
 | |
| 	for c in Cislo.objects.all().reverse():
 | |
| 		cnode = c.cislonode
 | |
| 
 | |
| 		# Témata a seriály:
 | |
| 		relevantni_temata = Tema.objects.filter(Q(cislo_zadani_old = c) | Q(cislo_reseni_old = c)).order_by('kod')
 | |
| 		# Téma dáme do prvního čísla, kde se vyskytne
 | |
| 		for t in relevantni_temata:
 | |
| 			tnodes = t.temavcislenode_set.all()
 | |
| 			# Migrujeme, TvCN je jen jedno dohromady
 | |
| 			assert(len(tnodes) == 1)
 | |
| 			tnode = tnodes[0]
 | |
| 			# Zkontrolujeme a preskocime cislo_reseni
 | |
| 			if t.cislo_zadani_old and t.cislo_reseni_old:
 | |
| 				assert(t.cislo_zadani_old.rocnik == t.cislo_reseni_old.rocnik
 | |
| 					and t.cislo_zadani_old.cislo <= t.cislo_reseni_old.cislo)
 | |
| 				if t.cislo_reseni_old == c:
 | |
| 					# Už by mělo být přidané do čísla zadání
 | |
| 					continue
 | |
| 			# Patří sem (buď je to jediné číslo, nebo je to číslo zadání)
 | |
| 			pridej_potomka(cnode, tnode)
 | |
| 
 | |
| 		# Úložky (zadání) a pohádky
 | |
| 		for u in Uloha.objects.filter(cislo_zadani = c).order_by('kod'):
 | |
| 			unode = u.ulohazadaninode
 | |
| 			pohadky_pred = Pohadka.objects.filter(uloha_old = u.problem_ptr, pred = True)
 | |
| 			pohadky_po = Pohadka.objects.filter(uloha_old = u.problem_ptr, pred = False)
 | |
| 			for p in pohadky_pred:
 | |
| 				pnode = p.pohadkanode
 | |
| 				pridej_potomka(cnode, pnode)
 | |
| 			pridej_potomka(cnode, unode)
 | |
| 			for p in pohadky_po:
 | |
| 				pnode = p.pohadkanode
 | |
| 				pridej_potomka(cnode, pnode)
 | |
| 
 | |
| 		# Pohádky, které nejsou u úlohy jsou špatně:
 | |
| 		if Pohadka.objects.exclude(uloha_old__typ='uloha').count():
 | |
| 			raise ValueError("Existuje pohádka, která není u úlohy")
 | |
| 
 | |
| 		# Články
 | |
| 		for cl in Clanek.objects.filter(cislo = c).order_by('kod'):
 | |
| 			# Zmena: Clanky nemaji vlastni Node, ale pouziva se ReseniNode v text_cely
 | |
| 			reseni = cl.reseni_set.all()
 | |
| 			if len(reseni) != 1:
 | |
| 				raise ValueError('Clanek ma vic reseni')
 | |
| 			resnode = reseni[0].text_cely
 | |
| 			pridej_potomka(cnode, resnode)
 | |
| 
 | |
| 		# Konfery
 | |
| 		for k in Konfera.objects.all():
 | |
| 			knode = k.konferanode
 | |
| 			if k.reseni and knode.root is None:
 | |
| 				# Takováhle konfera nejspíš neexistuje
 | |
| 				raise NotImplementedError("Konfery neumím zapojit do stromu")
 | |
| 
 | |
| 		# Vzoráky
 | |
| 		for u in Uloha.objects.filter(cislo_reseni = c).order_by('kod'):
 | |
| 			unode = u.ulohavzoraknode
 | |
| 			pridej_potomka(cnode, unode)
 | |
| 
 | |
| 
 | |
| class Migration(migrations.Migration):
 | |
| 
 | |
| 	dependencies = [
 | |
| 		('seminar', '0059_vytvorit_pohadkanode'),
 | |
| 	]
 | |
| 
 | |
| 	operations = [
 | |
| 		migrations.RunPython(pokacej_les, migrations.RunPython.noop),
 | |
| 	]
 |