# Generated by Django 2.2.13 on 2020-06-17 19:06 from django.db import migrations, models import django.db.models.deletion from treenode.treelib import get_parent import logging logger = logging.getLogger(__name__) 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 (reseni.count() != 1): # Pozor, reseni_set je Manager, takže se na něj musí trošku jinak logger.warn(f"Více než jedno řešení pro článek {c}") c.cislo = None c.save() continue r = reseni.first() aktualniNode = r.text_cely # Hlavní ReseniNode pro řešení while aktualniNode is not None: #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) class Migration(migrations.Migration): dependencies = [ ('seminar', '0083_auto_20200506_1952'), ] operations = [ migrations.AddField( model_name='clanek', 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.noop), ]