dynamicweb/cms/migrations/0024_set_plugin_absolute_position.py

66 lines
1.8 KiB
Python

# Generated by Django 1.11.12 on 2018-05-29 14:38
from django.db import migrations
def get_descendant_ids(model_class, root_id):
"""
Returns the a generator of primary keys which represent
descendants of the given plugin ID (root_id)
"""
ids = (
model_class
.objects
.filter(parent=root_id)
.order_by('position')
.values_list('pk', flat=True)
)
for child_id in ids:
yield child_id
for child_id in get_descendant_ids(model_class, child_id):
yield child_id
def set_plugin_absolute_position(apps, schema_editor):
db_alias = schema_editor.connection.alias
CMSPlugin = apps.get_model('cms', 'CMSPlugin')
Placeholder = apps.get_model('cms', 'Placeholder')
placeholders = Placeholder.objects.using(db_alias).all()
all_languages = (
CMSPlugin
.objects
.using(db_alias)
.values_list('language', flat=True)
.distinct()
)
for placeholder in placeholders:
for language in all_languages:
position = 1
plugins = placeholder.cmsplugin_set.filter(language=language)
root_plugin_ids = (
plugins
.filter(parent__isnull=True)
.order_by('position')
.values_list('pk', flat=True)
)
for root_id in root_plugin_ids:
plugins.filter(pk=root_id).update(position=position)
position +=1
for desc_id in get_descendant_ids(CMSPlugin, root_id=root_id):
plugins.filter(pk=desc_id).update(position=position)
position += 1
class Migration(migrations.Migration):
dependencies = [
('cms', '0023_placeholder_source_field'),
]
operations = [
migrations.RunPython(set_plugin_absolute_position),
]