Oprava vytvoření polymorfických contenttypes
This commit is contained in:
parent
3153b31b2d
commit
303c8e4b4b
3 changed files with 53 additions and 4 deletions
|
@ -5,7 +5,7 @@ import django.db.models.deletion
|
||||||
|
|
||||||
def vyrob_treenodum_ctypes(apps, schema_editor):
|
def vyrob_treenodum_ctypes(apps, schema_editor):
|
||||||
# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html
|
# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html
|
||||||
# XXX: Nevím, jestli se tohle náhodou nemělo spustit na všech childech (jen/i)
|
# NOTE: Tahle migrace je špatně, 0087 ji opravuje. Možno squashnout pryč.
|
||||||
TreeNode = apps.get_model('seminar', 'TreeNode')
|
TreeNode = apps.get_model('seminar', 'TreeNode')
|
||||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||||
|
|
||||||
|
@ -27,5 +27,5 @@ class Migration(migrations.Migration):
|
||||||
name='polymorphic_ctype',
|
name='polymorphic_ctype',
|
||||||
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.treenode_set+', to='contenttypes.ContentType'),
|
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.treenode_set+', to='contenttypes.ContentType'),
|
||||||
),
|
),
|
||||||
migrations.RunPython(vyrob_treenodum_ctypes, migrations.RunPython.noop),
|
migrations.RunPython(vyrob_treenodum_ctypes, migrations.RunPython.noop, elidable=True),
|
||||||
]
|
]
|
||||||
|
|
|
@ -5,7 +5,7 @@ import django.db.models.deletion
|
||||||
|
|
||||||
def vyrob_problemum_ctypes(apps, schema_editor):
|
def vyrob_problemum_ctypes(apps, schema_editor):
|
||||||
# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html
|
# Kód zkopírovaný z dokumentace: https://django-polymorphic.readthedocs.io/en/stable/migrating.html
|
||||||
# XXX: Nevím, jestli se tohle náhodou nemělo spustit na všech childech (jen/i)
|
# NOTE: Tahle migrace je špatně, 0087 ji opravuje. Možno squashnout pryč.
|
||||||
Problem = apps.get_model('seminar', 'Problem')
|
Problem = apps.get_model('seminar', 'Problem')
|
||||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||||
|
|
||||||
|
@ -25,5 +25,5 @@ class Migration(migrations.Migration):
|
||||||
name='polymorphic_ctype',
|
name='polymorphic_ctype',
|
||||||
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.problem_set+', to='contenttypes.ContentType'),
|
field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_seminar.problem_set+', to='contenttypes.ContentType'),
|
||||||
),
|
),
|
||||||
migrations.RunPython(vyrob_problemum_ctypes, migrations.RunPython.noop),
|
migrations.RunPython(vyrob_problemum_ctypes, migrations.RunPython.noop, elidable=True),
|
||||||
]
|
]
|
||||||
|
|
49
seminar/migrations/0087_fix_polymorphism.py
Normal file
49
seminar/migrations/0087_fix_polymorphism.py
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
# Generated by Django 2.2.16 on 2020-09-04 12:06
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
log = getLogger(__name__)
|
||||||
|
|
||||||
|
# Oprava migrací 0065 a 0066, kde jsem špatně pochopil django-polymorphic
|
||||||
|
|
||||||
|
# Pomocná funkce -- děláme to samé pro obě polymorfní hierarchie
|
||||||
|
def fix_ctypes(parent: str, children, apps, schema_editor):
|
||||||
|
Parent = apps.get_model('seminar', parent)
|
||||||
|
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||||
|
|
||||||
|
# Nejdřív všechno smažeme:
|
||||||
|
Parent.objects.update(polymorphic_ctype=None)
|
||||||
|
|
||||||
|
# Opravíme děti
|
||||||
|
for clsname in children:
|
||||||
|
Model = apps.get_model('seminar', clsname)
|
||||||
|
ct = ContentType.objects.get_for_model(Model)
|
||||||
|
Model.objects.update(polymorphic_ctype=ct)
|
||||||
|
|
||||||
|
|
||||||
|
# Ostatní instance mají mít explicitně content type pro rodiče
|
||||||
|
new_ct = ContentType.objects.get_for_model(Parent)
|
||||||
|
for obj in Parent.objects.filter(polymorphic_ctype__isnull=True):
|
||||||
|
log.warn(f"{parent} {obj} neměl content type -- nejspíš to je instance přímo {parent}!")
|
||||||
|
obj.polymorphic_ctype=new_ct
|
||||||
|
obj.save()
|
||||||
|
|
||||||
|
def fix_treenode(apps, schema_editor):
|
||||||
|
children = ['RocnikNode', 'CisloNode', 'MezicisloNode', 'TemaVCisleNode',
|
||||||
|
'OrgTextNode', 'UlohaZadaniNode', 'UlohaVzorakNode', 'PohadkaNode',
|
||||||
|
'TextNode', 'CastNode', 'ReseniNode']
|
||||||
|
fix_ctypes("TreeNode", children, apps, schema_editor)
|
||||||
|
|
||||||
|
def fix_problem(apps, schema_editor):
|
||||||
|
children = ['Tema', 'Clanek', 'Uloha', 'Konfera']
|
||||||
|
fix_ctypes("Problem", children, apps, schema_editor)
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
('seminar', '0086_auto_20200819_0959'),
|
||||||
|
]
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(fix_treenode, migrations.RunPython.noop),
|
||||||
|
migrations.RunPython(fix_problem, migrations.RunPython.noop),
|
||||||
|
]
|
Loading…
Reference in a new issue