<p align="center">
<img alt="Plone Logo" width="200px" src="https://raw.githubusercontent.com/plone/.github/main/plone-logo.png">
</p>
<h1 align="center">
Plone Content Export and Import
</h1>
Package supporting the export and import of content, principals, relations, translations, discussions, and redirects from and to a Plone site.
## Introduction
This package is a slimmer version of the awesome [collective.exportimport](https://github.com/collective/collective.exportimport).
While `collective.exportimport` supports older Plone versions and Python 2, and also takes care of data conversion from Archetypes to Dexterity, this package focuses only on latest Plone and Python.
## Documentation
[`plone.exportimport` documentation](https://6.docs.plone.org/admin-guide/export-import.html)
## Installation
> [!IMPORTANT]
> This package supports sites running Plone version 6.0 and above.
> [!IMPORTANT]
> This package is now included with Plone 6.1 and above by default.
If `plone.exportimport` is not yet available in your Plone installation, add it using `pip`.
```shell
pip install plone.exportimport
```
## Contributing
See [Contributing to Plone](https://6.docs.plone.org/contributing/index.html) and [Contribute to Plone 6 core](Contribute to Plone 6 core) for general contributing policies and guidance.
The following sections specifically describe how to develop and contribute to `plone.exportimport`.
### Setup
You need a working Python environment version 3.8 or later.
Install the dependencies and a development instance using the following command.
```shell
make install
```
### Local environment Plone server
Start Plone, on port 8080, with the following command.
```shell
make start
```
### Format code base
Format the code base with the following command.
```shell
make format
```
### Run tests
Testing of this package is done with [`pytest`](https://docs.pytest.org/en/stable/) and [`tox`](https://tox.wiki/en/stable/).
Run all tests with the following command.
```shell
make test
```
Run all tests, but stop on the first error and open a `pdb` session.
```shell
./bin/tox -e test -- -x --pdb
```
Run tests named `TestUtilsDiscussions`.
```shell
./bin/tox -e test -- -k TestUtilsDiscussions
```
## License
The project is licensed under the GPLv2.
# Changelog
<!--
You should *NOT* be adding new change log entries to this file.
You should create a file in the news directory instead.
For helpful instructions, please see:
https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst
-->
<!-- towncrier release notes start -->
## 1.1.0 (2025-03-11)
### New features:
- Report object creation during import using the plone-importer cli. Use --quiet to disable it. @ericof #54
- Do not stop the import if an object parent is missing @ericof #56
### Bug fixes:
- Set site during plone-importer transaction commit. @ericof #52
- Sort `relations.json` and `translations.json` so their contents are stable. @mauritsvanrees #57
## 1.0.0 (2025-01-31)
### Bug fixes:
- Export the raw value of rich text fields, instead of the transformed output.
This fixes internal links in Classic UI based distributions.
@mauritsvanrees #48
- Fix traceback when translation group does not have the default language.
@mauritsvanrees #50
### Documentation:
- Migrate documentation to README.md and https://6.docs.plone.org/admin-guide/export-import.html. @stevepiercy #46
## 1.0.0b1 (2025-01-23)
### New features:
- Include revisions only when passing `--include-revisions`. @mauritsvanrees #39
### Bug fixes:
- Export principals: sort groups, roles, and members. @mauritsvanrees #39
- Import: update modification dates again at the end. The original modification dates may have changed. @mauritsvanrees #39
- Do not export parent info.
This information is no longer needed: during import, parents are now always found by path and not by UID.
From now on, the import ignores any parent info that is set.
@mauritsvanrees #39
## 1.0.0a8 (2024-10-11)
### Bug fixes:
- Use plone.app.discussion and plone.app.multilingual as optional dependencies.
@davisagli #18
- Include 'isReferencing' relations in import. @ksuess #32
- Set constraints after setting local permissions on content [@ericof] #33
- Export adds a newline at the end of all files.
This matches the `.editorconfig` settings that we have in most Plone packages.
[maurits] #35
- Do not export or import translations when `plone.app.multilingual` is not available.
[maurits] #35
- Disallowlisted portlets were not imported when there was no accompanying change in the actual portlet list.
[maurits] #35
- Add a fixer for the `allow_discussion` key: this should only contain True or False when this is explicitly set on the object.
[maurits] #35
- Do not export or import discussions/comments when `plone.app.discussion` is not available.
[maurits] #35
- Renamed `blacklisted_status` key to `blocked_status` to be sensitive.
We still read the old key for backwards compatibility.
[maurits] #35
## 1.0.0a7 (2024-06-13)
### New features:
- Export / Import local permissions for each content [@ericof] #15
### Bug fixes:
- Fix `plone.exportimport.utils.principals.members._run_as_manager` function [@ericof] #29
## 1.0.0a6 (2024-06-10)
### Bug fixes:
- Allow granting roles other than Manager and Member to principals [@ericof] #25
- Fix export of language for content [@sneridagh] #26
## 1.0.0a5 (2024-05-16)
### Internal:
- Fix list of test dependencies [@ericof]
## 1.0.0a4 (2024-05-15)
### New features:
- Add pre_deserialize_hooks to content import [@pbauer] #22
### Bug fixes:
- Reindex members of relations in case that they contain preview_image_links
[sneridagh] #13
- Avoid duplicating portlets registration during import [@ericof] #16
### Internal:
- Update plone/meta [@ericof] #20
## 1.0.0a3 (2024-05-02)
### Bug fixes:
- Fix importer by issuing a transaction commit
[sneridagh] #9
- Account for use case language is empty string
[sneridagh] #10
## 1.0.0a2 (2024-04-18)
### New features:
- Support export/import of portlets if plone.app.portlets is installed. @davisagli #8
## 1.0.0a1 (2024-04-17)
### New features:
- Implement exporter and importer for content [@ericof] #1
- Implement exporter and importer for members and groups [@ericof] #2
- Implement exporter and importer for redirects [@ericof] #3
- Implement exporter and importer for relations [@ericof] #4
- Implement exporter and importer for translations [@ericof] #5
- Implement exporter and importer for discussions [@ericof] #6
Raw data
{
"_id": null,
"home_page": "https://plone.org",
"name": "plone.exportimport",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "Plone CMF Python Zope CMS",
"author": "Plone Foundation",
"author_email": "releasemanager@plone.org",
"download_url": "https://files.pythonhosted.org/packages/10/b0/9605d69ff27a9ebbd87efcc53d5efab9f9c06ebce9263e4d371934359e81/plone_exportimport-1.1.0.tar.gz",
"platform": null,
"description": "\n<p align=\"center\">\n <img alt=\"Plone Logo\" width=\"200px\" src=\"https://raw.githubusercontent.com/plone/.github/main/plone-logo.png\">\n</p>\n\n<h1 align=\"center\">\n Plone Content Export and Import\n</h1>\n\nPackage supporting the export and import of content, principals, relations, translations, discussions, and redirects from and to a Plone site.\n\n## Introduction\n\nThis package is a slimmer version of the awesome [collective.exportimport](https://github.com/collective/collective.exportimport).\n\nWhile `collective.exportimport` supports older Plone versions and Python 2, and also takes care of data conversion from Archetypes to Dexterity, this package focuses only on latest Plone and Python.\n\n\n## Documentation\n\n[`plone.exportimport` documentation](https://6.docs.plone.org/admin-guide/export-import.html)\n\n\n\n## Installation\n\n> [!IMPORTANT]\n> This package supports sites running Plone version 6.0 and above.\n\n> [!IMPORTANT]\n> This package is now included with Plone 6.1 and above by default.\n\nIf `plone.exportimport` is not yet available in your Plone installation, add it using `pip`.\n\n```shell\npip install plone.exportimport\n```\n\n\n## Contributing\n\nSee [Contributing to Plone](https://6.docs.plone.org/contributing/index.html) and [Contribute to Plone 6 core](Contribute to Plone 6 core) for general contributing policies and guidance.\n\nThe following sections specifically describe how to develop and contribute to `plone.exportimport`.\n\n\n### Setup\n\nYou need a working Python environment version 3.8 or later.\n\nInstall the dependencies and a development instance using the following command.\n\n```shell\nmake install\n```\n\n\n### Local environment Plone server\n\nStart Plone, on port 8080, with the following command.\n\n```shell\nmake start\n```\n\n\n### Format code base\n\nFormat the code base with the following command.\n\n```shell\nmake format\n```\n\n\n### Run tests\n\nTesting of this package is done with [`pytest`](https://docs.pytest.org/en/stable/) and [`tox`](https://tox.wiki/en/stable/).\n\nRun all tests with the following command.\n\n```shell\nmake test\n```\n\nRun all tests, but stop on the first error and open a `pdb` session.\n\n```shell\n./bin/tox -e test -- -x --pdb\n```\n\nRun tests named `TestUtilsDiscussions`.\n\n```shell\n./bin/tox -e test -- -k TestUtilsDiscussions\n```\n\n\n## License\n\nThe project is licensed under the GPLv2.\n\n\n# Changelog\n\n<!--\n You should *NOT* be adding new change log entries to this file.\n You should create a file in the news directory instead.\n For helpful instructions, please see:\n https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst\n-->\n\n<!-- towncrier release notes start -->\n\n## 1.1.0 (2025-03-11)\n\n\n### New features:\n\n- Report object creation during import using the plone-importer cli. Use --quiet to disable it. @ericof #54\n- Do not stop the import if an object parent is missing @ericof #56\n\n\n### Bug fixes:\n\n- Set site during plone-importer transaction commit. @ericof #52\n- Sort `relations.json` and `translations.json` so their contents are stable. @mauritsvanrees #57\n\n## 1.0.0 (2025-01-31)\n\n\n### Bug fixes:\n\n- Export the raw value of rich text fields, instead of the transformed output.\n This fixes internal links in Classic UI based distributions.\n @mauritsvanrees #48\n- Fix traceback when translation group does not have the default language.\n @mauritsvanrees #50\n\n\n### Documentation:\n\n- Migrate documentation to README.md and https://6.docs.plone.org/admin-guide/export-import.html. @stevepiercy #46\n\n## 1.0.0b1 (2025-01-23)\n\n\n### New features:\n\n- Include revisions only when passing `--include-revisions`. @mauritsvanrees #39\n\n\n### Bug fixes:\n\n- Export principals: sort groups, roles, and members. @mauritsvanrees #39\n- Import: update modification dates again at the end. The original modification dates may have changed. @mauritsvanrees #39\n- Do not export parent info.\n This information is no longer needed: during import, parents are now always found by path and not by UID.\n From now on, the import ignores any parent info that is set.\n @mauritsvanrees #39\n\n## 1.0.0a8 (2024-10-11)\n\n\n### Bug fixes:\n\n- Use plone.app.discussion and plone.app.multilingual as optional dependencies.\n @davisagli #18\n- Include 'isReferencing' relations in import. @ksuess #32\n- Set constraints after setting local permissions on content [@ericof] #33\n- Export adds a newline at the end of all files.\n This matches the `.editorconfig` settings that we have in most Plone packages.\n [maurits] #35\n- Do not export or import translations when `plone.app.multilingual` is not available.\n [maurits] #35\n- Disallowlisted portlets were not imported when there was no accompanying change in the actual portlet list.\n [maurits] #35\n- Add a fixer for the `allow_discussion` key: this should only contain True or False when this is explicitly set on the object.\n [maurits] #35\n- Do not export or import discussions/comments when `plone.app.discussion` is not available.\n [maurits] #35\n- Renamed `blacklisted_status` key to `blocked_status` to be sensitive.\n We still read the old key for backwards compatibility.\n [maurits] #35\n\n## 1.0.0a7 (2024-06-13)\n\n\n### New features:\n\n- Export / Import local permissions for each content [@ericof] #15\n\n\n### Bug fixes:\n\n- Fix `plone.exportimport.utils.principals.members._run_as_manager` function [@ericof] #29\n\n## 1.0.0a6 (2024-06-10)\n\n\n### Bug fixes:\n\n- Allow granting roles other than Manager and Member to principals [@ericof] #25\n- Fix export of language for content [@sneridagh] #26\n\n## 1.0.0a5 (2024-05-16)\n\n\n### Internal:\n\n- Fix list of test dependencies [@ericof] \n\n## 1.0.0a4 (2024-05-15)\n\n\n### New features:\n\n- Add pre_deserialize_hooks to content import [@pbauer] #22\n\n\n### Bug fixes:\n\n- Reindex members of relations in case that they contain preview_image_links\n [sneridagh] #13\n- Avoid duplicating portlets registration during import [@ericof] #16\n\n\n### Internal:\n\n- Update plone/meta [@ericof] #20\n\n\n## 1.0.0a3 (2024-05-02)\n\n\n### Bug fixes:\n\n- Fix importer by issuing a transaction commit\n [sneridagh] #9\n- Account for use case language is empty string\n [sneridagh] #10\n\n\n## 1.0.0a2 (2024-04-18)\n\n\n### New features:\n\n- Support export/import of portlets if plone.app.portlets is installed. @davisagli #8\n\n\n## 1.0.0a1 (2024-04-17)\n\n\n### New features:\n\n- Implement exporter and importer for content [@ericof] #1\n- Implement exporter and importer for members and groups [@ericof] #2\n- Implement exporter and importer for redirects [@ericof] #3\n- Implement exporter and importer for relations [@ericof] #4\n- Implement exporter and importer for translations [@ericof] #5\n- Implement exporter and importer for discussions [@ericof] #6\n\n\n",
"bugtrack_url": null,
"license": "GPL version 2",
"summary": "Plone content export / import support",
"version": "1.1.0",
"project_urls": {
"Documentation": "https://6.docs.plone.org",
"Homepage": "https://plone.org",
"Issues": "https://github.com/plone/plone.exportimport/issues",
"Source": "https://github.com/plone/plone.exportimport"
},
"split_keywords": [
"plone",
"cmf",
"python",
"zope",
"cms"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0fed89e1dcf88e4f7809161578ba78d16845dbed7ad72ef8dcfd23175ecb9f20",
"md5": "0110332b7726c1e266514814e1ba2c22",
"sha256": "004b68df86aceb10a00de90d4f3dfc085960b199b8e225a2fad80e5474f0bd45"
},
"downloads": -1,
"filename": "plone.exportimport-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0110332b7726c1e266514814e1ba2c22",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 64623,
"upload_time": "2025-03-11T21:38:39",
"upload_time_iso_8601": "2025-03-11T21:38:39.171521Z",
"url": "https://files.pythonhosted.org/packages/0f/ed/89e1dcf88e4f7809161578ba78d16845dbed7ad72ef8dcfd23175ecb9f20/plone.exportimport-1.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "10b09605d69ff27a9ebbd87efcc53d5efab9f9c06ebce9263e4d371934359e81",
"md5": "5347547ffa299d555d3d6d82f8473eb7",
"sha256": "a85420732f319abfc3d40f4dee214065e4de15a77cf3e5f82dbbdf2df410d5aa"
},
"downloads": -1,
"filename": "plone_exportimport-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "5347547ffa299d555d3d6d82f8473eb7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 194933,
"upload_time": "2025-03-11T21:38:41",
"upload_time_iso_8601": "2025-03-11T21:38:41.176617Z",
"url": "https://files.pythonhosted.org/packages/10/b0/9605d69ff27a9ebbd87efcc53d5efab9f9c06ebce9263e4d371934359e81/plone_exportimport-1.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-03-11 21:38:41",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "plone",
"github_project": "plone.exportimport",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"tox": true,
"lcname": "plone.exportimport"
}