Use with plone.distribution¶
Adding to your distribution¶
plone.pgcatalog works with plone.distribution for automated site creation.
In your distribution’s profiles.json, include the plone.pgcatalog profile in the base list:
{
"base": [
"plone.app.contenttypes:default",
"plonetheme.barceloneta:default",
"plone.pgcatalog:default"
],
"content": []
}
Example Distribution¶
The example/pgcatalog-example-distribution/ directory in the plone.pgcatalog repository provides a complete working example:
pgcatalog-example-distribution/
pyproject.toml
src/
pgcatalog_example/
__init__.py
configure.zcml
dependencies.zcml
distributions.zcml
distributions/
pgcatalog_demo/
profiles.json
schema.json
The schema.json defines the site creation form fields (site_id, title, language, timezone).
The profiles.json lists the GenericSetup profiles to apply.
Site Creation via REST API¶
curl -X POST http://localhost:8081/@@plone.distribution/create \
-H "Content-Type: application/json" \
-d '{
"distribution": "pgcatalog_demo",
"site_id": "Plone",
"title": "My Site",
"default_language": "en",
"portal_timezone": "UTC"
}'
GenericSetup Integration¶
The setuphandlers.py install step replaces portal_catalog with PlonePGCatalogTool (preserving existing addon indexes via snapshot/restore) and ensures:
Essential Plone catalog indexes are present (UID, portal_type, Title, etc.)
Orphaned ZCTextIndex lexicons are removed
DDL schema is applied to PostgreSQL (catalog columns, expression indexes, functions)
All schema DDL is applied via the CatalogStateProcessor registration at startup, using the storage’s own connection to avoid REPEATABLE READ lock conflicts.