diff --git a/endpoint_route_handler/README.rst b/endpoint_route_handler/README.rst index 2f35e9ff..30e5c05f 100644 --- a/endpoint_route_handler/README.rst +++ b/endpoint_route_handler/README.rst @@ -114,31 +114,31 @@ You can see a real life example on shopfloor.app model. Known issues / Roadmap ====================== -- add api docs helpers +- add api docs helpers -- allow multiple HTTP methods on the same endpoint +- allow multiple HTTP methods on the same endpoint -- multiple values for route and methods +- multiple values for route and methods - keep the same in the ui for now, later own we can imagine a - multi-value selection or just add text field w/ proper validation - and cleanup + keep the same in the ui for now, later own we can imagine a + multi-value selection or just add text field w/ proper validation + and cleanup - remove the route field in the table of endpoint_route + remove the route field in the table of endpoint_route - support a comma separated list of routes maybe support comma - separated list of methods use only routing.routes for generating - the rule sort and freeze its values to update the endpoint hash + support a comma separated list of routes maybe support comma + separated list of methods use only routing.routes for generating + the rule sort and freeze its values to update the endpoint hash - catch dup route exception on the sync to detect duplicated routes - and use the endpoint_hash to retrieve the real record (note: we - could store more info in the routing information which will stay in - the map) + catch dup route exception on the sync to detect duplicated routes + and use the endpoint_hash to retrieve the real record (note: we + could store more info in the routing information which will stay + in the map) - for customizing the rule behavior the endpoint the hook is to - override the registry lookup + for customizing the rule behavior the endpoint the hook is to + override the registry lookup - make EndpointRule class overridable on the registry + make EndpointRule class overridable on the registry NOTE in v16 we won't care anymore about odoo controller so the lookup of the controller can be simplified to a basic py obj that holds the @@ -165,8 +165,8 @@ Authors Contributors ------------ -- Simone Orsi -- Nguyen Minh Chien +- Simone Orsi +- Nguyen Minh Chien Maintainers ----------- diff --git a/endpoint_route_handler/static/description/index.html b/endpoint_route_handler/static/description/index.html index 42c23095..267915bf 100644 --- a/endpoint_route_handler/static/description/index.html +++ b/endpoint_route_handler/static/description/index.html @@ -476,8 +476,8 @@

Known issues / Roadmap

the rule sort and freeze its values to update the endpoint hash

catch dup route exception on the sync to detect duplicated routes and use the endpoint_hash to retrieve the real record (note: we -could store more info in the routing information which will stay in -the map)

+could store more info in the routing information which will stay +in the map)

for customizing the rule behavior the endpoint the hook is to override the registry lookup

make EndpointRule class overridable on the registry

diff --git a/spp_alerts/README.rst b/spp_alerts/README.rst index 54f87c0d..d865491b 100644 --- a/spp_alerts/README.rst +++ b/spp_alerts/README.rst @@ -31,27 +31,27 @@ domain-specific conditions. Key Capabilities ~~~~~~~~~~~~~~~~ -- Track alert lifecycle through state machine: active → acknowledged → - resolved -- Record resolution details including user, timestamp, and notes -- Classify alerts by type using ``spp.vocabulary`` codes (threshold, - expiry, deadline, manual, system) -- Prioritize alerts as low, medium, high, or critical -- Send mail notifications via ``mail.thread`` integration -- Auto-generate alert references in ALR-YYYY-NNNNN format +- Track alert lifecycle through state machine: active → acknowledged → + resolved +- Record resolution details including user, timestamp, and notes +- Classify alerts by type using ``spp.vocabulary`` codes (threshold, + expiry, deadline, manual, system) +- Prioritize alerts as low, medium, high, or critical +- Send mail notifications via ``mail.thread`` integration +- Auto-generate alert references in ALR-YYYY-NNNNN format Key Models ~~~~~~~~~~ -+--------------------+-------------------------------------------------+ -| Model | Description | -+====================+=================================================+ -| ``spp.alert`` | Alert instance with state tracking and | -| | resolution workflow | -+--------------------+-------------------------------------------------+ -| ``spp.alert.rule`` | Rule configuration for monitoring criteria and | -| | thresholds | -+--------------------+-------------------------------------------------+ ++--------------------+------------------------------------------------+ +| Model | Description | ++====================+================================================+ +| ``spp.alert`` | Alert instance with state tracking and | +| | resolution workflow | ++--------------------+------------------------------------------------+ +| ``spp.alert.rule`` | Rule configuration for monitoring criteria and | +| | thresholds | ++--------------------+------------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -67,9 +67,9 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Settings > Technical > Alerts > Alerts -- **Configuration**: Settings > Technical > Alerts > Alert Rules -- **Form Tabs**: Details, Resolution (alerts); Thresholds (rules) +- **Menu**: Settings > Technical > Alerts > Alerts +- **Configuration**: Settings > Technical > Alerts > Alert Rules +- **Form Tabs**: Details, Resolution (alerts); Thresholds (rules) Security ~~~~~~~~ @@ -85,14 +85,14 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.alert`` to add domain-specific fields (e.g., stock - levels, document references) -- Inherit ``spp.alert.rule`` to add custom threshold or evaluation - criteria -- Override ``action_acknowledge()`` or ``action_resolve()`` to add - custom workflow steps -- Consumer modules implement alert checking via cron jobs or event - handlers that evaluate rules and call ``create()`` on ``spp.alert`` +- Inherit ``spp.alert`` to add domain-specific fields (e.g., stock + levels, document references) +- Inherit ``spp.alert.rule`` to add custom threshold or evaluation + criteria +- Override ``action_acknowledge()`` or ``action_resolve()`` to add + custom workflow steps +- Consumer modules implement alert checking via cron jobs or event + handlers that evaluate rules and call ``create()`` on ``spp.alert`` Dependencies ~~~~~~~~~~~~ diff --git a/spp_api_v2/README.rst b/spp_api_v2/README.rst index a73935a8..e15ddb7f 100644 --- a/spp_api_v2/README.rst +++ b/spp_api_v2/README.rst @@ -30,38 +30,38 @@ all identifiers use namespace URIs for global interoperability. Key Capabilities ---------------- -- **OAuth 2.0 Authentication**: Client credentials flow with - scrypt-hashed secrets, scoped access -- **Consent-Based Access Control**: All reads require active consent, - filtered by organization type -- **External Identifiers Only**: Namespace URIs for lookups, vocabulary - IDs for coded values -- **Source Tracking**: Records data provenance per ADR-008 -- **Extension Registry**: Domain modules register custom fields via - ``spp.api.extension`` -- **Batch Operations**: Create/update multiple registrants per request +- **OAuth 2.0 Authentication**: Client credentials flow with + scrypt-hashed secrets, scoped access +- **Consent-Based Access Control**: All reads require active consent, + filtered by organization type +- **External Identifiers Only**: Namespace URIs for lookups, vocabulary + IDs for coded values +- **Source Tracking**: Records data provenance per ADR-008 +- **Extension Registry**: Domain modules register custom fields via + ``spp.api.extension`` +- **Batch Operations**: Create/update multiple registrants per request Key Models ---------- -+---------------------------+------------------------------------------+ -| Model | Description | -+===========================+==========================================+ -| ``spp.api.client`` | OAuth 2.0 credentials, organization | -| | verification | -+---------------------------+------------------------------------------+ -| ``spp.api.client.scope`` | Resource/action permissions | -+---------------------------+------------------------------------------+ -| ``spp.api.path`` | Endpoint configuration and filters | -+---------------------------+------------------------------------------+ -| ``spp.api.path.filter`` | Field-level filter configurations | -+---------------------------+------------------------------------------+ -| ``spp.api.filter.preset`` | Saved filter combinations | -+---------------------------+------------------------------------------+ -| ``spp.api.extension`` | Domain field registry | -+---------------------------+------------------------------------------+ -| ``spp.consent.scope`` | Resource types per consent | -+---------------------------+------------------------------------------+ ++---------------------------+-----------------------------------------+ +| Model | Description | ++===========================+=========================================+ +| ``spp.api.client`` | OAuth 2.0 credentials, organization | +| | verification | ++---------------------------+-----------------------------------------+ +| ``spp.api.client.scope`` | Resource/action permissions | ++---------------------------+-----------------------------------------+ +| ``spp.api.path`` | Endpoint configuration and filters | ++---------------------------+-----------------------------------------+ +| ``spp.api.path.filter`` | Field-level filter configurations | ++---------------------------+-----------------------------------------+ +| ``spp.api.filter.preset`` | Saved filter combinations | ++---------------------------+-----------------------------------------+ +| ``spp.api.extension`` | Domain field registry | ++---------------------------+-----------------------------------------+ +| ``spp.consent.scope`` | Resource types per consent | ++---------------------------+-----------------------------------------+ UI Location ----------- @@ -69,29 +69,29 @@ UI Location Navigate to **Registry > Configuration > API V2** for all API configuration. Available submenus: -- **API Clients** - Manage OAuth credentials and organization - verification -- **API Extensions** - View registered custom field extensions -- **API Paths** - Configure available endpoints and static filters -- **API Filters** - Define queryable field filters per path -- **Filter Presets** - Create named filter combinations +- **API Clients** - Manage OAuth credentials and organization + verification +- **API Extensions** - View registered custom field extensions +- **API Paths** - Configure available endpoints and static filters +- **API Filters** - Define queryable field filters per path +- **Filter Presets** - Create named filter combinations **API Client Form Tabs:** -- **Consent & Security** - Consent requirements, legal basis, - organization type verification -- **Scopes** - Resource/action permissions and program restrictions -- **Description** - Client documentation +- **Consent & Security** - Consent requirements, legal basis, + organization type verification +- **Scopes** - Resource/action permissions and program restrictions +- **Description** - Client documentation **API Extension Form Tabs:** -- **Fields** - Registered custom fields from domain modules -- **JSON Schema** - Auto-generated schema for extension fields +- **Fields** - Registered custom fields from domain modules +- **JSON Schema** - Auto-generated schema for extension fields **API Path Form Tabs:** -- **Filters** - Field-level filter configurations (inline editable) -- **Presets** - Saved filter combinations (inline editable) +- **Filters** - Field-level filter configurations (inline editable) +- **Presets** - Saved filter combinations (inline editable) Configuration ------------- @@ -110,27 +110,27 @@ API endpoints available at ``/api/v2/`` (token endpoint: Security -------- -+--------------------------+-------------------------------------------+ -| Group | Access | -+==========================+===========================================+ -| ``group_api_v2_viewer`` | Read-only: all API configuration and | -| | consent | -+--------------------------+-------------------------------------------+ -| ``group_api_v2_officer`` | Read/Write: all models (no | -| | create/delete), full CRUD on consent | -| | scopes | -+--------------------------+-------------------------------------------+ -| ``group_api_v2_manager`` | Full CRUD: clients, scopes, paths, | -| | filters, presets, extensions; | -| | Read/Write/Create on consent (no delete) | -+--------------------------+-------------------------------------------+ ++--------------------------+------------------------------------------+ +| Group | Access | ++==========================+==========================================+ +| ``group_api_v2_viewer`` | Read-only: all API configuration and | +| | consent | ++--------------------------+------------------------------------------+ +| ``group_api_v2_officer`` | Read/Write: all models (no | +| | create/delete), full CRUD on consent | +| | scopes | ++--------------------------+------------------------------------------+ +| ``group_api_v2_manager`` | Full CRUD: clients, scopes, paths, | +| | filters, presets, extensions; | +| | Read/Write/Create on consent (no delete) | ++--------------------------+------------------------------------------+ Extension Points ---------------- -- Inherit ``spp.api.extension`` to register custom fields -- Override ``_get_fastapi_routers()`` in ``fastapi.endpoint`` for custom - endpoints +- Inherit ``spp.api.extension`` to register custom fields +- Override ``_get_fastapi_routers()`` in ``fastapi.endpoint`` for + custom endpoints Dependencies ------------ diff --git a/spp_api_v2/static/description/index.html b/spp_api_v2/static/description/index.html index 7c943e8b..458d18f5 100644 --- a/spp_api_v2/static/description/index.html +++ b/spp_api_v2/static/description/index.html @@ -393,8 +393,8 @@

Key Capabilities

Key Models

--++ @@ -504,8 +504,8 @@

Security

Extension Points

  • Inherit spp.api.extension to register custom fields
  • -
  • Override _get_fastapi_routers() in fastapi.endpoint for custom -endpoints
  • +
  • Override _get_fastapi_routers() in fastapi.endpoint for +custom endpoints
diff --git a/spp_api_v2_change_request/README.rst b/spp_api_v2_change_request/README.rst index 5858f9ba..3820b720 100644 --- a/spp_api_v2_change_request/README.rst +++ b/spp_api_v2_change_request/README.rst @@ -31,35 +31,36 @@ numbers (CR/2024/00001) instead of database IDs for all operations. Key Capabilities ~~~~~~~~~~~~~~~~ -- Create change requests in draft status with registrant and detail data -- Read individual change requests by reference or search with filters - (registrant, type, status, dates) -- Update detail data on draft change requests with optimistic locking - via If-Match headers -- Submit draft requests for approval workflow -- Approve, reject, or request revision on pending requests (requires - approval scope) -- Apply approved change requests to registrant records -- Reset rejected/revision requests to draft for resubmission +- Create change requests in draft status with registrant and detail + data +- Read individual change requests by reference or search with filters + (registrant, type, status, dates) +- Update detail data on draft change requests with optimistic locking + via If-Match headers +- Submit draft requests for approval workflow +- Approve, reject, or request revision on pending requests (requires + approval scope) +- Apply approved change requests to registrant records +- Reset rejected/revision requests to draft for resubmission Key Models ~~~~~~~~~~ This module extends existing models and does not define new ones. -+-----------------------------+----------------------------------------+ -| Model | Usage | -+=============================+========================================+ -| ``fastapi.endpoint`` | Extended to register ChangeRequest | -| | router with API V2 | -+-----------------------------+----------------------------------------+ -| ``spp.change.request`` | CRUD operations via REST API | -+-----------------------------+----------------------------------------+ -| ``spp.change.request.type`` | Looked up by code in create requests | -+-----------------------------+----------------------------------------+ -| ``spp.registry.id`` | Used to resolve registrant identifiers | -| | (system|value) | -+-----------------------------+----------------------------------------+ ++-----------------------------+---------------------------------------+ +| Model | Usage | ++=============================+=======================================+ +| ``fastapi.endpoint`` | Extended to register ChangeRequest | +| | router with API V2 | ++-----------------------------+---------------------------------------+ +| ``spp.change.request`` | CRUD operations via REST API | ++-----------------------------+---------------------------------------+ +| ``spp.change.request.type`` | Looked up by code in create requests | ++-----------------------------+---------------------------------------+ +| ``spp.registry.id`` | Used to resolve registrant | +| | identifiers (system|value) | ++-----------------------------+---------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -73,26 +74,26 @@ To configure OAuth 2.0 clients with appropriate scopes: by ``spp_api_v2``) 2. Configure OAuth 2.0 clients with appropriate scopes: - - ``change_request:read`` - Read and search change requests - - ``change_request:create`` - Create new change requests - - ``change_request:update`` - Update, submit, and reset requests - - ``change_request:approve`` - Approve, reject, or request revision - - ``change_request:apply`` - Apply approved changes to registrants + - ``change_request:read`` - Read and search change requests + - ``change_request:create`` - Create new change requests + - ``change_request:update`` - Update, submit, and reset requests + - ``change_request:approve`` - Approve, reject, or request revision + - ``change_request:apply`` - Apply approved changes to registrants API Endpoints ~~~~~~~~~~~~~ -- ``POST /ChangeRequest`` - Create new change request -- ``GET /ChangeRequest/{reference}`` - Read by reference -- ``GET /ChangeRequest`` - Search with filters -- ``PUT /ChangeRequest/{reference}`` - Update detail data -- ``POST /ChangeRequest/{reference}/$submit`` - Submit for approval -- ``POST /ChangeRequest/{reference}/$approve`` - Approve request -- ``POST /ChangeRequest/{reference}/$reject`` - Reject request -- ``POST /ChangeRequest/{reference}/$request-revision`` - Request - revision -- ``POST /ChangeRequest/{reference}/$apply`` - Apply to registrant -- ``POST /ChangeRequest/{reference}/$reset`` - Reset to draft +- ``POST /ChangeRequest`` - Create new change request +- ``GET /ChangeRequest/{reference}`` - Read by reference +- ``GET /ChangeRequest`` - Search with filters +- ``PUT /ChangeRequest/{reference}`` - Update detail data +- ``POST /ChangeRequest/{reference}/$submit`` - Submit for approval +- ``POST /ChangeRequest/{reference}/$approve`` - Approve request +- ``POST /ChangeRequest/{reference}/$reject`` - Reject request +- ``POST /ChangeRequest/{reference}/$request-revision`` - Request + revision +- ``POST /ChangeRequest/{reference}/$apply`` - Apply to registrant +- ``POST /ChangeRequest/{reference}/$reset`` - Reset to draft Security ~~~~~~~~ @@ -105,12 +106,12 @@ enforces scope checks on each endpoint. Users must authenticate via the Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``ChangeRequestService`` to customize serialization, - validation, or business logic -- Override router endpoint functions to add custom validation or side - effects -- Extend the API schema by inheriting the Pydantic models in - ``schemas/change_request.py`` +- Inherit ``ChangeRequestService`` to customize serialization, + validation, or business logic +- Override router endpoint functions to add custom validation or side + effects +- Extend the API schema by inheriting the Pydantic models in + ``schemas/change_request.py`` UI Location ~~~~~~~~~~~ diff --git a/spp_api_v2_change_request/static/description/index.html b/spp_api_v2_change_request/static/description/index.html index 4c0c788f..25e83cf3 100644 --- a/spp_api_v2_change_request/static/description/index.html +++ b/spp_api_v2_change_request/static/description/index.html @@ -378,7 +378,8 @@

OpenSPP API V2 - Change Request

Key Capabilities

    -
  • Create change requests in draft status with registrant and detail data
  • +
  • Create change requests in draft status with registrant and detail +data
  • Read individual change requests by reference or search with filters (registrant, type, status, dates)
  • Update detail data on draft change requests with optimistic locking @@ -395,8 +396,8 @@

    Key Models

    This module extends existing models and does not define new ones.

Model
--++ @@ -415,8 +416,8 @@

Key Models

- +
Model Looked up by code in create requests
spp.registry.idUsed to resolve registrant identifiers -(system|value)Used to resolve registrant +identifiers (system|value)
diff --git a/spp_api_v2_cycles/README.rst b/spp_api_v2_cycles/README.rst index 459c411f..5128411d 100644 --- a/spp_api_v2_cycles/README.rst +++ b/spp_api_v2_cycles/README.rst @@ -30,18 +30,18 @@ and requires OAuth 2.0 authentication with resource-based scopes. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Read Cycle**: Retrieve cycle details by name via - ``GET /Cycle/{identifier}`` -- **Search Cycles**: Filter cycles by program, state, start/end dates, - or last updated timestamp -- **Pagination**: Support for offset-based pagination with configurable - page size (max 100) -- **Statistics**: Expose beneficiary count, entitlement count, payment - count, and total amounts -- **Cycle Navigation**: Reference to previous and next cycles in - sequence -- **OAuth Scopes**: Extend API client scopes with ``cycle`` resource - type for read operations +- **Read Cycle**: Retrieve cycle details by name via + ``GET /Cycle/{identifier}`` +- **Search Cycles**: Filter cycles by program, state, start/end dates, + or last updated timestamp +- **Pagination**: Support for offset-based pagination with configurable + page size (max 100) +- **Statistics**: Expose beneficiary count, entitlement count, payment + count, and total amounts +- **Cycle Navigation**: Reference to previous and next cycles in + sequence +- **OAuth Scopes**: Extend API client scopes with ``cycle`` resource + type for read operations Key Models ~~~~~~~~~~ @@ -70,8 +70,8 @@ UI Location No standalone menu. API endpoints are available at: -- ``/api/v2/spp/Cycle`` - Search cycles -- ``/api/v2/spp/Cycle/{identifier}`` - Read cycle by name +- ``/api/v2/spp/Cycle`` - Search cycles +- ``/api/v2/spp/Cycle/{identifier}`` - Read cycle by name Security ~~~~~~~~ @@ -87,12 +87,12 @@ existing models. Extension Points ~~~~~~~~~~~~~~~~ -- Override ``CycleService.to_api_schema()`` to add custom fields to the - API response -- Inherit ``Cycle`` schema to add domain-specific attributes in the - ``extension`` field -- Add search filters by extending ``CycleService.search()`` to support - additional query parameters +- Override ``CycleService.to_api_schema()`` to add custom fields to the + API response +- Inherit ``Cycle`` schema to add domain-specific attributes in the + ``extension`` field +- Add search filters by extending ``CycleService.search()`` to support + additional query parameters Dependencies ~~~~~~~~~~~~ diff --git a/spp_api_v2_data/README.rst b/spp_api_v2_data/README.rst index 8d77504a..84d1db0c 100644 --- a/spp_api_v2_data/README.rst +++ b/spp_api_v2_data/README.rst @@ -31,14 +31,14 @@ identifiers for subject resolution and provider-based access control. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Push values**: Bulk upsert variable values from external systems - with validation and error reporting -- **Pull values**: Retrieve cached variable values by subject external - IDs and period keys -- **Invalidate cache**: Mark cached values as stale to force refresh on - next computation -- **List variables**: Query available variables with provider and source - type filtering +- **Push values**: Bulk upsert variable values from external systems + with validation and error reporting +- **Pull values**: Retrieve cached variable values by subject external + IDs and period keys +- **Invalidate cache**: Mark cached values as stale to force refresh on + next computation +- **List variables**: Query available variables with provider and + source type filtering Key Models ~~~~~~~~~~ @@ -72,13 +72,13 @@ No standalone menus (API-only module). **API Endpoints**: -- ``POST /api/v2/Data/push`` - Push variable values from external - systems -- ``GET /api/v2/Data/pull`` - Pull cached variable values for subjects -- ``POST /api/v2/Data/invalidate`` - Invalidate cached values to force - refresh -- ``GET /api/v2/Data/variables`` - List available variables with - filtering +- ``POST /api/v2/Data/push`` - Push variable values from external + systems +- ``GET /api/v2/Data/pull`` - Pull cached variable values for subjects +- ``POST /api/v2/Data/invalidate`` - Invalidate cached values to force + refresh +- ``GET /api/v2/Data/variables`` - List available variables with + filtering Security ~~~~~~~~ @@ -99,12 +99,12 @@ operations. Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_resolve_subject_id()`` in ``routers/data.py`` to customize - external identifier resolution -- Extend Pydantic schemas in ``schemas/data.py`` to add metadata fields - for domain-specific use cases -- Inherit ``DataValueInput`` or ``DataValueOutput`` for additional - validation logic +- Override ``_resolve_subject_id()`` in ``routers/data.py`` to + customize external identifier resolution +- Extend Pydantic schemas in ``schemas/data.py`` to add metadata fields + for domain-specific use cases +- Inherit ``DataValueInput`` or ``DataValueOutput`` for additional + validation logic Dependencies ~~~~~~~~~~~~ diff --git a/spp_api_v2_data/static/description/index.html b/spp_api_v2_data/static/description/index.html index 0e2eafac..5b5e0a1a 100644 --- a/spp_api_v2_data/static/description/index.html +++ b/spp_api_v2_data/static/description/index.html @@ -384,8 +384,8 @@

Key Capabilities

IDs and period keys
  • Invalidate cache: Mark cached values as stale to force refresh on next computation
  • -
  • List variables: Query available variables with provider and source -type filtering
  • +
  • List variables: Query available variables with provider and +source type filtering
  • @@ -467,8 +467,8 @@

    Security

    Extension Points

      -
    • Override _resolve_subject_id() in routers/data.py to customize -external identifier resolution
    • +
    • Override _resolve_subject_id() in routers/data.py to +customize external identifier resolution
    • Extend Pydantic schemas in schemas/data.py to add metadata fields for domain-specific use cases
    • Inherit DataValueInput or DataValueOutput for additional diff --git a/spp_api_v2_entitlements/README.rst b/spp_api_v2_entitlements/README.rst index fbde6155..9692ccd9 100644 --- a/spp_api_v2_entitlements/README.rst +++ b/spp_api_v2_entitlements/README.rst @@ -30,29 +30,29 @@ by beneficiary, program, cycle, state, and validity dates. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Read Entitlement**: Retrieve entitlement by code (UUID-based - identifier) via ``GET /Entitlement/{identifier}`` -- **Search Entitlements**: Query with filters (beneficiary, program, - cycle, state, type, dates) via ``GET /Entitlement`` -- **Cash and In-Kind**: Supports both ``spp.entitlement`` (cash) and - ``spp.entitlement.inkind`` models -- **Pagination**: Returns paginated bundles with next/previous links - (max 100 per page) -- **Scope-Based Access**: Requires ``entitlement:read`` OAuth scope for - all operations +- **Read Entitlement**: Retrieve entitlement by code (UUID-based + identifier) via ``GET /Entitlement/{identifier}`` +- **Search Entitlements**: Query with filters (beneficiary, program, + cycle, state, type, dates) via ``GET /Entitlement`` +- **Cash and In-Kind**: Supports both ``spp.entitlement`` (cash) and + ``spp.entitlement.inkind`` models +- **Pagination**: Returns paginated bundles with next/previous links + (max 100 per page) +- **Scope-Based Access**: Requires ``entitlement:read`` OAuth scope for + all operations Key Models ~~~~~~~~~~ -+--------------------------+-------------------------------------------+ -| Model | Description | -+==========================+===========================================+ -| ``spp.api.client.scope`` | Extended to add ``entitlement`` as | -| | resource type | -+--------------------------+-------------------------------------------+ -| ``fastapi.endpoint`` | Extended to register entitlement router | -| | for ``api_v2`` app | -+--------------------------+-------------------------------------------+ ++--------------------------+------------------------------------------+ +| Model | Description | ++==========================+==========================================+ +| ``spp.api.client.scope`` | Extended to add ``entitlement`` as | +| | resource type | ++--------------------------+------------------------------------------+ +| ``fastapi.endpoint`` | Extended to register entitlement router | +| | for ``api_v2`` app | ++--------------------------+------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -70,9 +70,9 @@ UI Location No UI components. This is a backend API module accessed via HTTP: -- **Read**: ``GET /api/v2/spp/Entitlement/{code}`` -- **Search**: - ``GET /api/v2/spp/Entitlement?beneficiary={system|value}&program={name}...`` +- **Read**: ``GET /api/v2/spp/Entitlement/{code}`` +- **Search**: + ``GET /api/v2/spp/Entitlement?beneficiary={system|value}&program={name}...`` Security ~~~~~~~~ @@ -80,22 +80,22 @@ Security No model access rules defined in this module. Security is enforced via OAuth 2.0 client scopes: -- API clients must have ``entitlement:read`` scope (via - ``spp.api.client.scope`` records) -- Authorization is validated at the router level via - ``api_client.has_scope("entitlement", "read")`` -- Underlying entitlement model access is governed by ``spp_programs`` - module security +- API clients must have ``entitlement:read`` scope (via + ``spp.api.client.scope`` records) +- Authorization is validated at the router level via + ``api_client.has_scope("entitlement", "read")`` +- Underlying entitlement model access is governed by ``spp_programs`` + module security Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``EntitlementService`` and override ``to_api_schema()`` to add - custom fields to the API response -- Extend ``Entitlement`` Pydantic schema to expose additional - entitlement attributes -- Override ``_search_cash()`` or ``_search_inkind()`` to customize - search domain logic +- Inherit ``EntitlementService`` and override ``to_api_schema()`` to + add custom fields to the API response +- Extend ``Entitlement`` Pydantic schema to expose additional + entitlement attributes +- Override ``_search_cash()`` or ``_search_inkind()`` to customize + search domain logic Dependencies ~~~~~~~~~~~~ diff --git a/spp_api_v2_entitlements/static/description/index.html b/spp_api_v2_entitlements/static/description/index.html index 6bc7874d..56051c37 100644 --- a/spp_api_v2_entitlements/static/description/index.html +++ b/spp_api_v2_entitlements/static/description/index.html @@ -449,8 +449,8 @@

      Security

      Extension Points

        -
      • Inherit EntitlementService and override to_api_schema() to add -custom fields to the API response
      • +
      • Inherit EntitlementService and override to_api_schema() to +add custom fields to the API response
      • Extend Entitlement Pydantic schema to expose additional entitlement attributes
      • Override _search_cash() or _search_inkind() to customize diff --git a/spp_api_v2_gis/README.rst b/spp_api_v2_gis/README.rst index 14c61f2e..348ac449 100644 --- a/spp_api_v2_gis/README.rst +++ b/spp_api_v2_gis/README.rst @@ -28,13 +28,13 @@ endpoints, spatial queries, and geofence management. Key Features ------------ -- **OGC API - Features**: Standards-compliant feature collections - (GovStack GIS BB) -- **GeoJSON Export**: Get pre-aggregated layer data for QGIS -- **QML Styling**: Fetch QGIS style files for consistent visualization -- **Spatial Queries**: Query registrant statistics within arbitrary - polygons using PostGIS -- **Geofence Management**: Save and manage areas of interest +- **OGC API - Features**: Standards-compliant feature collections + (GovStack GIS BB) +- **GeoJSON Export**: Get pre-aggregated layer data for QGIS +- **QML Styling**: Fetch QGIS style files for consistent visualization +- **Spatial Queries**: Query registrant statistics within arbitrary + polygons using PostGIS +- **Geofence Management**: Save and manage areas of interest Architecture ------------ @@ -42,34 +42,38 @@ Architecture Follows thin client architecture where QGIS displays data and OpenSPP performs all computation: -- All spatial queries executed in PostGIS for performance (including - bbox via ST_Intersects) -- Pre-aggregated data returned to minimize data transfer -- Configuration-driven styling using QML templates -- JWT authentication with scope-based access control +- All spatial queries executed in PostGIS for performance (including + bbox via ST_Intersects) +- Pre-aggregated data returned to minimize data transfer +- Configuration-driven styling using QML templates +- JWT authentication with scope-based access control API Endpoints ------------- **OGC API - Features (primary interface)** -+-------------------------------------------+--------+------------------------------+ -| Endpoint | Method | Description | -+===========================================+========+==============================+ -| ``/gis/ogc/`` | GET | OGC API landing page | -+-------------------------------------------+--------+------------------------------+ -| ``/gis/ogc/conformance`` | GET | OGC conformance classes | -+-------------------------------------------+--------+------------------------------+ -| ``/gis/ogc/collections`` | GET | List feature collections | -+-------------------------------------------+--------+------------------------------+ -| ``/gis/ogc/collections/{id}`` | GET | Collection metadata | -+-------------------------------------------+--------+------------------------------+ -| ``/gis/ogc/collections/{id}/items`` | GET | Feature items (GeoJSON) | -+-------------------------------------------+--------+------------------------------+ -| ``/gis/ogc/collections/{id}/items/{fid}`` | GET | Single feature | -+-------------------------------------------+--------+------------------------------+ -| ``/gis/ogc/collections/{id}/qml`` | GET | QGIS style file (extension) | -+-------------------------------------------+--------+------------------------------+ ++-----------------------------+--------+-----------------------------+ +| Endpoint | Method | Description | ++=============================+========+=============================+ +| ``/gis/ogc/`` | GET | OGC API landing page | ++-----------------------------+--------+-----------------------------+ +| ``/gis/ogc/conformance`` | GET | OGC conformance classes | ++-----------------------------+--------+-----------------------------+ +| ``/gis/ogc/collections`` | GET | List feature collections | ++-----------------------------+--------+-----------------------------+ +| `` | GET | Collection metadata | +| /gis/ogc/collections/{id}`` | | | ++-----------------------------+--------+-----------------------------+ +| ``/gis/o | GET | Feature items (GeoJSON) | +| gc/collections/{id}/items`` | | | ++-----------------------------+--------+-----------------------------+ +| ``/gis/ogc/col | GET | Single feature | +| lections/{id}/items/{fid}`` | | | ++-----------------------------+--------+-----------------------------+ +| ``/gis | GET | QGIS style file (extension) | +| /ogc/collections/{id}/qml`` | | | ++-----------------------------+--------+-----------------------------+ **Additional endpoints** @@ -87,46 +91,48 @@ Scopes and Data Privacy **OAuth Scopes** -+------------------+--------------+------------------------------------+ -| Scope | Access | Description | -+==================+==============+====================================+ -| ``gis:read`` | Read-only | View collections, layers, | -| | | statistics, export data | -+------------------+--------------+------------------------------------+ -| ``gis:geofence`` | Read + Write | Create and archive geofences (also | -| | | requires ``gis:read`` for listing) | -+------------------+--------------+------------------------------------+ ++------------------+--------------+----------------------------------+ +| Scope | Access | Description | ++==================+==============+==================================+ +| ``gis:read`` | Read-only | View collections, layers, | +| | | statistics, export data | ++------------------+--------------+----------------------------------+ +| ``gis:geofence`` | Read + Write | Create and archive geofences | +| | | (also requires ``gis:read`` for | +| | | listing) | ++------------------+--------------+----------------------------------+ **What data is exposed** **Aggregated statistics only.** No endpoint in this module returns individual registrant records. -- **OGC collections/items**: Return GeoJSON features organized by - administrative area, with pre-computed aggregate values (counts, - percentages). Each feature represents an *area*, not a person. -- **Spatial query statistics** (``POST /gis/query/statistics``): Accepts - a GeoJSON polygon and returns configured aggregate statistics computed - by ``spp.aggregation.service``. Individual registrant IDs are computed - internally for aggregation but are **explicitly stripped** from the - response before it is sent (see ``spatial_query.py``). -- **Exports** (GeoPackage/GeoJSON): Contain the same area-level - aggregated layer data, not registrant-level records. -- **Geofences**: Store only geometry and metadata — no registrant data. +- **OGC collections/items**: Return GeoJSON features organized by + administrative area, with pre-computed aggregate values (counts, + percentages). Each feature represents an *area*, not a person. +- **Spatial query statistics** (``POST /gis/query/statistics``): + Accepts a GeoJSON polygon and returns configured aggregate statistics + computed by ``spp.aggregation.service``. Individual registrant IDs + are computed internally for aggregation but are **explicitly + stripped** from the response before it is sent (see + ``spatial_query.py``). +- **Exports** (GeoPackage/GeoJSON): Contain the same area-level + aggregated layer data, not registrant-level records. +- **Geofences**: Store only geometry and metadata — no registrant data. **Privacy controls** -- **K-anonymity suppression**: Statistics backed by CEL variables can - apply k-anonymity thresholds. When a cell count falls below the - configured minimum, the value is replaced with a suppression marker - and flagged as ``"suppressed": true`` in the response. This prevents - re-identification in small populations. -- **CEL variable configuration**: Administrators control which - statistics are published and their suppression thresholds via - ``spp.statistic`` records. -- **Scope separation**: ``gis:read`` and ``gis:geofence`` are separate - scopes, allowing clients to be granted read-only access without write - capability. +- **K-anonymity suppression**: Statistics backed by CEL variables can + apply k-anonymity thresholds. When a cell count falls below the + configured minimum, the value is replaced with a suppression marker + and flagged as ``"suppressed": true`` in the response. This prevents + re-identification in small populations. +- **CEL variable configuration**: Administrators control which + statistics are published and their suppression thresholds via + ``spp.statistic`` records. +- **Scope separation**: ``gis:read`` and ``gis:geofence`` are separate + scopes, allowing clients to be granted read-only access without write + capability. **Design rationale** @@ -139,10 +145,10 @@ identifiable information. Dependencies ------------ -- ``spp_api_v2`` - FastAPI infrastructure -- ``spp_gis`` - PostGIS integration -- ``spp_gis_report`` - Report configuration -- ``spp_area`` - Administrative area data +- ``spp_api_v2`` - FastAPI infrastructure +- ``spp_gis`` - PostGIS integration +- ``spp_gis_report`` - Report configuration +- ``spp_area`` - Administrative area data .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. diff --git a/spp_api_v2_gis/static/description/index.html b/spp_api_v2_gis/static/description/index.html index 5da61de2..e64f0c4a 100644 --- a/spp_api_v2_gis/static/description/index.html +++ b/spp_api_v2_gis/static/description/index.html @@ -401,9 +401,9 @@

        API Endpoints

        OGC API - Features (primary interface)

        ---+++ @@ -424,19 +424,23 @@

        API Endpoints

        - + - + - + - + @@ -480,9 +484,9 @@

        Scopes and Data Privacy

        OAuth Scopes

        Endpoint GET List feature collections
        /gis/ogc/collections/{id}
        `` +/gis/ogc/collections/{id}`` GET Collection metadata
        /gis/ogc/collections/{id}/items
        /gis/o +gc/collections/{id}/items GET Feature items (GeoJSON)
        /gis/ogc/collections/{id}/items/{fid}
        /gis/ogc/col +lections/{id}/items/{fid} GET Single feature
        /gis/ogc/collections/{id}/qml
        /gis +/ogc/collections/{id}/qml GET QGIS style file (extension)
        -+-+ @@ -498,8 +502,9 @@

        Scopes and Data Privacy

        - +
        Scope
        gis:geofence Read + WriteCreate and archive geofences (also -requires gis:read for listing)Create and archive geofences +(also requires gis:read for +listing)
        @@ -510,11 +515,12 @@

        Scopes and Data Privacy

      • OGC collections/items: Return GeoJSON features organized by administrative area, with pre-computed aggregate values (counts, percentages). Each feature represents an area, not a person.
      • -
      • Spatial query statistics (POST /gis/query/statistics): Accepts -a GeoJSON polygon and returns configured aggregate statistics computed -by spp.aggregation.service. Individual registrant IDs are computed -internally for aggregation but are explicitly stripped from the -response before it is sent (see spatial_query.py).
      • +
      • Spatial query statistics (POST /gis/query/statistics): +Accepts a GeoJSON polygon and returns configured aggregate statistics +computed by spp.aggregation.service. Individual registrant IDs +are computed internally for aggregation but are explicitly +stripped from the response before it is sent (see +spatial_query.py).
      • Exports (GeoPackage/GeoJSON): Contain the same area-level aggregated layer data, not registrant-level records.
      • Geofences: Store only geometry and metadata — no registrant data.
      • diff --git a/spp_api_v2_products/README.rst b/spp_api_v2_products/README.rst index c5e4dcde..9479269a 100644 --- a/spp_api_v2_products/README.rst +++ b/spp_api_v2_products/README.rst @@ -31,28 +31,29 @@ external identifiers. Key Capabilities ~~~~~~~~~~~~~~~~ -- Search and retrieve products by default_code (SKU) or name -- Query product categories for classification and filtering -- List units of measure with category filtering -- Paginated search with filters: name, code, category, last updated date -- OAuth 2.0 authentication with "product" resource scope -- Returns JSON responses with references to related resources (category, - UoM) +- Search and retrieve products by default_code (SKU) or name +- Query product categories for classification and filtering +- List units of measure with category filtering +- Paginated search with filters: name, code, category, last updated + date +- OAuth 2.0 authentication with "product" resource scope +- Returns JSON responses with references to related resources + (category, UoM) Key Models ~~~~~~~~~~ This module extends existing models rather than introducing new ones: -+--------------------------+-------------------------------------------+ -| Model | Extension | -+==========================+===========================================+ -| ``spp.api.client.scope`` | Adds "product" resource type for scope | -| | management | -+--------------------------+-------------------------------------------+ -| ``fastapi.endpoint`` | Registers Product, ProductCategory, UoM | -| | routers | -+--------------------------+-------------------------------------------+ ++--------------------------+------------------------------------------+ +| Model | Extension | ++==========================+==========================================+ +| ``spp.api.client.scope`` | Adds "product" resource type for scope | +| | management | ++--------------------------+------------------------------------------+ +| ``fastapi.endpoint`` | Registers Product, ProductCategory, UoM | +| | routers | ++--------------------------+------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -71,14 +72,14 @@ No standalone menu. This is an API-only module. **API Endpoints**: -- ``GET /api/v2/spp/Product`` - Search products -- ``GET /api/v2/spp/Product/{identifier}`` - Read product by code or - name -- ``GET /api/v2/spp/ProductCategory`` - Search categories -- ``GET /api/v2/spp/ProductCategory/{identifier}`` - Read category by - name -- ``GET /api/v2/spp/UnitOfMeasure`` - Search units of measure -- ``GET /api/v2/spp/UnitOfMeasure/{identifier}`` - Read UoM by name +- ``GET /api/v2/spp/Product`` - Search products +- ``GET /api/v2/spp/Product/{identifier}`` - Read product by code or + name +- ``GET /api/v2/spp/ProductCategory`` - Search categories +- ``GET /api/v2/spp/ProductCategory/{identifier}`` - Read category by + name +- ``GET /api/v2/spp/UnitOfMeasure`` - Search units of measure +- ``GET /api/v2/spp/UnitOfMeasure/{identifier}`` - Read UoM by name **Configuration**: Registry > Configuration > API V2 > API Clients @@ -98,11 +99,11 @@ layer through OAuth scopes. Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``ProductService``, ``ProductCategoryService``, or - ``UomService`` to customize API responses -- Override ``to_api_schema()`` methods to add fields to Product, - ProductCategory, or UnitOfMeasure schemas -- Override ``search()`` methods to add custom filtering logic +- Inherit ``ProductService``, ``ProductCategoryService``, or + ``UomService`` to customize API responses +- Override ``to_api_schema()`` methods to add fields to Product, + ProductCategory, or UnitOfMeasure schemas +- Override ``search()`` methods to add custom filtering logic Dependencies ~~~~~~~~~~~~ diff --git a/spp_api_v2_products/static/description/index.html b/spp_api_v2_products/static/description/index.html index 8cbd3042..661e2c44 100644 --- a/spp_api_v2_products/static/description/index.html +++ b/spp_api_v2_products/static/description/index.html @@ -381,10 +381,11 @@

        Key Capabilities

      • Search and retrieve products by default_code (SKU) or name
      • Query product categories for classification and filtering
      • List units of measure with category filtering
      • -
      • Paginated search with filters: name, code, category, last updated date
      • +
      • Paginated search with filters: name, code, category, last updated +date
      • OAuth 2.0 authentication with “product” resource scope
      • -
      • Returns JSON responses with references to related resources (category, -UoM)
      • +
      • Returns JSON responses with references to related resources +(category, UoM)
      diff --git a/spp_api_v2_service_points/README.rst b/spp_api_v2_service_points/README.rst index a9f66f3b..4f94ebc1 100644 --- a/spp_api_v2_service_points/README.rst +++ b/spp_api_v2_service_points/README.rst @@ -30,30 +30,30 @@ external identifiers to avoid exposing database IDs. Key Capabilities ~~~~~~~~~~~~~~~~ -- Search service points by name, area, country, contract status, and - last updated date -- Read individual service points by identifier (name) -- Paginate search results with configurable page size (1-100 records) -- Filter service points by contract active status and geographic - criteria -- Return metadata including version IDs and last updated timestamps for - optimistic locking -- Enforce OAuth 2.0 authentication and scope-based authorization +- Search service points by name, area, country, contract status, and + last updated date +- Read individual service points by identifier (name) +- Paginate search results with configurable page size (1-100 records) +- Filter service points by contract active status and geographic + criteria +- Return metadata including version IDs and last updated timestamps for + optimistic locking +- Enforce OAuth 2.0 authentication and scope-based authorization Extended Models ~~~~~~~~~~~~~~~ This module extends existing models from dependencies: -+--------------------------+-------------------------------------------+ -| Model | Description | -+==========================+===========================================+ -| ``spp.api.client.scope`` | Extended to add "service_point" resource | -| | type for OAuth scopes | -+--------------------------+-------------------------------------------+ -| ``fastapi.endpoint`` | Extended to register Service Point router | -| | in API V2 app | -+--------------------------+-------------------------------------------+ ++--------------------------+------------------------------------------+ +| Model | Description | ++==========================+==========================================+ +| ``spp.api.client.scope`` | Extended to add "service_point" resource | +| | type for OAuth scopes | ++--------------------------+------------------------------------------+ +| ``fastapi.endpoint`` | Extended to register Service Point | +| | router in API V2 app | ++--------------------------+------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -71,10 +71,10 @@ base module: API Endpoints ~~~~~~~~~~~~~ -- ``GET /api/v2/spp/ServicePoint/{identifier}`` - Read service point by - identifier (URL-encoded name) -- ``GET /api/v2/spp/ServicePoint?name=&area=&country=&contractActive=&_lastUpdated=&_count=&_offset=`` - - Search service points +- ``GET /api/v2/spp/ServicePoint/{identifier}`` - Read service point by + identifier (URL-encoded name) +- ``GET /api/v2/spp/ServicePoint?name=&area=&country=&contractActive=&_lastUpdated=&_count=&_offset=`` + - Search service points Security ~~~~~~~~ @@ -87,12 +87,12 @@ client with appropriate scope. No model-level access rules defined Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``ServicePointService.to_api_schema()`` to add custom fields - to API response -- Override ``ServicePointService.search()`` to customize search domain - logic -- Extend ``ServicePoint`` schema to add module-specific fields in - ``extension`` attribute +- Inherit ``ServicePointService.to_api_schema()`` to add custom fields + to API response +- Override ``ServicePointService.search()`` to customize search domain + logic +- Extend ``ServicePoint`` schema to add module-specific fields in + ``extension`` attribute Dependencies ~~~~~~~~~~~~ diff --git a/spp_api_v2_service_points/static/description/index.html b/spp_api_v2_service_points/static/description/index.html index 20541256..0294cb47 100644 --- a/spp_api_v2_service_points/static/description/index.html +++ b/spp_api_v2_service_points/static/description/index.html @@ -407,8 +407,8 @@

      Extended Models

      type for OAuth scopes fastapi.endpoint -Extended to register Service Point router -in API V2 app +Extended to register Service Point +router in API V2 app diff --git a/spp_api_v2_vocabulary/README.rst b/spp_api_v2_vocabulary/README.rst index 7efddcaf..f67a8869 100644 --- a/spp_api_v2_vocabulary/README.rst +++ b/spp_api_v2_vocabulary/README.rst @@ -32,44 +32,44 @@ present. Key Capabilities ~~~~~~~~~~~~~~~~ -- List all available vocabularies with domain filtering and pagination -- Retrieve vocabulary metadata including name, version, description, and - reference URL -- Fetch codes within a vocabulary with support for hierarchical - structures -- Filter codes by parent (for hierarchical vocabularies) and - include/exclude deprecated codes -- Validate namespace URIs for security (path traversal, null bytes, - control characters) +- List all available vocabularies with domain filtering and pagination +- Retrieve vocabulary metadata including name, version, description, + and reference URL +- Fetch codes within a vocabulary with support for hierarchical + structures +- Filter codes by parent (for hierarchical vocabularies) and + include/exclude deprecated codes +- Validate namespace URIs for security (path traversal, null bytes, + control characters) Key Models ~~~~~~~~~~ -+--------------------------+-------------------------------------------+ -| Model | Description | -+==========================+===========================================+ -| ``spp.vocabulary`` | Vocabulary definitions exposed via GET | -| | endpoints | -+--------------------------+-------------------------------------------+ -| ``spp.vocabulary.code`` | Individual codes within vocabularies | -+--------------------------+-------------------------------------------+ -| ``spp.api.client.scope`` | Extended to add "vocabulary" resource | -| | type for OAuth | -+--------------------------+-------------------------------------------+ -| ``fastapi.endpoint`` | Extended to register Vocabulary router in | -| | API V2 | -+--------------------------+-------------------------------------------+ ++--------------------------+------------------------------------------+ +| Model | Description | ++==========================+==========================================+ +| ``spp.vocabulary`` | Vocabulary definitions exposed via GET | +| | endpoints | ++--------------------------+------------------------------------------+ +| ``spp.vocabulary.code`` | Individual codes within vocabularies | ++--------------------------+------------------------------------------+ +| ``spp.api.client.scope`` | Extended to add "vocabulary" resource | +| | type for OAuth | ++--------------------------+------------------------------------------+ +| ``fastapi.endpoint`` | Extended to register Vocabulary router | +| | in API V2 | ++--------------------------+------------------------------------------+ API Endpoints ~~~~~~~~~~~~~ -- ``GET /Vocabulary`` - List all vocabularies (supports ``domain``, - ``_count``, ``_offset`` query params) -- ``GET /Vocabulary/{namespace_uri}`` - Get vocabulary details by - namespace URI (URL-encoded) -- ``GET /Vocabulary/{namespace_uri}/codes`` - Get codes within a - vocabulary (supports ``parent_code``, ``include_deprecated``, - ``_count``, ``_offset``) +- ``GET /Vocabulary`` - List all vocabularies (supports ``domain``, + ``_count``, ``_offset`` query params) +- ``GET /Vocabulary/{namespace_uri}`` - Get vocabulary details by + namespace URI (URL-encoded) +- ``GET /Vocabulary/{namespace_uri}/codes`` - Get codes within a + vocabulary (supports ``parent_code``, ``include_deprecated``, + ``_count``, ``_offset``) Configuration ~~~~~~~~~~~~~ @@ -87,12 +87,12 @@ modules: Security ~~~~~~~~ -- Requires OAuth 2.0 authentication via ``spp_api_v2`` framework -- Requires "vocabulary" scope with "read" action on API client -- No Odoo security groups required (vocabularies are public data, - endpoints use sudo()) -- Validates namespace URI and parent_code parameters for injection - attacks +- Requires OAuth 2.0 authentication via ``spp_api_v2`` framework +- Requires "vocabulary" scope with "read" action on API client +- No Odoo security groups required (vocabularies are public data, + endpoints use sudo()) +- Validates namespace URI and parent_code parameters for injection + attacks Dependencies ~~~~~~~~~~~~ diff --git a/spp_api_v2_vocabulary/static/description/index.html b/spp_api_v2_vocabulary/static/description/index.html index 684f1b7d..59b27943 100644 --- a/spp_api_v2_vocabulary/static/description/index.html +++ b/spp_api_v2_vocabulary/static/description/index.html @@ -380,8 +380,8 @@

      OpenSPP API V2 - Vocabulary

      Key Capabilities

      • List all available vocabularies with domain filtering and pagination
      • -
      • Retrieve vocabulary metadata including name, version, description, and -reference URL
      • +
      • Retrieve vocabulary metadata including name, version, description, +and reference URL
      • Fetch codes within a vocabulary with support for hierarchical structures
      • Filter codes by parent (for hierarchical vocabularies) and @@ -415,8 +415,8 @@

        Key Models

        type for OAuth fastapi.endpoint -Extended to register Vocabulary router in -API V2 +Extended to register Vocabulary router +in API V2 diff --git a/spp_approval/README.rst b/spp_approval/README.rst index 19fb5953..2879f504 100644 --- a/spp_approval/README.rst +++ b/spp_approval/README.rst @@ -31,50 +31,50 @@ submit/approve/reject actions with audit trails and optimistic locking. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Approval Mixin**: Add ``spp.approval.mixin`` to any model to enable - approval workflow with state tracking (``draft``, ``pending``, - ``approved``, ``rejected``, ``revision``) -- **Multi-Tier Workflows**: Define sequential approval tiers with - configurable approver types (security group, specific users, - submitter's manager, or dynamic field) -- **CEL Rules**: Conditional approval routing using Common Expression - Language domain filters -- **Freeze Periods**: System-wide approval suspension during election - bans, audits, or maintenance windows -- **SLA Tracking**: Track approval deadlines per tier with escalation - support -- **Revision Requests**: Approvers can request revisions instead of - outright rejection -- **Optimistic Locking**: Prevents concurrent approval conflicts via - version-based locking +- **Approval Mixin**: Add ``spp.approval.mixin`` to any model to enable + approval workflow with state tracking (``draft``, ``pending``, + ``approved``, ``rejected``, ``revision``) +- **Multi-Tier Workflows**: Define sequential approval tiers with + configurable approver types (security group, specific users, + submitter's manager, or dynamic field) +- **CEL Rules**: Conditional approval routing using Common Expression + Language domain filters +- **Freeze Periods**: System-wide approval suspension during election + bans, audits, or maintenance windows +- **SLA Tracking**: Track approval deadlines per tier with escalation + support +- **Revision Requests**: Approvers can request revisions instead of + outright rejection +- **Optimistic Locking**: Prevents concurrent approval conflicts via + version-based locking Key Models ~~~~~~~~~~ -+------------------------------+---------------------------------------+ -| Model | Description | -+==============================+=======================================+ -| ``spp.approval.mixin`` | Abstract mixin providing approval | -| | workflow to inheriting models | -+------------------------------+---------------------------------------+ -| ``spp.approval.definition`` | Configures approval rules, approvers, | -| | and conditions per model | -+------------------------------+---------------------------------------+ -| ``spp.approval.tier`` | Individual tier in a multi-tier | -| | approval sequence | -+------------------------------+---------------------------------------+ -| ``spp.approval.review`` | Tracks individual approval/rejection | -| | actions | -+------------------------------+---------------------------------------+ -| ``spp.approval.tier.review`` | Tracks progress through multi-tier | -| | workflows | -+------------------------------+---------------------------------------+ -| ``spp.approval.freeze`` | Defines system-wide freeze periods | -| | blocking approvals | -+------------------------------+---------------------------------------+ -| ``spp.approval.config`` | System-wide approval configuration | -| | settings | -+------------------------------+---------------------------------------+ ++------------------------------+--------------------------------------+ +| Model | Description | ++==============================+======================================+ +| ``spp.approval.mixin`` | Abstract mixin providing approval | +| | workflow to inheriting models | ++------------------------------+--------------------------------------+ +| ``spp.approval.definition`` | Configures approval rules, | +| | approvers, and conditions per model | ++------------------------------+--------------------------------------+ +| ``spp.approval.tier`` | Individual tier in a multi-tier | +| | approval sequence | ++------------------------------+--------------------------------------+ +| ``spp.approval.review`` | Tracks individual approval/rejection | +| | actions | ++------------------------------+--------------------------------------+ +| ``spp.approval.tier.review`` | Tracks progress through multi-tier | +| | workflows | ++------------------------------+--------------------------------------+ +| ``spp.approval.freeze`` | Defines system-wide freeze periods | +| | blocking approvals | ++------------------------------+--------------------------------------+ +| ``spp.approval.config`` | System-wide approval configuration | +| | settings | ++------------------------------+--------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -92,40 +92,43 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Approvals > My Approvals > Pending Approvals -- **Configuration**: Approvals > Configuration > Approval Definitions -- **Freeze Periods**: Approvals > Configuration > Freeze Periods -- **Mixin Integration**: Approval buttons appear on forms of models - inheriting the mixin +- **Menu**: Approvals > My Approvals > Pending Approvals +- **Configuration**: Approvals > Configuration > Approval Definitions +- **Freeze Periods**: Approvals > Configuration > Freeze Periods +- **Mixin Integration**: Approval buttons appear on forms of models + inheriting the mixin Tabs ~~~~ On **Approval Definition** forms: -- **Conditions**: Domain filter to determine which records require this - approval -- **Behavior**: Approval settings (require comment, auto-approve, - notifications) -- **SLA & Escalation**: SLA tracking and escalation rules +- **Conditions**: Domain filter to determine which records require this + approval +- **Behavior**: Approval settings (require comment, auto-approve, + notifications) +- **SLA & Escalation**: SLA tracking and escalation rules Security ~~~~~~~~ -+------------------------------------------+----------------------------------+ -| Group | Access | -+==========================================+==================================+ -| ``spp_approval.group_approval_viewer`` | Read approval records | -+------------------------------------------+----------------------------------+ -| ``spp_approval.group_approval_officer`` | Read/Write/Create (no delete) | -+------------------------------------------+----------------------------------+ -| ``spp_approval.group_approval_manager`` | Read/Write/Create on all models | -| | (delete only for reviews/config; | -| | definitions and freezes require | -| | admin) | -+------------------------------------------+----------------------------------+ -| ``spp_approval.group_approval_approver`` | Approve/reject assigned reviews | -+------------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_ | Read approval records | +| approval.group_approval_viewer`` | | ++----------------------------------+----------------------------------+ +| ``spp_a | Read/Write/Create (no delete) | +| pproval.group_approval_officer`` | | ++----------------------------------+----------------------------------+ +| ``spp_a | Read/Write/Create on all models | +| pproval.group_approval_manager`` | (delete only for reviews/config; | +| | definitions and freezes require | +| | admin) | ++----------------------------------+----------------------------------+ +| ``spp_ap | Approve/reject assigned reviews | +| proval.group_approval_approver`` | | ++----------------------------------+----------------------------------+ Note: ``approval_definition`` and ``approval_freeze`` models block deletion for managers via Python override - only system administrators @@ -134,14 +137,14 @@ can delete these records. Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.approval.mixin`` to add approval workflow to any model - inheriting ``mail.thread`` -- Override ``_on_submit()``, ``_on_approve()``, ``_on_reject()``, - ``_on_request_revision()`` hooks for custom logic -- Override ``_get_approval_definition()`` to provide record-specific - approval rules (e.g., from a type field) -- Extend ``spp.approval.definition`` to add custom approver types or - matching logic +- Inherit ``spp.approval.mixin`` to add approval workflow to any model + inheriting ``mail.thread`` +- Override ``_on_submit()``, ``_on_approve()``, ``_on_reject()``, + ``_on_request_revision()`` hooks for custom logic +- Override ``_get_approval_definition()`` to provide record-specific + approval rules (e.g., from a type field) +- Extend ``spp.approval.definition`` to add custom approver types or + matching logic Dependencies ~~~~~~~~~~~~ diff --git a/spp_approval/static/description/index.html b/spp_approval/static/description/index.html index fca91d09..d595e836 100644 --- a/spp_approval/static/description/index.html +++ b/spp_approval/static/description/index.html @@ -400,8 +400,8 @@

        Key Capabilities

        Key Models

        --++ @@ -414,8 +414,8 @@

        Key Models

        workflow to inheriting models - +
        Model
        spp.approval.definitionConfigures approval rules, approvers, -and conditions per modelConfigures approval rules, +approvers, and conditions per model
        spp.approval.tier Individual tier in a multi-tier @@ -478,8 +478,8 @@

        Tabs

        Security

        --++ @@ -487,19 +487,23 @@

        Security

        - + - + - + - + diff --git a/spp_area/README.rst b/spp_area/README.rst index 53f6c857..5a92f18c 100644 --- a/spp_area/README.rst +++ b/spp_area/README.rst @@ -31,44 +31,44 @@ area types. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define hierarchical area structures with up to 10 levels (country, - province, district, etc.) -- Assign unique codes and multi-language names to each area -- Import bulk area data from Excel files in COD (Common Operational - Dataset) format from HDX -- Tag areas with classifications (urban, remote, priority) for filtering - and reporting -- Link registrants and groups to their geographical areas -- Restrict user access to specific geographic areas via role-based area - assignments -- Automatically detect and activate required languages during import +- Define hierarchical area structures with up to 10 levels (country, + province, district, etc.) +- Assign unique codes and multi-language names to each area +- Import bulk area data from Excel files in COD (Common Operational + Dataset) format from HDX +- Tag areas with classifications (urban, remote, priority) for + filtering and reporting +- Link registrants and groups to their geographical areas +- Restrict user access to specific geographic areas via role-based area + assignments +- Automatically detect and activate required languages during import Key Models ~~~~~~~~~~ -+-------------------------------------+----------------------------------+ -| Model | Description | -+=====================================+==================================+ -| ``spp.area`` | Hierarchical geographical area | -| | with code and name | -+-------------------------------------+----------------------------------+ -| ``spp.area.kind`` | Area type definition (country, | -| | province, district, etc.) | -+-------------------------------------+----------------------------------+ -| ``spp.area.tag`` | Classification tags for areas | -+-------------------------------------+----------------------------------+ -| ``spp.area.import`` | Excel import wizard with | -| | validation and bulk processing | -+-------------------------------------+----------------------------------+ -| ``spp.area.import.raw`` | Staging table for import | -| | validation | -+-------------------------------------+----------------------------------+ -| ``spp.area.import.json`` | Parsed JSON storage from Excel | -| | files | -+-------------------------------------+----------------------------------+ -| ``spp.area.import.language.wizard`` | Wizard for activating languages | -| | during import | -+-------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ``spp.area`` | Hierarchical geographical area | +| | with code and name | ++----------------------------------+----------------------------------+ +| ``spp.area.kind`` | Area type definition (country, | +| | province, district, etc.) | ++----------------------------------+----------------------------------+ +| ``spp.area.tag`` | Classification tags for areas | ++----------------------------------+----------------------------------+ +| ``spp.area.import`` | Excel import wizard with | +| | validation and bulk processing | ++----------------------------------+----------------------------------+ +| ``spp.area.import.raw`` | Staging table for import | +| | validation | ++----------------------------------+----------------------------------+ +| ``spp.area.import.json`` | Parsed JSON storage from Excel | +| | files | ++----------------------------------+----------------------------------+ +| ``s | Wizard for activating languages | +| pp.area.import.language.wizard`` | during import | ++----------------------------------+----------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -86,12 +86,12 @@ After installing: UI Location ~~~~~~~~~~~ -- **Area Menu**: Area > Areas > Area -- **Area Type Menu**: Area > Areas > Area Type -- **Area Tags Menu**: Area > Areas > Area Tags -- **Import Menu**: Area > Areas > Area Import -- **Registrant Form**: Area field appears on registrant and group - profile forms +- **Area Menu**: Area > Areas > Area +- **Area Type Menu**: Area > Areas > Area Type +- **Area Tags Menu**: Area > Areas > Area Tags +- **Import Menu**: Area > Areas > Area Import +- **Registrant Form**: Area field appears on registrant and group + profile forms Views and Tabs ~~~~~~~~~~~~~~ @@ -119,12 +119,13 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.area`` to add custom fields or computed attributes -- Override ``_prepare_domain()`` in models to customize area-based - filtering logic -- Extend ``spp.area.import.raw`` to add custom validation rules for - imports -- Inherit ``spp.area.tag`` to add domain-specific classification schemes +- Inherit ``spp.area`` to add custom fields or computed attributes +- Override ``_prepare_domain()`` in models to customize area-based + filtering logic +- Extend ``spp.area.import.raw`` to add custom validation rules for + imports +- Inherit ``spp.area.tag`` to add domain-specific classification + schemes Dependencies ~~~~~~~~~~~~ diff --git a/spp_area/static/description/index.html b/spp_area/static/description/index.html index 06d6fed3..4471a753 100644 --- a/spp_area/static/description/index.html +++ b/spp_area/static/description/index.html @@ -383,8 +383,8 @@

        Key Capabilities

      • Assign unique codes and multi-language names to each area
      • Import bulk area data from Excel files in COD (Common Operational Dataset) format from HDX
      • -
      • Tag areas with classifications (urban, remote, priority) for filtering -and reporting
      • +
      • Tag areas with classifications (urban, remote, priority) for +filtering and reporting
      • Link registrants and groups to their geographical areas
      • Restrict user access to specific geographic areas via role-based area assignments
      • @@ -395,8 +395,8 @@

        Key Capabilities

        Key Models

        Group
        spp_approval.group_approval_viewer
        spp_ +approval.group_approval_viewer Read approval records
        spp_approval.group_approval_officer
        spp_a +pproval.group_approval_officer Read/Write/Create (no delete)
        spp_approval.group_approval_manager
        spp_a +pproval.group_approval_manager Read/Write/Create on all models (delete only for reviews/config; definitions and freezes require admin)
        spp_approval.group_approval_approver
        spp_ap +proval.group_approval_approver Approve/reject assigned reviews
        --++ @@ -427,7 +427,8 @@

        Key Models

        - + @@ -519,7 +520,8 @@

        Extension Points

        filtering logic
      • Extend spp.area.import.raw to add custom validation rules for imports
      • -
      • Inherit spp.area.tag to add domain-specific classification schemes
      • +
      • Inherit spp.area.tag to add domain-specific classification +schemes
      • diff --git a/spp_area_hdx/README.rst b/spp_area_hdx/README.rst index 8efd2692..c5cf6845 100644 --- a/spp_area_hdx/README.rst +++ b/spp_area_hdx/README.rst @@ -31,36 +31,36 @@ area lookup using PostGIS spatial queries. Key Capabilities ~~~~~~~~~~~~~~~~ -- Sync COD dataset metadata from HDX API by country -- Auto-detect field mappings from GeoJSON (P-code, name, parent P-code) - using HXL tags -- Import admin boundaries with polygons from HDX or manually uploaded - GeoJSON files -- Match imported features to existing areas by P-code or create new - areas -- GPS-based area lookup using PostGIS ``ST_Contains`` for - point-in-polygon queries -- Standardize area identification with HDX P-codes for inter-agency - coordination +- Sync COD dataset metadata from HDX API by country +- Auto-detect field mappings from GeoJSON (P-code, name, parent P-code) + using HXL tags +- Import admin boundaries with polygons from HDX or manually uploaded + GeoJSON files +- Match imported features to existing areas by P-code or create new + areas +- GPS-based area lookup using PostGIS ``ST_Contains`` for + point-in-polygon queries +- Standardize area identification with HDX P-codes for inter-agency + coordination Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.hdx.cod.source`` | Tracks COD datasets available from | -| | HDX (one per country) | -+-------------------------------+--------------------------------------+ -| ``spp.hdx.cod.resource`` | Individual admin level dataset | -| | within a COD (e.g., Level 3) | -+-------------------------------+--------------------------------------+ -| ``spp.hdx.cod.import.wizard`` | Multi-step wizard to download from | -| | HDX or upload GeoJSON | -+-------------------------------+--------------------------------------+ -| ``spp.area`` (extended) | Adds ``hdx_pcode`` field and GPS | -| | lookup methods | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.hdx.cod.source`` | Tracks COD datasets available from | +| | HDX (one per country) | ++-------------------------------+-------------------------------------+ +| ``spp.hdx.cod.resource`` | Individual admin level dataset | +| | within a COD (e.g., Level 3) | ++-------------------------------+-------------------------------------+ +| ``spp.hdx.cod.import.wizard`` | Multi-step wizard to download from | +| | HDX or upload GeoJSON | ++-------------------------------+-------------------------------------+ +| ``spp.area`` (extended) | Adds ``hdx_pcode`` field and GPS | +| | lookup methods | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -79,36 +79,36 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Area > Areas > HDX Integration > COD Sources -- **Import**: Area > Areas > HDX Integration > Import COD -- **Area Records**: Extended with HDX P-code field visible in area form - view +- **Menu**: Area > Areas > HDX Integration > COD Sources +- **Import**: Area > Areas > HDX Integration > Import COD +- **Area Records**: Extended with HDX P-code field visible in area form + view Security ~~~~~~~~ -+-----------------------+----------------------------------------------+ -| Group | Access | -+=======================+==============================================+ -| ``group_hdx_user`` | Read access to COD sources and resources | -+-----------------------+----------------------------------------------+ -| ``group_hdx_manager`` | Full CRUD on sources/resources, sync from | -| | HDX, run imports | -+-----------------------+----------------------------------------------+ ++-----------------------+---------------------------------------------+ +| Group | Access | ++=======================+=============================================+ +| ``group_hdx_user`` | Read access to COD sources and resources | ++-----------------------+---------------------------------------------+ +| ``group_hdx_manager`` | Full CRUD on sources/resources, sync from | +| | HDX, run imports | ++-----------------------+---------------------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- ``spp.area.find_by_coordinates(latitude, longitude, level=None)`` - - Find area containing GPS point -- ``spp.area.find_all_containing(latitude, longitude)`` - Find all areas - in hierarchy containing point -- ``spp.area.find_by_pcode(pcode)`` - Find area by HDX P-code or - fallback to code field -- Inherit ``spp.hdx.cod.source`` to add country-specific dataset - discovery logic -- Inherit ``spp.hdx.cod.import.wizard._process_features()`` to customize - import behavior +- ``spp.area.find_by_coordinates(latitude, longitude, level=None)`` - + Find area containing GPS point +- ``spp.area.find_all_containing(latitude, longitude)`` - Find all + areas in hierarchy containing point +- ``spp.area.find_by_pcode(pcode)`` - Find area by HDX P-code or + fallback to code field +- Inherit ``spp.hdx.cod.source`` to add country-specific dataset + discovery logic +- Inherit ``spp.hdx.cod.import.wizard._process_features()`` to + customize import behavior Dependencies ~~~~~~~~~~~~ diff --git a/spp_audit/README.rst b/spp_audit/README.rst index b0de36ad..d33c807b 100644 --- a/spp_audit/README.rst +++ b/spp_audit/README.rst @@ -33,34 +33,34 @@ disabled through compromised database access. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Automatic Operation Logging**: Intercepts create, write, and unlink - operations on configured models via method decoration -- **Lifecycle Action Logging**: Explicitly logs state transitions like - activate, deactivate, approve, reject through - ``log_lifecycle_action()`` API -- **File Access Tracking**: Records download, preview, and export - actions when enabled for specific models -- **Multi-Backend Dispatch**: Writes to database (UI-visible), JSONL - files (daily rotation), syslog, and HTTP endpoints concurrently -- **Tamper-Resistant Config**: Environment variables and ``odoo.conf`` - override database parameters to prevent audit disabling -- **Self-Protection**: Logs changes to ``spp.audit.rule`` records - directly to non-database backends -- **Optional Chatter Integration**: Posts audit summaries to record's - mail.thread when explicitly enabled +- **Automatic Operation Logging**: Intercepts create, write, and unlink + operations on configured models via method decoration +- **Lifecycle Action Logging**: Explicitly logs state transitions like + activate, deactivate, approve, reject through + ``log_lifecycle_action()`` API +- **File Access Tracking**: Records download, preview, and export + actions when enabled for specific models +- **Multi-Backend Dispatch**: Writes to database (UI-visible), JSONL + files (daily rotation), syslog, and HTTP endpoints concurrently +- **Tamper-Resistant Config**: Environment variables and ``odoo.conf`` + override database parameters to prevent audit disabling +- **Self-Protection**: Logs changes to ``spp.audit.rule`` records + directly to non-database backends +- **Optional Chatter Integration**: Posts audit summaries to record's + mail.thread when explicitly enabled Key Models ~~~~~~~~~~ -+--------------------+-------------------------------------------------+ -| Model | Description | -+====================+=================================================+ -| ``spp.audit.rule`` | Defines which models and operations to audit, | -| | with field filters | -+--------------------+-------------------------------------------------+ -| ``spp.audit.log`` | Database-stored audit entries with old/new | -| | value comparison | -+--------------------+-------------------------------------------------+ ++--------------------+------------------------------------------------+ +| Model | Description | ++====================+================================================+ +| ``spp.audit.rule`` | Defines which models and operations to audit, | +| | with field filters | ++--------------------+------------------------------------------------+ +| ``spp.audit.log`` | Database-stored audit entries with old/new | +| | value comparison | ++--------------------+------------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -73,12 +73,12 @@ After installing: 3. Enable additional backends via environment variables or ``odoo.conf``: - - ``OPENSPP_AUDIT_BACKEND_FILE=true`` / - ``spp_audit_backend_file = true`` - - ``OPENSPP_AUDIT_BACKEND_SYSLOG=true`` / - ``spp_audit_backend_syslog = true`` - - ``OPENSPP_AUDIT_BACKEND_HTTP=true`` / - ``spp_audit_backend_http = true`` + - ``OPENSPP_AUDIT_BACKEND_FILE=true`` / + ``spp_audit_backend_file = true`` + - ``OPENSPP_AUDIT_BACKEND_SYSLOG=true`` / + ``spp_audit_backend_syslog = true`` + - ``OPENSPP_AUDIT_BACKEND_HTTP=true`` / + ``spp_audit_backend_http = true`` 4. Configure backend-specific settings (file path, HTTP endpoint, syslog host) @@ -86,32 +86,33 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Audit Log > Audit > Rule (configure audit rules) -- **Menu**: Audit Log > Audit > Log (view database-stored audit entries) -- **Action**: "View logs" action menu appears on audited model forms - when ``is_view_logs`` enabled +- **Menu**: Audit Log > Audit > Rule (configure audit rules) +- **Menu**: Audit Log > Audit > Log (view database-stored audit + entries) +- **Action**: "View logs" action menu appears on audited model forms + when ``is_view_logs`` enabled **Tabs (Audit Log form)**: -- **Changes**: Displays old/new field values in table format +- **Changes**: Displays old/new field values in table format **Tabs (Audit Rule form)**: -- **Related Rules**: Shows child rules when parent model inherits - mail.thread +- **Related Rules**: Shows child rules when parent model inherits + mail.thread Security ~~~~~~~~ -+-----------------------------------+----------------------------------+ -| Group | Access | -+===================================+==================================+ -| ``spp_audit.group_audit_manager`` | Full CRUD on audit rules and | -| | logs | -+-----------------------------------+----------------------------------+ -| ``spp_security.group_spp_admin`` | Includes audit manager | -| | privileges (via imply) | -+-----------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ` | Full CRUD on audit rules and | +| `spp_audit.group_audit_manager`` | logs | ++----------------------------------+----------------------------------+ +| ``spp_security.group_spp_admin`` | Includes audit manager | +| | privileges (via imply) | ++----------------------------------+----------------------------------+ Audit logs cannot be deleted by default (``ALLOW_DELETE = False`` in code, despite ``perm_unlink=1`` in access rules). @@ -119,15 +120,15 @@ code, despite ``perm_unlink=1`` in access rules). Extension Points ~~~~~~~~~~~~~~~~ -- Call - ``log_lifecycle_action(model_name, record_id, action, old_values, new_values)`` - to explicitly log state transitions -- Inherit ``spp.audit.backend`` and register new backend types via - ``AuditBackendRegistry.register_backend()`` -- Override ``_format_data_to_log()`` to customize field value - sanitization -- Extend ``spp.audit.rule`` with additional logging flags for - domain-specific actions +- Call + ``log_lifecycle_action(model_name, record_id, action, old_values, new_values)`` + to explicitly log state transitions +- Inherit ``spp.audit.backend`` and register new backend types via + ``AuditBackendRegistry.register_backend()`` +- Override ``_format_data_to_log()`` to customize field value + sanitization +- Extend ``spp.audit.rule`` with additional logging flags for + domain-specific actions Dependencies ~~~~~~~~~~~~ diff --git a/spp_audit/static/description/index.html b/spp_audit/static/description/index.html index 56bb0104..8ebf6156 100644 --- a/spp_audit/static/description/index.html +++ b/spp_audit/static/description/index.html @@ -446,7 +446,8 @@

        Configuration

        UI Location

        • Menu: Audit Log > Audit > Rule (configure audit rules)
        • -
        • Menu: Audit Log > Audit > Log (view database-stored audit entries)
        • +
        • Menu: Audit Log > Audit > Log (view database-stored audit +entries)
        • Action: “View logs” action menu appears on audited model forms when is_view_logs enabled
        @@ -464,8 +465,8 @@

        UI Location

        Security

        Model Parsed JSON storage from Excel files
        spp.area.import.language.wizard
        s +pp.area.import.language.wizard Wizard for activating languages during import
        --++ @@ -473,7 +474,8 @@

        Security

        - + diff --git a/spp_banking/README.rst b/spp_banking/README.rst index a16a04c4..1bce3eb5 100644 --- a/spp_banking/README.rst +++ b/spp_banking/README.rst @@ -30,23 +30,22 @@ IBANs using the schwifty library. Extends the standard Odoo Key Capabilities ~~~~~~~~~~~~~~~~ -- Store multiple bank accounts per registrant with account number, bank, - and account type -- Automatically generate IBAN from bank country code, BIC, and account - number -- Display bank details in individual and group registry forms under the - financial section -- Validate and format IBANs according to country-specific standards +- Store multiple bank accounts per registrant with account number, + bank, and account type +- Automatically generate IBAN from bank country code, BIC, and account + number +- Display bank details in individual and group registry forms under the + financial section +- Validate and format IBANs according to country-specific standards Key Models ~~~~~~~~~~ -+----------------------+-----------------------------------------------+ -| Model | Description | -+======================+===============================================+ -| ``res.partner.bank`` | Bank account details with automatic IBAN | -| | computation | -+----------------------+-----------------------------------------------+ ++----------------------+------------------------------------------------------+ +| Model | Description | ++======================+======================================================+ +| ``res.partner.bank`` | Bank account details with automatic IBAN computation | ++----------------------+------------------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -57,12 +56,12 @@ directly to registrant profiles. UI Location ~~~~~~~~~~~ -- **No standalone menu**: Bank account fields are added to existing - registrant forms -- **Individuals**: Navigate to a registrant, view the "Profile" tab, - bank accounts appear in the Financial Information section -- **Groups**: Navigate to a group registrant, view the "Profile" tab, - bank accounts appear in the Financial Information section +- **No standalone menu**: Bank account fields are added to existing + registrant forms +- **Individuals**: Navigate to a registrant, view the "Profile" tab, + bank accounts appear in the Financial Information section +- **Groups**: Navigate to a group registrant, view the "Profile" tab, + bank accounts appear in the Financial Information section Bank accounts are displayed as an editable list with fields for bank, account number, and computed IBAN. @@ -81,10 +80,10 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_account_number()`` in ``res.partner.bank`` to - customize IBAN generation logic -- Inherit ``res.partner.bank`` to add additional banking fields or - validation rules +- Override ``_compute_account_number()`` in ``res.partner.bank`` to + customize IBAN generation logic +- Inherit ``res.partner.bank`` to add additional banking fields or + validation rules Dependencies ~~~~~~~~~~~~ diff --git a/spp_banking/static/description/index.html b/spp_banking/static/description/index.html index 9fa29261..54c150be 100644 --- a/spp_banking/static/description/index.html +++ b/spp_banking/static/description/index.html @@ -377,8 +377,8 @@

        OpenSPP Banking: Bank Details

        Key Capabilities

          -
        • Store multiple bank accounts per registrant with account number, bank, -and account type
        • +
        • Store multiple bank accounts per registrant with account number, +bank, and account type
        • Automatically generate IBAN from bank country code, BIC, and account number
        • Display bank details in individual and group registry forms under the @@ -390,8 +390,8 @@

          Key Capabilities

          Key Models

        Group
        spp_audit.group_audit_manager
        ` +spp_audit.group_audit_manager` Full CRUD on audit rules and logs
        --++ @@ -400,8 +400,7 @@

        Key Models

        - +
        Model
        res.partner.bankBank account details with automatic IBAN -computationBank account details with automatic IBAN computation
        diff --git a/spp_base_common/README.rst b/spp_base_common/README.rst index 85003af2..ac9b13c8 100644 --- a/spp_base_common/README.rst +++ b/spp_base_common/README.rst @@ -31,31 +31,32 @@ validation rules and UI theming across the platform. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define configurable phone validation rules with digit count and prefix - requirements -- Automatically validate phone numbers on create/write against active - validation rules -- Customize menu icons for Registry, Apps, Settings, and standard Odoo - modules -- Configure global and local registrar user roles with implied - permissions -- Auto-populate partner phone field from structured phone number records +- Define configurable phone validation rules with digit count and + prefix requirements +- Automatically validate phone numbers on create/write against active + validation rules +- Customize menu icons for Registry, Apps, Settings, and standard Odoo + modules +- Configure global and local registrar user roles with implied + permissions +- Auto-populate partner phone field from structured phone number + records Key Models ~~~~~~~~~~ -+--------------------------+-------------------------------------------+ -| Model | Description | -+==========================+===========================================+ -| ``spp.phone.validation`` | Configurable phone validation rule | -| | (prefix, digits) | -+--------------------------+-------------------------------------------+ ++--------------------------+------------------------------------------+ +| Model | Description | ++==========================+==========================================+ +| ``spp.phone.validation`` | Configurable phone validation rule | +| | (prefix, digits) | ++--------------------------+------------------------------------------+ **Extensions:** -- ``spp.phone.number`` - Adds automatic validation on save -- ``res.partner`` - Adds phone auto-population from phone_number_ids -- ``ir.module.module`` - Adds menu icon update on module install +- ``spp.phone.number`` - Adds automatic validation on save +- ``res.partner`` - Adds phone auto-population from phone_number_ids +- ``ir.module.module`` - Adds menu icon update on module install Configuration ~~~~~~~~~~~~~ @@ -75,10 +76,10 @@ UI Location **No standalone menu.** Phone validation configuration is accessible through: -- Technical views (debug mode) via Settings > Technical > Database - Structure > Models -- Registry main menu gets custom OpenSPP icon -- Apps and Settings menus get custom OpenSPP icons +- Technical views (debug mode) via Settings > Technical > Database + Structure > Models +- Registry main menu gets custom OpenSPP icon +- Apps and Settings menus get custom OpenSPP icons Security ~~~~~~~~ @@ -99,12 +100,12 @@ Additional access rules grant registry groups appropriate permissions on Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_onchange_phone_validation()`` in ``spp.phone.number`` to - customize validation logic -- Extend ``ICON_MAP`` in ``ir.module.module`` to add menu icons for - additional modules -- Inherit global/local role definitions in ``data/global_roles.xml`` and - ``data/local_roles.xml`` +- Override ``_onchange_phone_validation()`` in ``spp.phone.number`` to + customize validation logic +- Extend ``ICON_MAP`` in ``ir.module.module`` to add menu icons for + additional modules +- Inherit global/local role definitions in ``data/global_roles.xml`` + and ``data/local_roles.xml`` Dependencies ~~~~~~~~~~~~ diff --git a/spp_base_common/static/description/index.html b/spp_base_common/static/description/index.html index 86400136..e0a0c871 100644 --- a/spp_base_common/static/description/index.html +++ b/spp_base_common/static/description/index.html @@ -378,15 +378,16 @@

        OpenSPP Base (Common)

        Key Capabilities

          -
        • Define configurable phone validation rules with digit count and prefix -requirements
        • +
        • Define configurable phone validation rules with digit count and +prefix requirements
        • Automatically validate phone numbers on create/write against active validation rules
        • Customize menu icons for Registry, Apps, Settings, and standard Odoo modules
        • Configure global and local registrar user roles with implied permissions
        • -
        • Auto-populate partner phone field from structured phone number records
        • +
        • Auto-populate partner phone field from structured phone number +records
        @@ -476,8 +477,8 @@

        Extension Points

        customize validation logic
      • Extend ICON_MAP in ir.module.module to add menu icons for additional modules
      • -
      • Inherit global/local role definitions in data/global_roles.xml and -data/local_roles.xml
      • +
      • Inherit global/local role definitions in data/global_roles.xml +and data/local_roles.xml
      • diff --git a/spp_base_setting/README.rst b/spp_base_setting/README.rst index 2e09ac78..e22e6d16 100644 --- a/spp_base_setting/README.rst +++ b/spp_base_setting/README.rst @@ -32,13 +32,13 @@ deployments. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define Country Offices as administrative units using company records - with custom form and list views -- Organize hierarchical office structures through parent-child company - relationships -- Expose user and group management in the Registry configuration menu -- Provide standardized Country Office form including address, contact - details, currency, and branding +- Define Country Offices as administrative units using company records + with custom form and list views +- Organize hierarchical office structures through parent-child company + relationships +- Expose user and group management in the Registry configuration menu +- Provide standardized Country Office form including address, contact + details, currency, and branding Key Models ~~~~~~~~~~ @@ -66,19 +66,19 @@ After installing: UI Location ~~~~~~~~~~~ -- **User Management**: Registry > Configuration > Users -- **Group Management**: Registry > Configuration > Groups (system admins - only, ``base.group_no_one``) -- **Country Offices**: No standalone menu; accessed via - ``action_res_country_office`` action or Settings +- **User Management**: Registry > Configuration > Users +- **Group Management**: Registry > Configuration > Groups (system + admins only, ``base.group_no_one``) +- **Country Offices**: No standalone menu; accessed via + ``action_res_country_office`` action or Settings Form Views ~~~~~~~~~~ The Country Office form (``view_country_office_form``) includes one tab: -- **General Information**: Address fields, phone, email, website, VAT, - currency, and parent office +- **General Information**: Address fields, phone, email, website, VAT, + currency, and parent office Security ~~~~~~~~ @@ -87,19 +87,19 @@ This module does not define custom security groups. Access to Country Office management and user/group configuration follows standard Odoo security rules: -- User management requires standard Odoo access rights -- Group management restricted to ``base.group_no_one`` (system admins) -- Country Office (company) records follow ``res.company`` access rules +- User management requires standard Odoo access rights +- Group management restricted to ``base.group_no_one`` (system admins) +- Country Office (company) records follow ``res.company`` access rules Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``res.company`` to add Country Office-specific fields (e.g., - office codes, regional metadata) -- Override ``view_country_office_form`` to customize the Country Office - form layout -- Extend the "social_media" placeholder group in the Country Office form - to add social media fields +- Inherit ``res.company`` to add Country Office-specific fields (e.g., + office codes, regional metadata) +- Override ``view_country_office_form`` to customize the Country Office + form layout +- Extend the "social_media" placeholder group in the Country Office + form to add social media fields Dependencies ~~~~~~~~~~~~ diff --git a/spp_base_setting/static/description/index.html b/spp_base_setting/static/description/index.html index 5d015718..a652a27d 100644 --- a/spp_base_setting/static/description/index.html +++ b/spp_base_setting/static/description/index.html @@ -429,8 +429,8 @@

        Configuration

        UI Location

        • User Management: Registry > Configuration > Users
        • -
        • Group Management: Registry > Configuration > Groups (system admins -only, base.group_no_one)
        • +
        • Group Management: Registry > Configuration > Groups (system +admins only, base.group_no_one)
        • Country Offices: No standalone menu; accessed via action_res_country_office action or Settings
        @@ -461,8 +461,8 @@

        Extension Points

        office codes, regional metadata)
      • Override view_country_office_form to customize the Country Office form layout
      • -
      • Extend the “social_media” placeholder group in the Country Office form -to add social media fields
      • +
      • Extend the “social_media” placeholder group in the Country Office +form to add social media fields
      • diff --git a/spp_branding_kit/README.rst b/spp_branding_kit/README.rst index 4c61d197..187a841d 100644 --- a/spp_branding_kit/README.rst +++ b/spp_branding_kit/README.rst @@ -31,41 +31,41 @@ system messages, email signatures, and report footers. Works with Key Capabilities ~~~~~~~~~~~~~~~~ -- URL routing: ``/openspp/programs/123`` works as an alias for - ``/odoo/programs/123`` -- Telemetry control: redirect to OpenSPP endpoint or disable entirely - via configuration -- Session branding: injects OpenSPP system name and version into web - client session -- Email signatures: replaces default Odoo signature with OpenSPP - branding -- Report customization: updates company report headers and footers with - OpenSPP text -- Post-install debranding: disables Odoo brand promotion messages, - update notification crons, and theme store menu -- Module filtering: adds "OpenSPP Apps" menu to filter and view - OpenSPP-specific applications +- URL routing: ``/openspp/programs/123`` works as an alias for + ``/odoo/programs/123`` +- Telemetry control: redirect to OpenSPP endpoint or disable entirely + via configuration +- Session branding: injects OpenSPP system name and version into web + client session +- Email signatures: replaces default Odoo signature with OpenSPP + branding +- Report customization: updates company report headers and footers with + OpenSPP text +- Post-install debranding: disables Odoo brand promotion messages, + update notification crons, and theme store menu +- Module filtering: adds "OpenSPP Apps" menu to filter and view + OpenSPP-specific applications Key Models ~~~~~~~~~~ This module does not introduce new models. It extends existing models: -+-------------------------+--------------------------------------------+ -| Model | Extension Purpose | -+=========================+============================================+ -| ``res.users`` | Custom email signature, removes Odoo | -| | account URL | -+-------------------------+--------------------------------------------+ -| ``res.config.settings`` | Adds branding and telemetry configuration | -| | fields | -+-------------------------+--------------------------------------------+ -| ``ir.http`` | Injects OpenSPP branding into web client | -| | session info | -+-------------------------+--------------------------------------------+ -| ``ir.module.module`` | Provides utility to count paid/proprietary | -| | apps | -+-------------------------+--------------------------------------------+ ++-------------------------+-------------------------------------------+ +| Model | Extension Purpose | ++=========================+===========================================+ +| ``res.users`` | Custom email signature, removes Odoo | +| | account URL | ++-------------------------+-------------------------------------------+ +| ``res.config.settings`` | Adds branding and telemetry configuration | +| | fields | ++-------------------------+-------------------------------------------+ +| ``ir.http`` | Injects OpenSPP branding into web client | +| | session info | ++-------------------------+-------------------------------------------+ +| ``ir.module.module`` | Provides utility to count | +| | paid/proprietary apps | ++-------------------------+-------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -89,8 +89,8 @@ update notifications, and theme store menu. Menu Location ~~~~~~~~~~~~~ -- **Apps > OpenSPP Apps** - View and filter OpenSPP-specific - applications +- **Apps > OpenSPP Apps** - View and filter OpenSPP-specific + applications Security ~~~~~~~~ @@ -102,14 +102,14 @@ Configuration access follows standard Odoo settings permissions Extension Points ~~~~~~~~~~~~~~~~ -- Override ``get_branding_config(env)`` in ``utils.py`` to customize - branding data injected into session -- Inherit ``res.users`` to further customize email signatures or user - menu elements -- Inherit ``ir.http.session_info()`` to add custom branding keys to web - client session -- Patch JavaScript router in ``static/src/js/router_patch.js`` to - customize URL prefix beyond ``/openspp`` +- Override ``get_branding_config(env)`` in ``utils.py`` to customize + branding data injected into session +- Inherit ``res.users`` to further customize email signatures or user + menu elements +- Inherit ``ir.http.session_info()`` to add custom branding keys to web + client session +- Patch JavaScript router in ``static/src/js/router_patch.js`` to + customize URL prefix beyond ``/openspp`` Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_base/README.rst b/spp_case_base/README.rst index 0dacf2ba..e3b04d0b 100644 --- a/spp_case_base/README.rst +++ b/spp_case_base/README.rst @@ -30,57 +30,58 @@ scheduling via cron job ensures timely case monitoring. Key Capabilities ~~~~~~~~~~~~~~~~ -- Track cases for individuals, households, or groups with configurable - types and workflow stages -- Conduct assessments with risk scoring (0-100) and automatic risk level - classification (low/medium/high/critical) -- Create versioned intervention plans with approval workflows and - progress tracking -- Document case activities: visits, notes, referrals to external - services -- Assign cases to workers and teams with supervisor oversight -- Schedule automated review reminders for cases approaching or past - review dates +- Track cases for individuals, households, or groups with configurable + types and workflow stages +- Conduct assessments with risk scoring (0-100) and automatic risk + level classification (low/medium/high/critical) +- Create versioned intervention plans with approval workflows and + progress tracking +- Document case activities: visits, notes, referrals to external + services +- Assign cases to workers and teams with supervisor oversight +- Schedule automated review reminders for cases approaching or past + review dates Key Models ~~~~~~~~~~ -+--------------------------------+-------------------------------------+ -| Model | Description | -+================================+=====================================+ -| ``spp.case`` | Core case record with client and | -| | assignment | -+--------------------------------+-------------------------------------+ -| ``spp.case.type`` | Case type with default intensity | -| | and caseload | -+--------------------------------+-------------------------------------+ -| ``spp.case.stage`` | Workflow stage with phase and | -| | requirements | -+--------------------------------+-------------------------------------+ -| ``spp.case.assessment`` | Assessment with risk score and | -| | findings | -+--------------------------------+-------------------------------------+ -| ``spp.case.intervention.plan`` | Versioned plan with approval | -| | workflow | -+--------------------------------+-------------------------------------+ -| ``spp.case.intervention`` | Individual intervention with status | -| | tracking | -+--------------------------------+-------------------------------------+ -| ``spp.case.visit`` | Client visit with type and notes | -+--------------------------------+-------------------------------------+ -| ``spp.case.note`` | Case note with confidentiality flag | -+--------------------------------+-------------------------------------+ -| ``spp.case.referral`` | External service referral with | -| | status | -+--------------------------------+-------------------------------------+ -| ``spp.case.team`` | Team with supervisor and members | -+--------------------------------+-------------------------------------+ -| ``spp.case.risk.factor`` | Risk factor with severity weight | -+--------------------------------+-------------------------------------+ -| ``spp.case.vulnerability`` | Vulnerability for assessment | -+--------------------------------+-------------------------------------+ -| ``spp.case.closure.reason`` | Closure reason with outcome type | -+--------------------------------+-------------------------------------+ ++--------------------------------+------------------------------------+ +| Model | Description | ++================================+====================================+ +| ``spp.case`` | Core case record with client and | +| | assignment | ++--------------------------------+------------------------------------+ +| ``spp.case.type`` | Case type with default intensity | +| | and caseload | ++--------------------------------+------------------------------------+ +| ``spp.case.stage`` | Workflow stage with phase and | +| | requirements | ++--------------------------------+------------------------------------+ +| ``spp.case.assessment`` | Assessment with risk score and | +| | findings | ++--------------------------------+------------------------------------+ +| ``spp.case.intervention.plan`` | Versioned plan with approval | +| | workflow | ++--------------------------------+------------------------------------+ +| ``spp.case.intervention`` | Individual intervention with | +| | status tracking | ++--------------------------------+------------------------------------+ +| ``spp.case.visit`` | Client visit with type and notes | ++--------------------------------+------------------------------------+ +| ``spp.case.note`` | Case note with confidentiality | +| | flag | ++--------------------------------+------------------------------------+ +| ``spp.case.referral`` | External service referral with | +| | status | ++--------------------------------+------------------------------------+ +| ``spp.case.team`` | Team with supervisor and members | ++--------------------------------+------------------------------------+ +| ``spp.case.risk.factor`` | Risk factor with severity weight | ++--------------------------------+------------------------------------+ +| ``spp.case.vulnerability`` | Vulnerability for assessment | ++--------------------------------+------------------------------------+ +| ``spp.case.closure.reason`` | Closure reason with outcome type | ++--------------------------------+------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -105,15 +106,15 @@ After installing: UI Location ~~~~~~~~~~~ -- **Cases**: Case Management > Cases > All Cases / My Cases / Unassigned - Cases -- **Activities**: Case Management > Activities > Visits / Notes / - Referrals / Assessments -- **Planning**: Case Management > Planning > Intervention Plans / - Interventions -- **Configuration**: Case Management > Configuration (Manager role - required) -- **Form tabs**: Details, Participants, Programs, History +- **Cases**: Case Management > Cases > All Cases / My Cases / + Unassigned Cases +- **Activities**: Case Management > Activities > Visits / Notes / + Referrals / Assessments +- **Planning**: Case Management > Planning > Intervention Plans / + Interventions +- **Configuration**: Case Management > Configuration (Manager role + required) +- **Form tabs**: Details, Participants, Programs, History Security ~~~~~~~~ @@ -130,13 +131,13 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_check_stage_requirements()`` on ``spp.case`` for custom - stage validation -- Override ``_compute_risk_level()`` on ``spp.case.assessment`` to - customize risk calculation thresholds -- Extend ``spp.case.intervention.plan`` with domain-specific fields -- Hook ``_cron_check_reviews()`` to add custom review logic or - notification templates +- Override ``_check_stage_requirements()`` on ``spp.case`` for custom + stage validation +- Override ``_compute_risk_level()`` on ``spp.case.assessment`` to + customize risk calculation thresholds +- Extend ``spp.case.intervention.plan`` with domain-specific fields +- Hook ``_cron_check_reviews()`` to add custom review logic or + notification templates Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_base/static/description/index.html b/spp_case_base/static/description/index.html index 135d3408..8a4ce5a2 100644 --- a/spp_case_base/static/description/index.html +++ b/spp_case_base/static/description/index.html @@ -379,8 +379,8 @@

        Key Capabilities

        • Track cases for individuals, households, or groups with configurable types and workflow stages
        • -
        • Conduct assessments with risk scoring (0-100) and automatic risk level -classification (low/medium/high/critical)
        • +
        • Conduct assessments with risk scoring (0-100) and automatic risk +level classification (low/medium/high/critical)
        • Create versioned intervention plans with approval workflows and progress tracking
        • Document case activities: visits, notes, referrals to external @@ -394,8 +394,8 @@

          Key Capabilities

          Key Models

          --++ @@ -424,14 +424,15 @@

          Key Models

          workflow - + - +
          Model
          spp.case.interventionIndividual intervention with status -trackingIndividual intervention with +status tracking
          spp.case.visit Client visit with type and notes
          spp.case.noteCase note with confidentiality flagCase note with confidentiality +flag
          spp.case.referral External service referral with @@ -475,8 +476,8 @@

          Configuration

          UI Location

            -
          • Cases: Case Management > Cases > All Cases / My Cases / Unassigned -Cases
          • +
          • Cases: Case Management > Cases > All Cases / My Cases / +Unassigned Cases
          • Activities: Case Management > Activities > Visits / Notes / Referrals / Assessments
          • Planning: Case Management > Planning > Intervention Plans / diff --git a/spp_case_cel/README.rst b/spp_case_cel/README.rst index 93baf8fb..5dd3bc58 100644 --- a/spp_case_cel/README.rst +++ b/spp_case_cel/README.rst @@ -30,32 +30,32 @@ cases to workers or teams based on workload balancing. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define triage rules that automatically categorize cases by intensity - level, priority, and type based on CEL conditions -- Add risk factors and vulnerabilities automatically when triage rules - match -- Define assignment rules that route cases to specific teams, workers, - or supervisors -- Balance workload by assigning to team members with lowest active - caseload -- Track rule effectiveness with match counters -- Evaluate rules in sequence order with first-match wins +- Define triage rules that automatically categorize cases by intensity + level, priority, and type based on CEL conditions +- Add risk factors and vulnerabilities automatically when triage rules + match +- Define assignment rules that route cases to specific teams, workers, + or supervisors +- Balance workload by assigning to team members with lowest active + caseload +- Track rule effectiveness with match counters +- Evaluate rules in sequence order with first-match wins Key Models ~~~~~~~~~~ -+------------------------------+---------------------------------------+ -| Model | Description | -+==============================+=======================================+ -| ``spp.case.triage.rule`` | CEL-based rule for automatic case | -| | categorization and risk tagging | -+------------------------------+---------------------------------------+ -| ``spp.case.assignment.rule`` | CEL-based rule for automatic case | -| | assignment with workload balancing | -+------------------------------+---------------------------------------+ -| ``spp.case`` | Extended to apply triage and | -| | assignment rules on creation | -+------------------------------+---------------------------------------+ ++------------------------------+--------------------------------------+ +| Model | Description | ++==============================+======================================+ +| ``spp.case.triage.rule`` | CEL-based rule for automatic case | +| | categorization and risk tagging | ++------------------------------+--------------------------------------+ +| ``spp.case.assignment.rule`` | CEL-based rule for automatic case | +| | assignment with workload balancing | ++------------------------------+--------------------------------------+ +| ``spp.case`` | Extended to apply triage and | +| | assignment rules on creation | ++------------------------------+--------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -74,12 +74,12 @@ After installing: UI Location ~~~~~~~~~~~ -- **Triage Rules**: Case Management > Configuration > CEL Rules > Triage - Rules -- **Assignment Rules**: Case Management > Configuration > CEL Rules > - Assignment Rules -- **Form Tabs (Triage)**: Condition, Actions -- **Form Tabs (Assignment)**: Condition, Assignment +- **Triage Rules**: Case Management > Configuration > CEL Rules > + Triage Rules +- **Assignment Rules**: Case Management > Configuration > CEL Rules > + Assignment Rules +- **Form Tabs (Triage)**: Condition, Actions +- **Form Tabs (Assignment)**: Condition, Assignment Security ~~~~~~~~ @@ -94,13 +94,13 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``spp.case.triage.rule._build_evaluation_context()`` to add - custom variables for triage conditions -- Override ``spp.case.assignment.rule._build_evaluation_context()`` to - add custom variables for assignment conditions -- Override - ``spp.case.assignment.rule._get_worker_with_lowest_caseload()`` to - customize workload calculation +- Override ``spp.case.triage.rule._build_evaluation_context()`` to add + custom variables for triage conditions +- Override ``spp.case.assignment.rule._build_evaluation_context()`` to + add custom variables for assignment conditions +- Override + ``spp.case.assignment.rule._get_worker_with_lowest_caseload()`` to + customize workload calculation Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_cel/static/description/index.html b/spp_case_cel/static/description/index.html index 85416fbc..591399a7 100644 --- a/spp_case_cel/static/description/index.html +++ b/spp_case_cel/static/description/index.html @@ -393,8 +393,8 @@

            Key Capabilities

            Key Models

            --++ @@ -434,8 +434,8 @@

            Configuration

            UI Location

              -
            • Triage Rules: Case Management > Configuration > CEL Rules > Triage -Rules
            • +
            • Triage Rules: Case Management > Configuration > CEL Rules > +Triage Rules
            • Assignment Rules: Case Management > Configuration > CEL Rules > Assignment Rules
            • Form Tabs (Triage): Condition, Actions
            • diff --git a/spp_case_demo/README.rst b/spp_case_demo/README.rst index af487498..64b25595 100644 --- a/spp_case_demo/README.rst +++ b/spp_case_demo/README.rst @@ -30,35 +30,35 @@ plus configurable random case generation for volume testing. Key Capabilities ~~~~~~~~~~~~~~~~ -- Generate 9 fixed demo stories with predictable personas and case - progressions for consistent training scenarios -- Create random volume cases with configurable distribution percentages - for plans, visits, notes, and closures -- Link generated cases to existing registrants or create standalone - cases -- Backdate case records and related activities to simulate realistic - timelines over configurable day ranges -- Create intervention plans with multiple interventions across case - lifecycle stages -- Generate home visits, office visits, phone calls, and virtual visits - with contextual notes -- Install default case types (General Support, Emergency Assistance, - Child Protection, Health Support, Livelihood Development, Housing - Assistance) and case stages (Intake, Assessment, Planning, - Implementation, Monitoring, Closure) +- Generate 9 fixed demo stories with predictable personas and case + progressions for consistent training scenarios +- Create random volume cases with configurable distribution percentages + for plans, visits, notes, and closures +- Link generated cases to existing registrants or create standalone + cases +- Backdate case records and related activities to simulate realistic + timelines over configurable day ranges +- Create intervention plans with multiple interventions across case + lifecycle stages +- Generate home visits, office visits, phone calls, and virtual visits + with contextual notes +- Install default case types (General Support, Emergency Assistance, + Child Protection, Health Support, Livelihood Development, Housing + Assistance) and case stages (Intake, Assessment, Planning, + Implementation, Monitoring, Closure) Key Models ~~~~~~~~~~ -+-----------------------------+----------------------------------------+ -| Model | Description | -+=============================+========================================+ -| ``spp.case.demo.generator`` | Core logic for configuring and | -| | generating demo data | -+-----------------------------+----------------------------------------+ -| ``spp.case.demo.wizard`` | Wizard interface for demo data | -| | generation (inherits generator) | -+-----------------------------+----------------------------------------+ ++-----------------------------+---------------------------------------+ +| Model | Description | ++=============================+=======================================+ +| ``spp.case.demo.generator`` | Core logic for configuring and | +| | generating demo data | ++-----------------------------+---------------------------------------+ +| ``spp.case.demo.wizard`` | Wizard interface for demo data | +| | generation (inherits generator) | ++-----------------------------+---------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -68,13 +68,13 @@ After installing: 1. Navigate to **Case Management > Configuration > Generate Demo Data** 2. Configure generation parameters: - - Number of cases to generate (1-5,000) - - Days back to distribute cases over - - Enable "Include Demo Stories" to create 9 fixed personas - - Set distribution percentages for plans, visits, notes, and closed - cases - - Choose locale origin for Faker data generation - - Select whether to link cases to existing beneficiaries + - Number of cases to generate (1-5,000) + - Days back to distribute cases over + - Enable "Include Demo Stories" to create 9 fixed personas + - Set distribution percentages for plans, visits, notes, and closed + cases + - Choose locale origin for Faker data generation + - Select whether to link cases to existing beneficiaries 3. Click "Generate Cases" to create demo data 4. View generated cases in Case Management > Cases (filtered by @@ -83,8 +83,8 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Case Management > Configuration > Generate Demo Data -- **Generated Cases**: View results in Case Management > Cases +- **Menu**: Case Management > Configuration > Generate Demo Data +- **Generated Cases**: View results in Case Management > Cases Security ~~~~~~~~ @@ -100,23 +100,23 @@ Demo Stories When "Include Demo Stories" is enabled, generates 9 fixed personas: -- **Santos Family Support**: Complete case lifecycle from intake to - successful closure -- **Dela Cruz Emergency Response**: High intensity urgent case with - same-day response -- **Garcia Elder Care Coordination**: Long-term care case with service - referrals -- **Mendoza Child Welfare**: Child protection case with safety - assessments and frequent visits -- **Hassan Resettlement Support**: Displaced person case escalated from - GRM -- **Morales Household Crisis**: Multi-member household identified during - outreach -- **Martinez Disability Support**: Disability-focused case with - equipment and education services -- **Al-Rahman Family Assessment**: GRM-initiated assessment leading to - program enrollment -- **Said Family Support**: Pattern detection from repeat GRM tickets +- **Santos Family Support**: Complete case lifecycle from intake to + successful closure +- **Dela Cruz Emergency Response**: High intensity urgent case with + same-day response +- **Garcia Elder Care Coordination**: Long-term care case with service + referrals +- **Mendoza Child Welfare**: Child protection case with safety + assessments and frequent visits +- **Hassan Resettlement Support**: Displaced person case escalated from + GRM +- **Morales Household Crisis**: Multi-member household identified + during outreach +- **Martinez Disability Support**: Disability-focused case with + equipment and education services +- **Al-Rahman Family Assessment**: GRM-initiated assessment leading to + program enrollment +- **Said Family Support**: Pattern detection from repeat GRM tickets Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_demo/static/description/index.html b/spp_case_demo/static/description/index.html index b2131a12..d4fefc8d 100644 --- a/spp_case_demo/static/description/index.html +++ b/spp_case_demo/static/description/index.html @@ -399,8 +399,8 @@

              Key Capabilities

              Key Models

            Model
            --++ @@ -479,8 +479,8 @@

            Demo Stories

            assessments and frequent visits
          • Hassan Resettlement Support: Displaced person case escalated from GRM
          • -
          • Morales Household Crisis: Multi-member household identified during -outreach
          • +
          • Morales Household Crisis: Multi-member household identified +during outreach
          • Martinez Disability Support: Disability-focused case with equipment and education services
          • Al-Rahman Family Assessment: GRM-initiated assessment leading to diff --git a/spp_case_entitlements/README.rst b/spp_case_entitlements/README.rst index 5fe10e1e..1d265394 100644 --- a/spp_case_entitlements/README.rst +++ b/spp_case_entitlements/README.rst @@ -30,24 +30,23 @@ Auto-loads beneficiary entitlements when partner is selected. Key Capabilities ~~~~~~~~~~~~~~~~ -- Link multiple entitlements to a case via many2many relationship -- Auto-populate entitlements when case partner is selected -- Compute entitlement statistics: total count, approved count, pending - count, total value -- Filter entitlements by state (all, approved, pending) via dedicated - action methods -- Display entitlement counts and status in list, kanban, and form views -- Search and group cases by entitlement status +- Link multiple entitlements to a case via many2many relationship +- Auto-populate entitlements when case partner is selected +- Compute entitlement statistics: total count, approved count, pending + count, total value +- Filter entitlements by state (all, approved, pending) via dedicated + action methods +- Display entitlement counts and status in list, kanban, and form views +- Search and group cases by entitlement status Extended Models ~~~~~~~~~~~~~~~ -+--------------+-------------------------------------------------------+ -| Model | Description | -+==============+=======================================================+ -| ``spp.case`` | Extended with entitlement relationships and computed | -| | metrics | -+--------------+-------------------------------------------------------+ ++--------------+--------------------------------------------------------------+ +| Model | Description | ++==============+==============================================================+ +| ``spp.case`` | Extended with entitlement relationships and computed metrics | ++--------------+--------------------------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -58,16 +57,16 @@ No configuration required. The module auto-installs when both UI Location ~~~~~~~~~~~ -- **Menu**: Case Management > Cases > All Cases -- **Smart Buttons**: Case form header displays total, approved, and - pending entitlement counts -- **Tab**: "Entitlements" tab on case form with summary statistics and - entitlement list -- **List Columns**: Entitlement count and approved count appear in case - list view -- **Kanban Icons**: Entitlement indicators appear in case kanban cards -- **Search Filters**: "Has Entitlements", "No Entitlements", "Has - Approved Entitlements", "Has Pending Entitlements" +- **Menu**: Case Management > Cases > All Cases +- **Smart Buttons**: Case form header displays total, approved, and + pending entitlement counts +- **Tab**: "Entitlements" tab on case form with summary statistics and + entitlement list +- **List Columns**: Entitlement count and approved count appear in case + list view +- **Kanban Icons**: Entitlement indicators appear in case kanban cards +- **Search Filters**: "Has Entitlements", "No Entitlements", "Has + Approved Entitlements", "Has Pending Entitlements" Security ~~~~~~~~ @@ -82,14 +81,14 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_entitlement_info()`` to customize entitlement - statistics or add domain-specific calculations -- Override ``_onchange_partner_entitlements()`` to filter which - entitlements auto-populate based on case criteria -- Inherit ``action_view_entitlements()``, - ``action_view_approved_entitlements()``, or - ``action_view_pending_entitlements()`` to modify entitlement list - views or add filtering logic +- Override ``_compute_entitlement_info()`` to customize entitlement + statistics or add domain-specific calculations +- Override ``_onchange_partner_entitlements()`` to filter which + entitlements auto-populate based on case criteria +- Inherit ``action_view_entitlements()``, + ``action_view_approved_entitlements()``, or + ``action_view_pending_entitlements()`` to modify entitlement list + views or add filtering logic Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_entitlements/static/description/index.html b/spp_case_entitlements/static/description/index.html index 963d26a6..c281957d 100644 --- a/spp_case_entitlements/static/description/index.html +++ b/spp_case_entitlements/static/description/index.html @@ -391,8 +391,8 @@

            Key Capabilities

            Extended Models

          • Model
            --++ @@ -401,8 +401,7 @@

            Extended Models

            - +
            Model
            spp.caseExtended with entitlement relationships and computed -metricsExtended with entitlement relationships and computed metrics
            diff --git a/spp_case_graduation/README.rst b/spp_case_graduation/README.rst index 38aa7503..fad56e5b 100644 --- a/spp_case_graduation/README.rst +++ b/spp_case_graduation/README.rst @@ -31,25 +31,25 @@ case lifecycle. Key Capabilities ~~~~~~~~~~~~~~~~ -- Link graduation assessments to cases for centralized exit tracking -- Compute graduation status from assessment state and recommendations -- Display readiness scores and assessment counts on case records -- Create new graduation assessments directly from case forms -- View full assessment history with state, pathway, and scores +- Link graduation assessments to cases for centralized exit tracking +- Compute graduation status from assessment state and recommendations +- Display readiness scores and assessment counts on case records +- Create new graduation assessments directly from case forms +- View full assessment history with state, pathway, and scores Key Models ~~~~~~~~~~ This module extends existing models without introducing new ones: -+-------------------------------+--------------------------------------+ -| Model | Extension | -+===============================+======================================+ -| ``spp.case`` | Adds graduation assessment tracking | -| | and computed status fields | -+-------------------------------+--------------------------------------+ -| ``spp.graduation.assessment`` | Adds case linkage field | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Extension | ++===============================+=====================================+ +| ``spp.case`` | Adds graduation assessment tracking | +| | and computed status fields | ++-------------------------------+-------------------------------------+ +| ``spp.graduation.assessment`` | Adds case linkage field | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -60,13 +60,13 @@ extends case and graduation assessment forms. UI Location ~~~~~~~~~~~ -- **Cases**: Navigate to a case record. The "Graduation" tab displays - assessment history, status, and readiness score. A stat button in the - button box shows assessment count. -- **Assessments**: Graduation assessment forms include a case field for - linking to case records. -- **Actions**: Use "New Assessment" button on case graduation tab to - create assessments with pre-filled case and partner context. +- **Cases**: Navigate to a case record. The "Graduation" tab displays + assessment history, status, and readiness score. A stat button in the + button box shows assessment count. +- **Assessments**: Graduation assessment forms include a case field for + linking to case records. +- **Actions**: Use "New Assessment" button on case graduation tab to + create assessments with pre-filled case and partner context. Security ~~~~~~~~ @@ -74,17 +74,17 @@ Security This module does not introduce new security groups. Access to graduation features within cases follows the security model of the parent modules: -- Case access governed by ``spp_case_base`` security groups -- Graduation assessment access governed by ``spp_graduation`` security - groups +- Case access governed by ``spp_case_base`` security groups +- Graduation assessment access governed by ``spp_graduation`` security + groups Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_graduation_stats()`` on ``spp.case`` to customize - graduation status logic or add domain-specific readiness calculations -- Inherit ``spp.case`` to add fields that influence graduation decisions - or extend the status selection +- Override ``_compute_graduation_stats()`` on ``spp.case`` to customize + graduation status logic or add domain-specific readiness calculations +- Inherit ``spp.case`` to add fields that influence graduation + decisions or extend the status selection Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_graduation/static/description/index.html b/spp_case_graduation/static/description/index.html index 728b147a..c6087890 100644 --- a/spp_case_graduation/static/description/index.html +++ b/spp_case_graduation/static/description/index.html @@ -390,8 +390,8 @@

            Key Models

            This module extends existing models without introducing new ones:

            --++ @@ -441,8 +441,8 @@

            Extension Points

            • Override _compute_graduation_stats() on spp.case to customize graduation status logic or add domain-specific readiness calculations
            • -
            • Inherit spp.case to add fields that influence graduation decisions -or extend the status selection
            • +
            • Inherit spp.case to add fields that influence graduation +decisions or extend the status selection
            diff --git a/spp_case_programs/README.rst b/spp_case_programs/README.rst index 554552b5..5c041aca 100644 --- a/spp_case_programs/README.rst +++ b/spp_case_programs/README.rst @@ -31,28 +31,28 @@ status fields. Auto-installs when both ``spp_case_base`` and Key Capabilities ~~~~~~~~~~~~~~~~ -- Link cases to program enrollments via ``program_membership_ids`` - Many2many relationship -- Track which program triggered case creation via - ``triggered_by_program_id`` field -- Automatically load client program memberships on partner selection -- Compute enrollment status: active enrollment flag, enrollment count, - enrolled program names -- Filter and group cases by enrollment status and triggering program -- View program enrollment details directly from case form +- Link cases to program enrollments via ``program_membership_ids`` + Many2many relationship +- Track which program triggered case creation via + ``triggered_by_program_id`` field +- Automatically load client program memberships on partner selection +- Compute enrollment status: active enrollment flag, enrollment count, + enrolled program names +- Filter and group cases by enrollment status and triggering program +- View program enrollment details directly from case form Key Models ~~~~~~~~~~ This module extends existing models and does not introduce new ones. -+--------------+-------------------------------------------------------+ -| Model | Extension | -+==============+=======================================================+ -| ``spp.case`` | Adds ``program_membership_ids``, | -| | ``triggered_by_program_id``, and computed enrollment | -| | fields | -+--------------+-------------------------------------------------------+ ++--------------+------------------------------------------------------+ +| Model | Extension | ++==============+======================================================+ +| ``spp.case`` | Adds ``program_membership_ids``, | +| | ``triggered_by_program_id``, and computed enrollment | +| | fields | ++--------------+------------------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -66,19 +66,19 @@ UI Location This module extends the existing case form view. No standalone menus are added. -- **Form View**: Accessed via existing case management. Adds Programs - tab, smart button, and header field. -- **Programs Tab**: Displays enrollment summary (has_active_enrollment, - active_program_count, enrolled_program_names) and membership list with - state badges -- **Smart Button**: Programs count button (visible when - active_program_count > 0) -- **Header Field**: "Triggered By Program" field appears after priority -- **Search Filters**: "Has Active Enrollment", "No Active Enrollment", - "Triggered by Program" -- **List View**: Active program count column -- **Kanban View**: Program enrollment icon and count in bottom-left - corner +- **Form View**: Accessed via existing case management. Adds Programs + tab, smart button, and header field. +- **Programs Tab**: Displays enrollment summary (has_active_enrollment, + active_program_count, enrolled_program_names) and membership list + with state badges +- **Smart Button**: Programs count button (visible when + active_program_count > 0) +- **Header Field**: "Triggered By Program" field appears after priority +- **Search Filters**: "Has Active Enrollment", "No Active Enrollment", + "Triggered by Program" +- **List View**: Active program count column +- **Kanban View**: Program enrollment icon and count in bottom-left + corner Security ~~~~~~~~ @@ -93,12 +93,12 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_program_info()`` to customize enrollment status - computation logic -- Override ``_onchange_partner_programs()`` to filter which memberships - load automatically -- Inherit ``spp.case`` to add additional program-related fields or - methods +- Override ``_compute_program_info()`` to customize enrollment status + computation logic +- Override ``_onchange_partner_programs()`` to filter which memberships + load automatically +- Inherit ``spp.case`` to add additional program-related fields or + methods Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_programs/static/description/index.html b/spp_case_programs/static/description/index.html index a6bcf4f5..c03ba12f 100644 --- a/spp_case_programs/static/description/index.html +++ b/spp_case_programs/static/description/index.html @@ -394,8 +394,8 @@

            Key Models

            This module extends existing models and does not introduce new ones.

            Model
            --++ @@ -424,8 +424,8 @@

            UI Location

          • Form View: Accessed via existing case management. Adds Programs tab, smart button, and header field.
          • Programs Tab: Displays enrollment summary (has_active_enrollment, -active_program_count, enrolled_program_names) and membership list with -state badges
          • +active_program_count, enrolled_program_names) and membership list +with state badges
          • Smart Button: Programs count button (visible when active_program_count > 0)
          • Header Field: “Triggered By Program” field appears after priority
          • diff --git a/spp_case_registry/README.rst b/spp_case_registry/README.rst index c8902d47..9ca5133b 100644 --- a/spp_case_registry/README.rst +++ b/spp_case_registry/README.rst @@ -31,27 +31,29 @@ when both ``spp_case_base`` and ``spp_registry`` are present. Key Capabilities ~~~~~~~~~~~~~~~~ -- Link cases to individual registrants or household groups from the - registry -- Automatically populate case details from registrant profiles - (household membership, geographic area) -- Detect and display previous cases for the same registrant or household -- Track which household members are involved in each case -- View all cases from a registrant or household profile via smart button -- Filter and group cases by registrant, household, or geographic area +- Link cases to individual registrants or household groups from the + registry +- Automatically populate case details from registrant profiles + (household membership, geographic area) +- Detect and display previous cases for the same registrant or + household +- Track which household members are involved in each case +- View all cases from a registrant or household profile via smart + button +- Filter and group cases by registrant, household, or geographic area Key Models ~~~~~~~~~~ -+-----------------+----------------------------------------------------+ -| Model | Description | -+=================+====================================================+ -| ``spp.case`` | Extended with registrant_id, household_id, | -| | area_id, and previous case detection | -+-----------------+----------------------------------------------------+ -| ``res.partner`` | Extended with case counts and relationships to | -| | cases as registrant or household | -+-----------------+----------------------------------------------------+ ++-----------------+---------------------------------------------------+ +| Model | Description | ++=================+===================================================+ +| ``spp.case`` | Extended with registrant_id, household_id, | +| | area_id, and previous case detection | ++-----------------+---------------------------------------------------+ +| ``res.partner`` | Extended with case counts and relationships to | +| | cases as registrant or household | ++-----------------+---------------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -62,12 +64,12 @@ management and registry modules are present. UI Location ~~~~~~~~~~~ -- **Menu**: Case Management > Cases > All Cases (fields added to - existing case forms and tree views) -- **Registrant Profile**: Smart button showing active/total case count, - "Cases" tab listing all related cases -- **Case Form**: Registrant, Household, and Area fields in header; - "Household Members" tab when applicable +- **Menu**: Case Management > Cases > All Cases (fields added to + existing case forms and tree views) +- **Registrant Profile**: Smart button showing active/total case count, + "Cases" tab listing all related cases +- **Case Form**: Registrant, Household, and Area fields in header; + "Household Members" tab when applicable Security ~~~~~~~~ @@ -82,12 +84,12 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_onchange_registrant_id()`` to customize auto-fill logic - when registrant is selected -- Override ``_compute_previous_cases()`` to modify previous case - detection rules -- Inherit ``spp.case`` to add additional registry-related fields or - constraints +- Override ``_onchange_registrant_id()`` to customize auto-fill logic + when registrant is selected +- Override ``_compute_previous_cases()`` to modify previous case + detection rules +- Inherit ``spp.case`` to add additional registry-related fields or + constraints Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_registry/static/description/index.html b/spp_case_registry/static/description/index.html index 10af45b0..69a4bcfc 100644 --- a/spp_case_registry/static/description/index.html +++ b/spp_case_registry/static/description/index.html @@ -382,9 +382,11 @@

            Key Capabilities

            registry
          • Automatically populate case details from registrant profiles (household membership, geographic area)
          • -
          • Detect and display previous cases for the same registrant or household
          • +
          • Detect and display previous cases for the same registrant or +household
          • Track which household members are involved in each case
          • -
          • View all cases from a registrant or household profile via smart button
          • +
          • View all cases from a registrant or household profile via smart +button
          • Filter and group cases by registrant, household, or geographic area
          • diff --git a/spp_case_session/README.rst b/spp_case_session/README.rst index 179f6f22..85fd2d05 100644 --- a/spp_case_session/README.rst +++ b/spp_case_session/README.rst @@ -30,12 +30,12 @@ clients meet session attendance requirements. Key Capabilities ~~~~~~~~~~~~~~~~ -- Link cases to required sessions via many-to-many relationship -- Track attendance records for case clients at linked sessions -- Calculate attendance rate as percentage of required sessions attended -- Classify compliance: compliant (≥80%), partial (≥50%), non-compliant - (<50%), or N/A -- Navigate between cases and sessions via stat buttons +- Link cases to required sessions via many-to-many relationship +- Track attendance records for case clients at linked sessions +- Calculate attendance rate as percentage of required sessions attended +- Classify compliance: compliant (≥80%), partial (≥50%), non-compliant + (<50%), or N/A +- Navigate between cases and sessions via stat buttons Key Models ~~~~~~~~~~ @@ -57,10 +57,10 @@ navigation. UI Location ~~~~~~~~~~~ -- **Case Form**: "Sessions" tab displays linked sessions, attendance - records, compliance badge, and attendance rate progress bar -- **Case Form**: Stat button opens list of linked sessions -- **Session Form**: Stat button opens list of related cases +- **Case Form**: "Sessions" tab displays linked sessions, attendance + records, compliance badge, and attendance rate progress bar +- **Case Form**: Stat button opens list of linked sessions +- **Session Form**: Stat button opens list of related cases No standalone menus are defined. All features are accessed via existing case and session forms. @@ -75,12 +75,12 @@ with access to cases and sessions can view and manage session links. Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_session_stats()`` on ``spp.case`` to customize - compliance thresholds (default: 80% compliant, 50% partial) -- Override ``_compute_session_attendance()`` on ``spp.case`` to filter - which attendance records are included in calculations -- Inherit ``spp.case`` to add domain-specific session tracking fields or - workflows +- Override ``_compute_session_stats()`` on ``spp.case`` to customize + compliance thresholds (default: 80% compliant, 50% partial) +- Override ``_compute_session_attendance()`` on ``spp.case`` to filter + which attendance records are included in calculations +- Inherit ``spp.case`` to add domain-specific session tracking fields + or workflows Dependencies ~~~~~~~~~~~~ diff --git a/spp_case_session/static/description/index.html b/spp_case_session/static/description/index.html index d7a663d7..e7e08bb7 100644 --- a/spp_case_session/static/description/index.html +++ b/spp_case_session/static/description/index.html @@ -437,8 +437,8 @@

            Extension Points

            compliance thresholds (default: 80% compliant, 50% partial)
          • Override _compute_session_attendance() on spp.case to filter which attendance records are included in calculations
          • -
          • Inherit spp.case to add domain-specific session tracking fields or -workflows
          • +
          • Inherit spp.case to add domain-specific session tracking fields +or workflows
          • diff --git a/spp_cel_domain/README.rst b/spp_cel_domain/README.rst index f9ce7aa3..d177166c 100644 --- a/spp_cel_domain/README.rst +++ b/spp_cel_domain/README.rst @@ -31,49 +31,51 @@ data providers, and cached values with TTL-based expiration. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define variables mapping to model fields, constants, computed values, - member aggregations, or external APIs -- Write filter and formula expressions using CEL syntax with variable - references -- Resolve variable references into expanded CEL expressions before - compilation -- Configure external data providers with authentication, TTL, and ID - mapping for API-based data sources -- Cache computed and external variable values with TTL-based expiration - and manual invalidation -- Support historical data queries with configurable period granularity - (daily, monthly, quarterly, yearly) -- Evaluate expressions against context data for testing and validation +- Define variables mapping to model fields, constants, computed values, + member aggregations, or external APIs +- Write filter and formula expressions using CEL syntax with variable + references +- Resolve variable references into expanded CEL expressions before + compilation +- Configure external data providers with authentication, TTL, and ID + mapping for API-based data sources +- Cache computed and external variable values with TTL-based expiration + and manual invalidation +- Support historical data queries with configurable period granularity + (daily, monthly, quarterly, yearly) +- Evaluate expressions against context data for testing and validation Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.cel.variable`` | Variable definitions with source | -| | type, CEL accessor, and caching | -+-------------------------------+--------------------------------------+ -| ``spp.cel.variable.category`` | Variable categories for organization | -+-------------------------------+--------------------------------------+ -| ``spp.cel.expression`` | Business rule expressions with CEL | -| | syntax and variable tracking | -+-------------------------------+--------------------------------------+ -| ``spp.data.provider`` | External data provider configuration | -| | with auth and connection settings | -+-------------------------------+--------------------------------------+ -| ``spp.data.credential`` | Secure encrypted credential storage | -| | for external providers | -+-------------------------------+--------------------------------------+ -| ``spp.data.value`` | Cached variable values with period | -| | keys and expiration tracking | -+-------------------------------+--------------------------------------+ -| ``spp.cel.service`` | Service facade for compiling and | -| | evaluating CEL expressions | -+-------------------------------+--------------------------------------+ -| ``spp.cel.variable.resolver`` | Resolves variable references into | -| | expanded CEL expressions | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.cel.variable`` | Variable definitions with source | +| | type, CEL accessor, and caching | ++-------------------------------+-------------------------------------+ +| ``spp.cel.variable.category`` | Variable categories for | +| | organization | ++-------------------------------+-------------------------------------+ +| ``spp.cel.expression`` | Business rule expressions with CEL | +| | syntax and variable tracking | ++-------------------------------+-------------------------------------+ +| ``spp.data.provider`` | External data provider | +| | configuration with auth and | +| | connection settings | ++-------------------------------+-------------------------------------+ +| ``spp.data.credential`` | Secure encrypted credential storage | +| | for external providers | ++-------------------------------+-------------------------------------+ +| ``spp.data.value`` | Cached variable values with period | +| | keys and expiration tracking | ++-------------------------------+-------------------------------------+ +| ``spp.cel.service`` | Service facade for compiling and | +| | evaluating CEL expressions | ++-------------------------------+-------------------------------------+ +| ``spp.cel.variable.resolver`` | Resolves variable references into | +| | expanded CEL expressions | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -94,40 +96,40 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Custom > CEL Domain -- **Submenus**: Data Management > Data Providers, Data Management > Data - Cache -- **Tools**: Tools > Rule Preview wizard for testing expressions -- **Variable/Expression UI**: Provided by ``spp_studio`` module +- **Menu**: Custom > CEL Domain +- **Submenus**: Data Management > Data Providers, Data Management > + Data Cache +- **Tools**: Tools > Rule Preview wizard for testing expressions +- **Variable/Expression UI**: Provided by ``spp_studio`` module Security ~~~~~~~~ -+---------------------------------------------+----------------------------------+ -| Group | Access | -+=============================================+==================================+ -| ``spp_cel_domain.group_cel_domain_viewer`` | Read variables, expressions, and | -| | data cache | -+---------------------------------------------+----------------------------------+ -| ``spp_cel_domain.group_cel_domain_manager`` | Full CRUD on variables, | -| | expressions, providers, and | -| | cache | -+---------------------------------------------+----------------------------------+ -| ``spp_cel_domain.group_cel_domain_admin`` | Full CRUD on credentials and | -| | sensitive configs | -+---------------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_cel_ | Read variables, expressions, and | +| domain.group_cel_domain_viewer`` | data cache | ++----------------------------------+----------------------------------+ +| ``spp_cel_d | Full CRUD on variables, | +| omain.group_cel_domain_manager`` | expressions, providers, and | +| | cache | ++----------------------------------+----------------------------------+ +| ``spp_cel | Full CRUD on credentials and | +| _domain.group_cel_domain_admin`` | sensitive configs | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.cel.variable`` to add custom source types or validation - logic -- Register custom CEL functions via ``spp.cel.function.registry`` -- Override ``spp.cel.variable._compute_cel_expression()`` to customize - aggregate expression generation -- Implement custom data providers by inheriting ``spp.data.provider`` -- Add profile configurations in ``spp.cel.registry`` for new evaluation - contexts +- Inherit ``spp.cel.variable`` to add custom source types or validation + logic +- Register custom CEL functions via ``spp.cel.function.registry`` +- Override ``spp.cel.variable._compute_cel_expression()`` to customize + aggregate expression generation +- Implement custom data providers by inheriting ``spp.data.provider`` +- Add profile configurations in ``spp.cel.registry`` for new evaluation + contexts Dependencies ~~~~~~~~~~~~ diff --git a/spp_cel_domain/static/description/index.html b/spp_cel_domain/static/description/index.html index 7f31d741..f9d8395a 100644 --- a/spp_cel_domain/static/description/index.html +++ b/spp_cel_domain/static/description/index.html @@ -397,8 +397,8 @@

            Key Capabilities

            Key Models

            Model
            --++ @@ -411,15 +411,17 @@

            Key Models

            type, CEL accessor, and caching - + - +
            Model
            spp.cel.variable.categoryVariable categories for organizationVariable categories for +organization
            spp.cel.expression Business rule expressions with CEL syntax and variable tracking
            spp.data.providerExternal data provider configuration -with auth and connection settingsExternal data provider +configuration with auth and +connection settings
            spp.data.credential Secure encrypted credential storage @@ -460,8 +462,8 @@

            Configuration

            UI Location

            • Menu: Custom > CEL Domain
            • -
            • Submenus: Data Management > Data Providers, Data Management > Data -Cache
            • +
            • Submenus: Data Management > Data Providers, Data Management > +Data Cache
            • Tools: Tools > Rule Preview wizard for testing expressions
            • Variable/Expression UI: Provided by spp_studio module
            @@ -470,8 +472,8 @@

            UI Location

            Security

            --++ @@ -479,16 +481,19 @@

            Security

            - + - + - + diff --git a/spp_cel_event/README.rst b/spp_cel_event/README.rst index 5e87c0de..1ba8b9f8 100644 --- a/spp_cel_event/README.rst +++ b/spp_cel_event/README.rst @@ -31,15 +31,15 @@ with Python fallback for complex cases. Key Capabilities ~~~~~~~~~~~~~~~~ -- Query event field values with temporal filtering (within_days, - within_months, named periods) and selection modes (active, latest, - latest_active, first, any) -- Check event existence with date-based filtering -- Aggregate event data using count, sum, avg, min, max functions -- Generate period strings using helper functions (this_year, - this_quarter, etc.) -- Optimize queries using SQL fast paths with automatic fallback to - Python evaluation +- Query event field values with temporal filtering (within_days, + within_months, named periods) and selection modes (active, latest, + latest_active, first, any) +- Check event existence with date-based filtering +- Aggregate event data using count, sum, avg, min, max functions +- Generate period strings using helper functions (this_year, + this_quarter, etc.) +- Optimize queries using SQL fast paths with automatic fallback to + Python evaluation Key Models ~~~~~~~~~~ @@ -70,9 +70,9 @@ optimal query performance. UI Location ~~~~~~~~~~~ -- **Menu**: Studio > Rules > Variables > All Variables -- **Form**: Event aggregation fields appear in the Source Configuration - section when **Aggregate Target** is set to "Events" +- **Menu**: Studio > Rules > Variables > All Variables +- **Form**: Event aggregation fields appear in the Source Configuration + section when **Aggregate Target** is set to "Events" Security ~~~~~~~~ @@ -83,13 +83,13 @@ No module-specific security. Access control inherits from Extension Points ~~~~~~~~~~~~~~~~ -- Override ``spp.cel.translator._to_plan()`` to add custom event query - plan nodes -- Override ``spp.cel.executor._exec_event_value_sql()`` to customize SQL - execution logic -- Extend period helper functions in ``models/cel_event_functions.py`` -- Implement custom aggregation functions following the - events_count/sum/avg pattern +- Override ``spp.cel.translator._to_plan()`` to add custom event query + plan nodes +- Override ``spp.cel.executor._exec_event_value_sql()`` to customize + SQL execution logic +- Extend period helper functions in ``models/cel_event_functions.py`` +- Implement custom aggregation functions following the + events_count/sum/avg pattern Dependencies ~~~~~~~~~~~~ diff --git a/spp_cel_event/static/description/index.html b/spp_cel_event/static/description/index.html index e7d32959..66ea74c6 100644 --- a/spp_cel_event/static/description/index.html +++ b/spp_cel_event/static/description/index.html @@ -446,8 +446,8 @@

            Extension Points

            • Override spp.cel.translator._to_plan() to add custom event query plan nodes
            • -
            • Override spp.cel.executor._exec_event_value_sql() to customize SQL -execution logic
            • +
            • Override spp.cel.executor._exec_event_value_sql() to customize +SQL execution logic
            • Extend period helper functions in models/cel_event_functions.py
            • Implement custom aggregation functions following the events_count/sum/avg pattern
            • diff --git a/spp_cel_registry_search/README.rst b/spp_cel_registry_search/README.rst index 29ad63d2..bc6af814 100644 --- a/spp_cel_registry_search/README.rst +++ b/spp_cel_registry_search/README.rst @@ -31,16 +31,16 @@ eligibility criteria, or custom data fields. Auto-installs when Key Capabilities ~~~~~~~~~~~~~~~~ -- **CEL Expression Editor**: Write and validate CEL expressions with - syntax highlighting, autocomplete, and real-time validation -- **Profile Selection**: Search across Individuals or Groups with - profile-specific field validation -- **Live Validation**: See match counts before executing the search, - with inline error messages for invalid syntax -- **Clickable Results**: View search results in a list, click any - registrant to open their form view -- **Result Limiting**: Displays up to 50 results with a count indicator - when more matches exist +- **CEL Expression Editor**: Write and validate CEL expressions with + syntax highlighting, autocomplete, and real-time validation +- **Profile Selection**: Search across Individuals or Groups with + profile-specific field validation +- **Live Validation**: See match counts before executing the search, + with inline error messages for invalid syntax +- **Clickable Results**: View search results in a list, click any + registrant to open their form view +- **Result Limiting**: Displays up to 50 results with a count indicator + when more matches exist Key Models ~~~~~~~~~~ @@ -59,21 +59,22 @@ menu appears automatically under Registry. UI Location ~~~~~~~~~~~ -- **Menu**: Registry > Advanced Search -- **URL Path**: ``/odoo/registry-cel`` -- **Results**: Click any search result to open the registrant form view +- **Menu**: Registry > Advanced Search +- **URL Path**: ``/odoo/registry-cel`` +- **Results**: Click any search result to open the registrant form view Security ~~~~~~~~ -+---------------------------------------------------+----------------------------------+ -| Group | Access | -+===================================================+==================================+ -| ``spp_cel_registry_search.group_cel_search_user`` | Access to Advanced Search portal | -+---------------------------------------------------+----------------------------------+ -| ``spp_registry.group_registry_officer`` | Automatically includes CEL | -| | Search access | -+---------------------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_cel_registr | Access to Advanced Search portal | +| y_search.group_cel_search_user`` | | ++----------------------------------+----------------------------------+ +| ``spp_r | Automatically includes CEL | +| egistry.group_registry_officer`` | Search access | ++----------------------------------+----------------------------------+ The ``group_cel_search_user`` group implies ``spp_registry.group_registry_viewer``, ensuring users can only search @@ -82,13 +83,13 @@ registrants they have permission to view. Extension Points ~~~~~~~~~~~~~~~~ -- **Inherit ``CelSearchPortal`` component**: Override - ``performSearch()`` to customize query logic or add filters -- **Extend result display**: Modify the QWeb template - ``spp_cel_registry_search.CelSearchPortal`` to show additional - registrant fields -- **Add custom actions**: Override ``openRegistrant()`` to trigger - custom workflows when clicking search results +- **Inherit ``CelSearchPortal`` component**: Override + ``performSearch()`` to customize query logic or add filters +- **Extend result display**: Modify the QWeb template + ``spp_cel_registry_search.CelSearchPortal`` to show additional + registrant fields +- **Add custom actions**: Override ``openRegistrant()`` to trigger + custom workflows when clicking search results Dependencies ~~~~~~~~~~~~ diff --git a/spp_cel_registry_search/static/description/index.html b/spp_cel_registry_search/static/description/index.html index 900c4765..40c0cb97 100644 --- a/spp_cel_registry_search/static/description/index.html +++ b/spp_cel_registry_search/static/description/index.html @@ -414,8 +414,8 @@

              UI Location

              Security

            Group
            spp_cel_domain.group_cel_domain_viewer
            spp_cel_ +domain.group_cel_domain_viewer Read variables, expressions, and data cache
            spp_cel_domain.group_cel_domain_manager
            spp_cel_d +omain.group_cel_domain_manager Full CRUD on variables, expressions, providers, and cache
            spp_cel_domain.group_cel_domain_admin
            spp_cel +_domain.group_cel_domain_admin Full CRUD on credentials and sensitive configs
            --++ @@ -423,10 +423,12 @@

            Security

            - + - + diff --git a/spp_cel_vocabulary/README.rst b/spp_cel_vocabulary/README.rst index 7f30a0d3..19b55fc4 100644 --- a/spp_cel_vocabulary/README.rst +++ b/spp_cel_vocabulary/README.rst @@ -31,20 +31,20 @@ vocabulary function calls into Odoo domains. Auto-installs when both Key Capabilities ~~~~~~~~~~~~~~~~ -- **CEL Function Registration**: Registers vocabulary functions - (``code()``, ``in_group()``, ``code_eq()``, ``head()``) with the CEL - function registry for use in eligibility expressions -- **Domain Translation**: Extends ``spp.cel.translator`` to translate - vocabulary function calls into Odoo domains that check ``uri`` and - ``reference_uri`` fields -- **Semantic Helpers**: Provides shorthand functions (``is_female()``, - ``is_male()``, ``is_head()``, ``is_pregnant()``) that map to - predefined concept groups -- **Concept Group Management**: Creates standard concept groups on - installation (gender, household roles, pregnancy status, hazards, age - groups, disability) -- **Local Code Support**: Handles semantic equality for local codes that - map to standard codes via ``reference_uri`` +- **CEL Function Registration**: Registers vocabulary functions + (``code()``, ``in_group()``, ``code_eq()``, ``head()``) with the CEL + function registry for use in eligibility expressions +- **Domain Translation**: Extends ``spp.cel.translator`` to translate + vocabulary function calls into Odoo domains that check ``uri`` and + ``reference_uri`` fields +- **Semantic Helpers**: Provides shorthand functions (``is_female()``, + ``is_male()``, ``is_head()``, ``is_pregnant()``) that map to + predefined concept groups +- **Concept Group Management**: Creates standard concept groups on + installation (gender, household roles, pregnancy status, hazards, age + groups, disability) +- **Local Code Support**: Handles semantic equality for local codes + that map to standard codes via ``reference_uri`` Key Models ~~~~~~~~~~ @@ -111,13 +111,13 @@ via ``post_init_hook``. Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.cel.translator`` and override ``_to_plan()`` to add - custom vocabulary function translations -- Add new semantic helper functions to - ``services/cel_vocabulary_functions.py`` and register them in - ``VOCABULARY_FUNCTIONS`` dict -- Create additional concept groups via data files or UI to support - domain-specific eligibility patterns +- Inherit ``spp.cel.translator`` and override ``_to_plan()`` to add + custom vocabulary function translations +- Add new semantic helper functions to + ``services/cel_vocabulary_functions.py`` and register them in + ``VOCABULARY_FUNCTIONS`` dict +- Create additional concept groups via data files or UI to support + domain-specific eligibility patterns Dependencies ~~~~~~~~~~~~ diff --git a/spp_cel_vocabulary/static/description/index.html b/spp_cel_vocabulary/static/description/index.html index 6fd1f7f0..6df8ce2a 100644 --- a/spp_cel_vocabulary/static/description/index.html +++ b/spp_cel_vocabulary/static/description/index.html @@ -390,8 +390,8 @@

            Key Capabilities

          • Concept Group Management: Creates standard concept groups on installation (gender, household roles, pregnancy status, hazards, age groups, disability)
          • -
          • Local Code Support: Handles semantic equality for local codes that -map to standard codes via reference_uri
          • +
          • Local Code Support: Handles semantic equality for local codes +that map to standard codes via reference_uri
          • diff --git a/spp_cel_widget/README.rst b/spp_cel_widget/README.rst index a8a48469..be50f00b 100644 --- a/spp_cel_widget/README.rst +++ b/spp_cel_widget/README.rst @@ -31,32 +31,32 @@ modules that require expression editing. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Syntax highlighting**: Keywords, operators, strings, and functions - are color-coded for readability -- **Autocompletion**: Press Ctrl+Space to see available fields, - functions, and operators for the current profile -- **Live validation**: Expressions are validated as you type, with - inline error highlighting and match counts -- **Symbol browser**: Browse available fields, CEL variables, library - expressions, and functions via a sidebar -- **Profile-based context**: Automatically loads symbols for registry - individuals, groups, entitlements, memberships, or custom profiles -- **HTTP API**: JSONRPC endpoints for symbol retrieval and validation - from frontend or external tools +- **Syntax highlighting**: Keywords, operators, strings, and functions + are color-coded for readability +- **Autocompletion**: Press Ctrl+Space to see available fields, + functions, and operators for the current profile +- **Live validation**: Expressions are validated as you type, with + inline error highlighting and match counts +- **Symbol browser**: Browse available fields, CEL variables, library + expressions, and functions via a sidebar +- **Profile-based context**: Automatically loads symbols for registry + individuals, groups, entitlements, memberships, or custom profiles +- **HTTP API**: JSONRPC endpoints for symbol retrieval and validation + from frontend or external tools Key Models ~~~~~~~~~~ -+-----------------------------+----------------------------------------+ -| Model | Description | -+=============================+========================================+ -| ``spp.cel.symbol.provider`` | Abstract model that extracts symbols | -| | for autocompletion and validates | -| | expressions | -+-----------------------------+----------------------------------------+ -| ``spp.cel.widget.demo`` | Transient wizard for testing the | -| | widget (debug mode only) | -+-----------------------------+----------------------------------------+ ++-----------------------------+---------------------------------------+ +| Model | Description | ++=============================+=======================================+ +| ``spp.cel.symbol.provider`` | Abstract model that extracts symbols | +| | for autocompletion and validates | +| | expressions | ++-----------------------------+---------------------------------------+ +| ``spp.cel.widget.demo`` | Transient wizard for testing the | +| | widget (debug mode only) | ++-----------------------------+---------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -72,74 +72,76 @@ After installing, use the widget in any form view by adding Optional widget parameters: -- ``cel_profile``: Profile name (default: ``registry_individuals``) -- ``profile_field``: Read profile from a field on the record -- ``expression_type``: Expression type (filter, formula, scoring, - validation, other) -- ``expression_type_field``: Read expression type from a field -- ``output_type``: Expected output type (boolean, number, string, money) -- ``output_type_field``: Read output type from a field +- ``cel_profile``: Profile name (default: ``registry_individuals``) +- ``profile_field``: Read profile from a field on the record +- ``expression_type``: Expression type (filter, formula, scoring, + validation, other) +- ``expression_type_field``: Read expression type from a field +- ``output_type``: Expected output type (boolean, number, string, + money) +- ``output_type_field``: Read output type from a field UI Location ~~~~~~~~~~~ -- **Demo Wizard**: Settings > Technical > CEL Widget Demo (debug mode - only) -- **Widget Usage**: Add to any form view with - ``widget="cel_expression"`` +- **Demo Wizard**: Settings > Technical > CEL Widget Demo (debug mode + only) +- **Widget Usage**: Add to any form view with + ``widget="cel_expression"`` Tabs in Demo Wizard ~~~~~~~~~~~~~~~~~~~ -- **Dynamic Testing**: Test expressions with different profiles and see - validation results -- **By Profile**: Test expressions for specific profiles (individuals, - groups, entitlements) -- **Read-only Mode**: Verify the widget displays correctly in readonly - mode -- **Help**: Keyboard shortcuts, features, and example expressions +- **Dynamic Testing**: Test expressions with different profiles and see + validation results +- **By Profile**: Test expressions for specific profiles (individuals, + groups, entitlements) +- **Read-only Mode**: Verify the widget displays correctly in readonly + mode +- **Help**: Keyboard shortcuts, features, and example expressions Security ~~~~~~~~ -+--------------------+-------------------------+------------------------+ -| Group | Model | Access | -+====================+=========================+========================+ -| Internal User | HTTP endpoints | Can call widget | -| | | JSONRPC endpoints | -| | | (auth="user") | -+--------------------+-------------------------+------------------------+ -| Settings | ``spp.cel.widget.demo`` | Full CRUD (read, | -| | | write, create, delete) | -+--------------------+-------------------------+------------------------+ -| Technical Features | Menu visibility | Can see demo menu in | -| | | Settings > Technical | -+--------------------+-------------------------+------------------------+ ++--------------------+-----------------------+-----------------------+ +| Group | Model | Access | ++====================+=======================+=======================+ +| Internal User | HTTP endpoints | Can call widget | +| | | JSONRPC endpoints | +| | | (auth="user") | ++--------------------+-----------------------+-----------------------+ +| Settings | `` | Full CRUD (read, | +| | spp.cel.widget.demo`` | write, create, | +| | | delete) | ++--------------------+-----------------------+-----------------------+ +| Technical Features | Menu visibility | Can see demo menu in | +| | | Settings > Technical | ++--------------------+-----------------------+-----------------------+ HTTP Endpoints ~~~~~~~~~~~~~~ All endpoints use JSONRPC authentication (``auth="user"``): -- **``/spp_cel/symbols/``**: Get symbols for a CEL profile - (variables, functions, operators, keywords) -- **``/spp_cel/validate``**: Validate expression and return errors, - warnings, match count -- **``/spp_cel/profiles``**: Get list of available CEL profiles with - descriptions +- **``/spp_cel/symbols/``**: Get symbols for a CEL profile + (variables, functions, operators, keywords) +- **``/spp_cel/validate``**: Validate expression and return errors, + warnings, match count +- **``/spp_cel/profiles``**: Get list of available CEL profiles with + descriptions Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.cel.symbol.provider`` and override - ``get_symbols_for_profile()`` to add custom symbol sources -- Use the ``CelEditor`` JavaScript component standalone in client - actions for custom editors -- Add custom profiles to ``spp.cel.registry`` for domain-specific - contexts -- Customize the ``_get_model_fields()`` method to filter which fields - appear in autocompletion -- Use HTTP endpoints from external tools or custom frontend components +- Inherit ``spp.cel.symbol.provider`` and override + ``get_symbols_for_profile()`` to add custom symbol sources +- Use the ``CelEditor`` JavaScript component standalone in client + actions for custom editors +- Add custom profiles to ``spp.cel.registry`` for domain-specific + contexts +- Customize the ``_get_model_fields()`` method to filter which fields + appear in autocompletion +- Use HTTP endpoints from external tools or custom frontend components Dependencies ~~~~~~~~~~~~ diff --git a/spp_cel_widget/static/description/index.html b/spp_cel_widget/static/description/index.html index f1f236d9..9a05dc45 100644 --- a/spp_cel_widget/static/description/index.html +++ b/spp_cel_widget/static/description/index.html @@ -396,8 +396,8 @@

            Key Capabilities

            Key Models

            Group
            spp_cel_registry_search.group_cel_search_user
            spp_cel_registr +y_search.group_cel_search_user Access to Advanced Search portal
            spp_registry.group_registry_officer
            spp_r +egistry.group_registry_officer Automatically includes CEL Search access
            --++ @@ -433,7 +433,8 @@

            Configuration

          • expression_type: Expression type (filter, formula, scoring, validation, other)
          • expression_type_field: Read expression type from a field
          • -
          • output_type: Expected output type (boolean, number, string, money)
          • +
          • output_type: Expected output type (boolean, number, string, +money)
          • output_type_field: Read output type from a field
          • @@ -462,8 +463,8 @@

            Tabs in Demo Wizard

            Security

            Model
            --++ @@ -480,9 +481,11 @@

            Security

            (auth=”user”) - + +write, create, +delete) diff --git a/spp_change_request_v2/README.rst b/spp_change_request_v2/README.rst index 8f2a4a5f..e6e39971 100644 --- a/spp_change_request_v2/README.rst +++ b/spp_change_request_v2/README.rst @@ -31,96 +31,97 @@ group/household registrant data, with validation and audit trails. Key Capabilities ~~~~~~~~~~~~~~~~ -- Create change requests using configurable request types with custom - detail models -- Multi-tier approval workflows with automatic routing based on approval - definitions -- Dynamic approval: route CRs to different approval workflows based on - which field is being modified, with CEL condition evaluation for - field-specific escalation -- Detect conflicting change requests (same registrant, same group, or - same field) -- Prevent duplicate submissions with configurable similarity thresholds -- Validate required fields and documents before submission -- Preview changes before applying them to registrant records -- Apply changes via field mapping or custom strategies -- Track audit trail of all state changes via event data -- Attach supporting documents organized in DMS directories +- Create change requests using configurable request types with custom + detail models +- Multi-tier approval workflows with automatic routing based on + approval definitions +- Dynamic approval: route CRs to different approval workflows based on + which field is being modified, with CEL condition evaluation for + field-specific escalation +- Detect conflicting change requests (same registrant, same group, or + same field) +- Prevent duplicate submissions with configurable similarity thresholds +- Validate required fields and documents before submission +- Preview changes before applying them to registrant records +- Apply changes via field mapping or custom strategies +- Track audit trail of all state changes via event data +- Attach supporting documents organized in DMS directories Key Models ~~~~~~~~~~ -+-------------------------------------+----------------------------------+ -| Model | Description | -+=====================================+==================================+ -| ``spp.change.request`` | Main change request record with | -| | approval workflow | -+-------------------------------------+----------------------------------+ -| ``spp.change.request.type`` | Configuration for CR types: | -| | target, detail model, workflow | -+-------------------------------------+----------------------------------+ -| ``spp.change.request.type.mapping`` | Field mappings for automatic | -| | application | -+-------------------------------------+----------------------------------+ -| ``spp.cr.conflict.rule`` | Rules for detecting conflicting | -| | change requests | -+-------------------------------------+----------------------------------+ -| ``spp.cr.duplicate.config`` | Configuration for duplicate | -| | detection thresholds | -+-------------------------------------+----------------------------------+ -| ``spp.cr.conflict.mixin`` | Mixin providing conflict and | -| | duplicate detection | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.base`` | Base model for all change | -| | request detail types | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.add_member`` | Detail model for adding members | -| | to groups | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.edit_individual`` | Detail model for editing | -| | individual registrant data | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.edit_group`` | Detail model for editing | -| | group/household data | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.remove_member`` | Detail model for removing | -| | members from groups | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.change_hoh`` | Detail model for changing head | -| | of household | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.exit_registrant`` | Detail model for marking | -| | registrants as exited | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.transfer_member`` | Detail model for transferring | -| | members between groups | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.update_id`` | Detail model for updating | -| | registrant ID numbers | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.create_group`` | Detail model for creating new | -| | groups/households | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.merge_registrants`` | Detail model for merging | -| | duplicate registrant records | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.split_household`` | Detail model for splitting | -| | households into separate groups | -+-------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ``spp.change.request`` | Main change request record with | +| | approval workflow | ++----------------------------------+----------------------------------+ +| ``spp.change.request.type`` | Configuration for CR types: | +| | target, detail model, workflow | ++----------------------------------+----------------------------------+ +| ``s | Field mappings for automatic | +| pp.change.request.type.mapping`` | application | ++----------------------------------+----------------------------------+ +| ``spp.cr.conflict.rule`` | Rules for detecting conflicting | +| | change requests | ++----------------------------------+----------------------------------+ +| ``spp.cr.duplicate.config`` | Configuration for duplicate | +| | detection thresholds | ++----------------------------------+----------------------------------+ +| ``spp.cr.conflict.mixin`` | Mixin providing conflict and | +| | duplicate detection | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.base`` | Base model for all change | +| | request detail types | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.add_member`` | Detail model for adding members | +| | to groups | ++----------------------------------+----------------------------------+ +| ` | Detail model for editing | +| `spp.cr.detail.edit_individual`` | individual registrant data | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.edit_group`` | Detail model for editing | +| | group/household data | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.remove_member`` | Detail model for removing | +| | members from groups | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.change_hoh`` | Detail model for changing head | +| | of household | ++----------------------------------+----------------------------------+ +| ` | Detail model for marking | +| `spp.cr.detail.exit_registrant`` | registrants as exited | ++----------------------------------+----------------------------------+ +| ` | Detail model for transferring | +| `spp.cr.detail.transfer_member`` | members between groups | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.update_id`` | Detail model for updating | +| | registrant ID numbers | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.create_group`` | Detail model for creating new | +| | groups/households | ++----------------------------------+----------------------------------+ +| ``s | Detail model for merging | +| pp.cr.detail.merge_registrants`` | duplicate registrant records | ++----------------------------------+----------------------------------+ +| ` | Detail model for splitting | +| `spp.cr.detail.split_household`` | households into separate groups | ++----------------------------------+----------------------------------+ Form Tabs ~~~~~~~~~ Change request form view includes the following tabs: -- **Details**: Split-pane view showing current registrant data and - proposed changes -- **Documents**: Upload and manage supporting documents via DMS - integration -- **Notes**: Description and internal notes fields -- **Revision Requested**: Feedback from reviewers (visible when changes - requested) -- **Status History**: Timeline of approval reviews and state transitions +- **Details**: Split-pane view showing current registrant data and + proposed changes +- **Documents**: Upload and manage supporting documents via DMS + integration +- **Notes**: Description and internal notes fields +- **Revision Requested**: Feedback from reviewers (visible when changes + requested) +- **Status History**: Timeline of approval reviews and state + transitions Configuration ~~~~~~~~~~~~~ @@ -142,58 +143,58 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Change Requests (top-level menu) +- **Menu**: Change Requests (top-level menu) - - **All Requests**: View all change requests with filtering - - **New Request**: Launch wizard to create change request - - **Pending Approval**: Queue of requests awaiting validator action - (validators only) - - **Reporting > Analytics**: Pivot and graph views for change request - analysis (managers only) - - **Configuration**: Change request types, conflict rules, duplicate - detection (managers only) + - **All Requests**: View all change requests with filtering + - **New Request**: Launch wizard to create change request + - **Pending Approval**: Queue of requests awaiting validator action + (validators only) + - **Reporting > Analytics**: Pivot and graph views for change + request analysis (managers only) + - **Configuration**: Change request types, conflict rules, duplicate + detection (managers only) -- **Registrant Profile**: Change requests appear in registrant form - under smart buttons and related tabs -- **Wizards**: New Request wizard for guided CR creation, batch approval - for validators +- **Registrant Profile**: Change requests appear in registrant form + under smart buttons and related tabs +- **Wizards**: New Request wizard for guided CR creation, batch + approval for validators Security ~~~~~~~~ -+------------------------------------------------------+----------------------------------+ -| Group | Access | -+======================================================+==================================+ -| ``spp_change_request_v2.group_cr_user`` | Create and submit change | -| | requests (read/write/create) | -+------------------------------------------------------+----------------------------------+ -| ``spp_change_request_v2.group_cr_validator`` | Approve/reject, field-level | -| | validation (read/write/create) | -+------------------------------------------------------+----------------------------------+ -| ``spp_change_request_v2.group_cr_validator_hq`` | HQ-level approval with registry | -| | write (read/write/create) | -+------------------------------------------------------+----------------------------------+ -| ``spp_change_request_v2.group_cr_manager`` | Full CRUD including | -| | configuration | -+------------------------------------------------------+----------------------------------+ -| ``spp_change_request_v2.group_cr_conflict_approver`` | Override blocking conflict | -| | detections | -| | (specialized/functional) | -+------------------------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_c | Create and submit change | +| hange_request_v2.group_cr_user`` | requests (read/write/create) | ++----------------------------------+----------------------------------+ +| ``spp_change | Approve/reject, field-level | +| _request_v2.group_cr_validator`` | validation (read/write/create) | ++----------------------------------+----------------------------------+ +| ``spp_change_re | HQ-level approval with registry | +| quest_v2.group_cr_validator_hq`` | write (read/write/create) | ++----------------------------------+----------------------------------+ +| ``spp_chan | Full CRUD including | +| ge_request_v2.group_cr_manager`` | configuration | ++----------------------------------+----------------------------------+ +| ``spp_change_request | Override blocking conflict | +| _v2.group_cr_conflict_approver`` | detections | +| | (specialized/functional) | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.change.request.type`` and override - ``get_apply_strategy()`` to add custom application logic -- Inherit ``spp.cr.conflict.mixin`` and override - ``_check_custom_conflicts()`` for custom conflict detection -- Create new detail models inheriting ``spp.cr.detail.base`` for custom - change request types -- Override ``_validate_documents()`` on ``spp.change.request`` for - custom document validation -- Use ``_pre_enrollment_hook()`` and ``_post_enrollment_hook()`` - patterns for side effects during application +- Inherit ``spp.change.request.type`` and override + ``get_apply_strategy()`` to add custom application logic +- Inherit ``spp.cr.conflict.mixin`` and override + ``_check_custom_conflicts()`` for custom conflict detection +- Create new detail models inheriting ``spp.cr.detail.base`` for custom + change request types +- Override ``_validate_documents()`` on ``spp.change.request`` for + custom document validation +- Use ``_pre_enrollment_hook()`` and ``_post_enrollment_hook()`` + patterns for side effects during application Dependencies ~~~~~~~~~~~~ @@ -221,20 +222,20 @@ multi-tier workflows. A CR type consists of four parts: -+----------------------+-----------------------------------------------+ -| Part | What it does | -+======================+===============================================+ -| **Detail model** | Python model holding the proposed changes | -| | (inherits ``spp.cr.detail.base``) | -+----------------------+-----------------------------------------------+ -| **Detail form view** | XML view rendered inside the CR form | -+----------------------+-----------------------------------------------+ -| **CR type record** | XML data linking the detail model, view, | -| | approval workflow, and field mappings | -+----------------------+-----------------------------------------------+ -| **Field mappings** | XML records defining how detail fields map to | -| | registrant fields at apply time | -+----------------------+-----------------------------------------------+ ++----------------------+----------------------------------------------+ +| Part | What it does | ++======================+==============================================+ +| **Detail model** | Python model holding the proposed changes | +| | (inherits ``spp.cr.detail.base``) | ++----------------------+----------------------------------------------+ +| **Detail form view** | XML view rendered inside the CR form | ++----------------------+----------------------------------------------+ +| **CR type record** | XML data linking the detail model, view, | +| | approval workflow, and field mappings | ++----------------------+----------------------------------------------+ +| **Field mappings** | XML records defining how detail fields map | +| | to registrant fields at apply time | ++----------------------+----------------------------------------------+ When a user creates a change request, the system: @@ -276,13 +277,13 @@ A CR type that lets users update a single field with one-tier approval. Key points: -- Always inherit ``spp.cr.detail.base`` (required) and ``mail.thread`` - (for tracking) -- Never use ``required=True`` on detail fields — the detail record is - created empty by ``_ensure_detail()`` and populated later -- ``_get_prefill_mapping()`` returns - ``{detail_field: registrant_field}`` — the base class copies current - registrant values into the detail on creation +- Always inherit ``spp.cr.detail.base`` (required) and ``mail.thread`` + (for tracking) +- Never use ``required=True`` on detail fields — the detail record is + created empty by ``_ensure_detail()`` and populated later +- ``_get_prefill_mapping()`` returns + ``{detail_field: registrant_field}`` — the base class copies current + registrant values into the detail on creation **Detail form view** @@ -622,26 +623,26 @@ fallback. CEL conditions have access to these variables: -+--------------------------------+--------+------------------------------+ -| Variable | Type | Description | -+================================+========+==============================+ -| ``record.selected_field_name`` | string | Technical field name the | -| | | user selected | -+--------------------------------+--------+------------------------------+ -| ``old_value`` | typed | Current value on the | -| | | registrant | -+--------------------------------+--------+------------------------------+ -| ``new_value`` | typed | Proposed value from the | -| | | detail record | -+--------------------------------+--------+------------------------------+ -| ``record`` | dict | All fields on the | -| | | ``spp.change.request`` | -| | | record | -+--------------------------------+--------+------------------------------+ -| ``user`` | dict | Current user | -+--------------------------------+--------+------------------------------+ -| ``company`` | dict | Current company | -+--------------------------------+--------+------------------------------+ ++-----------------------------+--------+-----------------------------+ +| Variable | Type | Description | ++=============================+========+=============================+ +| ``r | string | Technical field name the | +| ecord.selected_field_name`` | | user selected | ++-----------------------------+--------+-----------------------------+ +| ``old_value`` | typed | Current value on the | +| | | registrant | ++-----------------------------+--------+-----------------------------+ +| ``new_value`` | typed | Proposed value from the | +| | | detail record | ++-----------------------------+--------+-----------------------------+ +| ``record`` | dict | All fields on the | +| | | ``spp.change.request`` | +| | | record | ++-----------------------------+--------+-----------------------------+ +| ``user`` | dict | Current user | ++-----------------------------+--------+-----------------------------+ +| ``company`` | dict | Current company | ++-----------------------------+--------+-----------------------------+ Many2one values are dicts with ``id`` and ``name`` (display_name) keys. Vocabulary models (``spp.vocabulary.code``) additionally include @@ -728,127 +729,147 @@ Methods Reference Methods available for override on detail models (all inherited from ``spp.cr.detail.base``): -+--------------------------------------+----------------+--------------------------------------+-----------------+ -| Method | Decorator | Returns | When to | -| | | | override | -+======================================+================+======================================+=================+ -| ``_get_field_to_modify_selection()`` | ``@api.model`` | ``[(field, label), ...]`` | Dynamic | -| | | | approval: | -| | | | define | -| | | | selectable | -| | | | fields | -+--------------------------------------+----------------+--------------------------------------+-----------------+ -| ``_get_prefill_mapping()`` | instance | ``{detail_field: registrant_field}`` | Pre-fill detail | -| | | | from registrant | -| | | | on creation | -+--------------------------------------+----------------+--------------------------------------+-----------------+ -| ``prefill_from_registrant()`` | instance | None | Detail has | -| | | | boolean fields | -| | | | that need | -| | | | ``False`` | -| | | | pre-filled | -+--------------------------------------+----------------+--------------------------------------+-----------------+ ++----------------+----------------+----------------+----------------+ +| Method | Decorator | Returns | When to | +| | | | override | ++================+================+================+================+ +| ``_get_f | ``@api.model`` | ``[(field, | Dynamic | +| ield_to_modify | | label), ...]`` | approval: | +| _selection()`` | | | define | +| | | | selectable | +| | | | fields | ++----------------+----------------+----------------+----------------+ +| ``_get_prefi | instance | ``{detai | Pre-fill | +| ll_mapping()`` | | l_field: regis | detail from | +| | | trant_field}`` | registrant on | +| | | | creation | ++----------------+----------------+----------------+----------------+ +| ` | instance | None | Detail has | +| `prefill_from_ | | | boolean fields | +| registrant()`` | | | that need | +| | | | ``False`` | +| | | | pre-filled | ++----------------+----------------+----------------+----------------+ Related fields available on all detail models (from ``spp.cr.detail.base``): -+----------------------------+-----------+------------------------------------------------------------+ -| Field | Type | Source | -+============================+===========+============================================================+ -| ``change_request_id`` | Many2one | Direct link to parent CR | -+----------------------------+-----------+------------------------------------------------------------+ -| ``registrant_id`` | Many2one | ``change_request_id.registrant_id`` | -+----------------------------+-----------+------------------------------------------------------------+ -| ``approval_state`` | Selection | ``change_request_id.approval_state`` | -+----------------------------+-----------+------------------------------------------------------------+ -| ``is_applied`` | Boolean | ``change_request_id.is_applied`` | -+----------------------------+-----------+------------------------------------------------------------+ -| ``use_dynamic_approval`` | Boolean | ``change_request_id.request_type_id.use_dynamic_approval`` | -+----------------------------+-----------+------------------------------------------------------------+ -| ``field_to_modify`` | Selection | Dynamic field selector (populated by | -| | | ``_get_field_to_modify_selection``) | -+----------------------------+-----------+------------------------------------------------------------+ ++--------------------------+-----------+---------------------------+ +| Field | Type | Source | ++==========================+===========+===========================+ +| ``change_request_id`` | Many2one | Direct link to parent CR | ++--------------------------+-----------+---------------------------+ +| ``registrant_id`` | Many2one | ``change_r | +| | | equest_id.registrant_id`` | ++--------------------------+-----------+---------------------------+ +| ``approval_state`` | Selection | ``change_re | +| | | quest_id.approval_state`` | ++--------------------------+-----------+---------------------------+ +| ``is_applied`` | Boolean | ``chang | +| | | e_request_id.is_applied`` | ++--------------------------+-----------+---------------------------+ +| ``use_dynamic_approval`` | Boolean | ``change | +| | | _request_id.request_type_ | +| | | id.use_dynamic_approval`` | ++--------------------------+-----------+---------------------------+ +| ``field_to_modify`` | Selection | Dynamic field selector | +| | | (populated by | +| | | ``_get_fie | +| | | ld_to_modify_selection``) | ++--------------------------+-----------+---------------------------+ CR Type Fields Reference ~~~~~~~~~~~~~~~~~~~~~~~~ -+------------------------------+-----------+---------------------+----------------------+ -| Field | Type | Default | Description | -+==============================+===========+=====================+======================+ -| ``name`` | Char | required | Display name | -+------------------------------+-----------+---------------------+----------------------+ -| ``code`` | Char | required | Unique identifier | -| | | | (lowercase, | -| | | | underscores) | -+------------------------------+-----------+---------------------+----------------------+ -| ``target_type`` | Selection | ``"both"`` | ``"individual"``, | -| | | | ``"group"``, or | -| | | | ``"both"`` | -+------------------------------+-----------+---------------------+----------------------+ -| ``detail_model`` | Char | required | Technical name of | -| | | | the detail model | -+------------------------------+-----------+---------------------+----------------------+ -| ``detail_form_view_id`` | Many2one | required | Reference to the | -| | | | detail form view | -+------------------------------+-----------+---------------------+----------------------+ -| ``apply_strategy`` | Selection | ``"field_mapping"`` | ``"field_mapping"``, | -| | | | ``"custom"``, or | -| | | | ``"manual"`` | -+------------------------------+-----------+---------------------+----------------------+ -| ``auto_apply_on_approve`` | Boolean | ``True`` | Apply changes | -| | | | automatically after | -| | | | final approval | -+------------------------------+-----------+---------------------+----------------------+ -| ``approval_definition_id`` | Many2one | required | Static/fallback | -| | | | approval workflow | -+------------------------------+-----------+---------------------+----------------------+ -| ``use_dynamic_approval`` | Boolean | ``False`` | Enable field-level | -| | | | approval routing | -+------------------------------+-----------+---------------------+----------------------+ -| ``candidate_definition_ids`` | Many2many | empty | Candidate | -| | | | definitions for | -| | | | dynamic routing | -+------------------------------+-----------+---------------------+----------------------+ -| ``icon`` | Char | optional | FontAwesome icon | -| | | | class (e.g., | -| | | | ``"fa-cog"``) | -+------------------------------+-----------+---------------------+----------------------+ -| ``sequence`` | Integer | ``10`` | Display order in | -| | | | type lists | -+------------------------------+-----------+---------------------+----------------------+ -| ``is_system_type`` | Boolean | ``False`` | Installed by a | -| | | | module (not | -| | | | user-created) | -+------------------------------+-----------+---------------------+----------------------+ -| ``source_module`` | Char | optional | Module that | -| | | | installed this type | -+------------------------------+-----------+---------------------+----------------------+ ++-----------------+-----------+-----------------+-----------------+ +| Field | Type | Default | Description | ++=================+===========+=================+=================+ +| ``name`` | Char | required | Display name | ++-----------------+-----------+-----------------+-----------------+ +| ``code`` | Char | required | Unique | +| | | | identifier | +| | | | (lowercase, | +| | | | underscores) | ++-----------------+-----------+-----------------+-----------------+ +| ``target_type`` | Selection | ``"both"`` | `` | +| | | | "individual"``, | +| | | | ``"group"``, or | +| | | | ``"both"`` | ++-----------------+-----------+-----------------+-----------------+ +| ` | Char | required | Technical name | +| `detail_model`` | | | of the detail | +| | | | model | ++-----------------+-----------+-----------------+-----------------+ +| ``detail | Many2one | required | Reference to | +| _form_view_id`` | | | the detail form | +| | | | view | ++-----------------+-----------+-----------------+-----------------+ +| ``a | Selection | ``"f | ``"fi | +| pply_strategy`` | | ield_mapping"`` | eld_mapping"``, | +| | | | ``"custom"``, | +| | | | or ``"manual"`` | ++-----------------+-----------+-----------------+-----------------+ +| ``auto_app | Boolean | ``True`` | Apply changes | +| ly_on_approve`` | | | automatically | +| | | | after final | +| | | | approval | ++-----------------+-----------+-----------------+-----------------+ +| ``approval_ | Many2one | required | Static/fallback | +| definition_id`` | | | approval | +| | | | workflow | ++-----------------+-----------+-----------------+-----------------+ +| ``use_dyn | Boolean | ``False`` | Enable | +| amic_approval`` | | | field-level | +| | | | approval | +| | | | routing | ++-----------------+-----------+-----------------+-----------------+ +| ``candidate_d | Many2many | empty | Candidate | +| efinition_ids`` | | | definitions for | +| | | | dynamic routing | ++-----------------+-----------+-----------------+-----------------+ +| ``icon`` | Char | optional | FontAwesome | +| | | | icon class | +| | | | (e.g., | +| | | | ``"fa-cog"``) | ++-----------------+-----------+-----------------+-----------------+ +| ``sequence`` | Integer | ``10`` | Display order | +| | | | in type lists | ++-----------------+-----------+-----------------+-----------------+ +| ``i | Boolean | ``False`` | Installed by a | +| s_system_type`` | | | module (not | +| | | | user-created) | ++-----------------+-----------+-----------------+-----------------+ +| `` | Char | optional | Module that | +| source_module`` | | | installed this | +| | | | type | ++-----------------+-----------+-----------------+-----------------+ Checklist ~~~~~~~~~ Before declaring a new CR type complete: -- Detail model inherits ``spp.cr.detail.base`` and ``mail.thread`` -- No ``required=True`` on detail fields (validate at submission, not - creation) -- ``_get_prefill_mapping()`` defined if fields should pre-fill from - registrant -- ``prefill_from_registrant()`` overridden if detail has boolean fields -- Form view uses ``approval_state`` (not raw state field) for visibility -- Form view uses ``use_dynamic_approval`` (not the 3-level chain) for - dynamic visibility -- Views listed before data in ``__manifest__.py`` (data references - ``detail_form_view_id``) -- ``ir.model.access.csv`` has 4 rows (user, validator, validator_hq, - manager) -- Field mappings exist for every field that should be applied to the - registrant -- Approval definition has ``model_id`` pointing to - ``spp_change_request_v2.model_spp_change_request`` -- If multi-tier: tiers created before ``use_multitier=True`` is set -- If dynamic: fallback definition has ``sequence=100`` (evaluated last) -- Tests cover CR creation, approval routing, and field application +- Detail model inherits ``spp.cr.detail.base`` and ``mail.thread`` +- No ``required=True`` on detail fields (validate at submission, not + creation) +- ``_get_prefill_mapping()`` defined if fields should pre-fill from + registrant +- ``prefill_from_registrant()`` overridden if detail has boolean fields +- Form view uses ``approval_state`` (not raw state field) for + visibility +- Form view uses ``use_dynamic_approval`` (not the 3-level chain) for + dynamic visibility +- Views listed before data in ``__manifest__.py`` (data references + ``detail_form_view_id``) +- ``ir.model.access.csv`` has 4 rows (user, validator, validator_hq, + manager) +- Field mappings exist for every field that should be applied to the + registrant +- Approval definition has ``model_id`` pointing to + ``spp_change_request_v2.model_spp_change_request`` +- If multi-tier: tiers created before ``use_multitier=True`` is set +- If dynamic: fallback definition has ``sequence=100`` (evaluated last) +- Tests cover CR creation, approval routing, and field application Bug Tracker =========== diff --git a/spp_change_request_v2/static/description/index.html b/spp_change_request_v2/static/description/index.html index 0ef9486d..a28ab92a 100644 --- a/spp_change_request_v2/static/description/index.html +++ b/spp_change_request_v2/static/description/index.html @@ -380,8 +380,8 @@

            Key Capabilities

            • Create change requests using configurable request types with custom detail models
            • -
            • Multi-tier approval workflows with automatic routing based on approval -definitions
            • +
            • Multi-tier approval workflows with automatic routing based on +approval definitions
            • Dynamic approval: route CRs to different approval workflows based on which field is being modified, with CEL condition evaluation for field-specific escalation
            • @@ -399,8 +399,8 @@

              Key Capabilities

              Key Models

            Settingsspp.cel.widget.demo`` +spp.cel.widget.demo`` Full CRUD (read, -write, create, delete)
            Technical Features Menu visibility
            --++ @@ -416,7 +416,8 @@

            Key Models

            - + @@ -440,7 +441,8 @@

            Key Models

            - + @@ -456,11 +458,13 @@

            Key Models

            - + - + @@ -472,11 +476,13 @@

            Key Models

            - + - + @@ -494,7 +500,8 @@

            Form Tabs

          • Notes: Description and internal notes fields
          • Revision Requested: Feedback from reviewers (visible when changes requested)
          • -
          • Status History: Timeline of approval reviews and state transitions
          • +
          • Status History: Timeline of approval reviews and state +transitions
          • @@ -522,24 +529,24 @@

            UI Location

          • New Request: Launch wizard to create change request
          • Pending Approval: Queue of requests awaiting validator action (validators only)
          • -
          • Reporting > Analytics: Pivot and graph views for change request -analysis (managers only)
          • +
          • Reporting > Analytics: Pivot and graph views for change +request analysis (managers only)
          • Configuration: Change request types, conflict rules, duplicate detection (managers only)
          • Registrant Profile: Change requests appear in registrant form under smart buttons and related tabs
          • -
          • Wizards: New Request wizard for guided CR creation, batch approval -for validators
          • +
          • Wizards: New Request wizard for guided CR creation, batch +approval for validators
          • Security

            Model Configuration for CR types: target, detail model, workflow
            spp.change.request.type.mapping
            s +pp.change.request.type.mapping Field mappings for automatic application
            Detail model for adding members to groups
            spp.cr.detail.edit_individual
            ` +spp.cr.detail.edit_individual` Detail model for editing individual registrant data
            Detail model for changing head of household
            spp.cr.detail.exit_registrant
            ` +spp.cr.detail.exit_registrant` Detail model for marking registrants as exited
            spp.cr.detail.transfer_member
            ` +spp.cr.detail.transfer_member` Detail model for transferring members between groups
            Detail model for creating new groups/households
            spp.cr.detail.merge_registrants
            s +pp.cr.detail.merge_registrants Detail model for merging duplicate registrant records
            spp.cr.detail.split_household
            ` +spp.cr.detail.split_household` Detail model for splitting households into separate groups
            --++ @@ -547,23 +554,28 @@

            Security

            - + - + - + - + - + @@ -631,8 +643,8 @@

            Developer Guide: Creating Custom CR Types

            approval workflow, and field mappings - +
            Group
            spp_change_request_v2.group_cr_user
            spp_c +hange_request_v2.group_cr_user Create and submit change requests (read/write/create)
            spp_change_request_v2.group_cr_validator
            spp_change +_request_v2.group_cr_validator Approve/reject, field-level validation (read/write/create)
            spp_change_request_v2.group_cr_validator_hq
            spp_change_re +quest_v2.group_cr_validator_hq HQ-level approval with registry write (read/write/create)
            spp_change_request_v2.group_cr_manager
            spp_chan +ge_request_v2.group_cr_manager Full CRUD including configuration
            spp_change_request_v2.group_cr_conflict_approver
            spp_change_request +_v2.group_cr_conflict_approver Override blocking conflict detections (specialized/functional)
            Field mappingsXML records defining how detail fields map to -registrant fields at apply timeXML records defining how detail fields map +to registrant fields at apply time
            @@ -993,9 +1005,9 @@

            Example 3: Dynamic Approval

            CEL conditions have access to these variables:

            ---+++ @@ -1004,7 +1016,8 @@

            Example 3: Dynamic Approval

            - + @@ -1115,10 +1128,10 @@

            Methods Reference

            spp.cr.detail.base):

            Variable
            record.selected_field_name
            r +ecord.selected_field_name string Technical field name the user selected
            ----++++ @@ -1129,23 +1142,32 @@

            Methods Reference

            - + - + - + - - + + - +
            Method
            _get_field_to_modify_selection()
            _get_f +ield_to_modify +_selection() @api.model[(field, label), ...][(field, +label), ...] Dynamic approval: define selectable fields
            _get_prefill_mapping()
            _get_prefi +ll_mapping() instance{detail_field: registrant_field}Pre-fill detail -from registrant -on creation{detai +l_field: regis +trant_field}Pre-fill +detail from +registrant on +creation
            prefill_from_registrant()
            ` +prefill_from_ +registrant()` instance None Detail has @@ -1160,9 +1182,9 @@

            Methods Reference

            spp.cr.detail.base):

            ---+++ @@ -1177,24 +1199,31 @@

            Methods Reference

            - + - + - + - + - +
            Field
            registrant_id Many2onechange_request_id.registrant_idchange_r +equest_id.registrant_id
            approval_state Selectionchange_request_id.approval_statechange_re +quest_id.approval_state
            is_applied Booleanchange_request_id.is_appliedchang +e_request_id.is_applied
            use_dynamic_approval Booleanchange_request_id.request_type_id.use_dynamic_approvalchange +_request_id.request_type_ +id.use_dynamic_approval
            field_to_modify SelectionDynamic field selector (populated by -_get_field_to_modify_selection)Dynamic field selector +(populated by +_get_fie +ld_to_modify_selection)
            @@ -1203,10 +1232,10 @@

            Methods Reference

            CR Type Fields Reference

            ----++++ @@ -1224,56 +1253,73 @@

            CR Type Fields Reference

            - - - + - + - + - + - + - - + + - + +automatically +after final +approval - + +approval +workflow - + - + - + - - + - + - + +installed this +type
            Field
            code Char requiredUnique identifier +Unique +identifier (lowercase, underscores)
            target_type Selection "both""individual", -"group", or +`` +“individual”, +``"group", or "both"
            detail_model
            ` +detail_model` Char requiredTechnical name of -the detail modelTechnical name +of the detail +model
            detail_form_view_id
            detail +_form_view_id Many2one requiredReference to the -detail form viewReference to +the detail form +view
            apply_strategy
            a +pply_strategy Selection"field_mapping""field_mapping", -"custom", or -"manual""f +ield_mapping""fi +eld_mapping", +"custom", +or "manual"
            auto_apply_on_approve
            auto_app +ly_on_approve Boolean True Apply changes -automatically after -final approval
            approval_definition_id
            approval_ +definition_id Many2one required Static/fallback -approval workflow
            use_dynamic_approval
            use_dyn +amic_approval Boolean FalseEnable field-level -approval routingEnable +field-level +approval +routing
            candidate_definition_ids
            candidate_d +efinition_ids Many2many empty Candidate @@ -1283,28 +1329,32 @@

            CR Type Fields Reference

            icon Char optionalFontAwesome icon -class (e.g., +FontAwesome +icon class +(e.g., "fa-cog")
            sequence Integer 10Display order in -type listsDisplay order +in type lists
            is_system_type
            i +s_system_type Boolean False Installed by a module (not user-created)
            source_module
            `` +source_module`` Char optional Module that -installed this type
            @@ -1319,7 +1369,8 @@

            Checklist

          • _get_prefill_mapping() defined if fields should pre-fill from registrant
          • prefill_from_registrant() overridden if detail has boolean fields
          • -
          • Form view uses approval_state (not raw state field) for visibility
          • +
          • Form view uses approval_state (not raw state field) for +visibility
          • Form view uses use_dynamic_approval (not the 3-level chain) for dynamic visibility
          • Views listed before data in __manifest__.py (data references diff --git a/spp_claim_169/README.rst b/spp_claim_169/README.rst index 7e7a74ad..68251c95 100644 --- a/spp_claim_169/README.rst +++ b/spp_claim_169/README.rst @@ -31,43 +31,43 @@ lifecycle tracking. Key Capabilities ~~~~~~~~~~~~~~~~ -- Generate signed QR credentials using MOSIP Claim 169 standard with - Ed25519 or EC keys -- Configure mappings from partner fields to numbered claim attributes - (1-99) -- Track credential lifecycle with automatic expiration and manual - revocation -- Verify credential authenticity using public key verification -- Transform data with multiple formats: direct copy, date formatting, - gender codes, address combination, and CEL expressions -- Batch generate credentials for multiple registrants with configurable - replacement modes -- Audit credential generation, revocation, and download events +- Generate signed QR credentials using MOSIP Claim 169 standard with + Ed25519 or EC keys +- Configure mappings from partner fields to numbered claim attributes + (1-99) +- Track credential lifecycle with automatic expiration and manual + revocation +- Verify credential authenticity using public key verification +- Transform data with multiple formats: direct copy, date formatting, + gender codes, address combination, and CEL expressions +- Batch generate credentials for multiple registrants with configurable + replacement modes +- Audit credential generation, revocation, and download events Key Models ~~~~~~~~~~ -+-------------------------------------+----------------------------------+ -| Model | Description | -+=====================================+==================================+ -| ``spp.claim169.credential`` | Stores issued credentials with | -| | QR codes and validity dates | -+-------------------------------------+----------------------------------+ -| ``spp.claim169.issuer.config`` | Defines issuer identity and | -| | signing keys | -+-------------------------------------+----------------------------------+ -| ``spp.claim169.attribute.mapping`` | Maps partner fields to claim | -| | attribute numbers | -+-------------------------------------+----------------------------------+ -| ``spp.claim169.service`` | Service for credential | -| | generation and verification | -+-------------------------------------+----------------------------------+ -| ``spp.claim169.generate.qr.wizard`` | Wizard for batch credential | -| | generation | -+-------------------------------------+----------------------------------+ -| ``spp.claim169.verify.qr.wizard`` | Wizard for credential | -| | verification | -+-------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ``spp.claim169.credential`` | Stores issued credentials with | +| | QR codes and validity dates | ++----------------------------------+----------------------------------+ +| ``spp.claim169.issuer.config`` | Defines issuer identity and | +| | signing keys | ++----------------------------------+----------------------------------+ +| `` | Maps partner fields to claim | +| spp.claim169.attribute.mapping`` | attribute numbers | ++----------------------------------+----------------------------------+ +| ``spp.claim169.service`` | Service for credential | +| | generation and verification | ++----------------------------------+----------------------------------+ +| ``s | Wizard for batch credential | +| pp.claim169.generate.qr.wizard`` | generation | ++----------------------------------+----------------------------------+ +| ` | Wizard for credential | +| `spp.claim169.verify.qr.wizard`` | verification | ++----------------------------------+----------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -89,36 +89,38 @@ After installing: UI Location ~~~~~~~~~~~ -- **Configuration**: Registry > Configuration > QR Credentials +- **Configuration**: Registry > Configuration > QR Credentials - - Issuer Configurations - - Attribute Mappings + - Issuer Configurations + - Attribute Mappings -- **Credentials**: Accessed from registrant profile under "QR - Credentials" section on Identity tab -- **Generate**: Button on partner form opens generation wizard -- **Verify**: Use verification wizard to validate credentials +- **Credentials**: Accessed from registrant profile under "QR + Credentials" section on Identity tab +- **Generate**: Button on partner form opens generation wizard +- **Verify**: Use verification wizard to validate credentials Security ~~~~~~~~ -+------------------------------------------+--------------+---------------+-----------+ -| Group | Credentials | Configuration | Wizards | -+==========================================+==============+===============+===========+ -| ``spp_claim_169.group_claim169_user`` | Read, Create | Read only | Full CRUD | -+------------------------------------------+--------------+---------------+-----------+ -| ``spp_claim_169.group_claim169_manager`` | Full CRUD | Full CRUD | Full CRUD | -+------------------------------------------+--------------+---------------+-----------+ ++------------------------+--------------+---------------+-----------+ +| Group | Credentials | Configuration | Wizards | ++========================+==============+===============+===========+ +| ``spp_claim_169 | Read, Create | Read only | Full CRUD | +| .group_claim169_user`` | | | | ++------------------------+--------------+---------------+-----------+ +| ``spp_claim_169.gr | Full CRUD | Full CRUD | Full CRUD | +| oup_claim169_manager`` | | | | ++------------------------+--------------+---------------+-----------+ Extension Points ~~~~~~~~~~~~~~~~ -- Override ``spp.claim169.attribute.mapping._transform_value()`` to add - custom transformation types -- Inherit ``spp.claim169.service._build_claim169_input()`` to customize - claim structure -- Extend ``spp.claim169.credential`` to add domain-specific metadata - fields +- Override ``spp.claim169.attribute.mapping._transform_value()`` to add + custom transformation types +- Inherit ``spp.claim169.service._build_claim169_input()`` to customize + claim structure +- Extend ``spp.claim169.credential`` to add domain-specific metadata + fields Dependencies ~~~~~~~~~~~~ diff --git a/spp_consent/README.rst b/spp_consent/README.rst index 1e15c975..36cffb06 100644 --- a/spp_consent/README.rst +++ b/spp_consent/README.rst @@ -33,65 +33,66 @@ groups. Key Capabilities ~~~~~~~~~~~~~~~~ -- Record consent with ISO 27560 four-section structure (metadata, - parties, processing, consent specifics) -- Track consent lifecycle with state validation: requested → - given/refused, given → renewed/withdrawn/expired/invalidated -- Two-mode recipients: specific organizations OR organization categories - (e.g., "all NGOs but not private sector") -- Maintain audit history per GDPR Article 7 requirements (who, what, - when, why, how) -- Handle delegation (guardian, parent, power of attorney) with evidence - attachment support -- Enforce notice-as-boundary: consent terms cannot exceed privacy notice - scope -- Export consent records as JSON-LD or generate ISO 27560 receipts for - interoperability -- Automatically expire consents via scheduled cron job (batch - processing) -- Protect consent terms from modification after given (immutable fields) +- Record consent with ISO 27560 four-section structure (metadata, + parties, processing, consent specifics) +- Track consent lifecycle with state validation: requested → + given/refused, given → renewed/withdrawn/expired/invalidated +- Two-mode recipients: specific organizations OR organization + categories (e.g., "all NGOs but not private sector") +- Maintain audit history per GDPR Article 7 requirements (who, what, + when, why, how) +- Handle delegation (guardian, parent, power of attorney) with evidence + attachment support +- Enforce notice-as-boundary: consent terms cannot exceed privacy + notice scope +- Export consent records as JSON-LD or generate ISO 27560 receipts for + interoperability +- Automatically expire consents via scheduled cron job (batch + processing) +- Protect consent terms from modification after given (immutable + fields) Key Models ~~~~~~~~~~ -+------------------------------------+----------------------------------+ -| Model | Description | -+====================================+==================================+ -| ``spp.consent`` | Consent record implementing ISO | -| | 27560 structure with DPV fields | -+------------------------------------+----------------------------------+ -| ``spp.consent.history`` | Audit trail of consent changes | -| | (action, status, user, | -| | timestamp) | -+------------------------------------+----------------------------------+ -| ``spp.consent.notice`` | Privacy notices per ISO 29184 | -| | with version tracking | -+------------------------------------+----------------------------------+ -| ``spp.consent.purpose`` | DPV-aligned purpose taxonomy | -| | (service delivery, research, | -| | etc.) | -+------------------------------------+----------------------------------+ -| ``spp.consent.personal.data`` | DPV-aligned data categories | -| | (GDPR Article 9 sensitivity | -| | tagging) | -+------------------------------------+----------------------------------+ -| ``spp.consent.processing`` | DPV-aligned processing | -| | operations (collect, store, | -| | share, etc.) | -+------------------------------------+----------------------------------+ -| ``spp.consent.org.type`` | Organization type categories for | -| | category-based consent | -+------------------------------------+----------------------------------+ -| ``spp.consent.mixin`` | Abstract mixin to add consent | -| | tracking to any model | -+------------------------------------+----------------------------------+ -| ``spp.record.consent.wizard`` | Wizard for recording individual | -| | consent | -+------------------------------------+----------------------------------+ -| ``spp.bulk.record.consent.wizard`` | Wizard for bulk consent | -| | recording across multiple | -| | beneficiaries | -+------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ``spp.consent`` | Consent record implementing ISO | +| | 27560 structure with DPV fields | ++----------------------------------+----------------------------------+ +| ``spp.consent.history`` | Audit trail of consent changes | +| | (action, status, user, | +| | timestamp) | ++----------------------------------+----------------------------------+ +| ``spp.consent.notice`` | Privacy notices per ISO 29184 | +| | with version tracking | ++----------------------------------+----------------------------------+ +| ``spp.consent.purpose`` | DPV-aligned purpose taxonomy | +| | (service delivery, research, | +| | etc.) | ++----------------------------------+----------------------------------+ +| ``spp.consent.personal.data`` | DPV-aligned data categories | +| | (GDPR Article 9 sensitivity | +| | tagging) | ++----------------------------------+----------------------------------+ +| ``spp.consent.processing`` | DPV-aligned processing | +| | operations (collect, store, | +| | share, etc.) | ++----------------------------------+----------------------------------+ +| ``spp.consent.org.type`` | Organization type categories for | +| | category-based consent | ++----------------------------------+----------------------------------+ +| ``spp.consent.mixin`` | Abstract mixin to add consent | +| | tracking to any model | ++----------------------------------+----------------------------------+ +| ``spp.record.consent.wizard`` | Wizard for recording individual | +| | consent | ++----------------------------------+----------------------------------+ +| `` | Wizard for bulk consent | +| spp.bulk.record.consent.wizard`` | recording across multiple | +| | beneficiaries | ++----------------------------------+----------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -112,55 +113,58 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Registry > Configuration > Consent Management > Consent - Records -- **Configuration Submenus**: - - - Registry > Configuration > Consent Management > Configuration > - Purposes (DPV) - - Registry > Configuration > Consent Management > Configuration > - Personal Data Categories - - Registry > Configuration > Consent Management > Configuration > - Processing Operations - - Registry > Configuration > Consent Management > Configuration > - Privacy Notices - - Registry > Configuration > Consent Management > Configuration > - Organization Types - -- **Registrant Access**: "Record Consent" stat button on individual and - group forms (added by ``spp.consent.mixin``) -- **Form Tabs**: Consent form has Processing, Consent Details, Audit - Trail, and Technical tabs -- **Notice Tabs**: Privacy Notice form has Summary, Full Notice, ISO - 29184 Elements, Contact, DPV Taxonomy, and Consent Boundaries tabs +- **Menu**: Registry > Configuration > Consent Management > Consent + Records +- **Configuration Submenus**: + + - Registry > Configuration > Consent Management > Configuration > + Purposes (DPV) + - Registry > Configuration > Consent Management > Configuration > + Personal Data Categories + - Registry > Configuration > Consent Management > Configuration > + Processing Operations + - Registry > Configuration > Consent Management > Configuration > + Privacy Notices + - Registry > Configuration > Consent Management > Configuration > + Organization Types + +- **Registrant Access**: "Record Consent" stat button on individual and + group forms (added by ``spp.consent.mixin``) +- **Form Tabs**: Consent form has Processing, Consent Details, Audit + Trail, and Technical tabs +- **Notice Tabs**: Privacy Notice form has Summary, Full Notice, ISO + 29184 Elements, Contact, DPV Taxonomy, and Consent Boundaries tabs Security ~~~~~~~~ -+-----------------------------------------+-------------------------+----------------------+ -| Group | Model | Access | -+=========================================+=========================+======================+ -| ``spp_registry.group_registry_viewer`` | All models | Read | -+-----------------------------------------+-------------------------+----------------------+ -| ``spp_registry.group_registry_officer`` | ``spp.consent`` | Read/Write/Create | -| | | (no delete) | -+-----------------------------------------+-------------------------+----------------------+ -| ``spp_registry.group_registry_officer`` | Wizards | Read/Write/Create | -| | | (no delete) | -+-----------------------------------------+-------------------------+----------------------+ -| ``spp_registry.group_registry_officer`` | DPV taxonomies and | Read | -| | notices | | -+-----------------------------------------+-------------------------+----------------------+ -| ``spp_registry.group_registry_manager`` | ``spp.consent`` | Full CRUD | -+-----------------------------------------+-------------------------+----------------------+ -| ``spp_registry.group_registry_manager`` | ``spp.consent.history`` | Read/Create (no | -| | | write/delete) | -+-----------------------------------------+-------------------------+----------------------+ -| ``spp_registry.group_registry_manager`` | Taxonomies, notices, | Full CRUD | -| | org types | | -+-----------------------------------------+-------------------------+----------------------+ -| ``spp_security.group_spp_admin`` | All models | Full CRUD | -+-----------------------------------------+-------------------------+----------------------+ ++----------------------+----------------------+----------------------+ +| Group | Model | Access | ++======================+======================+======================+ +| ``spp_registry.gro | All models | Read | +| up_registry_viewer`` | | | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | ``spp.consent`` | Read/Write/Create | +| p_registry_officer`` | | (no delete) | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | Wizards | Read/Write/Create | +| p_registry_officer`` | | (no delete) | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | DPV taxonomies and | Read | +| p_registry_officer`` | notices | | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | ``spp.consent`` | Full CRUD | +| p_registry_manager`` | | | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | ``s | Read/Create (no | +| p_registry_manager`` | pp.consent.history`` | write/delete) | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | Taxonomies, notices, | Full CRUD | +| p_registry_manager`` | org types | | ++----------------------+----------------------+----------------------+ +| ``spp_securi | All models | Full CRUD | +| ty.group_spp_admin`` | | | ++----------------------+----------------------+----------------------+ Note: Configuration menu requires ``spp_security.group_spp_admin`` or ``spp_registry.group_registry_config_admin``. @@ -168,17 +172,17 @@ Note: Configuration menu requires ``spp_security.group_spp_admin`` or Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.consent.mixin`` to add consent tracking to custom models - (provides ``consent_ids`` field and wizard launcher) -- Override ``check_consent()`` on ``spp.consent`` to add custom consent - validation logic for API filtering -- Extend DPV taxonomy models (``spp.consent.purpose``, - ``spp.consent.personal.data``, ``spp.consent.processing``) with - domain-specific terms -- Override ``_compute_consent_summary()`` on ``res.partner`` to - customize cached consent summary for fast API lookups -- Inherit ``spp.consent`` and add hook methods for consent lifecycle - events (e.g., ``_on_consent_given``, ``_on_consent_withdrawn``) +- Inherit ``spp.consent.mixin`` to add consent tracking to custom + models (provides ``consent_ids`` field and wizard launcher) +- Override ``check_consent()`` on ``spp.consent`` to add custom consent + validation logic for API filtering +- Extend DPV taxonomy models (``spp.consent.purpose``, + ``spp.consent.personal.data``, ``spp.consent.processing``) with + domain-specific terms +- Override ``_compute_consent_summary()`` on ``res.partner`` to + customize cached consent summary for fast API lookups +- Inherit ``spp.consent`` and add hook methods for consent lifecycle + events (e.g., ``_on_consent_given``, ``_on_consent_withdrawn``) Dependencies ~~~~~~~~~~~~ diff --git a/spp_consent/static/description/index.html b/spp_consent/static/description/index.html index c5fe084b..f525230e 100644 --- a/spp_consent/static/description/index.html +++ b/spp_consent/static/description/index.html @@ -384,27 +384,28 @@

            Key Capabilities

            parties, processing, consent specifics)
          • Track consent lifecycle with state validation: requested → given/refused, given → renewed/withdrawn/expired/invalidated
          • -
          • Two-mode recipients: specific organizations OR organization categories -(e.g., “all NGOs but not private sector”)
          • +
          • Two-mode recipients: specific organizations OR organization +categories (e.g., “all NGOs but not private sector”)
          • Maintain audit history per GDPR Article 7 requirements (who, what, when, why, how)
          • Handle delegation (guardian, parent, power of attorney) with evidence attachment support
          • -
          • Enforce notice-as-boundary: consent terms cannot exceed privacy notice -scope
          • +
          • Enforce notice-as-boundary: consent terms cannot exceed privacy +notice scope
          • Export consent records as JSON-LD or generate ISO 27560 receipts for interoperability
          • Automatically expire consents via scheduled cron job (batch processing)
          • -
          • Protect consent terms from modification after given (immutable fields)
          • +
          • Protect consent terms from modification after given (immutable +fields)
          • Key Models

            --++ @@ -452,7 +453,8 @@

            Key Models

            - + @@ -506,9 +508,9 @@

            UI Location

            Security

            Model Wizard for recording individual consent
            spp.bulk.record.consent.wizard
            `` +spp.bulk.record.consent.wizard`` Wizard for bulk consent recording across multiple beneficiaries
            ---+++ @@ -517,40 +519,49 @@

            Security

            - + - + - + - + - + - - + + - + - + @@ -562,8 +573,8 @@

            Security

            Extension Points

              -
            • Inherit spp.consent.mixin to add consent tracking to custom models -(provides consent_ids field and wizard launcher)
            • +
            • Inherit spp.consent.mixin to add consent tracking to custom +models (provides consent_ids field and wizard launcher)
            • Override check_consent() on spp.consent to add custom consent validation logic for API filtering
            • Extend DPV taxonomy models (spp.consent.purpose, diff --git a/spp_cr_types_advanced/README.rst b/spp_cr_types_advanced/README.rst index f770738f..dddd1e19 100644 --- a/spp_cr_types_advanced/README.rst +++ b/spp_cr_types_advanced/README.rst @@ -33,16 +33,16 @@ logic. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Membership operations**: Add member, remove member, change head of - household, transfer member between groups -- **Group operations**: Create new groups, split households into - separate groups -- **Registrant lifecycle**: Exit and deactivate registrants from the - system -- **Data quality**: Merge duplicate registrant records with full data - consolidation -- All types use ``apply_strategy='custom'`` with Python models that - cannot be modified via Studio +- **Membership operations**: Add member, remove member, change head of + household, transfer member between groups +- **Group operations**: Create new groups, split households into + separate groups +- **Registrant lifecycle**: Exit and deactivate registrants from the + system +- **Data quality**: Merge duplicate registrant records with full data + consolidation +- All types use ``apply_strategy='custom'`` with Python models that + cannot be modified via Studio Models Secured by This Module ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -51,33 +51,33 @@ This module does not define models. It provides data records for ``spp.change.request.type`` and security rules for detail/apply models defined in ``spp_change_request_v2``: -+-------------------------------------+------------------------------------+----------------------+ -| Detail Model | Apply Model | Purpose | -+=====================================+====================================+======================+ -| ``spp.cr.detail.add_member`` | ``spp.cr.apply.add_member`` | Add new member to | -| | | group | -+-------------------------------------+------------------------------------+----------------------+ -| ``spp.cr.detail.remove_member`` | ``spp.cr.apply.remove_member`` | Remove member from | -| | | group | -+-------------------------------------+------------------------------------+----------------------+ -| ``spp.cr.detail.change_hoh`` | ``spp.cr.apply.change_hoh`` | Change head of | -| | | household | -+-------------------------------------+------------------------------------+----------------------+ -| ``spp.cr.detail.transfer_member`` | ``spp.cr.apply.transfer_member`` | Transfer member | -| | | between groups | -+-------------------------------------+------------------------------------+----------------------+ -| ``spp.cr.detail.exit_registrant`` | ``spp.cr.apply.exit_registrant`` | Deactivate | -| | | registrant | -+-------------------------------------+------------------------------------+----------------------+ -| ``spp.cr.detail.create_group`` | ``spp.cr.apply.create_group`` | Create new | -| | | group/household | -+-------------------------------------+------------------------------------+----------------------+ -| ``spp.cr.detail.split_household`` | ``spp.cr.apply.split_household`` | Split household into | -| | | two groups | -+-------------------------------------+------------------------------------+----------------------+ -| ``spp.cr.detail.merge_registrants`` | ``spp.cr.apply.merge_registrants`` | Merge duplicate | -| | | registrant records | -+-------------------------------------+------------------------------------+----------------------+ ++----------------------+----------------------+----------------------+ +| Detail Model | Apply Model | Purpose | ++======================+======================+======================+ +| ``spp.cr | ``spp.c | Add new member to | +| .detail.add_member`` | r.apply.add_member`` | group | ++----------------------+----------------------+----------------------+ +| ``spp.cr.de | ``spp.cr.a | Remove member from | +| tail.remove_member`` | pply.remove_member`` | group | ++----------------------+----------------------+----------------------+ +| ``spp.cr | ``spp.c | Change head of | +| .detail.change_hoh`` | r.apply.change_hoh`` | household | ++----------------------+----------------------+----------------------+ +| ``spp.cr.deta | ``spp.cr.app | Transfer member | +| il.transfer_member`` | ly.transfer_member`` | between groups | ++----------------------+----------------------+----------------------+ +| ``spp.cr.deta | ``spp.cr.app | Deactivate | +| il.exit_registrant`` | ly.exit_registrant`` | registrant | ++----------------------+----------------------+----------------------+ +| ``spp.cr.d | ``spp.cr. | Create new | +| etail.create_group`` | apply.create_group`` | group/household | ++----------------------+----------------------+----------------------+ +| ``spp.cr.deta | ``spp.cr.app | Split household into | +| il.split_household`` | ly.split_household`` | two groups | ++----------------------+----------------------+----------------------+ +| ``spp.cr.detail | ``spp.cr.apply | Merge duplicate | +| .merge_registrants`` | .merge_registrants`` | registrant records | ++----------------------+----------------------+----------------------+ Configuration ~~~~~~~~~~~~~ @@ -94,13 +94,13 @@ After installing: UI Location ~~~~~~~~~~~ -- **Configuration**: Change Requests > Configuration > Change Request - Types -- **Create Requests**: Forms accessible from registrant profiles based - on ``target_type`` (individual/group/both) -- **Type Codes**: ``add_member``, ``remove_member``, ``change_hoh``, - ``transfer_member``, ``exit_registrant``, ``create_group``, - ``split_household``, ``merge_registrants`` +- **Configuration**: Change Requests > Configuration > Change Request + Types +- **Create Requests**: Forms accessible from registrant profiles based + on ``target_type`` (individual/group/both) +- **Type Codes**: ``add_member``, ``remove_member``, ``change_hoh``, + ``transfer_member``, ``exit_registrant``, ``create_group``, + ``split_household``, ``merge_registrants`` Security ~~~~~~~~ @@ -117,12 +117,12 @@ Security rules apply to all eight detail models. Extension Points ~~~~~~~~~~~~~~~~ -- Override apply strategies in ``spp_change_request_v2/strategies/*.py`` - to customize behavior -- Inherit detail models in ``spp_change_request_v2/details/*.py`` to add - fields -- Clone type definitions if ``is_studio_cloneable`` is enabled to create - variants +- Override apply strategies in + ``spp_change_request_v2/strategies/*.py`` to customize behavior +- Inherit detail models in ``spp_change_request_v2/details/*.py`` to + add fields +- Clone type definitions if ``is_studio_cloneable`` is enabled to + create variants Dependencies ~~~~~~~~~~~~ diff --git a/spp_cr_types_advanced/static/description/index.html b/spp_cr_types_advanced/static/description/index.html index 64c913ee..e7eb29ca 100644 --- a/spp_cr_types_advanced/static/description/index.html +++ b/spp_cr_types_advanced/static/description/index.html @@ -399,9 +399,9 @@

              Models Secured by This Module

              defined in spp_change_request_v2:

            Group
            spp_registry.group_registry_viewer
            spp_registry.gro +up_registry_viewer All models Read
            spp_registry.group_registry_officer
            spp_registry.grou +p_registry_officer spp.consent Read/Write/Create (no delete)
            spp_registry.group_registry_officer
            spp_registry.grou +p_registry_officer Wizards Read/Write/Create (no delete)
            spp_registry.group_registry_officer
            spp_registry.grou +p_registry_officer DPV taxonomies and notices Read
            spp_registry.group_registry_manager
            spp_registry.grou +p_registry_manager spp.consent Full CRUD
            spp_registry.group_registry_managerspp.consent.history
            spp_registry.grou +p_registry_managers +pp.consent.history Read/Create (no write/delete)
            spp_registry.group_registry_manager
            spp_registry.grou +p_registry_manager Taxonomies, notices, org types Full CRUD
            spp_security.group_spp_admin
            spp_securi +ty.group_spp_admin All models Full CRUD
            ---+++ @@ -410,43 +410,59 @@

            Models Secured by This Module

            - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -503,12 +519,12 @@

            Security

            Extension Points

              -
            • Override apply strategies in spp_change_request_v2/strategies/*.py -to customize behavior
            • -
            • Inherit detail models in spp_change_request_v2/details/*.py to add -fields
            • -
            • Clone type definitions if is_studio_cloneable is enabled to create -variants
            • +
            • Override apply strategies in +spp_change_request_v2/strategies/*.py to customize behavior
            • +
            • Inherit detail models in spp_change_request_v2/details/*.py to +add fields
            • +
            • Clone type definitions if is_studio_cloneable is enabled to +create variants
            diff --git a/spp_cr_types_base/README.rst b/spp_cr_types_base/README.rst index 87f3e7d4..5e1f9b3d 100644 --- a/spp_cr_types_base/README.rst +++ b/spp_cr_types_base/README.rst @@ -31,41 +31,41 @@ parent module. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Edit Individual Information**: Updates personal data (name, - birthdate, gender), contact information (phone, email), and address - fields using field mapping strategy -- **Edit Group Information**: Updates group/household name, contact - information, and address using field mapping strategy -- **Update ID Document**: Adds, updates, or removes identification - documents using custom application logic with operation selection - (add/update/remove) -- **Field Mapping Configuration**: Pre-configured mappings between - detail model fields and target registrant fields for automatic data - transfer -- **Studio Customization**: All CR types are marked as editable and - cloneable in Studio for implementation-specific requirements +- **Edit Individual Information**: Updates personal data (name, + birthdate, gender), contact information (phone, email), and address + fields using field mapping strategy +- **Edit Group Information**: Updates group/household name, contact + information, and address using field mapping strategy +- **Update ID Document**: Adds, updates, or removes identification + documents using custom application logic with operation selection + (add/update/remove) +- **Field Mapping Configuration**: Pre-configured mappings between + detail model fields and target registrant fields for automatic data + transfer +- **Studio Customization**: All CR types are marked as editable and + cloneable in Studio for implementation-specific requirements Key Models ~~~~~~~~~~ -+-------------------------------------+----------------------------------+ -| Model | Description | -+=====================================+==================================+ -| ``spp.cr.detail.edit_individual`` | Detail form for individual | -| | information changes | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.edit_group`` | Detail form for group/household | -| | information | -+-------------------------------------+----------------------------------+ -| ``spp.cr.detail.update_id`` | Detail form for ID document | -| | operations | -+-------------------------------------+----------------------------------+ -| ``spp.change.request.type`` | CR type configurations (defined | -| | in parent) | -+-------------------------------------+----------------------------------+ -| ``spp.change.request.type.mapping`` | Field mappings for field_mapping | -| | strategy | -+-------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ` | Detail form for individual | +| `spp.cr.detail.edit_individual`` | information changes | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.edit_group`` | Detail form for group/household | +| | information | ++----------------------------------+----------------------------------+ +| ``spp.cr.detail.update_id`` | Detail form for ID document | +| | operations | ++----------------------------------+----------------------------------+ +| ``spp.change.request.type`` | CR type configurations (defined | +| | in parent) | ++----------------------------------+----------------------------------+ +| ``s | Field mappings for field_mapping | +| pp.change.request.type.mapping`` | strategy | ++----------------------------------+----------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -83,36 +83,37 @@ After installing: UI Location ~~~~~~~~~~~ -- **CR Type Selection**: Types appear in the creation wizard at **Change - Requests > New Request** -- **Configuration**: Change Requests > Configuration > Change Request - Types -- **Detail Forms**: Accessed when creating or editing a change request - of the corresponding type +- **CR Type Selection**: Types appear in the creation wizard at + **Change Requests > New Request** +- **Configuration**: Change Requests > Configuration > Change Request + Types +- **Detail Forms**: Accessed when creating or editing a change request + of the corresponding type Security ~~~~~~~~ -+--------------------------------------------+----------------------------------+ -| Group | Access | -+============================================+==================================+ -| ``spp_change_request_v2.group_cr_user`` | Read/write/create detail models | -| | (no delete) | -+--------------------------------------------+----------------------------------+ -| ``spp_change_request_v2.group_cr_manager`` | Full CRUD on detail models | -+--------------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_c | Read/write/create detail models | +| hange_request_v2.group_cr_user`` | (no delete) | ++----------------------------------+----------------------------------+ +| ``spp_chan | Full CRUD on detail models | +| ge_request_v2.group_cr_manager`` | | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Clone any base type via Studio to create domain-specific variants - (e.g., "Edit Farmer Profile") -- Add custom fields to detail models via Studio; field mappings - auto-discover new fields in dropdown -- Inherit ``spp.cr.apply.update_id`` and override ``apply()`` method to - customize ID document application logic -- Mark types as ``is_studio_editable=False`` in inherited modules to - prevent runtime modification +- Clone any base type via Studio to create domain-specific variants + (e.g., "Edit Farmer Profile") +- Add custom fields to detail models via Studio; field mappings + auto-discover new fields in dropdown +- Inherit ``spp.cr.apply.update_id`` and override ``apply()`` method to + customize ID document application logic +- Mark types as ``is_studio_editable=False`` in inherited modules to + prevent runtime modification Dependencies ~~~~~~~~~~~~ diff --git a/spp_cr_types_base/static/description/index.html b/spp_cr_types_base/static/description/index.html index 9c90a59c..1f3ba4b5 100644 --- a/spp_cr_types_base/static/description/index.html +++ b/spp_cr_types_base/static/description/index.html @@ -397,8 +397,8 @@

            Key Capabilities

            Key Models

            Detail Model
            spp.cr.detail.add_memberspp.cr.apply.add_member
            spp.cr +.detail.add_memberspp.c +r.apply.add_member Add new member to group
            spp.cr.detail.remove_memberspp.cr.apply.remove_member
            spp.cr.de +tail.remove_memberspp.cr.a +pply.remove_member Remove member from group
            spp.cr.detail.change_hohspp.cr.apply.change_hoh
            spp.cr +.detail.change_hohspp.c +r.apply.change_hoh Change head of household
            spp.cr.detail.transfer_memberspp.cr.apply.transfer_member
            spp.cr.deta +il.transfer_memberspp.cr.app +ly.transfer_member Transfer member between groups
            spp.cr.detail.exit_registrantspp.cr.apply.exit_registrant
            spp.cr.deta +il.exit_registrantspp.cr.app +ly.exit_registrant Deactivate registrant
            spp.cr.detail.create_groupspp.cr.apply.create_group
            spp.cr.d +etail.create_groupspp.cr. +apply.create_group Create new group/household
            spp.cr.detail.split_householdspp.cr.apply.split_household
            spp.cr.deta +il.split_householdspp.cr.app +ly.split_household Split household into two groups
            spp.cr.detail.merge_registrantsspp.cr.apply.merge_registrants
            spp.cr.detail +.merge_registrantsspp.cr.apply +.merge_registrants Merge duplicate registrant records
            --++ @@ -406,7 +406,8 @@

            Key Models

            - + @@ -422,7 +423,8 @@

            Key Models

            - + @@ -445,8 +447,8 @@

            Configuration

            UI Location

              -
            • CR Type Selection: Types appear in the creation wizard at Change -Requests > New Request
            • +
            • CR Type Selection: Types appear in the creation wizard at +Change Requests > New Request
            • Configuration: Change Requests > Configuration > Change Request Types
            • Detail Forms: Accessed when creating or editing a change request @@ -457,8 +459,8 @@

              UI Location

              Security

            Model
            spp.cr.detail.edit_individual
            ` +spp.cr.detail.edit_individual` Detail form for individual information changes
            CR type configurations (defined in parent)
            spp.change.request.type.mapping
            s +pp.change.request.type.mapping Field mappings for field_mapping strategy
            --++ @@ -466,11 +468,13 @@

            Security

            - + - + diff --git a/spp_custom_field/README.rst b/spp_custom_field/README.rst index dfee7594..b7cd7b40 100644 --- a/spp_custom_field/README.rst +++ b/spp_custom_field/README.rst @@ -31,31 +31,31 @@ grouping and read-only indicator fields for program metrics. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define custom fields with ``x_cst_grp_*`` (group) or ``x_cst_indv_*`` - (individual) naming pattern -- Define read-only indicator fields with ``x_ind_grp_*`` or - ``x_ind_indv_*`` naming pattern -- Organize fields into named groups with sequence-based ordering -- Automatically inject fields into registrant forms based on registrant - type -- Display custom fields under "Additional Details" tab, indicators under - "Indicators" tab +- Define custom fields with ``x_cst_grp_*`` (group) or ``x_cst_indv_*`` + (individual) naming pattern +- Define read-only indicator fields with ``x_ind_grp_*`` or + ``x_ind_indv_*`` naming pattern +- Organize fields into named groups with sequence-based ordering +- Automatically inject fields into registrant forms based on registrant + type +- Display custom fields under "Additional Details" tab, indicators + under "Indicators" tab Key Models ~~~~~~~~~~ -+------------------------------+---------------------------------------+ -| Model | Description | -+==============================+=======================================+ -| ``spp.custom.field.group`` | Groups custom fields for organized | -| | display in UI | -+------------------------------+---------------------------------------+ -| ``ir.model.fields`` (extend) | Adds ``field_group_id`` and | -| | ``sequence`` for field order | -+------------------------------+---------------------------------------+ -| ``res.partner`` (extend) | Dynamically injects custom fields | -| | into forms | -+------------------------------+---------------------------------------+ ++------------------------------+--------------------------------------+ +| Model | Description | ++==============================+======================================+ +| ``spp.custom.field.group`` | Groups custom fields for organized | +| | display in UI | ++------------------------------+--------------------------------------+ +| ``ir.model.fields`` (extend) | Adds ``field_group_id`` and | +| | ``sequence`` for field order | ++------------------------------+--------------------------------------+ +| ``res.partner`` (extend) | Dynamically injects custom fields | +| | into forms | ++------------------------------+--------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -68,22 +68,22 @@ After installing: 3. Navigate to **Settings > Technical > Database Structure > Models** 4. Select **Contact (res.partner)** and create custom fields: - - For group registrants: ``x_cst_grp_fieldname`` or - ``x_ind_grp_fieldname`` - - For individuals: ``x_cst_indv_fieldname`` or - ``x_ind_indv_fieldname`` + - For group registrants: ``x_cst_grp_fieldname`` or + ``x_ind_grp_fieldname`` + - For individuals: ``x_cst_indv_fieldname`` or + ``x_ind_indv_fieldname`` 5. Assign ``field_group_id`` and ``sequence`` to organize field display UI Location ~~~~~~~~~~~ -- **Field Groups**: No menu defined; access via Settings > Technical > - Actions > Window Actions -- **Custom fields**: Appear on registrant forms under "Additional - Details" tab -- **Indicator fields**: Appear on registrant forms under "Indicators" - tab (read-only) +- **Field Groups**: No menu defined; access via Settings > Technical > + Actions > Window Actions +- **Custom fields**: Appear on registrant forms under "Additional + Details" tab +- **Indicator fields**: Appear on registrant forms under "Indicators" + tab (read-only) Security ~~~~~~~~ @@ -98,12 +98,12 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_inject_custom_pages()`` to customize tab and field - injection logic -- Override ``_group_fields_by_group()`` to modify field grouping and - sorting -- Extend ``spp.custom.field.group`` to add metadata or classification - fields +- Override ``_inject_custom_pages()`` to customize tab and field + injection logic +- Override ``_group_fields_by_group()`` to modify field grouping and + sorting +- Extend ``spp.custom.field.group`` to add metadata or classification + fields Dependencies ~~~~~~~~~~~~ diff --git a/spp_custom_field/static/description/index.html b/spp_custom_field/static/description/index.html index 180382d8..3b5ea914 100644 --- a/spp_custom_field/static/description/index.html +++ b/spp_custom_field/static/description/index.html @@ -385,16 +385,16 @@

            Key Capabilities

          • Organize fields into named groups with sequence-based ordering
          • Automatically inject fields into registrant forms based on registrant type
          • -
          • Display custom fields under “Additional Details” tab, indicators under -“Indicators” tab
          • +
          • Display custom fields under “Additional Details” tab, indicators +under “Indicators” tab
          • Key Models

            Group
            spp_change_request_v2.group_cr_user
            spp_c +hange_request_v2.group_cr_user Read/write/create detail models (no delete)
            spp_change_request_v2.group_cr_manager
            spp_chan +ge_request_v2.group_cr_manager Full CRUD on detail models
            --++ diff --git a/spp_dci/README.rst b/spp_dci/README.rst index 68cc1d7e..59c564f3 100644 --- a/spp_dci/README.rst +++ b/spp_dci/README.rst @@ -31,45 +31,46 @@ registry integrations. Key Capabilities ~~~~~~~~~~~~~~~~ -- Manage signing keys with Ed25519 and RSA-256 algorithms, state-based - lifecycle (draft → active → revoked) -- Generate HTTP signatures following draft-cavage specification for - outbound message authentication -- Verify incoming HTTP signatures using JWKS public key discovery -- Validate DCI message structure using Pydantic schemas (envelope, - header, payload) -- Export standard identifier types (UIN, BRN, MRN, DRN) with DCI - namespace URIs -- Build and sign DCI response envelopes with centralized helper - functions +- Manage signing keys with Ed25519 and RSA-256 algorithms, state-based + lifecycle (draft → active → revoked) +- Generate HTTP signatures following draft-cavage specification for + outbound message authentication +- Verify incoming HTTP signatures using JWKS public key discovery +- Validate DCI message structure using Pydantic schemas (envelope, + header, payload) +- Export standard identifier types (UIN, BRN, MRN, DRN) with DCI + namespace URIs +- Build and sign DCI response envelopes with centralized helper + functions Key Models ~~~~~~~~~~ -+-------------------------+--------------------------------------------+ -| Model | Description | -+=========================+============================================+ -| ``spp.dci.signing.key`` | Cryptographic signing key with lifecycle | -| | state management | -+-------------------------+--------------------------------------------+ ++-------------------------+-------------------------------------------+ +| Model | Description | ++=========================+===========================================+ +| ``spp.dci.signing.key`` | Cryptographic signing key with lifecycle | +| | state management | ++-------------------------+-------------------------------------------+ Pydantic Schemas ~~~~~~~~~~~~~~~~ Exported in ``spp_dci.schemas`` for import by DCI server/client modules: -- **Envelope**: ``DCIEnvelope``, ``DCIMessageHeader``, - ``DCICallbackHeader`` - Three-part message structure -- **Common**: ``Identifier``, ``Name``, ``Address``, ``GeoLocation``, - ``Place``, ``AdditionalAttribute``, ``Period`` - Shared data types -- **Person/Group**: ``Person``, ``RelatedPerson``, ``DisabilityInfo``, - ``Group``, ``Member`` - Registry entities -- **Search**: ``SearchRequest``, ``SearchResponse``, ``SearchCriteria``, - ``Pagination``, ``Expression`` - Search operations -- **Subscription**: ``SubscribeRequest``, ``SubscribeResponse``, - ``UnsubscribeRequest``, ``TxnStatusRequest`` - Event subscriptions -- **Receipt**: ``ReceiptRequest``, ``ReceiptResponse``, - ``BeneficiaryRef``, ``ReceiptInformation`` - Delivery confirmations +- **Envelope**: ``DCIEnvelope``, ``DCIMessageHeader``, + ``DCICallbackHeader`` - Three-part message structure +- **Common**: ``Identifier``, ``Name``, ``Address``, ``GeoLocation``, + ``Place``, ``AdditionalAttribute``, ``Period`` - Shared data types +- **Person/Group**: ``Person``, ``RelatedPerson``, ``DisabilityInfo``, + ``Group``, ``Member`` - Registry entities +- **Search**: ``SearchRequest``, ``SearchResponse``, + ``SearchCriteria``, ``Pagination``, ``Expression`` - Search + operations +- **Subscription**: ``SubscribeRequest``, ``SubscribeResponse``, + ``UnsubscribeRequest``, ``TxnStatusRequest`` - Event subscriptions +- **Receipt**: ``ReceiptRequest``, ``ReceiptResponse``, + ``BeneficiaryRef``, ``ReceiptInformation`` - Delivery confirmations Configuration ~~~~~~~~~~~~~ @@ -102,18 +103,18 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.dci.signing.key`` to add key rotation policies or HSM - integration -- Use ``DCISigner(private_key, sender_id, key_id, algorithm)`` to sign - outbound messages -- Use ``DCIVerifier(public_key, algorithm)`` to verify incoming - signatures -- Import schemas from ``spp_dci.schemas`` for message validation in - custom endpoints -- Override ``get_sender_id(env)`` in ``response_helpers`` to customize - sender identification -- Use ``build_signed_envelope()`` helper to construct DCI responses with - proper headers and signatures +- Inherit ``spp.dci.signing.key`` to add key rotation policies or HSM + integration +- Use ``DCISigner(private_key, sender_id, key_id, algorithm)`` to sign + outbound messages +- Use ``DCIVerifier(public_key, algorithm)`` to verify incoming + signatures +- Import schemas from ``spp_dci.schemas`` for message validation in + custom endpoints +- Override ``get_sender_id(env)`` in ``response_helpers`` to customize + sender identification +- Use ``build_signed_envelope()`` helper to construct DCI responses + with proper headers and signatures Dependencies ~~~~~~~~~~~~ diff --git a/spp_dci/static/description/index.html b/spp_dci/static/description/index.html index 1e960153..d3881f9f 100644 --- a/spp_dci/static/description/index.html +++ b/spp_dci/static/description/index.html @@ -395,8 +395,8 @@

            Key Capabilities

            Key Models

            Model
            --++ @@ -421,8 +421,9 @@

            Pydantic Schemas

            Place, AdditionalAttribute, Period - Shared data types
          • Person/Group: Person, RelatedPerson, DisabilityInfo, Group, Member - Registry entities
          • -
          • Search: SearchRequest, SearchResponse, SearchCriteria, -Pagination, Expression - Search operations
          • +
          • Search: SearchRequest, SearchResponse, +SearchCriteria, Pagination, Expression - Search +operations
          • Subscription: SubscribeRequest, SubscribeResponse, UnsubscribeRequest, TxnStatusRequest - Event subscriptions
          • Receipt: ReceiptRequest, ReceiptResponse, @@ -481,8 +482,8 @@

            Extension Points

            custom endpoints
          • Override get_sender_id(env) in response_helpers to customize sender identification
          • -
          • Use build_signed_envelope() helper to construct DCI responses with -proper headers and signatures
          • +
          • Use build_signed_envelope() helper to construct DCI responses +with proper headers and signatures
          • diff --git a/spp_dci_client/README.rst b/spp_dci_client/README.rst index acc336cf..48f96666 100644 --- a/spp_dci_client/README.rst +++ b/spp_dci_client/README.rst @@ -31,33 +31,33 @@ and Python service class for search, subscribe, and status operations. Key Capabilities ~~~~~~~~~~~~~~~~ -- Configure external DCI registry endpoints with OAuth2 or Bearer token - authentication -- Cache OAuth2 tokens with automatic refresh to minimize token requests -- Sign outgoing DCI requests using JWK keys from ``spp_dci`` -- Execute synchronous and asynchronous search operations (by ID, - predicate, expression, date range) -- Subscribe to and unsubscribe from registry event notifications -- Check transaction status for asynchronous operations -- Test connection with one-click validation and error diagnostics -- Format HTTP and connection errors into user-friendly messages +- Configure external DCI registry endpoints with OAuth2 or Bearer token + authentication +- Cache OAuth2 tokens with automatic refresh to minimize token requests +- Sign outgoing DCI requests using JWK keys from ``spp_dci`` +- Execute synchronous and asynchronous search operations (by ID, + predicate, expression, date range) +- Subscribe to and unsubscribe from registry event notifications +- Check transaction status for asynchronous operations +- Test connection with one-click validation and error diagnostics +- Format HTTP and connection errors into user-friendly messages Key Models ~~~~~~~~~~ -+-------------------------+--------------------------------------------+ -| Model | Description | -+=========================+============================================+ -| ``spp.dci.data.source`` | Connection configuration for external DCI | -| | registries | -+-------------------------+--------------------------------------------+ ++-------------------------+-------------------------------------------+ +| Model | Description | ++=========================+===========================================+ +| ``spp.dci.data.source`` | Connection configuration for external DCI | +| | registries | ++-------------------------+-------------------------------------------+ Python Service Classes ~~~~~~~~~~~~~~~~~~~~~~ -- **``DCIClient(data_source, env)``**: Main API client for executing DCI - protocol operations (search, subscribe, txn_status). Instantiate with - a data source record and environment. +- **``DCIClient(data_source, env)``**: Main API client for executing + DCI protocol operations (search, subscribe, txn_status). Instantiate + with a data source record and environment. Configuration ~~~~~~~~~~~~~ @@ -76,9 +76,9 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Settings > Technical > DCI > Configuration > Data Sources -- **Form**: Includes connection test button in header, configuration - groups, and two notebook tabs ("Connection Status" and "Notes") +- **Menu**: Settings > Technical > DCI > Configuration > Data Sources +- **Form**: Includes connection test button in header, configuration + groups, and two notebook tabs ("Connection Status" and "Notes") Security ~~~~~~~~ @@ -93,14 +93,14 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.dci.data.source`` to add registry-specific configuration - fields -- Instantiate ``DCIClient(data_source, env)`` from custom code to - execute DCI operations -- Override ``_get_registry_type()`` or ``_get_receiver_id()`` for custom - registry routing -- Use ``format_http_error()`` and ``format_connection_error()`` for - consistent error handling +- Inherit ``spp.dci.data.source`` to add registry-specific + configuration fields +- Instantiate ``DCIClient(data_source, env)`` from custom code to + execute DCI operations +- Override ``_get_registry_type()`` or ``_get_receiver_id()`` for + custom registry routing +- Use ``format_http_error()`` and ``format_connection_error()`` for + consistent error handling Usage Example ~~~~~~~~~~~~~ diff --git a/spp_dci_client/static/description/index.html b/spp_dci_client/static/description/index.html index baaa3245..77aa5cd2 100644 --- a/spp_dci_client/static/description/index.html +++ b/spp_dci_client/static/description/index.html @@ -394,8 +394,8 @@

            Key Capabilities

            Key Models

            Model
            --++ @@ -413,9 +413,9 @@

            Key Models

            Python Service Classes

              -
            • ``DCIClient(data_source, env)``: Main API client for executing DCI -protocol operations (search, subscribe, txn_status). Instantiate with -a data source record and environment.
            • +
            • ``DCIClient(data_source, env)``: Main API client for executing +DCI protocol operations (search, subscribe, txn_status). Instantiate +with a data source record and environment.
            @@ -465,12 +465,12 @@

            Security

            Extension Points

              -
            • Inherit spp.dci.data.source to add registry-specific configuration -fields
            • +
            • Inherit spp.dci.data.source to add registry-specific +configuration fields
            • Instantiate DCIClient(data_source, env) from custom code to execute DCI operations
            • -
            • Override _get_registry_type() or _get_receiver_id() for custom -registry routing
            • +
            • Override _get_registry_type() or _get_receiver_id() for +custom registry routing
            • Use format_http_error() and format_connection_error() for consistent error handling
            diff --git a/spp_dci_client_crvs/README.rst b/spp_dci_client_crvs/README.rst index 054e0c3e..8e2fa112 100644 --- a/spp_dci_client_crvs/README.rst +++ b/spp_dci_client_crvs/README.rst @@ -30,31 +30,31 @@ stored public keys of trusted CRVS registries. Key Capabilities ~~~~~~~~~~~~~~~~ -- Receive and log vital events: birth, death, marriage, divorce from - CRVS systems -- Match events to registry partners using identifiers (BRN, DRN, MRN, - UIN) -- Update partner records: birthdate, death status, civil status, - registry identifiers -- Process events with state tracking: received → processing → - processed/error -- Verify DCI callback signatures using JWKS public keys from trusted - CRVS registries -- Fetch and store CRVS public keys automatically from JWKS endpoints -- Retry failed event processing through UI actions +- Receive and log vital events: birth, death, marriage, divorce from + CRVS systems +- Match events to registry partners using identifiers (BRN, DRN, MRN, + UIN) +- Update partner records: birthdate, death status, civil status, + registry identifiers +- Process events with state tracking: received → processing → + processed/error +- Verify DCI callback signatures using JWKS public keys from trusted + CRVS registries +- Fetch and store CRVS public keys automatically from JWKS endpoints +- Retry failed event processing through UI actions Key Models ~~~~~~~~~~ -+-------------------------+--------------------------------------------+ -| Model | Description | -+=========================+============================================+ -| ``spp.dci.crvs.event`` | Vital event log with identifier, type, | -| | date, processing state | -+-------------------------+--------------------------------------------+ -| ``spp.dci.crvs.sender`` | Trusted CRVS registry with sender ID and | -| | public key | -+-------------------------+--------------------------------------------+ ++-------------------------+-------------------------------------------+ +| Model | Description | ++=========================+===========================================+ +| ``spp.dci.crvs.event`` | Vital event log with identifier, type, | +| | date, processing state | ++-------------------------+-------------------------------------------+ +| ``spp.dci.crvs.sender`` | Trusted CRVS registry with sender ID and | +| | public key | ++-------------------------+-------------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -72,11 +72,11 @@ After installing: UI Location ~~~~~~~~~~~ -- **Events**: Settings > Technical > DCI > Activity Logs > CRVS Events -- **Sender Registry**: Settings > Technical > DCI > Configuration > CRVS - Sender Registry -- **Event form tabs**: "Raw Data", "Notes" -- **Sender form tabs**: "Public Key", "Notes" +- **Events**: Settings > Technical > DCI > Activity Logs > CRVS Events +- **Sender Registry**: Settings > Technical > DCI > Configuration > + CRVS Sender Registry +- **Event form tabs**: "Raw Data", "Notes" +- **Sender form tabs**: "Public Key", "Notes" Security ~~~~~~~~ @@ -91,15 +91,15 @@ Group CRVS Event Access CRVS Sender Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_process_birth_event()``, ``_process_death_event()``, - ``_process_marriage_event()``, ``_process_divorce_event()`` to - customize partner record updates based on event type -- Override ``_find_person_by_identifier()`` to implement custom matching - logic -- Inherit ``spp.dci.crvs.event`` to add fields for domain-specific event - metadata -- Use ``CRVSService`` class for programmatic access to verify_birth(), - check_death(), subscribe_events() +- Override ``_process_birth_event()``, ``_process_death_event()``, + ``_process_marriage_event()``, ``_process_divorce_event()`` to + customize partner record updates based on event type +- Override ``_find_person_by_identifier()`` to implement custom + matching logic +- Inherit ``spp.dci.crvs.event`` to add fields for domain-specific + event metadata +- Use ``CRVSService`` class for programmatic access to verify_birth(), + check_death(), subscribe_events() Dependencies ~~~~~~~~~~~~ diff --git a/spp_dci_client_crvs/static/description/index.html b/spp_dci_client_crvs/static/description/index.html index 2f0c61ac..0dcdba9c 100644 --- a/spp_dci_client_crvs/static/description/index.html +++ b/spp_dci_client_crvs/static/description/index.html @@ -395,8 +395,8 @@

            Key Capabilities

            Key Models

            Model
            --++ @@ -432,8 +432,8 @@

            Configuration

            UI Location

            • Events: Settings > Technical > DCI > Activity Logs > CRVS Events
            • -
            • Sender Registry: Settings > Technical > DCI > Configuration > CRVS -Sender Registry
            • +
            • Sender Registry: Settings > Technical > DCI > Configuration > +CRVS Sender Registry
            • Event form tabs: “Raw Data”, “Notes”
            • Sender form tabs: “Public Key”, “Notes”
            @@ -470,10 +470,10 @@

            Extension Points

          • Override _process_birth_event(), _process_death_event(), _process_marriage_event(), _process_divorce_event() to customize partner record updates based on event type
          • -
          • Override _find_person_by_identifier() to implement custom matching -logic
          • -
          • Inherit spp.dci.crvs.event to add fields for domain-specific event -metadata
          • +
          • Override _find_person_by_identifier() to implement custom +matching logic
          • +
          • Inherit spp.dci.crvs.event to add fields for domain-specific +event metadata
          • Use CRVSService class for programmatic access to verify_birth(), check_death(), subscribe_events()
          • diff --git a/spp_dci_client_dr/README.rst b/spp_dci_client_dr/README.rst index ecc9fdb4..1ab7ae79 100644 --- a/spp_dci_client_dr/README.rst +++ b/spp_dci_client_dr/README.rst @@ -31,28 +31,28 @@ systems. Key Capabilities ~~~~~~~~~~~~~~~~ -- Query disability status from remote DR systems using DCI client -- Cache disability data in local records with sync status tracking - (synced, stale, error) -- Receive async search response callbacks via FastAPI endpoints -- Verify callback signatures using Ed25519 or RSA-256 algorithms -- Match DR responses to OpenSPP registrants by UIN, DRN, or National ID -- Refresh cached data manually or programmatically +- Query disability status from remote DR systems using DCI client +- Cache disability data in local records with sync status tracking + (synced, stale, error) +- Receive async search response callbacks via FastAPI endpoints +- Verify callback signatures using Ed25519 or RSA-256 algorithms +- Match DR responses to OpenSPP registrants by UIN, DRN, or National ID +- Refresh cached data manually or programmatically Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.dci.disability.status`` | Cached disability data: PWD flag, | -| | disability types, functional scores, | -| | raw data | -+-------------------------------+--------------------------------------+ -| ``spp.dci.dr.sender`` | Trusted DR registry entries with | -| | sender_id, public keys, and JWKS | -| | endpoints | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.dci.disability.status`` | Cached disability data: PWD flag, | +| | disability types, functional | +| | scores, raw data | ++-------------------------------+-------------------------------------+ +| ``spp.dci.dr.sender`` | Trusted DR registry entries with | +| | sender_id, public keys, and JWKS | +| | endpoints | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -81,54 +81,54 @@ To query disability status programmatically: UI Location ~~~~~~~~~~~ -- **Menu**: Settings > Technical > DCI > Activity Logs > Disability - Status -- **Configuration**: Settings > Technical > DCI > Configuration > DR - Senders -- **Callback Endpoints**: ``/dci_api/dr/on-search``, - ``/dci_api/dr/on-subscribe`` +- **Menu**: Settings > Technical > DCI > Activity Logs > Disability + Status +- **Configuration**: Settings > Technical > DCI > Configuration > DR + Senders +- **Callback Endpoints**: ``/dci_api/dr/on-search``, + ``/dci_api/dr/on-subscribe`` Tabs ~~~~ Disability Status form: -- **Disability Information**: Disability types and functional scores - (JSON) -- **Raw Data**: Original JSON data received from DR system -- **Notes**: Additional notes about disability status -- **Error Details**: Error message if sync failed (visible only when - error exists) +- **Disability Information**: Disability types and functional scores + (JSON) +- **Raw Data**: Original JSON data received from DR system +- **Notes**: Additional notes about disability status +- **Error Details**: Error message if sync failed (visible only when + error exists) DR Sender form: -- **Public Key**: PEM-encoded public key for signature verification -- **Notes**: Additional notes about the DR registry +- **Public Key**: PEM-encoded public key for signature verification +- **Notes**: Additional notes about the DR registry Security ~~~~~~~~ -+-----------------------+----------------------------------------------+ -| Group | Access | -+=======================+==============================================+ -| ``base.group_system`` | Full CRUD on disability status and DR sender | -| | registry | -+-----------------------+----------------------------------------------+ -| ``base.group_user`` | Read/Write/Create disability status, | -| | read-only DR sender registry | -+-----------------------+----------------------------------------------+ ++-----------------------+---------------------------------------------+ +| Group | Access | ++=======================+=============================================+ +| ``base.group_system`` | Full CRUD on disability status and DR | +| | sender registry | ++-----------------------+---------------------------------------------+ +| ``base.group_user`` | Read/Write/Create disability status, | +| | read-only DR sender registry | ++-----------------------+---------------------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Override ``DRService._extract_disability_data()`` to customize parsing - of DR response fields -- Override ``DRService._extract_functional_scores()`` to handle custom - score formats -- Inherit ``spp.dci.disability.status`` to add domain-specific - disability fields -- Extend callback router at ``spp_dci_client_dr.routers.callback`` to - handle additional DR callback types +- Override ``DRService._extract_disability_data()`` to customize + parsing of DR response fields +- Override ``DRService._extract_functional_scores()`` to handle custom + score formats +- Inherit ``spp.dci.disability.status`` to add domain-specific + disability fields +- Extend callback router at ``spp_dci_client_dr.routers.callback`` to + handle additional DR callback types Dependencies ~~~~~~~~~~~~ diff --git a/spp_dci_client_dr/static/description/index.html b/spp_dci_client_dr/static/description/index.html index f73ca1e2..ca913bec 100644 --- a/spp_dci_client_dr/static/description/index.html +++ b/spp_dci_client_dr/static/description/index.html @@ -391,8 +391,8 @@

            Key Capabilities

            Key Models

            Model
            --++ @@ -402,8 +402,8 @@

            Key Models

            +disability types, functional +scores, raw data
            Model
            spp.dci.disability.status Cached disability data: PWD flag, -disability types, functional scores, -raw data
            spp.dci.dr.sender Trusted DR registry entries with @@ -467,8 +467,8 @@

            Tabs

            Security

            --++ @@ -477,8 +477,8 @@

            Security

            - +
            Group
            base.group_systemFull CRUD on disability status and DR sender -registryFull CRUD on disability status and DR +sender registry
            base.group_user Read/Write/Create disability status, @@ -490,8 +490,8 @@

            Security

            Extension Points

              -
            • Override DRService._extract_disability_data() to customize parsing -of DR response fields
            • +
            • Override DRService._extract_disability_data() to customize +parsing of DR response fields
            • Override DRService._extract_functional_scores() to handle custom score formats
            • Inherit spp.dci.disability.status to add domain-specific diff --git a/spp_dci_client_ibr/README.rst b/spp_dci_client_ibr/README.rst index c97544b6..53a0d9f8 100644 --- a/spp_dci_client_ibr/README.rst +++ b/spp_dci_client_ibr/README.rst @@ -31,32 +31,33 @@ infrastructure. Key Capabilities ~~~~~~~~~~~~~~~~ -- Check registrants for duplicate enrollments in external IBR systems - using DCI protocol -- Store duplication check results with match status, matched programs, - and raw API responses -- Manage trusted IBR sender registries with automatic JWKS public key - fetching -- Receive async search response callbacks at ``/dci_api/ibr/on-search`` - endpoint -- Verify callback signatures using Ed25519 or RSA-256 algorithms -- Track duplication check lifecycle: ready → checking → completed/failed +- Check registrants for duplicate enrollments in external IBR systems + using DCI protocol +- Store duplication check results with match status, matched programs, + and raw API responses +- Manage trusted IBR sender registries with automatic JWKS public key + fetching +- Receive async search response callbacks at ``/dci_api/ibr/on-search`` + endpoint +- Verify callback signatures using Ed25519 or RSA-256 algorithms +- Track duplication check lifecycle: ready → checking → + completed/failed Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.dci.duplication.check`` | Stores duplication check requests | -| | and results from IBR | -+-------------------------------+--------------------------------------+ -| ``spp.dci.ibr.sender`` | Registry of trusted IBR systems with | -| | public keys | -+-------------------------------+--------------------------------------+ -| ``fastapi.endpoint`` | Inherited to add IBR callback router | -| | to DCI API endpoint | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.dci.duplication.check`` | Stores duplication check requests | +| | and results from IBR | ++-------------------------------+-------------------------------------+ +| ``spp.dci.ibr.sender`` | Registry of trusted IBR systems | +| | with public keys | ++-------------------------------+-------------------------------------+ +| ``fastapi.endpoint`` | Inherited to add IBR callback | +| | router to DCI API endpoint | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -73,42 +74,46 @@ After installing: UI Location ~~~~~~~~~~~ -- **IBR Duplication Checks**: Settings > Technical > DCI > Activity Logs - > IBR Duplication Checks -- **IBR Senders**: Settings > Technical > DCI > Configuration > IBR - Senders -- **FastAPI Callbacks**: ``/dci_api/ibr/on-search`` and - ``/dci_api/ibr/on-subscribe`` +- **IBR Duplication Checks**: Settings > Technical > DCI > Activity + Logs > IBR Duplication Checks +- **IBR Senders**: Settings > Technical > DCI > Configuration > IBR + Senders +- **FastAPI Callbacks**: ``/dci_api/ibr/on-search`` and + ``/dci_api/ibr/on-subscribe`` Security ~~~~~~~~ -+-----------------------------------------+-------------------------------+----------------------+ -| Group | Model | Access | -+=========================================+===============================+======================+ -| ``spp_registry.group_registry_viewer`` | ``spp.dci.duplication.check`` | Read | -+-----------------------------------------+-------------------------------+----------------------+ -| ``spp_registry.group_registry_officer`` | ``spp.dci.duplication.check`` | Read/Write/Create | -| | | (no delete) | -+-----------------------------------------+-------------------------------+----------------------+ -| ``spp_registry.group_registry_manager`` | ``spp.dci.duplication.check`` | Full CRUD | -+-----------------------------------------+-------------------------------+----------------------+ -| ``base.group_system`` | ``spp.dci.ibr.sender`` | Full CRUD | -+-----------------------------------------+-------------------------------+----------------------+ -| ``base.group_user`` | ``spp.dci.ibr.sender`` | Read | -+-----------------------------------------+-------------------------------+----------------------+ ++----------------------+----------------------+----------------------+ +| Group | Model | Access | ++======================+======================+======================+ +| ``spp_registry.gro | ``spp.dci | Read | +| up_registry_viewer`` | .duplication.check`` | | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | ``spp.dci | Read/Write/Create | +| p_registry_officer`` | .duplication.check`` | (no delete) | ++----------------------+----------------------+----------------------+ +| ``spp_registry.grou | ``spp.dci | Full CRUD | +| p_registry_manager`` | .duplication.check`` | | ++----------------------+----------------------+----------------------+ +| ` | `` | Full CRUD | +| `base.group_system`` | spp.dci.ibr.sender`` | | ++----------------------+----------------------+----------------------+ +| ``base.group_user`` | `` | Read | +| | spp.dci.ibr.sender`` | | ++----------------------+----------------------+----------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_process_ibr_search_result()`` in ``routers/callback.py`` - to customize result processing -- Inherit ``spp.dci.duplication.check`` to add domain-specific fields or - validation -- Extend ``fastapi.endpoint._get_fastapi_routers()`` to add additional - IBR-related routes -- Override ``spp.dci.ibr.sender._jwk_to_pem()`` to support additional - key formats +- Override ``_process_ibr_search_result()`` in ``routers/callback.py`` + to customize result processing +- Inherit ``spp.dci.duplication.check`` to add domain-specific fields + or validation +- Extend ``fastapi.endpoint._get_fastapi_routers()`` to add additional + IBR-related routes +- Override ``spp.dci.ibr.sender._jwk_to_pem()`` to support additional + key formats Dependencies ~~~~~~~~~~~~ diff --git a/spp_dci_client_ibr/static/description/index.html b/spp_dci_client_ibr/static/description/index.html index 62bb4fb2..ca8b1799 100644 --- a/spp_dci_client_ibr/static/description/index.html +++ b/spp_dci_client_ibr/static/description/index.html @@ -387,15 +387,16 @@

              Key Capabilities

            • Receive async search response callbacks at /dci_api/ibr/on-search endpoint
            • Verify callback signatures using Ed25519 or RSA-256 algorithms
            • -
            • Track duplication check lifecycle: ready → checking → completed/failed
            • +
            • Track duplication check lifecycle: ready → checking → +completed/failed

            Key Models

            --++ @@ -408,12 +409,12 @@

            Key Models

            and results from IBR - + - +
            Model
            spp.dci.ibr.senderRegistry of trusted IBR systems with -public keysRegistry of trusted IBR systems +with public keys
            fastapi.endpointInherited to add IBR callback router -to DCI API endpointInherited to add IBR callback +router to DCI API endpoint
            @@ -433,8 +434,8 @@

            Configuration

            UI Location

              -
            • IBR Duplication Checks: Settings > Technical > DCI > Activity Logs -> IBR Duplication Checks
            • +
            • IBR Duplication Checks: Settings > Technical > DCI > Activity +Logs > IBR Duplication Checks
            • IBR Senders: Settings > Technical > DCI > Configuration > IBR Senders
            • FastAPI Callbacks: /dci_api/ibr/on-search and @@ -445,9 +446,9 @@

              UI Location

              Security

              --++ @@ -456,25 +457,34 @@

              Security

              - - + + - - + + - - + + - - + + - + @@ -485,8 +495,8 @@

              Extension Points

              • Override _process_ibr_search_result() in routers/callback.py to customize result processing
              • -
              • Inherit spp.dci.duplication.check to add domain-specific fields or -validation
              • +
              • Inherit spp.dci.duplication.check to add domain-specific fields +or validation
              • Extend fastapi.endpoint._get_fastapi_routers() to add additional IBR-related routes
              • Override spp.dci.ibr.sender._jwk_to_pem() to support additional diff --git a/spp_dci_server/README.rst b/spp_dci_server/README.rst index 4f378a40..fcaef54b 100644 --- a/spp_dci_server/README.rst +++ b/spp_dci_server/README.rst @@ -31,44 +31,44 @@ JWKS-based public key distribution. Key Capabilities ~~~~~~~~~~~~~~~~ -- **FastAPI Endpoints**: Exposes DCI-compliant REST API at - ``/dci_api/v1`` with automatic OpenAPI documentation -- **HTTP Signature Verification**: Validates inbound requests using - Ed25519/RSA signatures against sender public keys -- **Async Transaction Processing**: Queues search, subscribe, and - unsubscribe operations for background processing with automatic - callbacks -- **Event Subscriptions**: Manages external system subscriptions to - registry events (registration, update, delete) with notification - delivery -- **JWKS Distribution**: Publishes server public keys at - ``/.well-known/jwks.json`` for signature verification by clients -- **Rate Limiting**: Enforces per-sender request limits (per-minute and - per-day) with automatic counter resets -- **Callback Retry**: Retries failed callbacks with exponential backoff - (3 attempts) and SSRF protection +- **FastAPI Endpoints**: Exposes DCI-compliant REST API at + ``/dci_api/v1`` with automatic OpenAPI documentation +- **HTTP Signature Verification**: Validates inbound requests using + Ed25519/RSA signatures against sender public keys +- **Async Transaction Processing**: Queues search, subscribe, and + unsubscribe operations for background processing with automatic + callbacks +- **Event Subscriptions**: Manages external system subscriptions to + registry events (registration, update, delete) with notification + delivery +- **JWKS Distribution**: Publishes server public keys at + ``/.well-known/jwks.json`` for signature verification by clients +- **Rate Limiting**: Enforces per-sender request limits (per-minute and + per-day) with automatic counter resets +- **Callback Retry**: Retries failed callbacks with exponential backoff + (3 attempts) and SSRF protection Key Models ~~~~~~~~~~ -+------------------------------+---------------------------------------+ -| Model | Description | -+==============================+=======================================+ -| ``spp.dci.sender.registry`` | External DCI senders with public keys | -| | for signature verification | -+------------------------------+---------------------------------------+ -| ``spp.dci.transaction`` | Async DCI request tracking (search, | -| | subscribe, unsubscribe) | -+------------------------------+---------------------------------------+ -| ``spp.dci.subscription`` | Event subscriptions with callback | -| | URIs and filter expressions | -+------------------------------+---------------------------------------+ -| ``spp.dci.notification.log`` | Audit trail of sent notifications | -| | with receipt tracking | -+------------------------------+---------------------------------------+ -| ``spp.dci.server.key`` | Server signing keys for outbound | -| | responses and notifications | -+------------------------------+---------------------------------------+ ++------------------------------+--------------------------------------+ +| Model | Description | ++==============================+======================================+ +| ``spp.dci.sender.registry`` | External DCI senders with public | +| | keys for signature verification | ++------------------------------+--------------------------------------+ +| ``spp.dci.transaction`` | Async DCI request tracking (search, | +| | subscribe, unsubscribe) | ++------------------------------+--------------------------------------+ +| ``spp.dci.subscription`` | Event subscriptions with callback | +| | URIs and filter expressions | ++------------------------------+--------------------------------------+ +| ``spp.dci.notification.log`` | Audit trail of sent notifications | +| | with receipt tracking | ++------------------------------+--------------------------------------+ +| ``spp.dci.server.key`` | Server signing keys for outbound | +| | responses and notifications | ++------------------------------+--------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -89,11 +89,11 @@ installation. To manage keys manually, use the technical interface for UI Location ~~~~~~~~~~~ -- **Menu**: Settings > DCI > Configuration > Sender Registry -- **Menu**: Settings > DCI > Configuration > Transactions -- **Menu**: Settings > DCI > Configuration > Subscriptions -- **API**: ``/dci_api/v1`` (OpenAPI docs at ``/dci_api/v1/docs``) -- **JWKS**: ``/dci_api/v1/.well-known/jwks.json`` +- **Menu**: Settings > DCI > Configuration > Sender Registry +- **Menu**: Settings > DCI > Configuration > Transactions +- **Menu**: Settings > DCI > Configuration > Subscriptions +- **API**: ``/dci_api/v1`` (OpenAPI docs at ``/dci_api/v1/docs``) +- **JWKS**: ``/dci_api/v1/.well-known/jwks.json`` Security ~~~~~~~~ @@ -111,14 +111,14 @@ public keys. Extension Points ~~~~~~~~~~~~~~~~ -- Override ``DCIErrorResponseMiddleware.dispatch()`` to customize error - response formatting -- Inherit ``fastapi.endpoint`` with ``app='dci_api'`` to add custom - routers via ``_get_fastapi_routers()`` -- Override ``spp.dci.transaction.process_async_*()`` methods to - customize async processing logic -- Inherit ``spp.dci.subscription._build_notification()`` to add custom - notification fields +- Override ``DCIErrorResponseMiddleware.dispatch()`` to customize error + response formatting +- Inherit ``fastapi.endpoint`` with ``app='dci_api'`` to add custom + routers via ``_get_fastapi_routers()`` +- Override ``spp.dci.transaction.process_async_*()`` methods to + customize async processing logic +- Inherit ``spp.dci.subscription._build_notification()`` to add custom + notification fields Dependencies ~~~~~~~~~~~~ diff --git a/spp_dci_server/static/description/index.html b/spp_dci_server/static/description/index.html index 8475eace..437c31a1 100644 --- a/spp_dci_server/static/description/index.html +++ b/spp_dci_server/static/description/index.html @@ -400,8 +400,8 @@

                Key Capabilities

                Key Models

              Group
              spp_registry.group_registry_viewerspp.dci.duplication.check
              spp_registry.gro +up_registry_viewerspp.dci +.duplication.check Read
              spp_registry.group_registry_officerspp.dci.duplication.check
              spp_registry.grou +p_registry_officerspp.dci +.duplication.check Read/Write/Create (no delete)
              spp_registry.group_registry_managerspp.dci.duplication.check
              spp_registry.grou +p_registry_managerspp.dci +.duplication.check Full CRUD
              base.group_systemspp.dci.ibr.sender
              ` +base.group_system``` +spp.dci.ibr.sender`` Full CRUD
              base.group_userspp.dci.ibr.sender`` +spp.dci.ibr.sender`` Read
              --++ @@ -410,8 +410,8 @@

              Key Models

              - +
              Model
              spp.dci.sender.registryExternal DCI senders with public keys -for signature verificationExternal DCI senders with public +keys for signature verification
              spp.dci.transaction Async DCI request tracking (search, diff --git a/spp_demo/README.rst b/spp_demo/README.rst index 92e150a7..c66a858d 100644 --- a/spp_demo/README.rst +++ b/spp_demo/README.rst @@ -31,42 +31,42 @@ for large datasets. Key Capabilities ~~~~~~~~~~~~~~~~ -- Generate random registrants using Faker library with locale-specific - providers (Kenya, Laos, Sri Lanka) -- Create fixed demo stories with memorable names for repeatable demos - (e.g., "Maria Santos", "Juan Dela Cruz") -- Generate IDs from regex patterns with validation and error logging -- Batch process large datasets using queue_job (configurable threshold) -- Configure percentages for IDs, GPS coordinates, and bank accounts -- Track generation failures with diagnostic logging -- Extend ``res.country`` with Faker locale and GPS boundaries -- Create demo user accounts (viewer, officer, supervisor, manager, - admin) +- Generate random registrants using Faker library with locale-specific + providers (Kenya, Laos, Sri Lanka) +- Create fixed demo stories with memorable names for repeatable demos + (e.g., "Maria Santos", "Juan Dela Cruz") +- Generate IDs from regex patterns with validation and error logging +- Batch process large datasets using queue_job (configurable threshold) +- Configure percentages for IDs, GPS coordinates, and bank accounts +- Track generation failures with diagnostic logging +- Extend ``res.country`` with Faker locale and GPS boundaries +- Create demo user accounts (viewer, officer, supervisor, manager, + admin) Key Models ~~~~~~~~~~ -+----------------------------------+-----------------------------------+ -| Model | Description | -+==================================+===================================+ -| ``spp.demo.data.generator`` | Main generator with configuration | -| | and batch controls | -+----------------------------------+-----------------------------------+ -| ``spp.demo.data.generation.log`` | Logs failed generation attempts | -| | with diagnostics | -+----------------------------------+-----------------------------------+ -| ``spp.demo.data.id.types`` | ID type configuration for | -| | individual/group generation | -+----------------------------------+-----------------------------------+ -| ``spp.demo.data.bank.types`` | Bank type configuration for | -| | account generation | -+----------------------------------+-----------------------------------+ -| ``spp.apps.wizard`` | Wizard for installing missing | -| | demo modules | -+----------------------------------+-----------------------------------+ -| ``spp.missing.module`` | Transient model for tracking | -| | missing modules | -+----------------------------------+-----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ``spp.demo.data.generator`` | Main generator with | +| | configuration and batch controls | ++----------------------------------+----------------------------------+ +| ``spp.demo.data.generation.log`` | Logs failed generation attempts | +| | with diagnostics | ++----------------------------------+----------------------------------+ +| ``spp.demo.data.id.types`` | ID type configuration for | +| | individual/group generation | ++----------------------------------+----------------------------------+ +| ``spp.demo.data.bank.types`` | Bank type configuration for | +| | account generation | ++----------------------------------+----------------------------------+ +| ``spp.apps.wizard`` | Wizard for installing missing | +| | demo modules | ++----------------------------------+----------------------------------+ +| ``spp.missing.module`` | Transient model for tracking | +| | missing modules | ++----------------------------------+----------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -76,9 +76,9 @@ After installing: 1. Navigate to **Settings > General Settings > SPP Demo Data Generator Settings** to set defaults: - - Number of groups - - Members per group range - - Batch size and queue job threshold + - Number of groups + - Members per group range + - Batch size and queue job threshold 2. Access generator via action ``spp_demo.action_demo_data_generator`` (no standalone menu) @@ -89,46 +89,47 @@ After installing: UI Location ~~~~~~~~~~~ -- **Action**: ``spp_demo.action_demo_data_generator`` (no standalone - menu item) -- **Configuration**: Settings > General Settings > SPP Demo Data - Generator Settings -- **Form tabs**: Generated Groups, Generated Individuals, ID Types, Bank - Types, Generation Logs +- **Action**: ``spp_demo.action_demo_data_generator`` (no standalone + menu item) +- **Configuration**: Settings > General Settings > SPP Demo Data + Generator Settings +- **Form tabs**: Generated Groups, Generated Individuals, ID Types, + Bank Types, Generation Logs Security ~~~~~~~~ -+----------------------------------------+----------------------------------+ -| Group | Access | -+========================================+==================================+ -| ``base.group_system`` | Full CRUD on all models | -+----------------------------------------+----------------------------------+ -| ``spp_registry.group_registry_read`` | Read access to all models | -+----------------------------------------+----------------------------------+ -| ``spp_registry.group_registry_write`` | Read/Write on generator and logs | -| | (delete ID/Bank types) | -+----------------------------------------+----------------------------------+ -| ``spp_registry.group_registry_create`` | Read/Create access (delete | -| | ID/Bank types) | -+----------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``base.group_system`` | Full CRUD on all models | ++----------------------------------+----------------------------------+ +| ``sp | Read access to all models | +| p_registry.group_registry_read`` | | ++----------------------------------+----------------------------------+ +| ``spp | Read/Write on generator and logs | +| _registry.group_registry_write`` | (delete ID/Bank types) | ++----------------------------------+----------------------------------+ +| ``spp_ | Read/Create access (delete | +| registry.group_registry_create`` | ID/Bank types) | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_create_individual_story()``, ``_create_farmer_story()``, - ``_create_household_story()`` for custom story generation -- Add custom stories to ``models/demo_stories.py`` (``DEMO_STORIES`` or - ``BACKGROUND_STORIES`` lists) -- Extend ``res.country`` with ``faker_locale`` field for custom locale - providers -- Use utility methods: - - - ``create_individual_from_params(name, gender, age, extra_vals)`` - - Create individual without full generator session - - ``create_group_from_params(name, extra_vals)`` - Create group from - parameters - - ``lookup_gender_id(gender)`` - Look up gender vocabulary code ID +- Override ``_create_individual_story()``, ``_create_farmer_story()``, + ``_create_household_story()`` for custom story generation +- Add custom stories to ``models/demo_stories.py`` (``DEMO_STORIES`` or + ``BACKGROUND_STORIES`` lists) +- Extend ``res.country`` with ``faker_locale`` field for custom locale + providers +- Use utility methods: + + - ``create_individual_from_params(name, gender, age, extra_vals)`` - + Create individual without full generator session + - ``create_group_from_params(name, extra_vals)`` - Create group from + parameters + - ``lookup_gender_id(gender)`` - Look up gender vocabulary code ID Dependencies ~~~~~~~~~~~~ diff --git a/spp_demo/static/description/index.html b/spp_demo/static/description/index.html index 0ece0bdb..c983d60e 100644 --- a/spp_demo/static/description/index.html +++ b/spp_demo/static/description/index.html @@ -395,8 +395,8 @@

              Key Capabilities

              Key Models

              --++ @@ -405,8 +405,8 @@

              Key Models

              - +
              Model
              spp.demo.data.generatorMain generator with configuration -and batch controlsMain generator with +configuration and batch controls
              spp.demo.data.generation.log Logs failed generation attempts @@ -456,16 +456,16 @@

              UI Location

              menu item)
            • Configuration: Settings > General Settings > SPP Demo Data Generator Settings
            • -
            • Form tabs: Generated Groups, Generated Individuals, ID Types, Bank -Types, Generation Logs
            • +
            • Form tabs: Generated Groups, Generated Individuals, ID Types, +Bank Types, Generation Logs
            • Security

              --++ @@ -476,14 +476,17 @@

              Security

              - + - + - + diff --git a/spp_dms/README.rst b/spp_dms/README.rst index c6247498..25332204 100644 --- a/spp_dms/README.rst +++ b/spp_dms/README.rst @@ -31,39 +31,39 @@ and size limits. Key Capabilities ~~~~~~~~~~~~~~~~ -- Organize files in nested directory structures with root directories - and subdirectories -- Automatically capture file metadata on upload: size, MIME type, - extension, SHA512 checksum -- Enable optional versioning per file with automatic snapshots on - content changes and manual restore -- Enforce file type restrictions (allowed/blocked extensions, MIME - types) and size limits per category -- Generate thumbnails automatically for image files using Pillow -- Compute directory statistics recursively: total file count, - subdirectory count, and cumulative size +- Organize files in nested directory structures with root directories + and subdirectories +- Automatically capture file metadata on upload: size, MIME type, + extension, SHA512 checksum +- Enable optional versioning per file with automatic snapshots on + content changes and manual restore +- Enforce file type restrictions (allowed/blocked extensions, MIME + types) and size limits per category +- Generate thumbnails automatically for image files using Pillow +- Compute directory statistics recursively: total file count, + subdirectory count, and cumulative size Key Models ~~~~~~~~~~ -+------------------------------------+----------------------------------+ -| Model | Description | -+====================================+==================================+ -| ``spp.dms.directory`` | Directory with parent/child | -| | hierarchy and file storage | -+------------------------------------+----------------------------------+ -| ``spp.dms.file`` | File record with binary content | -| | and optional versioning | -+------------------------------------+----------------------------------+ -| ``spp.dms.file.version`` | Version snapshot with content, | -| | checksum, and comment | -+------------------------------------+----------------------------------+ -| ``spp.dms.category`` | File classification with | -| | validation rules | -+------------------------------------+----------------------------------+ -| ``spp.dms.restore.version.wizard`` | Transient wizard for restoring | -| | file versions | -+------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ``spp.dms.directory`` | Directory with parent/child | +| | hierarchy and file storage | ++----------------------------------+----------------------------------+ +| ``spp.dms.file`` | File record with binary content | +| | and optional versioning | ++----------------------------------+----------------------------------+ +| ``spp.dms.file.version`` | Version snapshot with content, | +| | checksum, and comment | ++----------------------------------+----------------------------------+ +| ``spp.dms.category`` | File classification with | +| | validation rules | ++----------------------------------+----------------------------------+ +| `` | Transient wizard for restoring | +| spp.dms.restore.version.wizard`` | file versions | ++----------------------------------+----------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -80,36 +80,36 @@ After installing: UI Location ~~~~~~~~~~~ -- **Files**: DMS > Files -- **Directories**: DMS > Directories -- **Configuration**: DMS > Configuration > Categories -- **Version History**: Accessed via stat button on file forms when - versioning is enabled +- **Files**: DMS > Files +- **Directories**: DMS > Directories +- **Configuration**: DMS > Configuration > Categories +- **Version History**: Accessed via stat button on file forms when + versioning is enabled Security ~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Group | Access | -+===============================+======================================+ -| ``spp_dms.group_dms_viewer`` | Read directories, files, versions, | -| | categories | -+-------------------------------+--------------------------------------+ -| ``spp_dms.group_dms_officer`` | Create/edit files and directories | -| | (no delete) | -+-------------------------------+--------------------------------------+ -| ``spp_dms.group_dms_manager`` | Full CRUD on all models including | -| | categories | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Group | Access | ++===============================+=====================================+ +| ``spp_dms.group_dms_viewer`` | Read directories, files, versions, | +| | categories | ++-------------------------------+-------------------------------------+ +| ``spp_dms.group_dms_officer`` | Create/edit files and directories | +| | (no delete) | ++-------------------------------+-------------------------------------+ +| ``spp_dms.group_dms_manager`` | Full CRUD on all models including | +| | categories | ++-------------------------------+-------------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Override ``validate_file()`` on ``spp.dms.category`` to add custom - validation logic -- Inherit ``spp.dms.file`` to add domain-specific metadata fields -- Override ``_create_new_version()`` on ``spp.dms.file`` to customize - versioning behavior +- Override ``validate_file()`` on ``spp.dms.category`` to add custom + validation logic +- Inherit ``spp.dms.file`` to add domain-specific metadata fields +- Override ``_create_new_version()`` on ``spp.dms.file`` to customize + versioning behavior Dependencies ~~~~~~~~~~~~ diff --git a/spp_dms/static/description/index.html b/spp_dms/static/description/index.html index 18eead21..cd6eb13b 100644 --- a/spp_dms/static/description/index.html +++ b/spp_dms/static/description/index.html @@ -395,8 +395,8 @@

              Key Capabilities

              Key Models

              Group
              base.group_system Full CRUD on all models
              spp_registry.group_registry_read
              sp +p_registry.group_registry_read Read access to all models
              spp_registry.group_registry_write
              spp +_registry.group_registry_write Read/Write on generator and logs (delete ID/Bank types)
              spp_registry.group_registry_create
              spp_ +registry.group_registry_create Read/Create access (delete ID/Bank types)
              --++ @@ -420,7 +420,8 @@

              Key Models

              - + @@ -453,8 +454,8 @@

              UI Location

              Security

              Model File classification with validation rules
              spp.dms.restore.version.wizard
              `` +spp.dms.restore.version.wizard`` Transient wizard for restoring file versions
              --++ diff --git a/spp_drims/README.rst b/spp_drims/README.rst index df30ccf9..0bfed649 100644 --- a/spp_drims/README.rst +++ b/spp_drims/README.rst @@ -32,22 +32,22 @@ breaches. Key Capabilities ~~~~~~~~~~~~~~~~ -- Record incoming donations with state machine (announced, received, - inspected, stocked) and inspection workflow -- Submit supply requests for affected areas with approval workflow, SLA - tracking, and priority handling -- Allocate stock using FIFO/FEFO logic and create dispatch pickings with - beneficiary area tracking -- Track returned items with condition assessment and disposition routing - (restock, repair, dispose) -- Generate alerts automatically for low stock thresholds, expiring - inventory, and overdue requests -- Create request templates for rapid response to recurring emergency - scenarios -- Monitor fulfillment progress with allocation percentage, dispatch - status, and delivery tracking -- Assign personnel to warehouses and service points with role and - cluster tracking +- Record incoming donations with state machine (announced, received, + inspected, stocked) and inspection workflow +- Submit supply requests for affected areas with approval workflow, SLA + tracking, and priority handling +- Allocate stock using FIFO/FEFO logic and create dispatch pickings + with beneficiary area tracking +- Track returned items with condition assessment and disposition + routing (restock, repair, dispose) +- Generate alerts automatically for low stock thresholds, expiring + inventory, and overdue requests +- Create request templates for rapid response to recurring emergency + scenarios +- Monitor fulfillment progress with allocation percentage, dispatch + status, and delivery tracking +- Assign personnel to warehouses and service points with role and + cluster tracking Key Models ~~~~~~~~~~ @@ -98,9 +98,9 @@ After installing: 4. Verify scheduled actions are active under **Settings > Technical > Scheduled Actions**: - - DRIMS: Check Low Stock (daily) - - DRIMS: Check Expiry Dates (daily) - - DRIMS: Check SLA Breaches (hourly) + - DRIMS: Check Low Stock (daily) + - DRIMS: Check Expiry Dates (daily) + - DRIMS: Check SLA Breaches (hourly) 5. Create request templates under **DRIMS > Configuration > Request Templates** for common scenarios @@ -110,58 +110,59 @@ After installing: UI Location ~~~~~~~~~~~ -- **Dashboard**: DRIMS > Dashboard (KPIs, recent activity, pending - approvals) -- **Donations**: DRIMS > Receive Supplies > Donations -- **Requests**: DRIMS > Fulfill Requests > All Requests -- **Dispatches**: DRIMS > Fulfill Requests > Dispatches -- **Returns**: DRIMS > Receive Supplies > Returns -- **Alerts**: DRIMS > Monitoring > Alerts -- **Personnel**: DRIMS > Monitoring > Personnel -- **Inventory**: DRIMS > Inventory > Stock On Hand, Warehouses, Products +- **Dashboard**: DRIMS > Dashboard (KPIs, recent activity, pending + approvals) +- **Donations**: DRIMS > Receive Supplies > Donations +- **Requests**: DRIMS > Fulfill Requests > All Requests +- **Dispatches**: DRIMS > Fulfill Requests > Dispatches +- **Returns**: DRIMS > Receive Supplies > Returns +- **Alerts**: DRIMS > Monitoring > Alerts +- **Personnel**: DRIMS > Monitoring > Personnel +- **Inventory**: DRIMS > Inventory > Stock On Hand, Warehouses, + Products Security ~~~~~~~~ -+--------------------------------------------------+----------------------------------+ -| Group | Access | -+==================================================+==================================+ -| ``spp_drims.group_drims_viewer`` | Read-only access to donations, | -| | requests, dispatches | -+--------------------------------------------------+----------------------------------+ -| ``spp_drims.group_drims_officer`` | Create and edit donations, | -| | requests, returns (no delete) | -+--------------------------------------------------+----------------------------------+ -| ``spp_drims.group_drims_approver`` | Approve or reject supply | -| | requests | -+--------------------------------------------------+----------------------------------+ -| ``spp_drims.group_drims_manager`` | Full CRUD including deletion and | -| | configuration | -+--------------------------------------------------+----------------------------------+ -| ``spp_drims.group_drims_warehouse_worker`` | Receive donations, manage stock, | -| | process dispatches | -+--------------------------------------------------+----------------------------------+ -| ``spp_drims.group_drims_field_officer`` | Create requests and confirm | -| | deliveries in the field | -+--------------------------------------------------+----------------------------------+ -| ``spp_drims.group_drims_coordinator_supervisor`` | Coordinate requests and | -| | distributions within assigned | -| | areas | -+--------------------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_drims.group_drims_viewer`` | Read-only access to donations, | +| | requests, dispatches | ++----------------------------------+----------------------------------+ +| ` | Create and edit donations, | +| `spp_drims.group_drims_officer`` | requests, returns (no delete) | ++----------------------------------+----------------------------------+ +| `` | Approve or reject supply | +| spp_drims.group_drims_approver`` | requests | ++----------------------------------+----------------------------------+ +| ` | Full CRUD including deletion and | +| `spp_drims.group_drims_manager`` | configuration | ++----------------------------------+----------------------------------+ +| ``spp_drim | Receive donations, manage stock, | +| s.group_drims_warehouse_worker`` | process dispatches | ++----------------------------------+----------------------------------+ +| ``spp_d | Create requests and confirm | +| rims.group_drims_field_officer`` | deliveries in the field | ++----------------------------------+----------------------------------+ +| ``spp_drims.grou | Coordinate requests and | +| p_drims_coordinator_supervisor`` | distributions within assigned | +| | areas | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.drims.alert`` and override ``_cron_check_*`` methods to - add custom alert types -- Extend ``spp.drims.request`` and override ``_allocate_stock_fifo()`` - to customize allocation logic -- Add fields to ``stock.warehouse`` to track additional warehouse - metadata for DRIMS operations -- Inherit ``spp.drims.donation`` and override - ``_create_receipt_picking()`` to customize stock receipt behavior -- Override ``spp.drims.request._on_approve()`` and ``_on_reject()`` - hooks to add custom approval actions +- Inherit ``spp.drims.alert`` and override ``_cron_check_*`` methods to + add custom alert types +- Extend ``spp.drims.request`` and override ``_allocate_stock_fifo()`` + to customize allocation logic +- Add fields to ``stock.warehouse`` to track additional warehouse + metadata for DRIMS operations +- Inherit ``spp.drims.donation`` and override + ``_create_receipt_picking()`` to customize stock receipt behavior +- Override ``spp.drims.request._on_approve()`` and ``_on_reject()`` + hooks to add custom approval actions Dependencies ~~~~~~~~~~~~ diff --git a/spp_drims/static/description/index.html b/spp_drims/static/description/index.html index 5e4ac297..ac9d23db 100644 --- a/spp_drims/static/description/index.html +++ b/spp_drims/static/description/index.html @@ -383,10 +383,10 @@

              Key Capabilities

              inspected, stocked) and inspection workflow
            • Submit supply requests for affected areas with approval workflow, SLA tracking, and priority handling
            • -
            • Allocate stock using FIFO/FEFO logic and create dispatch pickings with -beneficiary area tracking
            • -
            • Track returned items with condition assessment and disposition routing -(restock, repair, dispose)
            • +
            • Allocate stock using FIFO/FEFO logic and create dispatch pickings +with beneficiary area tracking
            • +
            • Track returned items with condition assessment and disposition +routing (restock, repair, dispose)
            • Generate alerts automatically for low stock thresholds, expiring inventory, and overdue requests
            • Create request templates for rapid response to recurring emergency @@ -485,15 +485,16 @@

              UI Location

            • Returns: DRIMS > Receive Supplies > Returns
            • Alerts: DRIMS > Monitoring > Alerts
            • Personnel: DRIMS > Monitoring > Personnel
            • -
            • Inventory: DRIMS > Inventory > Stock On Hand, Warehouses, Products
            • +
            • Inventory: DRIMS > Inventory > Stock On Hand, Warehouses, +Products
            • Security

              Group
              --++ @@ -505,27 +506,33 @@

              Security

              - + - + - + - + - + - + diff --git a/spp_drims_sl/README.rst b/spp_drims_sl/README.rst index 3bcab5e9..5a8b27a0 100644 --- a/spp_drims_sl/README.rst +++ b/spp_drims_sl/README.rst @@ -32,48 +32,49 @@ no models or views. Key Configuration Data ~~~~~~~~~~~~~~~~~~~~~~ -- **Company Setup**: Configures main company as "Disaster Management - Centre - Sri Lanka" with LKR currency and Sri Lanka country -- **Geographic Structure**: Defines 4-level administrative hierarchy - (Province → District → DS Division → GN Division) via - ``spp.area.kind`` records -- **Agency Network**: Creates 16 ``res.partner`` records for government - agencies, military, UN agencies, and NGOs with DRIMS organization - roles -- **Warehouse Network**: Provisions 11 ``stock.warehouse`` records (2 - national-level, 9 provincial-level) with capacity and emergency - contact metadata -- **Hazard Taxonomy**: Hierarchical natural disaster categories (floods, - landslides, drought, cyclones, monsoons) via ``spp.hazard.category`` -- **Relief Products**: 30 ``product.product`` records across 8 - categories with expiry tracking enabled via ``product_expiry`` module -- **Approval Workflows**: 4 ``spp.approval.definition`` records with - value-based routing (life-threatening fast-track, small/medium/large - value tiers) -- **Vocabulary Extensions**: 15 Sri Lanka-specific - ``spp.vocabulary.code`` records for priority levels, transport modes, - hazard types, and agency types -- **Reference Numbers**: Overrides ``ir.sequence`` records with SL - prefixes (DON-SL, REQ-SL, WB-SL, INC-SL) -- **Demo Users**: 13 ``res.users`` spanning roles from field officers to - warehouse staff to approvers +- **Company Setup**: Configures main company as "Disaster Management + Centre - Sri Lanka" with LKR currency and Sri Lanka country +- **Geographic Structure**: Defines 4-level administrative hierarchy + (Province → District → DS Division → GN Division) via + ``spp.area.kind`` records +- **Agency Network**: Creates 16 ``res.partner`` records for government + agencies, military, UN agencies, and NGOs with DRIMS organization + roles +- **Warehouse Network**: Provisions 11 ``stock.warehouse`` records (2 + national-level, 9 provincial-level) with capacity and emergency + contact metadata +- **Hazard Taxonomy**: Hierarchical natural disaster categories + (floods, landslides, drought, cyclones, monsoons) via + ``spp.hazard.category`` +- **Relief Products**: 30 ``product.product`` records across 8 + categories with expiry tracking enabled via ``product_expiry`` module +- **Approval Workflows**: 4 ``spp.approval.definition`` records with + value-based routing (life-threatening fast-track, small/medium/large + value tiers) +- **Vocabulary Extensions**: 15 Sri Lanka-specific + ``spp.vocabulary.code`` records for priority levels, transport modes, + hazard types, and agency types +- **Reference Numbers**: Overrides ``ir.sequence`` records with SL + prefixes (DON-SL, REQ-SL, WB-SL, INC-SL) +- **Demo Users**: 13 ``res.users`` spanning roles from field officers + to warehouse staff to approvers Approval Workflow Tiers ~~~~~~~~~~~~~~~~~~~~~~~ -+------------------------------+------------------------------+--------+ -| Condition | Approvers | SLA | -+==============================+==============================+========+ -| Priority = Life-Threatening | Single manager (fast-track) | 0 days | -+------------------------------+------------------------------+--------+ -| Value < 100,000 LKR | District approver | 1 day | -+------------------------------+------------------------------+--------+ -| Value 100,000 - 500,000 LKR | District → Provincial | 2 days | -| | (2-tier) | | -+------------------------------+------------------------------+--------+ -| Value > 500,000 LKR | District → Provincial → | 3 days | -| | National DMC (3-tier) | | -+------------------------------+------------------------------+--------+ ++-----------------------------+-----------------------------+--------+ +| Condition | Approvers | SLA | ++=============================+=============================+========+ +| Priority = Life-Threatening | Single manager (fast-track) | 0 days | ++-----------------------------+-----------------------------+--------+ +| Value < 100,000 LKR | District approver | 1 day | ++-----------------------------+-----------------------------+--------+ +| Value 100,000 - 500,000 LKR | District → Provincial | 2 days | +| | (2-tier) | | ++-----------------------------+-----------------------------+--------+ +| Value > 500,000 LKR | District → Provincial → | 3 days | +| | National DMC (3-tier) | | ++-----------------------------+-----------------------------+--------+ Configuration ~~~~~~~~~~~~~ diff --git a/spp_drims_sl/static/description/index.html b/spp_drims_sl/static/description/index.html index 648aa756..bd80a56b 100644 --- a/spp_drims_sl/static/description/index.html +++ b/spp_drims_sl/static/description/index.html @@ -390,8 +390,9 @@

              Key Configuration Data

            • Warehouse Network: Provisions 11 stock.warehouse records (2 national-level, 9 provincial-level) with capacity and emergency contact metadata
            • -
            • Hazard Taxonomy: Hierarchical natural disaster categories (floods, -landslides, drought, cyclones, monsoons) via spp.hazard.category
            • +
            • Hazard Taxonomy: Hierarchical natural disaster categories +(floods, landslides, drought, cyclones, monsoons) via +spp.hazard.category
            • Relief Products: 30 product.product records across 8 categories with expiry tracking enabled via product_expiry module
            • Approval Workflows: 4 spp.approval.definition records with @@ -402,8 +403,8 @@

              Key Configuration Data

              hazard types, and agency types
            • Reference Numbers: Overrides ir.sequence records with SL prefixes (DON-SL, REQ-SL, WB-SL, INC-SL)
            • -
            • Demo Users: 13 res.users spanning roles from field officers to -warehouse staff to approvers
            • +
            • Demo Users: 13 res.users spanning roles from field officers +to warehouse staff to approvers
            • diff --git a/spp_drims_sl_demo/README.rst b/spp_drims_sl_demo/README.rst index a0acfad7..00c2fe15 100644 --- a/spp_drims_sl_demo/README.rst +++ b/spp_drims_sl_demo/README.rst @@ -31,35 +31,35 @@ Excel data and HDX polygon files for GIS visualization. Key Capabilities ~~~~~~~~~~~~~~~~ -- Import Sri Lanka administrative boundaries from Excel and HDX GeoJSON - files (provinces, districts, DS/GN divisions) -- Generate disaster incidents with affected areas, severity levels, and - coordination modes -- Create donations from UN agencies and NGOs at various workflow states -- Generate relief requests with priorities, SLA deadlines, - life-threatening flags, and OCHA cluster assignments -- Populate warehouses with relief items, lot tracking, and expiry dates -- Create personnel deployments with roles, organizations, clusters, and - contact information -- Generate low stock, SLA breach, and SLA warning alerts and trigger - alert engine cron jobs -- Create completed dispatch pickings with beneficiary counts and POD - data for dashboard KPIs -- Configure GIS reports for choropleth visualization of request - distribution and affected populations +- Import Sri Lanka administrative boundaries from Excel and HDX GeoJSON + files (provinces, districts, DS/GN divisions) +- Generate disaster incidents with affected areas, severity levels, and + coordination modes +- Create donations from UN agencies and NGOs at various workflow states +- Generate relief requests with priorities, SLA deadlines, + life-threatening flags, and OCHA cluster assignments +- Populate warehouses with relief items, lot tracking, and expiry dates +- Create personnel deployments with roles, organizations, clusters, and + contact information +- Generate low stock, SLA breach, and SLA warning alerts and trigger + alert engine cron jobs +- Create completed dispatch pickings with beneficiary counts and POD + data for dashboard KPIs +- Configure GIS reports for choropleth visualization of request + distribution and affected populations Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.drims.demo.generator`` | Transient wizard that orchestrates | -| | demo data generation | -+-------------------------------+--------------------------------------+ -| ``spp.gis.report`` (extended) | Adds ``spp.drims.request`` as | -| | supported GIS report data source | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.drims.demo.generator`` | Transient wizard that orchestrates | +| | demo data generation | ++-------------------------------+-------------------------------------+ +| ``spp.gis.report`` (extended) | Adds ``spp.drims.request`` as | +| | supported GIS report data source | ++-------------------------------+-------------------------------------+ Usage ~~~~~ @@ -77,22 +77,22 @@ alerts. Full generation takes 2-5 minutes. Demo Data Included ~~~~~~~~~~~~~~~~~~ -- **Relief Products**: 27 product templates across 7 categories (Food & - Nutrition, Water & Beverages, Medical & Health, Shelter & Housing, - Hygiene & WASH, Clothing & Bedding, Equipment & Tools) -- **Demo Users**: 6 users with password ``demo``: kumari (field - officer), rajitha (approver), silva (manager), perera (warehouse - worker), fernando (coordinator), secretary (viewer) -- **GIS Reports**: 5 pre-configured reports for request distribution, - affected population, pending approvals, relief value, and fulfillment - progress +- **Relief Products**: 27 product templates across 7 categories (Food & + Nutrition, Water & Beverages, Medical & Health, Shelter & Housing, + Hygiene & WASH, Clothing & Bedding, Equipment & Tools) +- **Demo Users**: 6 users with password ``demo``: kumari (field + officer), rajitha (approver), silva (manager), perera (warehouse + worker), fernando (coordinator), secretary (viewer) +- **GIS Reports**: 5 pre-configured reports for request distribution, + affected population, pending approvals, relief value, and fulfillment + progress UI Location ~~~~~~~~~~~ -- **Menu**: Settings > Demo Data > Load DRIMS Demo -- **Dashboard**: After loading, system redirects to Social Protection > - DRIMS > Dashboard +- **Menu**: Settings > Demo Data > Load DRIMS Demo +- **Dashboard**: After loading, system redirects to Social Protection > + DRIMS > Dashboard Security ~~~~~~~~ @@ -106,12 +106,12 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_generate_incidents()`` to customize incident scenarios for - country-specific disaster types -- Inherit ``spp.drims.demo.generator`` to add custom demo data - generation steps -- Override area import methods to support alternative data sources - beyond Excel/HDX +- Override ``_generate_incidents()`` to customize incident scenarios + for country-specific disaster types +- Inherit ``spp.drims.demo.generator`` to add custom demo data + generation steps +- Override area import methods to support alternative data sources + beyond Excel/HDX Dependencies ~~~~~~~~~~~~ diff --git a/spp_drims_sl_demo/static/description/index.html b/spp_drims_sl_demo/static/description/index.html index 797d1207..e9d28997 100644 --- a/spp_drims_sl_demo/static/description/index.html +++ b/spp_drims_sl_demo/static/description/index.html @@ -400,8 +400,8 @@

              Key Capabilities

              Key Models

              Group Read-only access to donations, requests, dispatches
              spp_drims.group_drims_officer
              ` +spp_drims.group_drims_officer` Create and edit donations, requests, returns (no delete)
              spp_drims.group_drims_approver
              `` +spp_drims.group_drims_approver`` Approve or reject supply requests
              spp_drims.group_drims_manager
              ` +spp_drims.group_drims_manager` Full CRUD including deletion and configuration
              spp_drims.group_drims_warehouse_worker
              spp_drim +s.group_drims_warehouse_worker Receive donations, manage stock, process dispatches
              spp_drims.group_drims_field_officer
              spp_d +rims.group_drims_field_officer Create requests and confirm deliveries in the field
              spp_drims.group_drims_coordinator_supervisor
              spp_drims.grou +p_drims_coordinator_supervisor Coordinate requests and distributions within assigned areas
              --++ @@ -476,8 +476,8 @@

              Security

              Extension Points

                -
              • Override _generate_incidents() to customize incident scenarios for -country-specific disaster types
              • +
              • Override _generate_incidents() to customize incident scenarios +for country-specific disaster types
              • Inherit spp.drims.demo.generator to add custom demo data generation steps
              • Override area import methods to support alternative data sources diff --git a/spp_event_data/README.rst b/spp_event_data/README.rst index 485a4f5f..308400c0 100644 --- a/spp_event_data/README.rst +++ b/spp_event_data/README.rst @@ -31,46 +31,46 @@ request generation when event data differs from registrant records. Key Capabilities ~~~~~~~~~~~~~~~~ -- Configure event types with categories (survey, visit, sync, manual), - target types, and storage modes -- Record events with collection metadata (date, collector, source - reference) and expiry tracking -- Store event data in JSON, define custom fields, or link to dedicated - Odoo models -- Automatically supersede previous active events when new ones arrive - for the same registrant -- Auto-expire events after a configurable number of days via scheduled - cron -- Require approval for new events before activation using configurable - workflows -- Integrate with external sources (ODK Central, KoBoToolbox, APIs) with - field mapping and transformations -- Generate change requests when event data differs from registrant - fields (requires ``spp_change_request``) -- Track event history with state transitions: draft → pending → active → - superseded/expired/cancelled +- Configure event types with categories (survey, visit, sync, manual), + target types, and storage modes +- Record events with collection metadata (date, collector, source + reference) and expiry tracking +- Store event data in JSON, define custom fields, or link to dedicated + Odoo models +- Automatically supersede previous active events when new ones arrive + for the same registrant +- Auto-expire events after a configurable number of days via scheduled + cron +- Require approval for new events before activation using configurable + workflows +- Integrate with external sources (ODK Central, KoBoToolbox, APIs) with + field mapping and transformations +- Generate change requests when event data differs from registrant + fields (requires ``spp_change_request``) +- Track event history with state transitions: draft → pending → active + → superseded/expired/cancelled Key Models ~~~~~~~~~~ -+-----------------------------+----------------------------------------+ -| Model | Description | -+=============================+========================================+ -| ``spp.event.data`` | Event record with registrant link, | -| | collection metadata | -+-----------------------------+----------------------------------------+ -| ``spp.event.type`` | Event type configuration (category, | -| | lifecycle, source) | -+-----------------------------+----------------------------------------+ -| ``spp.event.field`` | Custom field definition for JSON-based | -| | event types | -+-----------------------------+----------------------------------------+ -| ``spp.event.type.mapping`` | Field mapping for external source data | -| | transformation | -+-----------------------------+----------------------------------------+ -| ``spp.create.event.wizard`` | Wizard to create new event records | -| | from registrant form | -+-----------------------------+----------------------------------------+ ++-----------------------------+---------------------------------------+ +| Model | Description | ++=============================+=======================================+ +| ``spp.event.data`` | Event record with registrant link, | +| | collection metadata | ++-----------------------------+---------------------------------------+ +| ``spp.event.type`` | Event type configuration (category, | +| | lifecycle, source) | ++-----------------------------+---------------------------------------+ +| ``spp.event.field`` | Custom field definition for | +| | JSON-based event types | ++-----------------------------+---------------------------------------+ +| ``spp.event.type.mapping`` | Field mapping for external source | +| | data transformation | ++-----------------------------+---------------------------------------+ +| ``spp.create.event.wizard`` | Wizard to create new event records | +| | from registrant form | ++-----------------------------+---------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -93,14 +93,14 @@ After installing: UI Location ~~~~~~~~~~~ -- **Registrant Form**: "Event Data" stat button in button box opens - create wizard -- **Registrant Form**: Events section displays event history list with - state badges -- **Event Data**: Access via window action ``action_spp_event_data`` (no - menu defined in this module) -- **Event Form Tabs**: Event Data, Source, History, Legacy Data, - Approval +- **Registrant Form**: "Event Data" stat button in button box opens + create wizard +- **Registrant Form**: Events section displays event history list with + state badges +- **Event Data**: Access via window action ``action_spp_event_data`` + (no menu defined in this module) +- **Event Form Tabs**: Event Data, Source, History, Legacy Data, + Approval Security ~~~~~~~~ @@ -120,15 +120,15 @@ Group Access Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.event.type`` and override ``get_connector()`` to add - custom external source connectors -- Inherit ``spp.event.data`` and override ``_create_change_requests()`` - to customize change request logic -- Use ``_get_active_event_id()``, ``get_active_event()``, and - ``get_event_data_value()`` methods on ``res.partner`` for O(1) event - lookup -- Call ``_refresh_active_event_cache()`` on registrants when events are - activated/deactivated for cache consistency +- Inherit ``spp.event.type`` and override ``get_connector()`` to add + custom external source connectors +- Inherit ``spp.event.data`` and override ``_create_change_requests()`` + to customize change request logic +- Use ``_get_active_event_id()``, ``get_active_event()``, and + ``get_event_data_value()`` methods on ``res.partner`` for O(1) event + lookup +- Call ``_refresh_active_event_cache()`` on registrants when events are + activated/deactivated for cache consistency Dependencies ~~~~~~~~~~~~ diff --git a/spp_event_data/static/description/index.html b/spp_event_data/static/description/index.html index a42a92ab..3951dc4f 100644 --- a/spp_event_data/static/description/index.html +++ b/spp_event_data/static/description/index.html @@ -394,16 +394,16 @@

                Key Capabilities

                field mapping and transformations
              • Generate change requests when event data differs from registrant fields (requires spp_change_request)
              • -
              • Track event history with state transitions: draft → pending → active → -superseded/expired/cancelled
              • +
              • Track event history with state transitions: draft → pending → active +→ superseded/expired/cancelled

              Key Models

              Model
              --++ @@ -420,12 +420,12 @@

              Key Models

              lifecycle, source) - + - +
              Model
              spp.event.fieldCustom field definition for JSON-based -event typesCustom field definition for +JSON-based event types
              spp.event.type.mappingField mapping for external source data -transformationField mapping for external source +data transformation
              spp.create.event.wizard Wizard to create new event records @@ -459,8 +459,8 @@

              UI Location

              create wizard
            • Registrant Form: Events section displays event history list with state badges
            • -
            • Event Data: Access via window action action_spp_event_data (no -menu defined in this module)
            • +
            • Event Data: Access via window action action_spp_event_data +(no menu defined in this module)
            • Event Form Tabs: Event Data, Source, History, Legacy Data, Approval
            • diff --git a/spp_gis/README.rst b/spp_gis/README.rst index 300826d8..977b05c7 100644 --- a/spp_gis/README.rst +++ b/spp_gis/README.rst @@ -31,37 +31,37 @@ polygon fields. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define geo fields (``geo_point``, ``geo_line``, ``geo_polygon``) on - any model using PostGIS spatial types -- Visualize records on interactive maps via the GIS view type -- Configure background raster layers (OpenStreetMap, WMS, satellite - imagery) -- Configure data layers with basic or choropleth (color-by-value) - rendering -- Perform spatial queries (intersects, contains, within, distance-based) - via ``gis_locational_query()`` -- Import area boundaries from GeoJSON/shapefiles via area import wizard -- Manage color schemes for thematic mapping with sequential, diverging, - or qualitative palettes +- Define geo fields (``geo_point``, ``geo_line``, ``geo_polygon``) on + any model using PostGIS spatial types +- Visualize records on interactive maps via the GIS view type +- Configure background raster layers (OpenStreetMap, WMS, satellite + imagery) +- Configure data layers with basic or choropleth (color-by-value) + rendering +- Perform spatial queries (intersects, contains, within, + distance-based) via ``gis_locational_query()`` +- Import area boundaries from GeoJSON/shapefiles via area import wizard +- Manage color schemes for thematic mapping with sequential, diverging, + or qualitative palettes Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.gis.raster.layer`` | Background map layers (OSM, WMS, | -| | image) | -+-------------------------------+--------------------------------------+ -| ``spp.gis.data.layer`` | Vector data layers referencing geo | -| | fields from any model | -+-------------------------------+--------------------------------------+ -| ``spp.gis.color.scheme`` | Color palettes for choropleth and | -| | thematic visualizations | -+-------------------------------+--------------------------------------+ -| ``spp.gis.raster.layer.type`` | Raster layer type definitions (WMS | -| | services) | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.gis.raster.layer`` | Background map layers (OSM, WMS, | +| | image) | ++-------------------------------+-------------------------------------+ +| ``spp.gis.data.layer`` | Vector data layers referencing geo | +| | fields from any model | ++-------------------------------+-------------------------------------+ +| ``spp.gis.color.scheme`` | Color palettes for choropleth and | +| | thematic visualizations | ++-------------------------------+-------------------------------------+ +| ``spp.gis.raster.layer.type`` | Raster layer type definitions (WMS | +| | services) | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -79,42 +79,42 @@ After installing: UI Location ~~~~~~~~~~~ -- **GIS View**: Available as a view mode on models with geo fields - (e.g., ``spp.area``) -- **Area Form**: "Coordinates" and "Polygon" tabs appear when editing - areas (Social Protection > Configuration > Areas) -- **No standalone menu**: This module does not define menu items; GIS - functionality is accessed through existing models +- **GIS View**: Available as a view mode on models with geo fields + (e.g., ``spp.area``) +- **Area Form**: "Coordinates" and "Polygon" tabs appear when editing + areas (Social Protection > Configuration > Areas) +- **No standalone menu**: This module does not define menu items; GIS + functionality is accessed through existing models Security ~~~~~~~~ -+--------------------------------------+----------------------------------+ -| Group | Access | -+======================================+==================================+ -| ``spp_security.group_spp_admin`` | Full CRUD on all GIS models | -+--------------------------------------+----------------------------------+ -| ``spp_registry.group_registry_read`` | Read-only on color schemes and | -| | layers | -+--------------------------------------+----------------------------------+ -| ``spp_gis.group_gis_user`` | View GIS data and maps | -+--------------------------------------+----------------------------------+ -| ``spp_gis.group_gis_admin`` | Full GIS management including | -| | configuration | -+--------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_security.group_spp_admin`` | Full CRUD on all GIS models | ++----------------------------------+----------------------------------+ +| ``sp | Read-only on color schemes and | +| p_registry.group_registry_read`` | layers | ++----------------------------------+----------------------------------+ +| ``spp_gis.group_gis_user`` | View GIS data and maps | ++----------------------------------+----------------------------------+ +| ``spp_gis.group_gis_admin`` | Full GIS management including | +| | configuration | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``base`` and call - ``gis_locational_query(longitude, latitude, layer_type, spatial_relation)`` - for location-based searches -- Override ``_get_choropleth_config()`` on ``spp.gis.data.layer`` to - customize thematic mapping logic -- Inherit any model and add ``geo_point``, ``geo_line``, or - ``geo_polygon`` fields to enable spatial storage -- Create GIS views by setting ``type="gis"`` in ``ir.ui.view`` XML and - linking ``spp.gis.data.layer`` records +- Inherit ``base`` and call + ``gis_locational_query(longitude, latitude, layer_type, spatial_relation)`` + for location-based searches +- Override ``_get_choropleth_config()`` on ``spp.gis.data.layer`` to + customize thematic mapping logic +- Inherit any model and add ``geo_point``, ``geo_line``, or + ``geo_polygon`` fields to enable spatial storage +- Create GIS views by setting ``type="gis"`` in ``ir.ui.view`` XML and + linking ``spp.gis.data.layer`` records Dependencies ~~~~~~~~~~~~ diff --git a/spp_gis/static/description/index.html b/spp_gis/static/description/index.html index b428fb13..11c07128 100644 --- a/spp_gis/static/description/index.html +++ b/spp_gis/static/description/index.html @@ -385,8 +385,8 @@

              Key Capabilities

              imagery)
            • Configure data layers with basic or choropleth (color-by-value) rendering
            • -
            • Perform spatial queries (intersects, contains, within, distance-based) -via gis_locational_query()
            • +
            • Perform spatial queries (intersects, contains, within, +distance-based) via gis_locational_query()
            • Import area boundaries from GeoJSON/shapefiles via area import wizard
            • Manage color schemes for thematic mapping with sequential, diverging, or qualitative palettes
            • @@ -396,8 +396,8 @@

              Key Capabilities

              Key Models

              --++ @@ -452,8 +452,8 @@

              UI Location

              Security

              Model
              --++ @@ -464,7 +464,8 @@

              Security

              - + diff --git a/spp_gis_indicators/README.rst b/spp_gis_indicators/README.rst index e6a9006d..b6412d8d 100644 --- a/spp_gis_indicators/README.rst +++ b/spp_gis_indicators/README.rst @@ -31,27 +31,27 @@ legend generation. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define indicator layer configurations that link CEL variables to color - scales and classification methods -- Classify continuous indicator values into discrete color classes using - quantile, equal interval, or manual breaks -- Apply preset ColorBrewer color scales (sequential, diverging, - categorical) or define custom scales -- Compute break values automatically based on actual data distribution -- Generate HTML legends showing color-to-value mappings -- Map area features to colors for choropleth rendering in GIS data - layers -- Filter indicators by period and hazard incident context +- Define indicator layer configurations that link CEL variables to + color scales and classification methods +- Classify continuous indicator values into discrete color classes + using quantile, equal interval, or manual breaks +- Apply preset ColorBrewer color scales (sequential, diverging, + categorical) or define custom scales +- Compute break values automatically based on actual data distribution +- Generate HTML legends showing color-to-value mappings +- Map area features to colors for choropleth rendering in GIS data + layers +- Filter indicators by period and hazard incident context Key Models ~~~~~~~~~~ -- **spp.gis.indicator.layer** -- Configuration linking a CEL variable to - color scale and classification settings -- **spp.gis.color.scale** -- Color scheme definition with JSON array of - hex colors -- **spp.gis.data.layer** -- Extended with choropleth geo representation - option +- **spp.gis.indicator.layer** -- Configuration linking a CEL variable + to color scale and classification settings +- **spp.gis.color.scale** -- Color scheme definition with JSON array of + hex colors +- **spp.gis.data.layer** -- Extended with choropleth geo representation + option Configuration ~~~~~~~~~~~~~ @@ -70,26 +70,26 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Settings > GIS Configuration > Indicator Layers -- **Menu**: Settings > GIS Configuration > Color Scales +- **Menu**: Settings > GIS Configuration > Indicator Layers +- **Menu**: Settings > GIS Configuration > Color Scales Security ~~~~~~~~ -- **spp_security.group_spp_user** -- Read -- **spp_security.group_spp_manager** -- Read/write/create (no delete) -- **spp_security.group_spp_admin** -- Full CRUD +- **spp_security.group_spp_user** -- Read +- **spp_security.group_spp_manager** -- Read/write/create (no delete) +- **spp_security.group_spp_admin** -- Full CRUD Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_quantile_breaks()`` or - ``_compute_equal_interval_breaks()`` in ``spp.gis.indicator.layer`` to - add custom classification algorithms -- Inherit ``spp.gis.color.scale`` and override ``get_color_for_value()`` - to implement custom color mapping logic -- Extend ``spp.gis.indicator.layer._get_indicator_values()`` to support - additional data sources beyond ``spp.hxl.area.indicator`` +- Override ``_compute_quantile_breaks()`` or + ``_compute_equal_interval_breaks()`` in ``spp.gis.indicator.layer`` + to add custom classification algorithms +- Inherit ``spp.gis.color.scale`` and override + ``get_color_for_value()`` to implement custom color mapping logic +- Extend ``spp.gis.indicator.layer._get_indicator_values()`` to support + additional data sources beyond ``spp.hxl.area.indicator`` Dependencies ~~~~~~~~~~~~ diff --git a/spp_gis_indicators/static/description/index.html b/spp_gis_indicators/static/description/index.html index ff1a9f99..9b6163af 100644 --- a/spp_gis_indicators/static/description/index.html +++ b/spp_gis_indicators/static/description/index.html @@ -378,10 +378,10 @@

              OpenSPP GIS Indicators

              Key Capabilities

                -
              • Define indicator layer configurations that link CEL variables to color -scales and classification methods
              • -
              • Classify continuous indicator values into discrete color classes using -quantile, equal interval, or manual breaks
              • +
              • Define indicator layer configurations that link CEL variables to +color scales and classification methods
              • +
              • Classify continuous indicator values into discrete color classes +using quantile, equal interval, or manual breaks
              • Apply preset ColorBrewer color scales (sequential, diverging, categorical) or define custom scales
              • Compute break values automatically based on actual data distribution
              • @@ -394,8 +394,8 @@

                Key Capabilities

                Key Models

                  -
                • spp.gis.indicator.layer – Configuration linking a CEL variable to -color scale and classification settings
                • +
                • spp.gis.indicator.layer – Configuration linking a CEL variable +to color scale and classification settings
                • spp.gis.color.scale – Color scheme definition with JSON array of hex colors
                • spp.gis.data.layer – Extended with choropleth geo representation @@ -435,10 +435,10 @@

                  Security

                  Extension Points

                  • Override _compute_quantile_breaks() or -_compute_equal_interval_breaks() in spp.gis.indicator.layer to -add custom classification algorithms
                  • -
                  • Inherit spp.gis.color.scale and override get_color_for_value() -to implement custom color mapping logic
                  • +_compute_equal_interval_breaks() in spp.gis.indicator.layer +to add custom classification algorithms +
                  • Inherit spp.gis.color.scale and override +get_color_for_value() to implement custom color mapping logic
                  • Extend spp.gis.indicator.layer._get_indicator_values() to support additional data sources beyond spp.hxl.area.indicator
                  diff --git a/spp_gis_report/README.rst b/spp_gis_report/README.rst index f956ef5c..44e75d90 100644 --- a/spp_gis_report/README.rst +++ b/spp_gis_report/README.rst @@ -32,46 +32,46 @@ for external tool integration. Key Capabilities ~~~~~~~~~~~~~~~~ -- Template-based wizard guides users through report creation with three - steps -- Aggregates registrant, program, or disaster data by administrative - area using configurable field paths -- Normalizes values per km², per capita, per household, or as - percentages -- Rolls up data through area hierarchy from base level to all parent - levels -- Auto-calculates thresholds using quartiles, equal intervals, Jenks - breaks, or standard deviation -- Scheduled or on-demand data refresh with background job processing -- GeoJSON API endpoints using report codes (not database IDs) for - external tools -- Supports multiple geometry types: polygon choropleth, point markers, - clusters, heatmaps +- Template-based wizard guides users through report creation with three + steps +- Aggregates registrant, program, or disaster data by administrative + area using configurable field paths +- Normalizes values per km², per capita, per household, or as + percentages +- Rolls up data through area hierarchy from base level to all parent + levels +- Auto-calculates thresholds using quartiles, equal intervals, Jenks + breaks, or standard deviation +- Scheduled or on-demand data refresh with background job processing +- GeoJSON API endpoints using report codes (not database IDs) for + external tools +- Supports multiple geometry types: polygon choropleth, point markers, + clusters, heatmaps Key Models ~~~~~~~~~~ -+------------------------------+---------------------------------------+ -| Model | Description | -+==============================+=======================================+ -| ``spp.gis.report`` | Report configuration defining source, | -| | aggregation, and display | -+------------------------------+---------------------------------------+ -| ``spp.gis.report.data`` | Cached computed values for each area, | -| | updated on schedule | -+------------------------------+---------------------------------------+ -| ``spp.gis.report.template`` | Pre-built report definitions with | -| | JSON configuration | -+------------------------------+---------------------------------------+ -| ``spp.gis.report.category`` | Categories for organizing reports and | -| | templates | -+------------------------------+---------------------------------------+ -| ``spp.gis.report.threshold`` | Color threshold definitions for map | -| | visualization | -+------------------------------+---------------------------------------+ -| ``spp.gis.report.wizard`` | Three-step wizard for creating | -| | reports from templates | -+------------------------------+---------------------------------------+ ++------------------------------+--------------------------------------+ +| Model | Description | ++==============================+======================================+ +| ``spp.gis.report`` | Report configuration defining | +| | source, aggregation, and display | ++------------------------------+--------------------------------------+ +| ``spp.gis.report.data`` | Cached computed values for each | +| | area, updated on schedule | ++------------------------------+--------------------------------------+ +| ``spp.gis.report.template`` | Pre-built report definitions with | +| | JSON configuration | ++------------------------------+--------------------------------------+ +| ``spp.gis.report.category`` | Categories for organizing reports | +| | and templates | ++------------------------------+--------------------------------------+ +| ``spp.gis.report.threshold`` | Color threshold definitions for map | +| | visualization | ++------------------------------+--------------------------------------+ +| ``spp.gis.report.wizard`` | Three-step wizard for creating | +| | reports from templates | ++------------------------------+--------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -82,60 +82,61 @@ loaded automatically and accessible via the wizard. UI Location ~~~~~~~~~~~ -- **Menu**: GIS Reports > Reports -- **Templates**: GIS Reports > Templates -- **Configuration**: GIS Reports > Configuration > Categories and Color - Schemes (admin only) -- **Wizard**: Create reports by opening a template and clicking "Create - Report" -- **Form Tabs**: General, Data Source, Aggregation, Normalization, - Visualization, Rollup, Schedule, Access, Map Layer +- **Menu**: GIS Reports > Reports +- **Templates**: GIS Reports > Templates +- **Configuration**: GIS Reports > Configuration > Categories and Color + Schemes (admin only) +- **Wizard**: Create reports by opening a template and clicking "Create + Report" +- **Form Tabs**: General, Data Source, Aggregation, Normalization, + Visualization, Rollup, Schedule, Access, Map Layer Security ~~~~~~~~ -+-----------------------------------------+----------------------------------+ -| Group | Access | -+=========================================+==================================+ -| ``base.group_user`` | Read reports and data | -+-----------------------------------------+----------------------------------+ -| ``group_gis_report_user`` | Read reports, write data for | -| | refresh | -+-----------------------------------------+----------------------------------+ -| ``group_gis_report_officer`` | Read/Write/Create (no delete) | -+-----------------------------------------+----------------------------------+ -| ``group_gis_report_manager`` | Full CRUD | -+-----------------------------------------+----------------------------------+ -| ``spp_registry.group_registry_officer`` | Read reports and data | -+-----------------------------------------+----------------------------------+ -| ``spp_security.group_spp_admin`` | Full CRUD and configuration | -+-----------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``base.group_user`` | Read reports and data | ++----------------------------------+----------------------------------+ +| ``group_gis_report_user`` | Read reports, write data for | +| | refresh | ++----------------------------------+----------------------------------+ +| ``group_gis_report_officer`` | Read/Write/Create (no delete) | ++----------------------------------+----------------------------------+ +| ``group_gis_report_manager`` | Full CRUD | ++----------------------------------+----------------------------------+ +| ``spp_r | Read reports and data | +| egistry.group_registry_officer`` | | ++----------------------------------+----------------------------------+ +| ``spp_security.group_spp_admin`` | Full CRUD and configuration | ++----------------------------------+----------------------------------+ API Endpoints ~~~~~~~~~~~~~ All endpoints use report ``code`` as identifier, not database IDs: -- ``GET /api/v2/GISReport`` - List available reports -- ``GET /api/v2/GISReport//geojson`` - Get report data as GeoJSON - FeatureCollection -- ``GET /api/v2/GISReport//summary`` - Get aggregate statistics -- ``POST /api/v2/GISReport//refresh`` - Trigger manual data - refresh +- ``GET /api/v2/GISReport`` - List available reports +- ``GET /api/v2/GISReport//geojson`` - Get report data as GeoJSON + FeatureCollection +- ``GET /api/v2/GISReport//summary`` - Get aggregate statistics +- ``POST /api/v2/GISReport//refresh`` - Trigger manual data + refresh Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_get_gis_report_source_models()`` on ``spp.gis.report`` to - add models as data sources -- Override ``_apply_context_filters()`` on ``spp.gis.report`` to add - module-specific filtering (e.g., program context) -- Inherit ``spp.gis.report.wizard`` and override - ``_validate_context_requirements()`` and - ``_get_context_filter_vals()`` to add wizard steps for program or - incident selection -- Add report templates via data XML files with JSON configuration -- Extend ``spp.area`` to add reference data fields for normalization +- Override ``_get_gis_report_source_models()`` on ``spp.gis.report`` to + add models as data sources +- Override ``_apply_context_filters()`` on ``spp.gis.report`` to add + module-specific filtering (e.g., program context) +- Inherit ``spp.gis.report.wizard`` and override + ``_validate_context_requirements()`` and + ``_get_context_filter_vals()`` to add wizard steps for program or + incident selection +- Add report templates via data XML files with JSON configuration +- Extend ``spp.area`` to add reference data fields for normalization Dependencies ~~~~~~~~~~~~ diff --git a/spp_gis_report/static/description/index.html b/spp_gis_report/static/description/index.html index bc29408d..b586ed20 100644 --- a/spp_gis_report/static/description/index.html +++ b/spp_gis_report/static/description/index.html @@ -400,8 +400,8 @@

                  Key Capabilities

                  Key Models

              Group
              spp_security.group_spp_admin Full CRUD on all GIS models
              spp_registry.group_registry_read
              sp +p_registry.group_registry_read Read-only on color schemes and layers
              --++ @@ -410,20 +410,20 @@

              Key Models

              - + - + - +
              Model
              spp.gis.reportReport configuration defining source, -aggregation, and displayReport configuration defining +source, aggregation, and display
              spp.gis.report.dataCached computed values for each area, -updated on scheduleCached computed values for each +area, updated on schedule
              spp.gis.report.template Pre-built report definitions with JSON configuration
              spp.gis.report.categoryCategories for organizing reports and -templatesCategories for organizing reports +and templates
              spp.gis.report.threshold Color threshold definitions for map @@ -458,8 +458,8 @@

              UI Location

              Security

              --++ @@ -480,7 +480,8 @@

              Security

              - + diff --git a/spp_gis_report_programs/README.rst b/spp_gis_report_programs/README.rst index cf07635f..39debbc2 100644 --- a/spp_gis_report_programs/README.rst +++ b/spp_gis_report_programs/README.rst @@ -30,20 +30,20 @@ visualization. Key Capabilities ~~~~~~~~~~~~~~~~ -- Filter GIS reports to show only registrants enrolled in a specific - program -- Add program selector to report forms and wizard interface -- Validate program selection requirements before generating reports -- Include program identifier in generated report codes -- Grant GIS report access to program officers and managers +- Filter GIS reports to show only registrants enrolled in a specific + program +- Add program selector to report forms and wizard interface +- Validate program selection requirements before generating reports +- Include program identifier in generated report codes +- Grant GIS report access to program officers and managers Key Models ~~~~~~~~~~ -- ``spp.gis.report`` — Adds ``program_id`` field and filters domain by - program members -- ``spp.gis.report.wizard`` — Adds ``program_id`` selection with - validation and code suffix +- ``spp.gis.report`` — Adds ``program_id`` field and filters domain by + program members +- ``spp.gis.report.wizard`` — Adds ``program_id`` selection with + validation and code suffix Configuration ~~~~~~~~~~~~~ @@ -54,20 +54,20 @@ and ``spp_programs`` are present. UI Location ~~~~~~~~~~~ -- **Report Form**: Program field appears in the "context_group" on GIS - report forms (accessed via **GIS Reports > Reports**) -- **Wizard**: Program field appears in the "context_filters" group when - generating reports from templates +- **Report Form**: Program field appears in the "context_group" on GIS + report forms (accessed via **GIS Reports > Reports**) +- **Wizard**: Program field appears in the "context_filters" group when + generating reports from templates Security ~~~~~~~~ -- ``spp_programs.group_programs_officer`` — Read GIS reports, data, - templates, etc. -- ``spp_programs.group_programs_manager`` — Read/Write (no - create/unlink) all models -- ``spp_gis_report.group_gis_report_user`` — Implied for program - managers via XML +- ``spp_programs.group_programs_officer`` — Read GIS reports, data, + templates, etc. +- ``spp_programs.group_programs_manager`` — Read/Write (no + create/unlink) all models +- ``spp_gis_report.group_gis_report_user`` — Implied for program + managers via XML Models with access: ``spp.gis.report``, ``spp.gis.report.data``, ``spp.gis.report.threshold``, ``spp.gis.report.template``, @@ -76,14 +76,14 @@ Models with access: ``spp.gis.report``, ``spp.gis.report.data``, Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_apply_context_filters()`` on ``spp.gis.report`` to add - custom program-based filtering -- Override ``_validate_context_requirements()`` on - ``spp.gis.report.wizard`` for additional validation -- Override ``_get_context_code_suffix()`` to customize report code - generation with program identifiers -- Override ``_get_context_filter_vals()`` to modify report creation - values +- Override ``_apply_context_filters()`` on ``spp.gis.report`` to add + custom program-based filtering +- Override ``_validate_context_requirements()`` on + ``spp.gis.report.wizard`` for additional validation +- Override ``_get_context_code_suffix()`` to customize report code + generation with program identifiers +- Override ``_get_context_filter_vals()`` to modify report creation + values Dependencies ~~~~~~~~~~~~ diff --git a/spp_graduation/README.rst b/spp_graduation/README.rst index d81a083c..6743b5d9 100644 --- a/spp_graduation/README.rst +++ b/spp_graduation/README.rst @@ -32,37 +32,37 @@ removal). Key Capabilities ~~~~~~~~~~~~~~~~ -- Define graduation pathways with configurable criteria, exit type, and - monitoring duration -- Create weighted criteria with different assessment methods - (self-report, verification, computed, observation) -- Conduct beneficiary assessments with criteria responses and evidence - attachments -- Calculate readiness scores based on weighted criteria and enforce - required criteria -- Submit assessments for manager approval through a - draft/submitted/approved/rejected workflow -- Track graduation dates and compute post-graduation monitoring periods -- Filter assessments by assessor, state, pathway, and recommendation +- Define graduation pathways with configurable criteria, exit type, and + monitoring duration +- Create weighted criteria with different assessment methods + (self-report, verification, computed, observation) +- Conduct beneficiary assessments with criteria responses and evidence + attachments +- Calculate readiness scores based on weighted criteria and enforce + required criteria +- Submit assessments for manager approval through a + draft/submitted/approved/rejected workflow +- Track graduation dates and compute post-graduation monitoring periods +- Filter assessments by assessor, state, pathway, and recommendation Key Models ~~~~~~~~~~ -+--------------------------------------+----------------------------------+ -| Model | Description | -+======================================+==================================+ -| ``spp.graduation.pathway`` | Defines a graduation pathway | -| | with criteria and exit type | -+--------------------------------------+----------------------------------+ -| ``spp.graduation.criteria`` | Individual criterion within a | -| | pathway with weight and method | -+--------------------------------------+----------------------------------+ -| ``spp.graduation.assessment`` | Assessment of a beneficiary | -| | against a pathway with scores | -+--------------------------------------+----------------------------------+ -| ``spp.graduation.criteria.response`` | Response to a specific criterion | -| | within an assessment | -+--------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Model | Description | ++==================================+==================================+ +| ``spp.graduation.pathway`` | Defines a graduation pathway | +| | with criteria and exit type | ++----------------------------------+----------------------------------+ +| ``spp.graduation.criteria`` | Individual criterion within a | +| | pathway with weight and method | ++----------------------------------+----------------------------------+ +| ``spp.graduation.assessment`` | Assessment of a beneficiary | +| | against a pathway with scores | ++----------------------------------+----------------------------------+ +| ``sp | Response to a specific criterion | +| p.graduation.criteria.response`` | within an assessment | ++----------------------------------+----------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -80,39 +80,39 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Graduation (top-level menu) -- **Assessments**: Graduation > Assessments > All Assessments / My - Assessments -- **Configuration**: Graduation > Configuration > Pathways (managers - only) -- **Views**: List, kanban (grouped by state), and form views with - approval workflow -- **Pathway Form**: Criteria tab shows inline editable criteria list -- **Assessment Form**: Criteria Responses and Recommendation tabs +- **Menu**: Graduation (top-level menu) +- **Assessments**: Graduation > Assessments > All Assessments / My + Assessments +- **Configuration**: Graduation > Configuration > Pathways (managers + only) +- **Views**: List, kanban (grouped by state), and form views with + approval workflow +- **Pathway Form**: Criteria tab shows inline editable criteria list +- **Assessment Form**: Criteria Responses and Recommendation tabs Security ~~~~~~~~ -+-------------------------------------------------+----------------------------------+ -| Group | Access | -+=================================================+==================================+ -| ``spp_graduation.group_spp_graduation_user`` | Read pathways/criteria; | -| | create/edit own assessments (no | -| | delete) | -+-------------------------------------------------+----------------------------------+ -| ``spp_graduation.group_spp_graduation_manager`` | Full CRUD on all graduation data | -| | and configuration | -+-------------------------------------------------+----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``spp_gradua | Read pathways/criteria; | +| tion.group_spp_graduation_user`` | create/edit own assessments (no | +| | delete) | ++----------------------------------+----------------------------------+ +| ``spp_graduatio | Full CRUD on all graduation data | +| n.group_spp_graduation_manager`` | and configuration | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.graduation.assessment`` and override - ``_compute_scores()`` to customize readiness calculation -- Inherit ``spp.graduation.pathway`` to add domain-specific pathway - fields -- Extend approval workflow by inheriting assessment actions - (``action_submit``, ``action_approve``) +- Inherit ``spp.graduation.assessment`` and override + ``_compute_scores()`` to customize readiness calculation +- Inherit ``spp.graduation.pathway`` to add domain-specific pathway + fields +- Extend approval workflow by inheriting assessment actions + (``action_submit``, ``action_approve``) Dependencies ~~~~~~~~~~~~ diff --git a/spp_graduation/static/description/index.html b/spp_graduation/static/description/index.html index 6e33b82e..b36444b2 100644 --- a/spp_graduation/static/description/index.html +++ b/spp_graduation/static/description/index.html @@ -397,8 +397,8 @@

              Key Capabilities

              Key Models

              Group
              group_gis_report_manager Full CRUD
              spp_registry.group_registry_officer
              spp_r +egistry.group_registry_officer Read reports and data
              spp_security.group_spp_admin
              --++ @@ -418,7 +418,8 @@

              Key Models

              - + @@ -456,8 +457,8 @@

              UI Location

              Security

              Model Assessment of a beneficiary against a pathway with scores
              spp.graduation.criteria.response
              sp +p.graduation.criteria.response Response to a specific criterion within an assessment
              --++ @@ -465,12 +466,14 @@

              Security

              - + - + diff --git a/spp_grm/README.rst b/spp_grm/README.rst index bb58317a..e6148be5 100644 --- a/spp_grm/README.rst +++ b/spp_grm/README.rst @@ -31,57 +31,57 @@ group registrants and supports anonymous submissions. Key Capabilities ~~~~~~~~~~~~~~~~ -- Multi-channel intake: Email alias integration creates tickets from - inbound messages, portal form for beneficiaries, manual entry by - officers -- Stage-based workflow: Define stages with access control restrictions, - approval requirements, and decision enforcement before closure -- SLA tracking: Automatically compute deadlines based on - category/subcategory configuration, monitor status (on track, at risk, - breached), post notifications on breach -- Team assignment: Organize handlers into teams with geographic area - responsibilities, auto-assign based on category defaults -- Appeals and escalation: Reference original tickets for appeals, track - escalation history and reasons, mark tickets as escalated -- Hierarchical categorization: Two-level category/subcategory system - with inherited defaults for severity, sensitivity, SLA hours, and team - assignment -- Decision tracking: Record final decisions (upheld, partially upheld, - rejected, withdrawn, redirected, referred to case) with resolution - summaries -- Anonymous complaints: Optional contact fields for complainants not in - the registry +- Multi-channel intake: Email alias integration creates tickets from + inbound messages, portal form for beneficiaries, manual entry by + officers +- Stage-based workflow: Define stages with access control restrictions, + approval requirements, and decision enforcement before closure +- SLA tracking: Automatically compute deadlines based on + category/subcategory configuration, monitor status (on track, at + risk, breached), post notifications on breach +- Team assignment: Organize handlers into teams with geographic area + responsibilities, auto-assign based on category defaults +- Appeals and escalation: Reference original tickets for appeals, track + escalation history and reasons, mark tickets as escalated +- Hierarchical categorization: Two-level category/subcategory system + with inherited defaults for severity, sensitivity, SLA hours, and + team assignment +- Decision tracking: Record final decisions (upheld, partially upheld, + rejected, withdrawn, redirected, referred to case) with resolution + summaries +- Anonymous complaints: Optional contact fields for complainants not in + the registry Key Models ~~~~~~~~~~ -+--------------------------------+-------------------------------------+ -| Model | Description | -+================================+=====================================+ -| ``spp.grm.ticket`` | Main complaint/grievance with SLA | -| | tracking and decision fields | -+--------------------------------+-------------------------------------+ -| ``spp.grm.ticket.stage`` | Workflow stage with access control | -| | and closure configuration | -+--------------------------------+-------------------------------------+ -| ``spp.grm.ticket.category`` | Primary classification with | -| | hierarchical structure | -+--------------------------------+-------------------------------------+ -| ``spp.grm.ticket.subcategory`` | Second-level classification under | -| | category | -+--------------------------------+-------------------------------------+ -| ``spp.grm.team`` | Team of handlers with manager and | -| | geographic areas | -+--------------------------------+-------------------------------------+ -| ``spp.grm.sla.rule`` | Conditional SLA rules with | -| | escalation targets | -+--------------------------------+-------------------------------------+ -| ``spp.grm.ticket.tag`` | Tags for flexible ticket | -| | classification | -+--------------------------------+-------------------------------------+ -| ``spp.grm.ticket.channel`` | Communication channel (email, | -| | phone, walk-in, portal, etc.) | -+--------------------------------+-------------------------------------+ ++--------------------------------+------------------------------------+ +| Model | Description | ++================================+====================================+ +| ``spp.grm.ticket`` | Main complaint/grievance with SLA | +| | tracking and decision fields | ++--------------------------------+------------------------------------+ +| ``spp.grm.ticket.stage`` | Workflow stage with access control | +| | and closure configuration | ++--------------------------------+------------------------------------+ +| ``spp.grm.ticket.category`` | Primary classification with | +| | hierarchical structure | ++--------------------------------+------------------------------------+ +| ``spp.grm.ticket.subcategory`` | Second-level classification under | +| | category | ++--------------------------------+------------------------------------+ +| ``spp.grm.team`` | Team of handlers with manager and | +| | geographic areas | ++--------------------------------+------------------------------------+ +| ``spp.grm.sla.rule`` | Conditional SLA rules with | +| | escalation targets | ++--------------------------------+------------------------------------+ +| ``spp.grm.ticket.tag`` | Tags for flexible ticket | +| | classification | ++--------------------------------+------------------------------------+ +| ``spp.grm.ticket.channel`` | Communication channel (email, | +| | phone, walk-in, portal, etc.) | ++--------------------------------+------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -102,13 +102,13 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Helpdesk (top-level menu item) -- **Tickets**: Helpdesk > Tickets -- **Configuration**: Helpdesk > Configuration (manager access required) -- **Portal**: Beneficiaries can view and create tickets at - ``/my/tickets`` -- **Registrant Profile**: Stat button shows ticket count and opens - related tickets +- **Menu**: Helpdesk (top-level menu item) +- **Tickets**: Helpdesk > Tickets +- **Configuration**: Helpdesk > Configuration (manager access required) +- **Portal**: Beneficiaries can view and create tickets at + ``/my/tickets`` +- **Registrant Profile**: Stat button shows ticket count and opens + related tickets Security ~~~~~~~~ @@ -129,15 +129,15 @@ no direct model access entries. Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_sla_deadline()`` on ``spp.grm.ticket`` to - implement custom SLA calculation logic -- Install ``spp_grm_cel`` to provide ``spp.grm.escalation.rule`` model, - which is automatically invoked when SLA status changes to breached -- Inherit ``spp.grm.ticket`` to add domain-specific fields (extended by - ``spp_grm_registry``, ``spp_grm_programs``) -- Extend ``spp.grm.ticket.stage`` to add workflow state fields -- Override ``evaluate_ticket()`` on ``spp.grm.sla.rule`` to add custom - matching conditions +- Override ``_compute_sla_deadline()`` on ``spp.grm.ticket`` to + implement custom SLA calculation logic +- Install ``spp_grm_cel`` to provide ``spp.grm.escalation.rule`` model, + which is automatically invoked when SLA status changes to breached +- Inherit ``spp.grm.ticket`` to add domain-specific fields (extended by + ``spp_grm_registry``, ``spp_grm_programs``) +- Extend ``spp.grm.ticket.stage`` to add workflow state fields +- Override ``evaluate_ticket()`` on ``spp.grm.sla.rule`` to add custom + matching conditions Dependencies ~~~~~~~~~~~~ diff --git a/spp_grm/static/description/index.html b/spp_grm/static/description/index.html index 6d81d79a..2c16d02f 100644 --- a/spp_grm/static/description/index.html +++ b/spp_grm/static/description/index.html @@ -384,15 +384,15 @@

              Key Capabilities

            • Stage-based workflow: Define stages with access control restrictions, approval requirements, and decision enforcement before closure
            • SLA tracking: Automatically compute deadlines based on -category/subcategory configuration, monitor status (on track, at risk, -breached), post notifications on breach
            • +category/subcategory configuration, monitor status (on track, at +risk, breached), post notifications on breach
            • Team assignment: Organize handlers into teams with geographic area responsibilities, auto-assign based on category defaults
            • Appeals and escalation: Reference original tickets for appeals, track escalation history and reasons, mark tickets as escalated
            • Hierarchical categorization: Two-level category/subcategory system -with inherited defaults for severity, sensitivity, SLA hours, and team -assignment
            • +with inherited defaults for severity, sensitivity, SLA hours, and +team assignment
            • Decision tracking: Record final decisions (upheld, partially upheld, rejected, withdrawn, redirected, referred to case) with resolution summaries
            • @@ -404,8 +404,8 @@

              Key Capabilities

              Key Models

              Group
              spp_graduation.group_spp_graduation_user
              spp_gradua +tion.group_spp_graduation_user Read pathways/criteria; create/edit own assessments (no delete)
              spp_graduation.group_spp_graduation_manager
              spp_graduatio +n.group_spp_graduation_manager Full CRUD on all graduation data and configuration
              --++ diff --git a/spp_grm_case_link/README.rst b/spp_grm_case_link/README.rst index 5ac460a3..896044ac 100644 --- a/spp_grm_case_link/README.rst +++ b/spp_grm_case_link/README.rst @@ -31,34 +31,34 @@ follow-up tickets for ongoing grievance tracking. Key Capabilities ~~~~~~~~~~~~~~~~ -- Escalate GRM tickets to case management cases via wizard with - configurable case type, intensity, and assignment -- Bidirectional linking: tickets track their related case, cases track - all related tickets -- Smart buttons on ticket and case forms show linked records and allow - navigation -- Automatic intake source tracking (``intake_source='grm'``) for cases - created from tickets -- Optional ticket closure with decision recording after escalation -- Create follow-up GRM tickets from cases for continued grievance - handling -- Filter and group tickets by case linkage, cases by GRM source +- Escalate GRM tickets to case management cases via wizard with + configurable case type, intensity, and assignment +- Bidirectional linking: tickets track their related case, cases track + all related tickets +- Smart buttons on ticket and case forms show linked records and allow + navigation +- Automatic intake source tracking (``intake_source='grm'``) for cases + created from tickets +- Optional ticket closure with decision recording after escalation +- Create follow-up GRM tickets from cases for continued grievance + handling +- Filter and group tickets by case linkage, cases by GRM source Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.grm.escalate.wizard`` | Transient wizard to configure and | -| | execute escalation | -+-------------------------------+--------------------------------------+ -| ``spp.grm.ticket`` (extended) | Adds ``case_id`` field and | -| | escalation/view case actions | -+-------------------------------+--------------------------------------+ -| ``spp.case`` (extended) | Adds ``source_grm_ticket_id``, | -| | ``grm_ticket_ids``, and count | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.grm.escalate.wizard`` | Transient wizard to configure and | +| | execute escalation | ++-------------------------------+-------------------------------------+ +| ``spp.grm.ticket`` (extended) | Adds ``case_id`` field and | +| | escalation/view case actions | ++-------------------------------+-------------------------------------+ +| ``spp.case`` (extended) | Adds ``source_grm_ticket_id``, | +| | ``grm_ticket_ids``, and count | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -71,20 +71,20 @@ UI Location **From GRM Ticket:** -- **Escalate button**: Ticket form header (visible when no case linked) -- **Case smart button**: Ticket form button box (visible when case - linked) -- **Case section**: Embedded case details in ticket form when linked -- **Filters**: "Has Case" and "No Case" filters in ticket search view +- **Escalate button**: Ticket form header (visible when no case linked) +- **Case smart button**: Ticket form button box (visible when case + linked) +- **Case section**: Embedded case details in ticket form when linked +- **Filters**: "Has Case" and "No Case" filters in ticket search view **From Case:** -- **Create Ticket button**: Case form button box (always visible) -- **Tickets smart button**: Case form button box (shows count when - tickets exist) -- **GRM Tickets tab**: Case form notebook (visible when tickets linked) -- **Source ticket field**: Case intake section when escalated from - ticket +- **Create Ticket button**: Case form button box (always visible) +- **Tickets smart button**: Case form button box (shows count when + tickets exist) +- **GRM Tickets tab**: Case form notebook (visible when tickets linked) +- **Source ticket field**: Case intake section when escalated from + ticket Security ~~~~~~~~ @@ -104,12 +104,12 @@ to them; managers can escalate any ticket. Extension Points ~~~~~~~~~~~~~~~~ -- Override ``EscalateToCaseWizard.action_escalate()`` to customize case - creation logic or add post-escalation hooks -- Inherit ``spp.grm.ticket`` to add fields exposed in the escalation - wizard context -- Inherit ``spp.case`` to customize follow-up ticket creation via - ``action_create_grm_ticket()`` +- Override ``EscalateToCaseWizard.action_escalate()`` to customize case + creation logic or add post-escalation hooks +- Inherit ``spp.grm.ticket`` to add fields exposed in the escalation + wizard context +- Inherit ``spp.case`` to customize follow-up ticket creation via + ``action_create_grm_ticket()`` Dependencies ~~~~~~~~~~~~ diff --git a/spp_grm_case_link/static/description/index.html b/spp_grm_case_link/static/description/index.html index 8dca3de8..aae3fada 100644 --- a/spp_grm_case_link/static/description/index.html +++ b/spp_grm_case_link/static/description/index.html @@ -396,8 +396,8 @@

              Key Capabilities

              Key Models

              Model
              --++ diff --git a/spp_grm_cel/README.rst b/spp_grm_cel/README.rst index 94ebeb17..3eb32435 100644 --- a/spp_grm_cel/README.rst +++ b/spp_grm_cel/README.rst @@ -31,36 +31,36 @@ creation. Key Capabilities ~~~~~~~~~~~~~~~~ -- **Routing**: Automatically assign new tickets to teams and users based - on CEL conditions evaluated on ticket properties (severity, priority, - category, channel) -- **Escalation**: Automatically escalate tickets when CEL conditions - match, optionally after a time threshold (hours since creation) -- **Notifications**: Send email notifications when escalation rules - trigger using configurable mail templates -- **Case Integration**: Automatically create case management records - when escalating tickets (requires ``spp_case_management``) -- **Manual Trigger**: Button on ticket form to manually evaluate - escalation rules +- **Routing**: Automatically assign new tickets to teams and users + based on CEL conditions evaluated on ticket properties (severity, + priority, category, channel) +- **Escalation**: Automatically escalate tickets when CEL conditions + match, optionally after a time threshold (hours since creation) +- **Notifications**: Send email notifications when escalation rules + trigger using configurable mail templates +- **Case Integration**: Automatically create case management records + when escalating tickets (requires ``spp_case_management``) +- **Manual Trigger**: Button on ticket form to manually evaluate + escalation rules Key Models ~~~~~~~~~~ -+-------------------------------+--------------------------------------+ -| Model | Description | -+===============================+======================================+ -| ``spp.grm.routing.rule`` | Routing rule with CEL condition that | -| | assigns tickets to teams/users | -| | (first match wins) | -+-------------------------------+--------------------------------------+ -| ``spp.grm.escalation.rule`` | Escalation rule with CEL condition | -| | and time trigger that escalates | -| | tickets | -+-------------------------------+--------------------------------------+ -| ``spp.grm.ticket`` (extended) | Adds ``routing_rule_id`` and | -| | ``escalation_rule_ids`` fields to | -| | track applied rules | -+-------------------------------+--------------------------------------+ ++-------------------------------+-------------------------------------+ +| Model | Description | ++===============================+=====================================+ +| ``spp.grm.routing.rule`` | Routing rule with CEL condition | +| | that assigns tickets to teams/users | +| | (first match wins) | ++-------------------------------+-------------------------------------+ +| ``spp.grm.escalation.rule`` | Escalation rule with CEL condition | +| | and time trigger that escalates | +| | tickets | ++-------------------------------+-------------------------------------+ +| ``spp.grm.ticket`` (extended) | Adds ``routing_rule_id`` and | +| | ``escalation_rule_ids`` fields to | +| | track applied rules | ++-------------------------------+-------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -81,10 +81,10 @@ After installing: UI Location ~~~~~~~~~~~ -- **Routing Rules**: Helpdesk > Configuration > Routing Rules -- **Escalation Rules**: Helpdesk > Configuration > Escalation Rules -- **Manual Escalation**: Button in ticket form button box (labeled - "Check Escalation") +- **Routing Rules**: Helpdesk > Configuration > Routing Rules +- **Escalation Rules**: Helpdesk > Configuration > Escalation Rules +- **Manual Escalation**: Button in ticket form button box (labeled + "Check Escalation") Security ~~~~~~~~ @@ -105,11 +105,11 @@ CEL Context Variables Routing and escalation rules can reference these variables in CEL expressions: -- ``ticket``, ``category``, ``channel``, ``stage``, ``severity``, - ``priority``, ``partner``, ``team``, ``user`` -- Escalation only: ``sla_status``, ``days_open``, ``is_escalated`` -- Helper functions: ``days_since(date)``, ``hours_since(datetime)``, - ``is_business_day(date)`` +- ``ticket``, ``category``, ``channel``, ``stage``, ``severity``, + ``priority``, ``partner``, ``team``, ``user`` +- Escalation only: ``sla_status``, ``days_open``, ``is_escalated`` +- Helper functions: ``days_since(date)``, ``hours_since(datetime)``, + ``is_business_day(date)`` Dependencies ~~~~~~~~~~~~ diff --git a/spp_grm_cel/static/description/index.html b/spp_grm_cel/static/description/index.html index 7c686d6a..9a1cddba 100644 --- a/spp_grm_cel/static/description/index.html +++ b/spp_grm_cel/static/description/index.html @@ -378,9 +378,9 @@

              OpenSPP GRM: CEL Rules

              Key Capabilities

                -
              • Routing: Automatically assign new tickets to teams and users based -on CEL conditions evaluated on ticket properties (severity, priority, -category, channel)
              • +
              • Routing: Automatically assign new tickets to teams and users +based on CEL conditions evaluated on ticket properties (severity, +priority, category, channel)
              • Escalation: Automatically escalate tickets when CEL conditions match, optionally after a time threshold (hours since creation)
              • Notifications: Send email notifications when escalation rules @@ -395,8 +395,8 @@

                Key Capabilities

                Key Models

              Model
              --++ @@ -405,8 +405,8 @@

              Key Models

              - diff --git a/spp_grm_demo/README.rst b/spp_grm_demo/README.rst index be88bc6d..ca462fb3 100644 --- a/spp_grm_demo/README.rst +++ b/spp_grm_demo/README.rst @@ -31,31 +31,31 @@ escalations, and timeline distribution. Key Capabilities ~~~~~~~~~~~~~~~~ -- Generate story tickets for specific demo personas that align with - ``spp_mis_demo_v2`` and ``spp_case_demo`` -- Generate volume tickets using YAML scenario templates or built-in - fallback scenarios -- Simulate ticket workflows: resolution notes, stage transitions, - escalations, and assignments -- Link tickets to beneficiaries, programs, and teams with configurable - distribution -- Control resolved vs. unresolved ratios, severity distribution, and - timeline spread -- Backdate ticket creation and workflow events across a configurable - time range +- Generate story tickets for specific demo personas that align with + ``spp_mis_demo_v2`` and ``spp_case_demo`` +- Generate volume tickets using YAML scenario templates or built-in + fallback scenarios +- Simulate ticket workflows: resolution notes, stage transitions, + escalations, and assignments +- Link tickets to beneficiaries, programs, and teams with configurable + distribution +- Control resolved vs. unresolved ratios, severity distribution, and + timeline spread +- Backdate ticket creation and workflow events across a configurable + time range Key Models ~~~~~~~~~~ -+----------------------------+-----------------------------------------+ -| Model | Description | -+============================+=========================================+ -| ``spp.grm.demo.generator`` | Transient model containing generation | -| | logic and workflow simulation | -+----------------------------+-----------------------------------------+ -| ``spp.grm.demo.wizard`` | Transient model inheriting from | -| | generator for wizard UI configuration | -+----------------------------+-----------------------------------------+ ++----------------------------+----------------------------------------+ +| Model | Description | ++============================+========================================+ +| ``spp.grm.demo.generator`` | Transient model containing generation | +| | logic and workflow simulation | ++----------------------------+----------------------------------------+ +| ``spp.grm.demo.wizard`` | Transient model inheriting from | +| | generator for wizard UI configuration | ++----------------------------+----------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -70,9 +70,9 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Helpdesk > Configuration > Generate Demo Data -- **Wizard**: Configure story vs. volume generation, ticket count, time - range, and resolution percentages +- **Menu**: Helpdesk > Configuration > Generate Demo Data +- **Wizard**: Configure story vs. volume generation, ticket count, time + range, and resolution percentages Security ~~~~~~~~ @@ -88,15 +88,15 @@ Data Generated The generator creates ``spp.grm.ticket`` records with: -- Story tickets: 8 predefined personas with specific scenarios (payment - issues, eligibility inquiries, service requests) -- Volume tickets: Scenario-based tickets distributed over time with - realistic progression -- Ticket categories: Payment Issues, Eligibility Questions, Service - Delivery, Information Requests, Data Update Requests, General, - Complaint, Feedback -- Workflow progression: Resolution notes, stage transitions, escalation - notes, and user assignments with backdated timestamps +- Story tickets: 8 predefined personas with specific scenarios (payment + issues, eligibility inquiries, service requests) +- Volume tickets: Scenario-based tickets distributed over time with + realistic progression +- Ticket categories: Payment Issues, Eligibility Questions, Service + Delivery, Information Requests, Data Update Requests, General, + Complaint, Feedback +- Workflow progression: Resolution notes, stage transitions, escalation + notes, and user assignments with backdated timestamps Integration ~~~~~~~~~~~ diff --git a/spp_grm_programs/README.rst b/spp_grm_programs/README.rst index 8b4ca133..fcacc878 100644 --- a/spp_grm_programs/README.rst +++ b/spp_grm_programs/README.rst @@ -31,14 +31,14 @@ population and computed status/amount displays. Key Capabilities ~~~~~~~~~~~~~~~~ -- Link tickets to programs, enrollments, cycles, entitlements, and - payments via Many2one fields -- Auto-populate related fields based on record relationships (selecting - payment fills entitlement, cycle, and registrant) -- Display computed enrollment status and monetary amounts from linked - records -- Navigate to program records via stat buttons on ticket form -- Filter and group tickets by program, cycle, or enrollment status +- Link tickets to programs, enrollments, cycles, entitlements, and + payments via Many2one fields +- Auto-populate related fields based on record relationships (selecting + payment fills entitlement, cycle, and registrant) +- Display computed enrollment status and monetary amounts from linked + records +- Navigate to program records via stat buttons on ticket form +- Filter and group tickets by program, cycle, or enrollment status Models Extended ~~~~~~~~~~~~~~~ @@ -54,29 +54,29 @@ New Fields on ``spp.grm.ticket`` **Relational fields:** -- ``program_id`` → ``spp.program`` -- ``program_membership_id`` → ``spp.program.membership`` -- ``cycle_id`` → ``spp.cycle`` -- ``entitlement_id`` → ``spp.entitlement`` -- ``payment_id`` → ``spp.payment`` +- ``program_id`` → ``spp.program`` +- ``program_membership_id`` → ``spp.program.membership`` +- ``cycle_id`` → ``spp.cycle`` +- ``entitlement_id`` → ``spp.entitlement`` +- ``payment_id`` → ``spp.payment`` **Computed fields (stored):** -- ``enrollment_status``: Current state from program membership -- ``entitlement_amount``: Amount from linked entitlement -- ``payment_amount``: Amount from linked payment +- ``enrollment_status``: Current state from program membership +- ``entitlement_amount``: Amount from linked entitlement +- ``payment_amount``: Amount from linked payment UI Location ~~~~~~~~~~~ -- **Menu**: Helpdesk > Tickets (no new menus, extends existing ticket - views) -- **Form**: "Program Information" section below ticket details with stat - buttons for linked records -- **Search**: Filters for "Has Program", "Has Entitlement", "Has - Payment"; group by Program, Cycle, Enrollment Status -- **Tree/Kanban**: Program fields available as optional columns and card - elements +- **Menu**: Helpdesk > Tickets (no new menus, extends existing ticket + views) +- **Form**: "Program Information" section below ticket details with + stat buttons for linked records +- **Search**: Filters for "Has Program", "Has Entitlement", "Has + Payment"; group by Program, Cycle, Enrollment Status +- **Tree/Kanban**: Program fields available as optional columns and + card elements Security ~~~~~~~~ @@ -88,10 +88,10 @@ program links. Extension Points ~~~~~~~~~~~~~~~~ -- Override ``_compute_program_info()`` to customize enrollment status - and amount extraction logic -- Extend ``_onchange_*`` methods to add domain-specific auto-fill - behavior +- Override ``_compute_program_info()`` to customize enrollment status + and amount extraction logic +- Extend ``_onchange_*`` methods to add domain-specific auto-fill + behavior Dependencies ~~~~~~~~~~~~ diff --git a/spp_grm_programs/static/description/index.html b/spp_grm_programs/static/description/index.html index f33f90fe..f755a81e 100644 --- a/spp_grm_programs/static/description/index.html +++ b/spp_grm_programs/static/description/index.html @@ -429,12 +429,12 @@

              UI Location

              • Menu: Helpdesk > Tickets (no new menus, extends existing ticket views)
              • -
              • Form: “Program Information” section below ticket details with stat -buttons for linked records
              • +
              • Form: “Program Information” section below ticket details with +stat buttons for linked records
              • Search: Filters for “Has Program”, “Has Entitlement”, “Has Payment”; group by Program, Cycle, Enrollment Status
              • -
              • Tree/Kanban: Program fields available as optional columns and card -elements
              • +
              • Tree/Kanban: Program fields available as optional columns and +card elements
              diff --git a/spp_grm_registry/README.rst b/spp_grm_registry/README.rst index f8662444..61b48bc9 100644 --- a/spp_grm_registry/README.rst +++ b/spp_grm_registry/README.rst @@ -30,55 +30,57 @@ ticket history on both ticket and registrant forms. Key Capabilities ~~~~~~~~~~~~~~~~ -- Link tickets to individual registrants (``registrant_id``) and - households (``household_id``) -- Auto-populate ticket fields: when registrant is selected, fills - ``partner_id``, ``area_id``, and ``household_id`` from registrant data -- Detect repeat tickets: compute ``is_repeat`` and ``repeat_count`` for - tickets filed by the same registrant in last 6 months -- Display warning banner and previous tickets button on ticket form when - ``is_repeat=True`` -- Track ticket counts on registrant profiles with smart buttons (total - and open counts) -- Filter tickets by registrant, household, area, or repeat status +- Link tickets to individual registrants (``registrant_id``) and + households (``household_id``) +- Auto-populate ticket fields: when registrant is selected, fills + ``partner_id``, ``area_id``, and ``household_id`` from registrant + data +- Detect repeat tickets: compute ``is_repeat`` and ``repeat_count`` for + tickets filed by the same registrant in last 6 months +- Display warning banner and previous tickets button on ticket form + when ``is_repeat=True`` +- Track ticket counts on registrant profiles with smart buttons (total + and open counts) +- Filter tickets by registrant, household, area, or repeat status Key Models ~~~~~~~~~~ -+--------------------+-------------------------------------------------+ -| Model | Description | -+====================+=================================================+ -| ``spp.grm.ticket`` | Adds registrant/household links, repeat | -| | detection fields | -+--------------------+-------------------------------------------------+ -| ``res.partner`` | Adds GRM ticket relationships and computed | -| | count fields | -+--------------------+-------------------------------------------------+ ++--------------------+------------------------------------------------+ +| Model | Description | ++====================+================================================+ +| ``spp.grm.ticket`` | Adds registrant/household links, repeat | +| | detection fields | ++--------------------+------------------------------------------------+ +| ``res.partner`` | Adds GRM ticket relationships and computed | +| | count fields | ++--------------------+------------------------------------------------+ UI Location ~~~~~~~~~~~ **Ticket Form** (Helpdesk > Tickets): -- Registrant, household, and area fields appear after ``partner_id`` -- Warning banner displays when ``is_repeat=True`` -- "Previous Tickets" button in header (visible when - ``repeat_count > 0``) -- "Previous Tickets" tab in notebook (visible when ``repeat_count > 0``) +- Registrant, household, and area fields appear after ``partner_id`` +- Warning banner displays when ``is_repeat=True`` +- "Previous Tickets" button in header (visible when + ``repeat_count > 0``) +- "Previous Tickets" tab in notebook (visible when + ``repeat_count > 0``) **Registrant Form**: -- Smart button: "GRM Tickets" displays ``grm_registrant_ticket_count`` - for individuals -- Smart button: "GRM Tickets" displays ``grm_household_ticket_count`` - for households -- "GRM Tickets" tab shows ticket list for both individuals and - households +- Smart button: "GRM Tickets" displays ``grm_registrant_ticket_count`` + for individuals +- Smart button: "GRM Tickets" displays ``grm_household_ticket_count`` + for households +- "GRM Tickets" tab shows ticket list for both individuals and + households **Search View**: -- Filters: "Repeat Tickets", "Has Registrant", "Has Household" -- Group By: Registrant, Household, Area, Repeat Status +- Filters: "Repeat Tickets", "Has Registrant", "Has Household" +- Group By: Registrant, Household, Area, Repeat Status Behavior ~~~~~~~~ @@ -93,13 +95,13 @@ Behavior **On household selection**: -- Filters registrant dropdown to show only members of that household +- Filters registrant dropdown to show only members of that household **Repeat detection** (computed on create/write): -- Counts tickets from same registrant created in last 6 months -- Sets ``is_repeat=True`` if count > 0 -- Populates ``previous_ticket_ids`` with matching tickets +- Counts tickets from same registrant created in last 6 months +- Sets ``is_repeat=True`` if count > 0 +- Populates ``previous_ticket_ids`` with matching tickets Security ~~~~~~~~ diff --git a/spp_grm_registry/static/description/index.html b/spp_grm_registry/static/description/index.html index 95330be7..e1cdb043 100644 --- a/spp_grm_registry/static/description/index.html +++ b/spp_grm_registry/static/description/index.html @@ -380,11 +380,12 @@

              Key Capabilities

            • Link tickets to individual registrants (registrant_id) and households (household_id)
            • Auto-populate ticket fields: when registrant is selected, fills -partner_id, area_id, and household_id from registrant data
            • +partner_id, area_id, and household_id from registrant +data
            • Detect repeat tickets: compute is_repeat and repeat_count for tickets filed by the same registrant in last 6 months
            • -
            • Display warning banner and previous tickets button on ticket form when -is_repeat=True
            • +
            • Display warning banner and previous tickets button on ticket form +when is_repeat=True
            • Track ticket counts on registrant profiles with smart buttons (total and open counts)
            • Filter tickets by registrant, household, area, or repeat status
            • @@ -422,7 +423,8 @@

              UI Location

            • Warning banner displays when is_repeat=True
            • “Previous Tickets” button in header (visible when repeat_count > 0)
            • -
            • “Previous Tickets” tab in notebook (visible when repeat_count > 0)
            • +
            • “Previous Tickets” tab in notebook (visible when +repeat_count > 0)
            • Registrant Form:

                diff --git a/spp_hazard/README.rst b/spp_hazard/README.rst index 5f12ee79..0bad637a 100644 --- a/spp_hazard/README.rst +++ b/spp_hazard/README.rst @@ -30,44 +30,45 @@ targeted emergency response and humanitarian assistance. Key Capabilities ~~~~~~~~~~~~~~~~ -- Define hazard categories in a tree structure (e.g., Natural > Storm > - Typhoon) -- Record incidents with start/end dates, severity levels, and lifecycle - status (alert, active, recovery, closed) -- Link incidents to geographic areas with area-specific severity - overrides -- Track registrant-level impacts by type (physical, economic, health, - social) and damage level -- Verify impact records with workflow states (reported, verified, - disputed, closed) -- Bulk-create impact records for all registrants in an affected area via - ``bulk_create_impacts()`` -- Identify potentially affected registrants based on geographic location +- Define hazard categories in a tree structure (e.g., Natural > Storm > + Typhoon) +- Record incidents with start/end dates, severity levels, and lifecycle + status (alert, active, recovery, closed) +- Link incidents to geographic areas with area-specific severity + overrides +- Track registrant-level impacts by type (physical, economic, health, + social) and damage level +- Verify impact records with workflow states (reported, verified, + disputed, closed) +- Bulk-create impact records for all registrants in an affected area + via ``bulk_create_impacts()`` +- Identify potentially affected registrants based on geographic + location Key Models ~~~~~~~~~~ -+------------------------------+---------------------------------------+ -| Model | Description | -+==============================+=======================================+ -| ``spp.hazard.category`` | Hierarchical classification of hazard | -| | types | -+------------------------------+---------------------------------------+ -| ``spp.hazard.incident`` | Specific disaster event with dates, | -| | severity, and affected areas | -+------------------------------+---------------------------------------+ -| ``spp.hazard.incident.area`` | Links incident to area with | -| | area-specific details | -+------------------------------+---------------------------------------+ -| ``spp.hazard.impact`` | Records impact on a registrant (type, | -| | damage level, verification) | -+------------------------------+---------------------------------------+ -| ``spp.hazard.impact.type`` | Classification of impact types by | -| | category | -+------------------------------+---------------------------------------+ -| ``res.partner`` (extended) | Adds hazard impact tracking fields to | -| | registrants | -+------------------------------+---------------------------------------+ ++------------------------------+--------------------------------------+ +| Model | Description | ++==============================+======================================+ +| ``spp.hazard.category`` | Hierarchical classification of | +| | hazard types | ++------------------------------+--------------------------------------+ +| ``spp.hazard.incident`` | Specific disaster event with dates, | +| | severity, and affected areas | ++------------------------------+--------------------------------------+ +| ``spp.hazard.incident.area`` | Links incident to area with | +| | area-specific details | ++------------------------------+--------------------------------------+ +| ``spp.hazard.impact`` | Records impact on a registrant | +| | (type, damage level, verification) | ++------------------------------+--------------------------------------+ +| ``spp.hazard.impact.type`` | Classification of impact types by | +| | category | ++------------------------------+--------------------------------------+ +| ``res.partner`` (extended) | Adds hazard impact tracking fields | +| | to registrants | ++------------------------------+--------------------------------------+ Configuration ~~~~~~~~~~~~~ @@ -85,42 +86,42 @@ After installing: UI Location ~~~~~~~~~~~ -- **Menu**: Hazard & Emergency (top-level application menu) -- **Incidents**: Hazard & Emergency > Incidents > All Incidents -- **Impacts**: Hazard & Emergency > Incidents > Impact Records -- **Configuration**: Hazard & Emergency > Configuration (accessible to - managers only) -- **Registrant Form**: Stat button shows impact count; "Emergency - Response" tab displays impact records list +- **Menu**: Hazard & Emergency (top-level application menu) +- **Incidents**: Hazard & Emergency > Incidents > All Incidents +- **Impacts**: Hazard & Emergency > Incidents > Impact Records +- **Configuration**: Hazard & Emergency > Configuration (accessible to + managers only) +- **Registrant Form**: Stat button shows impact count; "Emergency + Response" tab displays impact records list Security ~~~~~~~~ -+----------------------------------+-----------------------------------+ -| Group | Access | -+==================================+===================================+ -| ``group_hazard_viewer`` | Read-only access to all hazard | -| | records | -+----------------------------------+-----------------------------------+ -| ``group_hazard_officer`` | Create and manage incidents and | -| | impacts (no delete) | -+----------------------------------+-----------------------------------+ -| ``group_hazard_manager`` | Full CRUD access including | -| | configuration | -+----------------------------------+-----------------------------------+ -| ``spp_security.group_spp_admin`` | Inherits manager access | -+----------------------------------+-----------------------------------+ ++----------------------------------+----------------------------------+ +| Group | Access | ++==================================+==================================+ +| ``group_hazard_viewer`` | Read-only access to all hazard | +| | records | ++----------------------------------+----------------------------------+ +| ``group_hazard_officer`` | Create and manage incidents and | +| | impacts (no delete) | ++----------------------------------+----------------------------------+ +| ``group_hazard_manager`` | Full CRUD access including | +| | configuration | ++----------------------------------+----------------------------------+ +| ``spp_security.group_spp_admin`` | Inherits manager access | ++----------------------------------+----------------------------------+ Extension Points ~~~~~~~~~~~~~~~~ -- Inherit ``spp.hazard.incident`` and override - ``identify_potentially_affected_registrants()`` to customize targeting - logic -- Inherit ``spp.hazard.impact`` to add domain-specific impact fields - (e.g., crop damage for farmer registries) -- Override ``bulk_create_impacts()`` to customize mass impact record - creation +- Inherit ``spp.hazard.incident`` and override + ``identify_potentially_affected_registrants()`` to customize + targeting logic +- Inherit ``spp.hazard.impact`` to add domain-specific impact fields + (e.g., crop damage for farmer registries) +- Override ``bulk_create_impacts()`` to customize mass impact record + creation Dependencies ~~~~~~~~~~~~ diff --git a/spp_hazard/static/description/index.html b/spp_hazard/static/description/index.html index c4bd810a..51345d0e 100644 --- a/spp_hazard/static/description/index.html +++ b/spp_hazard/static/description/index.html @@ -387,17 +387,18 @@

                Key Capabilities

                social) and damage level
              • Verify impact records with workflow states (reported, verified, disputed, closed)
              • -
              • Bulk-create impact records for all registrants in an affected area via -bulk_create_impacts()
              • -
              • Identify potentially affected registrants based on geographic location
              • +
              • Bulk-create impact records for all registrants in an affected area +via bulk_create_impacts()
              • +
              • Identify potentially affected registrants based on geographic +location

              Key Models

              Model
              spp.grm.routing.ruleRouting rule with CEL condition that -assigns tickets to teams/users +Routing rule with CEL condition +that assigns tickets to teams/users (first match wins)
              spp.grm.escalation.rule
              --++ @@ -406,8 +407,8 @@

              Key Models

              - + - + - +
              Model
              spp.hazard.categoryHierarchical classification of hazard -typesHierarchical classification of +hazard types
              spp.hazard.incident Specific disaster event with dates, @@ -418,16 +419,16 @@

              Key Models

              area-specific details
              spp.hazard.impactRecords impact on a registrant (type, -damage level, verification)Records impact on a registrant +(type, damage level, verification)
              spp.hazard.impact.type Classification of impact types by category
              res.partner (extended)Adds hazard impact tracking fields to -registrantsAdds hazard impact tracking fields +to registrants
              @@ -461,8 +462,8 @@

              UI Location

              Security

              --++ @@ -492,8 +493,8 @@

              Security

              Extension Points

              • Inherit spp.hazard.incident and override -identify_potentially_affected_registrants() to customize targeting -logic
              • +identify_potentially_affected_registrants() to customize +targeting logic
              • Inherit spp.hazard.impact to add domain-specific impact fields (e.g., crop damage for farmer registries)
              • Override bulk_create_impacts() to customize mass impact record diff --git a/spp_hazard_programs/README.rst b/spp_hazard_programs/README.rst index 51f5425f..f58ebd93 100644 --- a/spp_hazard_programs/README.rst +++ b/spp_hazard_programs/README.rst @@ -1,12 +1,8 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - =================================== OpenSPP Hazard Programs Integration =================================== -.. +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! @@ -135,4 +131,4 @@ Current maintainers: This module is part of the `OpenSPP/OpenSPP2 `_ project on GitHub. -You are welcome to contribute. +You are welcome to contribute. \ No newline at end of file diff --git a/spp_hazard_programs/static/description/index.html b/spp_hazard_programs/static/description/index.html index 732c50ae..312008dd 100644 --- a/spp_hazard_programs/static/description/index.html +++ b/spp_hazard_programs/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +OpenSPP Hazard Programs Integration -
                +
                +

                OpenSPP Hazard Programs Integration

                - - -Odoo Community Association - -
                -

                OpenSPP Hazard Programs Integration

              Group