Skip to content

Commit cd0fede

Browse files
committed
feat(spp_mis_demo_v2): prevent duplicate demo data loading
Add mis_demo_loaded boolean on res.company, set on successful generation. Wizard shows warning and hides Load button if already triggered. Also show GRM tickets / Case records bullets conditionally based on whether spp_grm_demo / spp_case_demo are installed.
1 parent c3c0549 commit cd0fede

4 files changed

Lines changed: 106 additions & 17 deletions

File tree

spp_mis_demo_v2/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
from . import household_blueprints
66
from . import indicator_providers
77
from . import mis_demo_generator
8+
from . import res_company
89
from . import seeded_volume_generator

spp_mis_demo_v2/models/mis_demo_generator.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,9 @@ def action_generate(self):
526526

527527
self.state = "completed"
528528

529+
# Mark company as having loaded MIS demo data
530+
self.env.company.mis_demo_loaded = True
531+
529532
# Return success notification with detailed summary
530533
return self._show_success_notification(stats)
531534

@@ -3442,6 +3445,32 @@ class SPPMISDemoWizard(models.TransientModel):
34423445
_description = "MIS Demo Data Wizard"
34433446
_inherit = "spp.mis.demo.generator"
34443447

3448+
mis_demo_loaded = fields.Boolean(
3449+
related="company_id.mis_demo_loaded",
3450+
string="Demo Already Loaded",
3451+
)
3452+
company_id = fields.Many2one(
3453+
"res.company",
3454+
default=lambda self: self.env.company,
3455+
)
3456+
has_grm_demo = fields.Boolean(compute="_compute_has_optional_demos")
3457+
has_case_demo = fields.Boolean(compute="_compute_has_optional_demos")
3458+
3459+
def _compute_has_optional_demos(self):
3460+
installed_names = set(
3461+
self.env["ir.module.module"]
3462+
.search(
3463+
[
3464+
("name", "in", ["spp_grm_demo", "spp_case_demo"]),
3465+
("state", "=", "installed"),
3466+
]
3467+
)
3468+
.mapped("name")
3469+
)
3470+
for rec in self:
3471+
rec.has_grm_demo = "spp_grm_demo" in installed_names
3472+
rec.has_case_demo = "spp_case_demo" in installed_names
3473+
34453474
def action_generate_demo_data(self):
34463475
"""Action to generate demo data from wizard."""
34473476
return self.action_generate()
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Part of OpenSPP. See LICENSE file for full copyright and licensing details.
2+
3+
from odoo import fields, models
4+
5+
6+
class ResCompany(models.Model):
7+
_inherit = "res.company"
8+
9+
mis_demo_loaded = fields.Boolean(
10+
string="MIS Demo Data Loaded",
11+
default=False,
12+
help="Indicates that MIS demo data has already been generated for this company.",
13+
)

spp_mis_demo_v2/views/mis_demo_wizard_view.xml

Lines changed: 63 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8" ?>
22
<odoo>
33
<!-- Wizard Form View -->
44
<record id="view_mis_demo_wizard_form" model="ir.ui.view">
@@ -7,28 +7,72 @@
77
<field name="arch" type="xml">
88
<form string="Load MIS Demo Data">
99
<sheet>
10-
<group>
10+
<field name="mis_demo_loaded" invisible="1" />
11+
<field name="has_grm_demo" invisible="1" />
12+
<field name="has_case_demo" invisible="1" />
13+
<div
14+
class="alert alert-warning"
15+
role="alert"
16+
invisible="not mis_demo_loaded"
17+
>
18+
<p class="mb-0">
19+
<strong
20+
>MIS Demo Data has already been loaded for this company.</strong>
21+
Loading it again may create duplicate records.
22+
</p>
23+
</div>
24+
<group invisible="mis_demo_loaded">
1125
<field name="country_id" widget="radio" />
1226
</group>
13-
<div class="alert alert-info" role="alert">
14-
<p><strong>This will load comprehensive MIS demo data:</strong></p>
27+
<div
28+
class="alert alert-info"
29+
role="alert"
30+
invisible="mis_demo_loaded"
31+
>
32+
<p>
33+
<strong>This will load comprehensive MIS demo data:</strong>
34+
</p>
1535
<ul>
16-
<li>6 social protection programs (Child Grant, Pension, Emergency Relief, Cash Transfer, Disability Support, Food Assistance)</li>
17-
<li>8 demo personas with full stories and payment history</li>
18-
<li>~730 deterministic households with ~2,500 members (country-aware names)</li>
36+
<li
37+
>6 social protection programs (Child Grant, Pension, Emergency Relief, Cash Transfer, Disability Support, Food Assistance)</li>
38+
<li
39+
>8 demo personas with full stories and payment history</li>
40+
<li
41+
>~730 deterministic households with ~2,500 members (country-aware names)</li>
1942
<li>Program enrollments based on household eligibility</li>
2043
<li>Program cycles with entitlements</li>
2144
<li>Logic Packs for eligibility rules</li>
2245
<li>Change requests at various workflow stages</li>
23-
<li>GRM tickets and case records</li>
46+
<li invisible="not has_grm_demo">GRM tickets</li>
47+
<li invisible="not has_case_demo">Case records</li>
2448
<li>Fairness analysis data</li>
2549
</ul>
26-
<p class="mb-0"><em>Names are locale-aware and 100% reproducible per country selection.</em></p>
50+
<p class="mb-0">
51+
<em
52+
>Names are locale-aware and 100% reproducible per country selection.</em>
53+
</p>
2754
</div>
2855
</sheet>
2956
<footer>
30-
<button name="action_generate_demo_data" string="Load Demo Data" type="object" class="btn-primary"/>
31-
<button string="Cancel" class="btn-secondary" special="cancel"/>
57+
<button
58+
name="action_generate_demo_data"
59+
string="Load Demo Data"
60+
type="object"
61+
class="btn-primary"
62+
invisible="mis_demo_loaded"
63+
/>
64+
<button
65+
string="Cancel"
66+
class="btn-secondary"
67+
special="cancel"
68+
invisible="mis_demo_loaded"
69+
/>
70+
<button
71+
string="Close"
72+
class="btn-primary"
73+
special="cancel"
74+
invisible="not mis_demo_loaded"
75+
/>
3276
</footer>
3377
</form>
3478
</field>
@@ -40,15 +84,17 @@
4084
<field name="res_model">spp.mis.demo.wizard</field>
4185
<field name="view_mode">form</field>
4286
<field name="target">new</field>
43-
<field name="view_id" ref="view_mis_demo_wizard_form"/>
87+
<field name="view_id" ref="view_mis_demo_wizard_form" />
4488
</record>
4589

4690
<!-- Parent menu for Demo Data (under Settings) -->
47-
<menuitem id="menu_demo_data_root"
48-
name="Demo Data"
49-
parent="base.menu_administration"
50-
sequence="100"
51-
groups="base.group_system"/>
91+
<menuitem
92+
id="menu_demo_data_root"
93+
name="Demo Data"
94+
parent="base.menu_administration"
95+
sequence="100"
96+
groups="base.group_system"
97+
/>
5298

5399
<!-- Menu Item (under Settings > Demo Data) -->
54100
<menuitem

0 commit comments

Comments
 (0)