dynamicweb/cms/migrations/0033_placeholder_source_data_migration.py

55 lines
2 KiB
Python

# Generated by Django 1.11 on 2018-08-24 08:22
from django.db import migrations
def forwards(apps, schema_editor):
db_alias = schema_editor.connection.alias
ContentType = apps.get_model('contenttypes', 'ContentType')
CMSPlugin = apps.get_model('cms', 'CMSPlugin')
Placeholder = apps.get_model('cms', 'Placeholder')
for app in apps.get_app_configs():
for model_class in app.get_models():
if issubclass(model_class, (CMSPlugin, Placeholder)):
# We ignore all models inherited from CMSPlugin or Placeholder.
continue
# Get all fields which has a relationship to Placeholder.
pl_related_fields = [
f for f in model_class._meta.get_fields()
if f.related_model == Placeholder and not f.auto_created
]
if not pl_related_fields:
# Model has no related fields with Placeholder.
continue
# Model has related field/s with Placeholder.
# Now get all the objects for the model and populate source field.
cur_ct_obj = ContentType.objects.get_for_model(model_class)
for obj in model_class.objects.using(db_alias):
for pl_field in pl_related_fields:
obj_placeholder_field = getattr(obj, pl_field.name)
if pl_field.many_to_many:
obj_placeholder_field.update(
content_type_id=cur_ct_obj.pk,
object_id=obj.pk,
)
elif obj_placeholder_field: # Only update if foreign key was set
obj_placeholder_field.content_type_id = cur_ct_obj.pk
obj_placeholder_field.object_id = obj.pk
obj_placeholder_field.save()
class Migration(migrations.Migration):
dependencies = [
('cms', '0032_remove_title_to_pagecontent'),
]
operations = [
migrations.RunPython(forwards),
]