def post_add_plugin(operation, **kwargs): from djangocms_history.actions import ADD_PLUGIN from djangocms_history.helpers import get_bound_plugins, get_plugin_data from djangocms_history.models import dump_json text_plugin = kwargs['plugin'] new_plugin_ids = set(text_plugin._get_inline_plugin_ids()) if not new_plugin_ids: # User has not embedded any plugins on the text return new_plugins = CMSPlugin.objects.filter(pk__in=new_plugin_ids) new_plugins = get_bound_plugins(new_plugins) # Extend the recorded added plugins to include the inline plugins (if any) action = operation.actions.only('post_action_data').get(action=ADD_PLUGIN, order=1) post_data = json.loads(action.post_action_data) post_data['plugins'].extend(get_plugin_data(plugin) for plugin in new_plugins) action.post_action_data = dump_json(post_data) action.save(update_fields=['post_action_data'])
def pre_change_plugin(operation, **kwargs): from djangocms_history.actions import ADD_PLUGIN, DELETE_PLUGIN from djangocms_history.helpers import get_bound_plugins, get_plugin_data old_text_plugin = kwargs['old_plugin'] old_plugin_ids = set(old_text_plugin._get_inline_plugin_ids()) new_text_plugin = kwargs['new_plugin'] new_plugin_ids = set(new_text_plugin._get_inline_plugin_ids()) added_plugin_ids = new_plugin_ids.difference(old_plugin_ids) deleted_plugin_ids = old_plugin_ids.difference(new_plugin_ids) plugin_ids = added_plugin_ids | deleted_plugin_ids if added_plugin_ids == deleted_plugin_ids: # User has not added or removed embedded plugins return order = 1 # This app is a special case. # We know the old and new tree orders because inline plugins # have already been set on the database when this pre operation # is executed. old_tree = (old_text_plugin.cmsplugin_set.filter( pk__in=old_plugin_ids).order_by('position').values_list('pk', flat=True)) old_tree = list(old_tree) new_tree = (new_text_plugin.cmsplugin_set.filter( pk__in=new_plugin_ids).order_by('position').values_list('pk', flat=True)) new_tree = list(new_tree) plugins = CMSPlugin.objects.filter(pk__in=plugin_ids) bound_plugins = list(get_bound_plugins(plugins)) if added_plugin_ids: order += 1 pre_action_data = { 'order': old_tree, 'parent_id': old_text_plugin.pk, } post_plugin_data = [ get_plugin_data(plugin) for plugin in bound_plugins if plugin.pk in added_plugin_ids ] post_action_data = { 'order': new_tree, 'parent_id': old_text_plugin.pk, 'plugins': post_plugin_data, } operation.create_action( action=ADD_PLUGIN, language=old_text_plugin.language, placeholder=kwargs['placeholder'], pre_data=pre_action_data, post_data=post_action_data, order=order, ) if deleted_plugin_ids: order += 1 deleted_plugins = [ plugin for plugin in bound_plugins if plugin.pk in deleted_plugin_ids ] pre_plugin_data = [ get_plugin_data(plugin) for plugin in deleted_plugins ] pre_action_data = { 'order': old_tree, 'parent_id': old_text_plugin.pk, 'plugins': pre_plugin_data, } post_plugin_data = [ get_plugin_data(plugin, only_meta=True) for plugin in deleted_plugins ] post_action_data = { 'order': new_tree, 'parent_id': old_text_plugin.pk, 'plugins': post_plugin_data, } operation.create_action( action=DELETE_PLUGIN, language=old_text_plugin.language, placeholder=kwargs['placeholder'], pre_data=pre_action_data, post_data=post_action_data, order=order, )
def pre_change_plugin(operation, **kwargs): from djangocms_history.actions import ADD_PLUGIN, DELETE_PLUGIN from djangocms_history.helpers import get_bound_plugins, get_plugin_data old_text_plugin = kwargs['old_plugin'] old_plugin_ids = set(old_text_plugin._get_inline_plugin_ids()) new_text_plugin = kwargs['new_plugin'] new_plugin_ids = set(new_text_plugin._get_inline_plugin_ids()) added_plugin_ids = new_plugin_ids.difference(old_plugin_ids) deleted_plugin_ids = old_plugin_ids.difference(new_plugin_ids) plugin_ids = added_plugin_ids | deleted_plugin_ids if added_plugin_ids == deleted_plugin_ids: # User has not added or removed embedded plugins return order = 1 # This app is a special case. # We know the old and new tree orders because inline plugins # have already been set on the database when this pre operation # is executed. old_tree = ( old_text_plugin .cmsplugin_set .filter(pk__in=old_plugin_ids) .order_by('position') .values_list('pk', flat=True) ) old_tree = list(old_tree) new_tree = ( new_text_plugin .cmsplugin_set .filter(pk__in=new_plugin_ids) .order_by('position') .values_list('pk', flat=True) ) new_tree = list(new_tree) plugins = CMSPlugin.objects.filter(pk__in=plugin_ids) bound_plugins = list(get_bound_plugins(plugins)) if added_plugin_ids: order += 1 pre_action_data = { 'order': old_tree, 'parent_id': old_text_plugin.pk, } post_plugin_data = [get_plugin_data(plugin) for plugin in bound_plugins if plugin.pk in added_plugin_ids] post_action_data = { 'order': new_tree, 'parent_id': old_text_plugin.pk, 'plugins': post_plugin_data, } operation.create_action( action=ADD_PLUGIN, language=old_text_plugin.language, placeholder=kwargs['placeholder'], pre_data=pre_action_data, post_data=post_action_data, order=order, ) if deleted_plugin_ids: order += 1 deleted_plugins = [plugin for plugin in bound_plugins if plugin.pk in deleted_plugin_ids] pre_plugin_data = [get_plugin_data(plugin) for plugin in deleted_plugins] pre_action_data = { 'order': old_tree, 'parent_id': old_text_plugin.pk, 'plugins': pre_plugin_data, } post_plugin_data = [get_plugin_data(plugin, only_meta=True) for plugin in deleted_plugins] post_action_data = { 'order': new_tree, 'parent_id': old_text_plugin.pk, 'plugins': post_plugin_data, } operation.create_action( action=DELETE_PLUGIN, language=old_text_plugin.language, placeholder=kwargs['placeholder'], pre_data=pre_action_data, post_data=post_action_data, order=order, )