plone.distribution


Nameplone.distribution JSON
Version 1.0.0b4 PyPI version JSON
download
home_pagehttps://plone.org
SummaryPlone distribution support
upload_time2024-04-03 10:04:34
maintainerNone
docs_urlNone
authorPlone Foundation
requires_python>=3.8
licenseGPL version 2
keywords plone cmf python zope cms distribution
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            
<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 Distributions
</h1>

Package supporting the (easy) implementation of a Plone Distribution.

## What is a Plone Distribution

A Plone distribution is a pre-packaged version of Plone that includes specific features, themes, modules, and configurations. It is a convenient way to get a specific type of website up and running quickly, as the distribution includes everything needed to run that type of site.

Examples of Plone distributions include:

* [SENAITE](https://www.senaite.com)
* [Quaive](https://quaivecloud.com/)
* [Portal Modelo](https://www.interlegis.leg.br/produtos-servicos/portal-modelo/)
* [Portal PadrĂ£o](https://identidade-digital-de-governo-plone.readthedocs.io/en/latest/)

### Similar Concept in Other CMS

* Drupal: Drupal has distributions for blogs, e-commerce sites, and intranet portals.

* WordPress: WordPress has a similar concept in the form of "WordPress Multisite," which allows users to run multiple websites from a single installation of WordPress.

* Joomla: Joomla has a similar concept in the form of "Joomla Templates," which are pre-designed templates for Joomla websites.

* TYPO3: TYPO3 has a similar concept in the form of "TYPO3 Distributions," which are pre-configured installations of TYPO3 for specific types of websites.

## Creating a new Distribution

First of all, a Plone Distribution is a Python Package that can be installed by `pip`.

### `setup.py`
The package will follow some conventions, to make it "discoverable" by others.

In `setup.py`, always add the correct Trove Classifiers:

```python
        "Framework :: Plone",
        "Framework :: Plone :: 6.0",
        "Framework :: Plone :: Distribution",
```

and also require `plone.distribution` to be available:

```python
    install_requires=[
        "Plone",
        "setuptools",
        "plone.distribution",
    ],
```

### `configure.zcml`

In your main `configure.zcml`, make sure to have the `plone` xml namespace declared:

```xml
<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:plone="http://namespaces.plone.org/plone"
    >
```

And also include `plone.distribution`:

```xml
  <include package="plone.distribution" />
```

Then declare the distributions included in your package:

```xml

  <plone:distribution
      name="blog"
      title="Personal Blog"
      description="A Plone site already configured to host a personal Blog."
      directory="distributions/blog"
      />

```

The registered distribution will configure a Personal Blog, with some default content.

#### distribution handlers

When registering a distribution, you can provide a `pre_handler`, a `handler` and a `post_handler` which must be
functions with the following signatures.

```python
def pre_handler(answers: dict) -> dict:
    return answers

def handler(distribution: Distribution, site, answers: dict):
    return site

def post_handler(distribution: Distribution, site, answers: dict):
    return site
```

Each of those handlers will be called in this way:

- `pre_handler`: it will process the answers to do modifications on them before creating the site
- `handler`: it will be run after the bare Plone site will be created but instead of the default handler that installs the required GenericSetup profiles and creates the content.
- `post_handler`: it will be run after the site is setup.

So if you have added some extra fields in the Plone site creation form and want to do some extra configuration in the
Plone site, you can add your own handler and register as follows:

```xml

  <plone:distribution
      name="blog"
      title="Personal Blog"
      description="A Plone site already configured to host a personal Blog."
      directory="distributions/blog"
      post_handler=".handlers.blog.post_handler"
      />

```

### distribution folder

A convention is to use the `distributions/<distribution_name>`folder in the root of your package to organize your distribution configuration.

In that folder, you will need to provide:

### `image.png`

A 1080x768 image of your distribution. It could be the default page of a new site, your logo, or any other way of representing this distribution.

### `profiles.json`

A `JSON` file with the GenericSetup profiles that are used by your distribution during installation.

This file needs to contain two keys:

* **base**: List of profiles installed in every new site using this distribution.

* **content**: List of profiles installed when the user decides to create a site with example content.

The configuration for a new Volto site is:

```json
{
  "base": [
    "plone.app.contenttypes:default",
    "plone.app.caching:default",
    "plonetheme.barceloneta:default",
    "plone.volto:default"
  ],
  "content": [
    "plone.volto:default-homepage"
  ]
}
```

#### How to add an add-on

If you want to add a Plone backend add-on to your Plone distribution, then you must perform the following steps.

Add your add-on, such as `collective.person`, to your `setup.py`:

```python
    install_requires=[
        "setuptools",
        "Plone",
        "plone.distribution>=1.0.0b2",
        "plone.api",
        "collective.person",
    ],
```

Add it to your `dependencies.zcml`:

```xml
  <!-- List all packages you depend here -->
  <include package="plone.volto" />
  <include package="plone.restapi" />
  <include package="collective.person" />
  <include package="plone.distribution" />

</configure>
```

Add it to your `profiles.json`:

```json
  "base": [
    "plone.app.contenttypes:default",
    "plone.app.caching:default",
    "plone.restapi:default",
    "plone.volto:default",
    "collective.person:default",
    "plonetheme.barceloneta:default"
  ],
```

### `schema.json`

In case you require additional input from the user during site creation, you can customize the form using the `schema.json` file.

The file should contain two keys:

* **schema**: A JSON Schema definition.
* **uischema**: A [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/docs/) configuration to modify how the form is displayed.

The **schema** should have at least the following keys:

* site_id
* title
* description
* default_language
* portal_timezone
* setup_content

The `schema.json` used for the default site creation is:

```json
{
  "schema": {
    "title": "Create a Plone site",
    "description": "Adds a new Plone content management system site to the underlying application server.",
    "type": "object",
    "required": [
      "site_id",
      "title"
    ],
    "properties": {
      "site_id": {
        "type": "string",
        "title": "Path Identifier",
        "default": "Plone",
        "description": "The ID of the site. No special characters or spaces are allowed. This ends up as part of the URL unless hidden by an upstream web server."
      },
      "title": {
        "type": "string",
        "title": "Title",
        "default": "Site",
        "description": "A short title for the site. This will be shown as part of the title of the browser window on each page."
      },
      "description": {
        "type": "string",
        "title": "Site Description",
        "default": "A Plone Site"
      },
      "default_language": {"$ref": "#/definitions/languages"},
      "portal_timezone": {"$ref": "#/definitions/timezones"},
      "setup_content": {
        "type": "boolean",
        "title": "Create Content",
        "description": "Should example content be added during site creation?",
        "default": false
      }
    }
  },
  "uischema": {
  }
}

```

**Important**
You probably noticed the entries for
default_language:

```
{"$ref": "#/definitions/languages"}
```
and portal_timezone:

```
{"$ref": "#/definitions/timezones"}
```

Both definitions are added in runtime by `plone.distribution` to provide a list of languages and timezones available on the installation.

### `content` folder

Folder containing JSON data exported using the `@@dist_export_all` browser view of this package.

## Advanced Usage

### Hiding Distributions

By default, `plone.distribution` ships with two ready-to-use distributions:

* **default**: Plone Site (Volto frontend)
* **classic**: Plone Site (Classic UI)

If you want to limit your users option to select a distribution, it is possible to set the environment variable `ALLOWED_DISTRIBUTIONS` with fewer options:

```shell
ALLOWED_DISTRIBUTIONS=default
```


## This project is supported by

<p align="left">
    <a href="https://plone.org/foundation/">
      <img alt="Plone Logo" width="200px" src="https://raw.githubusercontent.com/plone/.github/main/plone-foundation.png">
    </a>
</p>

## 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.0.0b4 (2024-04-03)


### Bug fixes:

- Fix exporting files.
  [pbauer] #58

## 1.0.0b3 (2024-03-08)


### Bug fixes:

- Fix importing blocks on the site-root.
  [pbauer] #56


### Internal:

- Update configuration files.
  [plone devs] 6e36bcc4

## 1.0.0b2 (2023-10-11)


### New features:

- Remove old blobs before exporting content [@ericof] #34
- Support to new export/import format with one content item per json file [@ericof] #47


## 1.0.0b1 (2023-07-10)


### New features:

- Validate answers payload against jsonschema [@ericof] #38
- Allow distribution to pre process answers before site creation [@ericof] #39
- Override @system from plone.restapi to display distribution information [@ericof] #45


## 1.0.0a9 (2023-06-27)


### Bug fixes:

- Allow setting default_language "default" value [@ericof] #36


## 1.0.0a8 (2023-06-25)


### New features:

- Bump @rjsf/core to version 5.8.2 [@ericof] #35


## 1.0.0a7 (2023-06-24)


### Bug fixes:

- Fix content export to json [@ericof] #33


## 1.0.0a6 (2023-06-23)


### New features:

- Improve support for testing distributions [@ericof] #24
- Allow export only for distributions still in development [@ericof] #28
- Create a report for Plone sites created from a distribution [@ericof] #30
- Clean up exported content to remove references to portal.absolute_url() [@ericof] #32


### Bug fixes:

- Content language should be allowed in portal configuration [@ericof] #23


### Internal:

- Update configuration files.
  [plone devs] 047ec50d, 55bda5c9, d7e9e748


## 1.0.0a5 (2023-05-18)


### Bug fixes:

- Import did not import any steps except content and portal. [pbauer] #22


## 1.0.0a4 (2023-05-18)


### New features:

- Increase test coverage.
  [ericof] #12
- Implement JSON import of content [pbauer] #13
- Use mxdev.
  [ericof] #18
- Implement default content for default and classic distributions as JSON.
  [ericof] #20


## 1.0.0a3 (2023-02-08)


### Bug fixes:

- Fix Basic Authentication for Chrome [@ericof] #10


## 1.0.0a2 (2023-02-08)


### New features:

- Change overview page favicon to use Plone logo [@ericof] #7
- Set content creation on `default` and `classic` distributions to be default. [@ericof] #9


### Bug fixes:

- Use [ajv8](https://rjsf-team.github.io/react-jsonschema-form/docs/usage/validation#ajvclass) with Ajv2019 class validator to fix `function nested too deeply` on Firefox [@ericof] #4
- Handle authentication when /acl_users does not support cookie extraction [@ericof] #6


## 1.0.0a1 (2023-02-08)


### New features:

- Initial implementation of plone.distribution [@ericof] #1


## 1.0.0 (Unreleased)



            

Raw data

            {
    "_id": null,
    "home_page": "https://plone.org",
    "name": "plone.distribution",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "Plone CMF Python Zope CMS Distribution",
    "author": "Plone Foundation",
    "author_email": "releasemanager@plone.org",
    "download_url": "https://files.pythonhosted.org/packages/6f/12/6f2c4d50271277f5f75103b2971ea38526fda21f4c4bbc724de18fd8151c/plone.distribution-1.0.0b4.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 Distributions\n</h1>\n\nPackage supporting the (easy) implementation of a Plone Distribution.\n\n## What is a Plone Distribution\n\nA Plone distribution is a pre-packaged version of Plone that includes specific features, themes, modules, and configurations. It is a convenient way to get a specific type of website up and running quickly, as the distribution includes everything needed to run that type of site.\n\nExamples of Plone distributions include:\n\n* [SENAITE](https://www.senaite.com)\n* [Quaive](https://quaivecloud.com/)\n* [Portal Modelo](https://www.interlegis.leg.br/produtos-servicos/portal-modelo/)\n* [Portal Padr\u00e3o](https://identidade-digital-de-governo-plone.readthedocs.io/en/latest/)\n\n### Similar Concept in Other CMS\n\n* Drupal: Drupal has distributions for blogs, e-commerce sites, and intranet portals.\n\n* WordPress: WordPress has a similar concept in the form of \"WordPress Multisite,\" which allows users to run multiple websites from a single installation of WordPress.\n\n* Joomla: Joomla has a similar concept in the form of \"Joomla Templates,\" which are pre-designed templates for Joomla websites.\n\n* TYPO3: TYPO3 has a similar concept in the form of \"TYPO3 Distributions,\" which are pre-configured installations of TYPO3 for specific types of websites.\n\n## Creating a new Distribution\n\nFirst of all, a Plone Distribution is a Python Package that can be installed by `pip`.\n\n### `setup.py`\nThe package will follow some conventions, to make it \"discoverable\" by others.\n\nIn `setup.py`, always add the correct Trove Classifiers:\n\n```python\n        \"Framework :: Plone\",\n        \"Framework :: Plone :: 6.0\",\n        \"Framework :: Plone :: Distribution\",\n```\n\nand also require `plone.distribution` to be available:\n\n```python\n    install_requires=[\n        \"Plone\",\n        \"setuptools\",\n        \"plone.distribution\",\n    ],\n```\n\n### `configure.zcml`\n\nIn your main `configure.zcml`, make sure to have the `plone` xml namespace declared:\n\n```xml\n<configure\n    xmlns=\"http://namespaces.zope.org/zope\"\n    xmlns:plone=\"http://namespaces.plone.org/plone\"\n    >\n```\n\nAnd also include `plone.distribution`:\n\n```xml\n  <include package=\"plone.distribution\" />\n```\n\nThen declare the distributions included in your package:\n\n```xml\n\n  <plone:distribution\n      name=\"blog\"\n      title=\"Personal Blog\"\n      description=\"A Plone site already configured to host a personal Blog.\"\n      directory=\"distributions/blog\"\n      />\n\n```\n\nThe registered distribution will configure a Personal Blog, with some default content.\n\n#### distribution handlers\n\nWhen registering a distribution, you can provide a `pre_handler`, a `handler` and a `post_handler` which must be\nfunctions with the following signatures.\n\n```python\ndef pre_handler(answers: dict) -> dict:\n    return answers\n\ndef handler(distribution: Distribution, site, answers: dict):\n    return site\n\ndef post_handler(distribution: Distribution, site, answers: dict):\n    return site\n```\n\nEach of those handlers will be called in this way:\n\n- `pre_handler`: it will process the answers to do modifications on them before creating the site\n- `handler`: it will be run after the bare Plone site will be created but instead of the default handler that installs the required GenericSetup profiles and creates the content.\n- `post_handler`: it will be run after the site is setup.\n\nSo if you have added some extra fields in the Plone site creation form and want to do some extra configuration in the\nPlone site, you can add your own handler and register as follows:\n\n```xml\n\n  <plone:distribution\n      name=\"blog\"\n      title=\"Personal Blog\"\n      description=\"A Plone site already configured to host a personal Blog.\"\n      directory=\"distributions/blog\"\n      post_handler=\".handlers.blog.post_handler\"\n      />\n\n```\n\n### distribution folder\n\nA convention is to use the `distributions/<distribution_name>`folder in the root of your package to organize your distribution configuration.\n\nIn that folder, you will need to provide:\n\n### `image.png`\n\nA 1080x768 image of your distribution. It could be the default page of a new site, your logo, or any other way of representing this distribution.\n\n### `profiles.json`\n\nA `JSON` file with the GenericSetup profiles that are used by your distribution during installation.\n\nThis file needs to contain two keys:\n\n* **base**: List of profiles installed in every new site using this distribution.\n\n* **content**: List of profiles installed when the user decides to create a site with example content.\n\nThe configuration for a new Volto site is:\n\n```json\n{\n  \"base\": [\n    \"plone.app.contenttypes:default\",\n    \"plone.app.caching:default\",\n    \"plonetheme.barceloneta:default\",\n    \"plone.volto:default\"\n  ],\n  \"content\": [\n    \"plone.volto:default-homepage\"\n  ]\n}\n```\n\n#### How to add an add-on\n\nIf you want to add a Plone backend add-on to your Plone distribution, then you must perform the following steps.\n\nAdd your add-on, such as `collective.person`, to your `setup.py`:\n\n```python\n    install_requires=[\n        \"setuptools\",\n        \"Plone\",\n        \"plone.distribution>=1.0.0b2\",\n        \"plone.api\",\n        \"collective.person\",\n    ],\n```\n\nAdd it to your `dependencies.zcml`:\n\n```xml\n  <!-- List all packages you depend here -->\n  <include package=\"plone.volto\" />\n  <include package=\"plone.restapi\" />\n  <include package=\"collective.person\" />\n  <include package=\"plone.distribution\" />\n\n</configure>\n```\n\nAdd it to your `profiles.json`:\n\n```json\n  \"base\": [\n    \"plone.app.contenttypes:default\",\n    \"plone.app.caching:default\",\n    \"plone.restapi:default\",\n    \"plone.volto:default\",\n    \"collective.person:default\",\n    \"plonetheme.barceloneta:default\"\n  ],\n```\n\n### `schema.json`\n\nIn case you require additional input from the user during site creation, you can customize the form using the `schema.json` file.\n\nThe file should contain two keys:\n\n* **schema**: A JSON Schema definition.\n* **uischema**: A [react-jsonschema-form](https://rjsf-team.github.io/react-jsonschema-form/docs/) configuration to modify how the form is displayed.\n\nThe **schema** should have at least the following keys:\n\n* site_id\n* title\n* description\n* default_language\n* portal_timezone\n* setup_content\n\nThe `schema.json` used for the default site creation is:\n\n```json\n{\n  \"schema\": {\n    \"title\": \"Create a Plone site\",\n    \"description\": \"Adds a new Plone content management system site to the underlying application server.\",\n    \"type\": \"object\",\n    \"required\": [\n      \"site_id\",\n      \"title\"\n    ],\n    \"properties\": {\n      \"site_id\": {\n        \"type\": \"string\",\n        \"title\": \"Path Identifier\",\n        \"default\": \"Plone\",\n        \"description\": \"The ID of the site. No special characters or spaces are allowed. This ends up as part of the URL unless hidden by an upstream web server.\"\n      },\n      \"title\": {\n        \"type\": \"string\",\n        \"title\": \"Title\",\n        \"default\": \"Site\",\n        \"description\": \"A short title for the site. This will be shown as part of the title of the browser window on each page.\"\n      },\n      \"description\": {\n        \"type\": \"string\",\n        \"title\": \"Site Description\",\n        \"default\": \"A Plone Site\"\n      },\n      \"default_language\": {\"$ref\": \"#/definitions/languages\"},\n      \"portal_timezone\": {\"$ref\": \"#/definitions/timezones\"},\n      \"setup_content\": {\n        \"type\": \"boolean\",\n        \"title\": \"Create Content\",\n        \"description\": \"Should example content be added during site creation?\",\n        \"default\": false\n      }\n    }\n  },\n  \"uischema\": {\n  }\n}\n\n```\n\n**Important**\nYou probably noticed the entries for\ndefault_language:\n\n```\n{\"$ref\": \"#/definitions/languages\"}\n```\nand portal_timezone:\n\n```\n{\"$ref\": \"#/definitions/timezones\"}\n```\n\nBoth definitions are added in runtime by `plone.distribution` to provide a list of languages and timezones available on the installation.\n\n### `content` folder\n\nFolder containing JSON data exported using the `@@dist_export_all` browser view of this package.\n\n## Advanced Usage\n\n### Hiding Distributions\n\nBy default, `plone.distribution` ships with two ready-to-use distributions:\n\n* **default**: Plone Site (Volto frontend)\n* **classic**: Plone Site (Classic UI)\n\nIf you want to limit your users option to select a distribution, it is possible to set the environment variable `ALLOWED_DISTRIBUTIONS` with fewer options:\n\n```shell\nALLOWED_DISTRIBUTIONS=default\n```\n\n\n## This project is supported by\n\n<p align=\"left\">\n    <a href=\"https://plone.org/foundation/\">\n      <img alt=\"Plone Logo\" width=\"200px\" src=\"https://raw.githubusercontent.com/plone/.github/main/plone-foundation.png\">\n    </a>\n</p>\n\n## License\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.0.0b4 (2024-04-03)\n\n\n### Bug fixes:\n\n- Fix exporting files.\n  [pbauer] #58\n\n## 1.0.0b3 (2024-03-08)\n\n\n### Bug fixes:\n\n- Fix importing blocks on the site-root.\n  [pbauer] #56\n\n\n### Internal:\n\n- Update configuration files.\n  [plone devs] 6e36bcc4\n\n## 1.0.0b2 (2023-10-11)\n\n\n### New features:\n\n- Remove old blobs before exporting content [@ericof] #34\n- Support to new export/import format with one content item per json file [@ericof] #47\n\n\n## 1.0.0b1 (2023-07-10)\n\n\n### New features:\n\n- Validate answers payload against jsonschema [@ericof] #38\n- Allow distribution to pre process answers before site creation [@ericof] #39\n- Override @system from plone.restapi to display distribution information [@ericof] #45\n\n\n## 1.0.0a9 (2023-06-27)\n\n\n### Bug fixes:\n\n- Allow setting default_language \"default\" value [@ericof] #36\n\n\n## 1.0.0a8 (2023-06-25)\n\n\n### New features:\n\n- Bump @rjsf/core to version 5.8.2 [@ericof] #35\n\n\n## 1.0.0a7 (2023-06-24)\n\n\n### Bug fixes:\n\n- Fix content export to json [@ericof] #33\n\n\n## 1.0.0a6 (2023-06-23)\n\n\n### New features:\n\n- Improve support for testing distributions [@ericof] #24\n- Allow export only for distributions still in development [@ericof] #28\n- Create a report for Plone sites created from a distribution [@ericof] #30\n- Clean up exported content to remove references to portal.absolute_url() [@ericof] #32\n\n\n### Bug fixes:\n\n- Content language should be allowed in portal configuration [@ericof] #23\n\n\n### Internal:\n\n- Update configuration files.\n  [plone devs] 047ec50d, 55bda5c9, d7e9e748\n\n\n## 1.0.0a5 (2023-05-18)\n\n\n### Bug fixes:\n\n- Import did not import any steps except content and portal. [pbauer] #22\n\n\n## 1.0.0a4 (2023-05-18)\n\n\n### New features:\n\n- Increase test coverage.\n  [ericof] #12\n- Implement JSON import of content [pbauer] #13\n- Use mxdev.\n  [ericof] #18\n- Implement default content for default and classic distributions as JSON.\n  [ericof] #20\n\n\n## 1.0.0a3 (2023-02-08)\n\n\n### Bug fixes:\n\n- Fix Basic Authentication for Chrome [@ericof] #10\n\n\n## 1.0.0a2 (2023-02-08)\n\n\n### New features:\n\n- Change overview page favicon to use Plone logo [@ericof] #7\n- Set content creation on `default` and `classic` distributions to be default. [@ericof] #9\n\n\n### Bug fixes:\n\n- Use [ajv8](https://rjsf-team.github.io/react-jsonschema-form/docs/usage/validation#ajvclass) with Ajv2019 class validator to fix `function nested too deeply` on Firefox [@ericof] #4\n- Handle authentication when /acl_users does not support cookie extraction [@ericof] #6\n\n\n## 1.0.0a1 (2023-02-08)\n\n\n### New features:\n\n- Initial implementation of plone.distribution [@ericof] #1\n\n\n## 1.0.0 (Unreleased)\n\n\n",
    "bugtrack_url": null,
    "license": "GPL version 2",
    "summary": "Plone distribution support",
    "version": "1.0.0b4",
    "project_urls": {
        "Documentation": "https://6.docs.plone.org",
        "Homepage": "https://plone.org",
        "Issues": "https://github.com/plone/plone.distribution/issues",
        "Source": "https://github.com/plone/plone.distribution"
    },
    "split_keywords": [
        "plone",
        "cmf",
        "python",
        "zope",
        "cms",
        "distribution"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f47d3d611c7f5a9580ef0a8140b18069deffef89963a8035d5ecc71a402fe174",
                "md5": "cdcf244ae5e686e0b38ea0dfea64dbf6",
                "sha256": "96fdade145627c8485cd81d57bc77413dcd13377cf92e2860be1ab8fb9ae4dc1"
            },
            "downloads": -1,
            "filename": "plone.distribution-1.0.0b4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "cdcf244ae5e686e0b38ea0dfea64dbf6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 655824,
            "upload_time": "2024-04-03T10:04:30",
            "upload_time_iso_8601": "2024-04-03T10:04:30.981648Z",
            "url": "https://files.pythonhosted.org/packages/f4/7d/3d611c7f5a9580ef0a8140b18069deffef89963a8035d5ecc71a402fe174/plone.distribution-1.0.0b4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6f126f2c4d50271277f5f75103b2971ea38526fda21f4c4bbc724de18fd8151c",
                "md5": "0b533e7ff3fba08aab40a84f96585bb5",
                "sha256": "8435d3e2dedf5086a1807957de37e701a31ac73c7545bf939a783bdcbe34b3b1"
            },
            "downloads": -1,
            "filename": "plone.distribution-1.0.0b4.tar.gz",
            "has_sig": false,
            "md5_digest": "0b533e7ff3fba08aab40a84f96585bb5",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 673412,
            "upload_time": "2024-04-03T10:04:34",
            "upload_time_iso_8601": "2024-04-03T10:04:34.164131Z",
            "url": "https://files.pythonhosted.org/packages/6f/12/6f2c4d50271277f5f75103b2971ea38526fda21f4c4bbc724de18fd8151c/plone.distribution-1.0.0b4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-03 10:04:34",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "plone",
    "github_project": "plone.distribution",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "tox": true,
    "lcname": "plone.distribution"
}
        
Elapsed time: 0.22816s