django CMS Transfer is an experimental package that allows you to export and import plugin data from a page or a placeholder. It does not support foreign key relations and won't import/export related data, such as media.
Note
This project is endorsed by the django CMS Association. That means that it is officially accepted by the dCA as being in line with our roadmap vision and development/plugin policy. Join us on Slack.
Because this is an open-source project, we welcome everyone to get involved in the project and receive a reward for their contribution. Become part of a fantastic community and help us make django CMS the best CMS in the world.
We'll be delighted to receive your feedback in the form of issues and pull requests. Before submitting your pull request, please review our contribution guidelines.
We're grateful to all contributors who have helped create and maintain this package. Contributors are listed at the contributors section.
The setting DJANGO_CMS_TRANSFER_SERIALIZER
allows registration of a custom JSON serializer. An example use case would be subclassing Django's built-in Python serializer to base64-encode inline image data.
See REQUIREMENTS
in the setup.py
file for additional dependencies:
For a manual install:
- run
pip install djangocms-transfer
- add
djangocms_transfer
to yourINSTALLED_APPS
- run
python manage.py migrate djangocms_transfer
For django CMS 4.0 or later, you must use djangocms-transfer 2.0 or later.
For django CMS 3.7 through 3.11 use versions 1.x of djangocms-transfer.
Following settings are available:
DJANGOCMS_TRANSFER_PROCESS_EXPORT_PLUGIN_DATA:
Enables processing of plugin instances prior to serialization, e.g.
myapp.module.function
.DJANGOCMS_TRANSFER_PROCESS_IMPORT_PLUGIN_DATA:
Enables processing of plugin instances prior to saving, e.g.
myapp.module.function
. For example: set default-values for ForeignKeys (images for django_filer, ..)
As an example the combination of _PROCESS_EXPORT_PLUGIN_DATA
and
_PROCESS_IMPORT_PLUGIN_DATA
lets you export and import the data between
different systems while setting the contents as you need it:
# settings.py .._PROCESS_EXPORT_PLUGIN_DATA = "myapp.some.module.export_function" .._PROCESS_IMPORT_PLUGIN_DATA = "myapp.some.module.import_function" # custom functions def export_function(plugin, plugin_data): # remove child-plugins which can't be handled if plugin.parent_id and plugin.parent.plugin_type == "SomeParentPlugin": return None # change data if plugin.plugin_type == "SomePlugin": plugin_data["data"].update({ "some_field": "TODO: change me", }) return plugin_data def import_function(deserialized_object): some_related_object = MyModel.objects.first() for field in deserialized_object.object._meta.fields: # example of setting a default value for a related field if isinstance(field, ForeignKey): value = getattr(deserialized_object.object, field.attname) if field.related_model == MyModel and value is not None: setattr(deserialized_object.object, field.name, some_related_object)
You can run tests by executing:
virtualenv env source env/bin/activate pip install -r tests/requirements/base.txt python setup.py test
For code formatting, black is used. To automatically fix errors reported from black, you can install it via virtualenv and pip install -r tests/requirements/base.txt. After this you just need to run tools/black.