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.