Browse Source

Oprava migrace pro přidání čísla ke článku

middleware_test
Pavel 'LEdoian' Turinsky 5 years ago
parent
commit
7c54079394
  1. 23
      seminar/migrations/0084_clanek_cislo.py

23
seminar/migrations/0084_clanek_cislo.py

@ -5,25 +5,32 @@ import django.db.models.deletion
from seminar.treelib import get_parent from seminar.treelib import get_parent
def najdi_cislo(apps, schema_editor): def najdi_cislo(apps, schema_editor):
#
Clanek = apps.get_model('seminar', 'Clanek') Clanek = apps.get_model('seminar', 'Clanek')
Hodnoceni = apps.get_model('seminar', 'Hodnoceni') Hodnoceni = apps.get_model('seminar', 'Hodnoceni')
Reseni = apps.get_model('seminar', 'Reseni') Reseni = apps.get_model('seminar', 'Reseni')
ReseniNode = apps.get_model('seminar', 'ReseniNode') ReseniNode = apps.get_model('seminar', 'ReseniNode')
CisloNode = apps.get_model('seminar', 'CisloNode') CisloNode = apps.get_model('seminar', 'CisloNode')
ContentType = apps.get_model('contenttypes', 'ContentType')
for c in Clanek.objects.all(): for c in Clanek.objects.all():
reseni = c.reseni_set 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í!") raise ValueError("Článek k sobě má nejedno řešení!")
r = reseni[0] r = reseni.first()
aktualniNode = r.reseninode aktualniNode = r.text_cely # Hlavní ReseniNode pro řešení
while aktualniNode is not None: while aktualniNode is not None:
if isinstance(aktualniNode, CisloNode): #if isinstance(aktualniNode, CisloNode): # Nejde, protože aktualniNode se tváří jako obecný TreeNode...
c.cislo = aktualniNode.cislo # 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() c.save()
break break
aktualniNode = get_parent() aktualniNode = get_parent(aktualniNode)
@ -39,5 +46,5 @@ class Migration(migrations.Migration):
name='cislo', 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í'), 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),
] ]

Loading…
Cancel
Save