diff --git a/seminar/migrations/0084_clanek_cislo.py b/seminar/migrations/0084_clanek_cislo.py index 03a8ff51..5de1fefa 100644 --- a/seminar/migrations/0084_clanek_cislo.py +++ b/seminar/migrations/0084_clanek_cislo.py @@ -5,25 +5,32 @@ import django.db.models.deletion from seminar.treelib import get_parent def najdi_cislo(apps, schema_editor): - # Clanek = apps.get_model('seminar', 'Clanek') Hodnoceni = apps.get_model('seminar', 'Hodnoceni') Reseni = apps.get_model('seminar', 'Reseni') ReseniNode = apps.get_model('seminar', 'ReseniNode') CisloNode = apps.get_model('seminar', 'CisloNode') + ContentType = apps.get_model('contenttypes', 'ContentType') for c in Clanek.objects.all(): reseni = c.reseni_set - if (len(reseni) != 1): + if (reseni.count() != 1): # Pozor, reseni_set je Manager, takže se na něj musí trošku jinak raise ValueError("Článek k sobě má nejedno řešení!") - r = reseni[0] - aktualniNode = r.reseninode + r = reseni.first() + aktualniNode = r.text_cely # Hlavní ReseniNode pro řešení while aktualniNode is not None: - if isinstance(aktualniNode, CisloNode): - c.cislo = aktualniNode.cislo + #if isinstance(aktualniNode, CisloNode): # Nejde, protože aktualniNode se tváří jako obecný TreeNode... + # Ale v dokumentaci k django-polymorphic se píše, že tam jsou nastavené nějaké fieldy na známé hodnoty :-) + # https://django-polymorphic.readthedocs.io/en/stable/migrating.html + cislonode_ct = ContentType.objects.get_for_model(CisloNode) + akt_ct = aktualniNode.polymorphic_ctype + if akt_ct == cislonode_ct: + # Zneužíváme tu opačnou vazbu k treenode_ptr, protože + # aktualniNode je "jen" TreeNode a ne CisloNode + c.cislo = aktualniNode.cislonode.cislo c.save() break - aktualniNode = get_parent() + aktualniNode = get_parent(aktualniNode) @@ -39,5 +46,5 @@ class Migration(migrations.Migration): name='cislo', field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='vydane_clanky', to='seminar.Cislo', verbose_name='číslo vydání'), ), - migrations.RunPython(najdi_cislo), + migrations.RunPython(najdi_cislo, migrations.RunPython.noop), ]