mamweb/seminar/migrations/0084_clanek_cislo.py

57 lines
2.1 KiB
Python
Raw Normal View History

2020-06-17 21:56:00 +02:00
# Generated by Django 2.2.13 on 2020-06-17 19:06
from django.db import migrations, models
import django.db.models.deletion
2021-11-07 10:25:34 +01:00
from treenode.treelib import get_parent
2020-06-17 21:56:00 +02:00
2020-08-19 20:28:51 +02:00
import logging
logger = logging.getLogger(__name__)
2020-06-17 21:56:00 +02:00
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')
2020-06-17 21:56:00 +02:00
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
2020-08-19 20:28:51 +02:00
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í
2020-06-17 21:56:00 +02:00
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
2020-06-17 21:56:00 +02:00
c.save()
break
aktualniNode = get_parent(aktualniNode)
2020-06-17 21:56:00 +02:00
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),
2020-06-17 21:56:00 +02:00
]