diff --git a/seminar/migrations/0068_treenode_nazev.py b/seminar/migrations/0068_treenode_nazev.py new file mode 100644 index 00000000..bead85d3 --- /dev/null +++ b/seminar/migrations/0068_treenode_nazev.py @@ -0,0 +1,107 @@ +# Generated by Django 2.2.5 on 2019-09-26 19:35 + +from django.db import migrations, models + +# Migrace nejspíš neumí volat metody modelů: +# https://stackoverflow.com/questions/28777338/django-migrations-runpython-not-able-to-call-model-methods#37685925 + +def fix_RocnikNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'RocnikNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.rocnik)+" (RocnikNode)" + obj.save() + +def fix_CisloNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'CisloNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.cislo)+" (CisloNode)" + obj.save() + +def fix_MezicisloNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'MezicisloNode') + for obj in Objects.objects.all(): + if obj.prev: + if (obj.prev.get_real_instance_class() != CisloNode and + obj.prev.get_real_instance_class() != MezicisloNode): + raise ValueError("Předchůdce není číslo!") + posledni = obj.prev.cislo + obj.nazev = "Mezičíslo po čísle"+str(posledni)+" (MezicisloNode)" + elif obj.root: + if obj.root.get_real_instance_class() != RocnikNode: + raise ValueError("Kořen stromu není ročník!") + rocnik = obj.root.rocnik + obj.nazev = "První mezičíslo ročníku "+" (MezicisloNode)" + else: + print("!!!!! Nějaké neidentifikované mezičíslo !!!!!") + obj.nazev = "Neidentifikovatelné mezičíslo! (MezicisloNode)" + obj.save() + +def fix_TemaVCisleNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'TemaVCisleNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.tema)+" (TemaVCisleNode)" + obj.save() + +def fix_KonferaNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'KonferaNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.konfera)+" (KonferaNode)" + obj.save() + +def fix_ClanekNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'ClanekNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.clanek)+" (ClanekNode)" + obj.save() + +def fix_UlohaZadaniNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'UlohaZadaniNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.uloha)+" (UlohaZadaniNode)" + obj.save() + +def fix_PohadkaNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'PohadkaNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.pohadka)+" (PohadkaNode)" + obj.save() + +def fix_UlohaVzorakNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'UlohaVzorakNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.uloha)+" (UlohaVzorakNode)" + obj.save() + +def fix_TextNode_names(apps,schema_editor): + Objects = apps.get_model('seminar', 'TextNode') + for obj in Objects.objects.all(): + obj.nazev = str(obj.text)+" (TextNode)" + obj.save() + +def fix_all_names(apps,schema_editor): + fix_RocnikNode_names(apps,schema_editor) + fix_CisloNode_names(apps,schema_editor) + fix_MezicisloNode_names(apps,schema_editor) + fix_TemaVCisleNode_names(apps,schema_editor) + fix_KonferaNode_names(apps,schema_editor) + fix_ClanekNode_names(apps,schema_editor) + fix_UlohaZadaniNode_names(apps,schema_editor) + fix_PohadkaNode_names(apps,schema_editor) + fix_UlohaVzorakNode_names(apps,schema_editor) + fix_TextNode_names(apps,schema_editor) + + +class Migration(migrations.Migration): + + dependencies = [ + ('seminar', '0067_auto_20190814_0805'), + ] + + operations = [ + migrations.AddField( + model_name='treenode', + name='nazev', + field=models.TextField(help_text='Tento název se zobrazuje v nabídkách pro výběr vhodného TreeNode', null=True, verbose_name='název tohoto node'), + ), + migrations.RunPython(fix_all_names), + ] diff --git a/seminar/models.py b/seminar/models.py index 45e5885e..85b2a9e8 100644 --- a/seminar/models.py +++ b/seminar/models.py @@ -384,6 +384,10 @@ class Rocnik(SeminarModelBase): cache.set(name, c, 300) return c + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + self.rocniknode.save() def cislo_pdf_filename(self, filename): rocnik = str(self.rocnik.rocnik) @@ -477,6 +481,11 @@ class Cislo(SeminarModelBase): return None return c + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + self.cislonode.save() + @reversion.register(ignore_duplicates=True) class Organizator(SeminarModelBase): # zmena dedicnosti z models.Model na SeminarModelBase, potencialni vznik bugu @@ -707,6 +716,12 @@ class Tema(Problem): return "t{}".format(self.kod) return '' + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + for tvcn in self_temavcislenode_set: + tvcn.save() + class Clanek(Problem): class Meta: db_table = 'seminar_clanky' @@ -727,6 +742,11 @@ class Clanek(Problem): return "c{}".format(self.kod) return '' + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + self.claneknode.save() + class Text(SeminarModelBase): class Meta: db_table = 'seminar_texty' @@ -744,6 +764,12 @@ class Text(SeminarModelBase): # obrázky mají návaznost opačným směrem (vazba z druhé strany) + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + for tn in self.textnode_set: + tn.save() + class Uloha(Problem): @@ -778,6 +804,12 @@ class Uloha(Problem): return name return '' + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + self.ulohazadaninode.save() + self.ulohavzoraknode.save() + @reversion.register(ignore_duplicates=True) class Reseni(SeminarModelBase): @@ -959,6 +991,10 @@ class Pohadka(SeminarModelBase): uryvek = self.text if len(self.text) < 50 else self.text[:(50-3)]+"..." return uryvek + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + self.pohadkanode.save() @reversion.register(ignore_duplicates=True) class Soustredeni_Ucastnici(SeminarModelBase): @@ -1069,6 +1105,11 @@ class Konfera(models.Model): def __str__(self): return "{}: ({})".format(self.nazev, self.soustredeni) + def save(self): + super().save() + # *Node.save() aktualizuje název *Nodu. + self.konferanode.save() + # Vazebna tabulka. Mozna se generuje automaticky. @reversion.register(ignore_duplicates=True) @@ -1147,6 +1188,7 @@ class TreeNode(PolymorphicModel): verbose_name = "TreeNode" verbose_name_plural = "TreeNody" + # TODO: Nechceme radši jako root vyžadovat přímo RocnikNode? root = models.ForeignKey('TreeNode', related_name="potomci_set", null = True, @@ -1176,7 +1218,15 @@ class TreeNode(PolymorphicModel): self.succ.print_tree(indent=indent) def __str__(self): - return self.nazev + if self.nazev: + return self.nazev + else: + #TODO: logování + return "Nepojmenovaný Treenode" + + def save(self): + self.aktualizuj_nazev() + super().save() class RocnikNode(TreeNode): class Meta: @@ -1186,8 +1236,9 @@ class RocnikNode(TreeNode): rocnik = models.OneToOneField(Rocnik, on_delete = models.PROTECT, # Pokud chci mazat ročník, musím si Node pořešit ručně verbose_name = "ročník") - def __str__(self): - return 'RocnikNode: '+str(self.rocnik) + + def aktualizuj_nazev(self): + self.nazev = "RocnikNode: "+str(self.rocnik) class CisloNode(TreeNode): class Meta: @@ -1197,16 +1248,31 @@ class CisloNode(TreeNode): cislo = models.OneToOneField(Cislo, on_delete = models.PROTECT, # Pokud chci mazat číslo, musím si Node pořešit ručně verbose_name = "číslo") - def __str__(self): - return 'CisloNode: '+str(self.poradi) + + def aktualizuj_nazev(self): + self.nazev = "CisloNode: "+str(self.cislo) class MezicisloNode(TreeNode): class Meta: db_table = 'seminar_nodes_mezicislo' verbose_name = 'Mezičíslo (Node)' verbose_name_plural = 'Mezičísla (Node)' - def __str__(self): - return 'MezicisloNode' + + def aktualizuj_nazev(self): + if self.prev: + if (self.prev.get_real_instance_class() != CisloNode and + self.prev.get_real_instance_class() != MezicisloNode): + raise ValueError("Předchůdce není číslo!") + posledni = self.prev.cislo + self.nazev = "MezicisloNode: Mezičíslo po čísle"+str(posledni) + elif self.root: + if self.root.get_real_instance_class() != RocnikNode: + raise ValueError("Kořen stromu není ročník!") + rocnik = self.root.rocnik + self.nazev = "MezicisloNode: První mezičíslo ročníku "+str(rocnik) + else: + print("!!!!! Nějaké neidentifikované mezičíslo !!!!!") + self.nazev = "MezicisloNode: Neidentifikovatelné mezičíslo!" class TemaVCisleNode(TreeNode): """ Obsahuje příspěvky k tématu v daném čísle """ @@ -1217,8 +1283,9 @@ class TemaVCisleNode(TreeNode): tema = models.ForeignKey(Tema, on_delete=models.PROTECT, # Pokud chci mazat téma, musím si Node pořešit ručně verbose_name = "téma v čísle") - def __str__(self): - return 'TemaVCisleNode: tema: '+str(self.tema) + + def aktualizuj_nazev(self): + self.nazev = "TemaVCisleNode: "+str(self.tema) class KonferaNode(TreeNode): class Meta: @@ -1230,8 +1297,9 @@ class KonferaNode(TreeNode): verbose_name = "konfera", null=True, blank=False) - def __str__(self): - return 'KonferaNode: '+str(self.konfera) + + def aktualizuj_nazev(self): + self.nazev = "KonferaNode: "+str(self.konfera) class ClanekNode(TreeNode): class Meta: @@ -1243,8 +1311,9 @@ class ClanekNode(TreeNode): verbose_name = "článek", null=True, blank=False) - def __str__(self): - return 'ClanekNode: '+str(self.clanek) + + def aktualizuj_nazev(self): + self.nazev = "ClanekNode: "+str(self.clanek) class UlohaZadaniNode(TreeNode): class Meta: @@ -1256,8 +1325,9 @@ class UlohaZadaniNode(TreeNode): verbose_name = "úloha", null=True, blank=False) - def __str__(self): - return 'UlohaZadaniNode: '+str(self.uloha) + + def aktualizuj_nazev(self): + self.nazev = "UlohaZadaniNode: "+str(self.uloha) class PohadkaNode(TreeNode): class Meta: @@ -1268,8 +1338,9 @@ class PohadkaNode(TreeNode): on_delete=models.PROTECT, # Pokud chci mazat pohádku, musím si Node pořešit ručně verbose_name = "pohádka", ) - def __str__(self): - return 'PohadkaNode: '+str(self.pohadka) + + def aktualizuj_nazev(self): + self.nazev = "PohadkaNode: "+str(self.pohadka) class UlohaVzorakNode(TreeNode): class Meta: @@ -1281,8 +1352,9 @@ class UlohaVzorakNode(TreeNode): verbose_name = "úloha", null=True, blank=False) - def __str__(self): - return 'UlohaVzorakNode: '+str(self.uloha) + + def aktualizuj_nazev(self): + self.nazev = "UlohaVzorakNode: "+str(self.uloha) class TextNode(TreeNode): class Meta: @@ -1292,8 +1364,9 @@ class TextNode(TreeNode): text = models.ForeignKey(Text, on_delete=models.PROTECT, verbose_name = 'text') - def __str__(self): - return 'TextNode: '+str(self.text) + + def aktualizuj_nazev(self): + self.nazev = "TextNode: "+str(self.text) ## FIXME: Logiku přesunout do views. #class VysledkyBase(SeminarModelBase):