Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions spp_mis_demo_v2/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"name": "OpenSPP MIS Demo V2",
"summary": "Demo Generator V2 for SP-MIS programs with fixed stories and volume generation",
"category": "OpenSPP",
"version": "19.0.2.0.1",
"version": "19.0.2.1.0",
"sequence": 1,
"author": "OpenSPP.org",
"website": "https://github.com/OpenSPP/OpenSPP2",
Expand Down Expand Up @@ -34,7 +34,7 @@
"spp_banking",
# Demo-specific extensions
],
"external_dependencies": {"python": ["requests"]},
"external_dependencies": {"python": ["requests", "faker"]},
"post_init_hook": "post_init_hook",
"data": [
"security/ir.model.access.csv",
Expand Down
4 changes: 2 additions & 2 deletions spp_mis_demo_v2/data/demo_api_client.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,13 @@
>Read access to GIS layers, reports catalog, and spatial statistics queries.</field>
</record>

<!-- GIS All Scope - Full GIS access including geofences -->
<!-- GIS All Scope - Full GIS access including geofences and incidents -->
<record id="demo_api_client_qgis_scope_gis_all" model="spp.api.client.scope">
<field name="client_id" ref="demo_api_client_qgis" />
<field name="resource">gis</field>
<field name="action">all</field>
<field
name="description"
>Full GIS access including creating and managing geofences.</field>
>Full GIS access including creating and managing geofences and incidents.</field>
</record>
</odoo>
22 changes: 16 additions & 6 deletions spp_mis_demo_v2/data/demo_gis_reports.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,18 @@
>[('is_registrant', '=', True), ('is_group', '=', True)]</field>
<field name="aggregation_method">count</field>
<field name="base_area_level">2</field>
<field name="normalization_method">raw</field>
<field name="normalization_method">per_population</field>
<field name="enable_rollup">True</field>
<field name="rollup_method">sum</field>
<field name="rollup_weight_source">count</field>
<field name="color_scheme_id" ref="spp_gis.scheme_viridis" />
<field name="threshold_mode">auto_quartile</field>
<field name="bucket_count">5</field>
<field name="disaggregate_by_gender">True</field>
<field
name="dimension_ids"
eval="[Command.link(ref('spp_metric_service.dimension_gender'))]"
/>
<field name="member_expansion">expand</field>
<field name="refresh_mode">scheduled</field>
<field name="refresh_interval">daily</field>
</record>
Expand All @@ -58,9 +62,13 @@
<field name="rollup_method">weighted_avg</field>
<field name="rollup_weight_source">area_sqkm</field>
<field name="color_scheme_id" ref="spp_gis.scheme_blues" />
<field name="threshold_mode">auto_jenks</field>
<field name="threshold_mode">auto_quartile</field>
<field name="bucket_count">5</field>
<field name="disaggregate_by_gender">True</field>
<field
name="dimension_ids"
eval="[Command.link(ref('spp_metric_service.dimension_gender'))]"
/>
<field name="member_expansion">expand</field>
<field name="refresh_mode">scheduled</field>
<field name="refresh_interval">daily</field>
</record>
Expand Down Expand Up @@ -89,8 +97,10 @@
<field name="color_scheme_id" ref="spp_gis.scheme_viridis" />
<field name="threshold_mode">auto_quartile</field>
<field name="bucket_count">4</field>
<field name="disaggregate_by_age">True</field>
<field name="disaggregate_by_gender">True</field>
<field
name="dimension_ids"
eval="[Command.link(ref('spp_metric_service.dimension_age_group')), Command.link(ref('spp_metric_service.dimension_gender'))]"
/>
<field name="refresh_mode">scheduled</field>
<field name="refresh_interval">weekly</field>
</record>
Expand Down
150 changes: 10 additions & 140 deletions spp_mis_demo_v2/data/demo_statistics.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,83 +29,21 @@
<field name="sequence">10</field>
</record>

<!-- Children Under 5: use spp_studio.var_children_under_5 (same cel_accessor + applies_to) -->

<!-- Children Under 18 -->
<record id="cel_var_children_under_18" model="spp.cel.variable">
<field name="name">demo_children_under_18</field>
<field name="cel_accessor">children_under_18</field>
<field name="source_type">aggregate</field>
<field name="aggregate_type">count</field>
<field name="aggregate_target">members</field>
<field name="aggregate_filter">age_years(m.birthdate) &lt; 18</field>
<field name="value_type">number</field>
<field name="applies_to">group</field>
<field name="category_id" ref="spp_studio.variable_category_demographics" />
<field name="state">active</field>
<field name="sequence">30</field>
</record>

<!-- Elderly 60+ -->
<record id="cel_var_elderly_60_plus" model="spp.cel.variable">
<field name="name">demo_elderly_60_plus</field>
<field name="cel_accessor">elderly_60_plus</field>
<field name="source_type">aggregate</field>
<field name="aggregate_type">count</field>
<field name="aggregate_target">members</field>
<field name="aggregate_filter">age_years(m.birthdate) >= 60</field>
<field name="value_type">number</field>
<field name="applies_to">group</field>
<field name="category_id" ref="spp_studio.variable_category_demographics" />
<field name="state">active</field>
<field name="sequence">40</field>
</record>

<!-- Disabled Members -->
<!-- Members with Disability (uses disability_id from spp_registry) -->
<record id="cel_var_disabled_members" model="spp.cel.variable">
<field name="name">demo_disabled_members</field>
<field name="cel_accessor">disabled_members</field>
<field name="name">demo_pwd_members</field>
<field name="cel_accessor">pwd_members</field>
<field name="source_type">aggregate</field>
<field name="aggregate_type">count</field>
<field name="aggregate_target">members</field>
<field name="aggregate_filter">m.disabled != null</field>
<field name="aggregate_filter">m.disability_id != null</field>
<field name="value_type">number</field>
<field name="applies_to">group</field>
<field name="category_id" ref="spp_studio.variable_category_characteristics" />
<field name="state">active</field>
<field name="sequence">50</field>
</record>

<!-- Female Members -->
<record id="cel_var_female_members" model="spp.cel.variable">
<field name="name">demo_female_members</field>
<field name="cel_accessor">female_members</field>
<field name="source_type">aggregate</field>
<field name="aggregate_type">count</field>
<field name="aggregate_target">members</field>
<field name="aggregate_filter">is_female(m.gender_id)</field>
<field name="value_type">number</field>
<field name="applies_to">group</field>
<field name="category_id" ref="spp_studio.variable_category_demographics" />
<field name="state">active</field>
<field name="sequence">45</field>
</record>

<!-- Male Members -->
<record id="cel_var_male_members" model="spp.cel.variable">
<field name="name">demo_male_members</field>
<field name="cel_accessor">male_members</field>
<field name="source_type">aggregate</field>
<field name="aggregate_type">count</field>
<field name="aggregate_target">members</field>
<field name="aggregate_filter">is_male(m.gender_id)</field>
<field name="value_type">number</field>
<field name="applies_to">group</field>
<field name="category_id" ref="spp_studio.variable_category_demographics" />
<field name="state">active</field>
<field name="sequence">46</field>
</record>

<!-- Total Households (computed - returns true for counting) -->
<record id="cel_var_total_households" model="spp.cel.variable">
<field name="name">demo_total_households</field>
Expand Down Expand Up @@ -165,81 +103,13 @@
<field name="is_published_dashboard" eval="True" />
</record>

<!-- Children Under 5 -->
<record id="stat_children_under_5" model="spp.indicator">
<field name="name">children_under_5</field>
<field name="label">Children Under 5</field>
<field name="description">Count of children under 5 years old</field>
<field name="variable_id" ref="spp_studio.var_children_under_5" />
<field name="format">count</field>
<field name="unit">children</field>
<field name="category_id" ref="spp_indicator.category_demographics" />
<field name="sequence">20</field>
<field name="is_published_gis" eval="True" />
<field name="is_published_dashboard" eval="True" />
</record>

<!-- Children Under 18 -->
<record id="stat_children_under_18" model="spp.indicator">
<field name="name">children_under_18</field>
<field name="label">Children Under 18</field>
<field name="description">Count of children under 18 years old</field>
<field name="variable_id" ref="cel_var_children_under_18" />
<field name="format">count</field>
<field name="unit">children</field>
<field name="category_id" ref="spp_indicator.category_demographics" />
<field name="sequence">30</field>
<field name="is_published_gis" eval="True" />
<field name="is_published_dashboard" eval="True" />
</record>

<!-- Elderly 60+ -->
<record id="stat_elderly_60_plus" model="spp.indicator">
<field name="name">elderly_60_plus</field>
<field name="label">Elderly (60+)</field>
<field name="description">Count of elderly persons aged 60 and above</field>
<field name="variable_id" ref="cel_var_elderly_60_plus" />
<field name="format">count</field>
<field name="unit">people</field>
<field name="category_id" ref="spp_indicator.category_demographics" />
<field name="sequence">40</field>
<field name="is_published_gis" eval="True" />
<field name="is_published_dashboard" eval="True" />
</record>

<!-- Female Members -->
<record id="stat_female_members" model="spp.indicator">
<field name="name">female_members</field>
<field name="label">Female Members</field>
<field name="description">Count of female household members</field>
<field name="variable_id" ref="cel_var_female_members" />
<field name="format">count</field>
<field name="unit">people</field>
<field name="category_id" ref="spp_indicator.category_demographics" />
<field name="sequence">45</field>
<field name="is_published_gis" eval="True" />
<field name="is_published_dashboard" eval="True" />
</record>

<!-- Male Members -->
<record id="stat_male_members" model="spp.indicator">
<field name="name">male_members</field>
<field name="label">Male Members</field>
<field name="description">Count of male household members</field>
<field name="variable_id" ref="cel_var_male_members" />
<field name="format">count</field>
<field name="unit">people</field>
<field name="category_id" ref="spp_indicator.category_demographics" />
<field name="sequence">46</field>
<field name="is_published_gis" eval="True" />
<field name="is_published_dashboard" eval="True" />
</record>

<!-- Disabled Members -->
<!-- Members with Disability -->
<record id="stat_disabled_members" model="spp.indicator">
<field name="name">disabled_members</field>
<field name="label">Disabled Members</field>
<field name="description">Count of household members with disabilities</field>
<field name="name">pwd_members</field>
<field name="label">Members with Disability</field>
<field
name="description"
>Count of household members with a recorded disability</field>
<field name="variable_id" ref="cel_var_disabled_members" />
<field name="format">count</field>
<field name="unit">people</field>
Expand Down
90 changes: 90 additions & 0 deletions spp_mis_demo_v2/models/indicator_providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@

_logger = logging.getLogger(__name__)

DEBUG_HH_POINTS_LAYER_NAME = "HH Points (Debug)"
DEBUG_HH_POINTS_LAYER_DOMAIN = (
"[('is_registrant', '=', True), ('is_group', '=', True), ('coordinates', '!=', False), ('active', '=', True)]"
)

# Standard variables from spp_studio to activate (module.xml_id format)
STANDARD_VARIABLES = [
# Demographics (computed)
Expand Down Expand Up @@ -128,6 +133,89 @@ def _activate_variables(env, xml_ids, source_name):
return activated, skipped, errors


def _find_debug_layer_view(env):
"""Find the most useful GIS view for debug household points."""
view_model = env["ir.ui.view"]

# Prefer geofence map when available (best fit for geofence query debugging)
geofence_view = view_model.search(
[
("model", "=", "spp.gis.geofence"),
("type", "=", "gis"),
],
limit=1,
)
if geofence_view:
return geofence_view

# Fallback to the standard area map
return view_model.search(
[
("model", "=", "spp.area"),
("type", "=", "gis"),
],
limit=1,
)


def _ensure_household_points_debug_layer(env):
"""Create/update the HH points debug GIS layer (hidden on startup)."""
coordinates_field = env["ir.model.fields"].search(
[
("model", "=", "res.partner"),
("name", "=", "coordinates"),
],
limit=1,
)
if not coordinates_field:
_logger.info("[spp.mis.demo] Skipping HH debug layer: res.partner.coordinates not available")
return False

view = _find_debug_layer_view(env)
if not view:
_logger.info("[spp.mis.demo] Skipping HH debug layer: no GIS view found for geofence/area")
return False

layer_model = env["spp.gis.data.layer"]
layer = layer_model.search(
[
("name", "=", DEBUG_HH_POINTS_LAYER_NAME),
("geo_field_id", "=", coordinates_field.id),
("view_id", "=", view.id),
],
limit=1,
)

vals = {
"name": DEBUG_HH_POINTS_LAYER_NAME,
"geo_field_id": coordinates_field.id,
"view_id": view.id,
"geo_repr": "basic",
"active_on_startup": False,
"layer_opacity": 0.9,
"begin_color": "#0057B8",
"sequence": 25,
"domain": DEBUG_HH_POINTS_LAYER_DOMAIN,
}

if layer:
layer.write(vals)
_logger.info(
"[spp.mis.demo] Updated HH debug layer '%s' on view %s",
layer.name,
view.display_name,
)
return layer

layer = layer_model.create(vals)
_logger.info(
"[spp.mis.demo] Created HH debug layer '%s' on view %s",
layer.name,
view.display_name,
)
return layer


def post_init_hook(env_or_cr, registry=None):
"""Post-initialization hook for demo module.

Expand Down Expand Up @@ -162,3 +250,5 @@ def post_init_hook(env_or_cr, registry=None):
total_skipped,
total_errors,
)

_ensure_household_points_debug_layer(env)
Loading