|
@ -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), |
|
|
] |
|
|
] |
|
|