Skip to content

feat(registry): consolidate registry configuration into a Registry Settings section - #439

Closed
emjay0921 wants to merge 1 commit into
19.0from
feat/1172-unify-program-configuration
Closed

feat(registry): consolidate registry configuration into a Registry Settings section#439
emjay0921 wants to merge 1 commit into
19.0from
feat/1172-unify-program-configuration

Conversation

@emjay0921

Copy link
Copy Markdown
Contributor

Draft: QA is re-testing the branch now (OP#1009 moved back to In testing). It passed on 12 August against an 8 June 19.0; 19.0 has since moved 438 commits and has been merged in, so the earlier pass no longer certifies what is here. Marking ready once QA confirms.

Why is this change needed?

Registry configuration lived in two places (OP#1009):

  • the Configuration menu inside the Registry app
  • Farmer Registry Settings / SP-MIS Settings in the Settings app, each carrying its own copy of the same toggle

The ticket asks for one Registry Settings section in Settings, equivalent to Programs Settings, with the registry configuration moved there — including superuser configuration such as API V2, which sat under Registry → Configuration.

How was the change implemented?

  • New Registry Settings section in spp_registry, mirroring Programs Settings, carrying Restrict Registry Edits to Admin Only.
  • One toggle, both legacy keys. get_values/set_values keep spp_farmer_registry.registry_admin_only_crud and spp_starter.registry_admin_only_crud in sync, so the Farmer Registry and SP-MIS controllers keep reading their own parameter unchanged — no migration and no change to how the restriction is enforced. The now-duplicate Farmer Registry Settings and SP-MIS Settings sections and their field definitions are removed.
  • Superuser configuration relocated. Registry → Configuration, and the API V2 and Import Match menus hanging off it, move under a new Registry group in the Settings app (base.menu_administration). The API V2 security compliance manifest is updated to match.
  • Two personas granted the Settings app so they can reach the new location: spp_security.group_spp_admin and spp_registry.group_registry_config_admin. Additive via Command.link, so stock system / access-rights visibility is preserved and every section under Settings still enforces its own group gate.
  • The parent menu is declared in res_config_settings_views.xml, which the manifest loads before main_view.xml so the reference resolves.

New unit tests

spp_registry/tests/test_res_config_settings.py — the Registry Settings section reads and writes the toggle, and both legacy parameter keys stay in sync in each direction, which is the property that replaces a data migration.

Unit tests executed by the author

After merging 19.0 in, all five affected modules installed together against current 19.0spp_registry, spp_starter_sp_mis, spp_farmer_registry, spp_api_v2, spp_import_match: 1069 tests, 0 failed, 1 error.

That one error is pre-existing on 19.0 and unrelated to this branch: spp_registry/tests/test_phone_number.py::test_unparseable_phone_falls_back_to_original expects "abcxyz" to fall through to phone_sanitized, while spp_base_common/models/phone_number.py:41 raises Phone number must not contain letters. from its create() override. Both files are unchanged here and untouched by this branch. It stays hidden in CI because spp_registry does not depend on spp_base_common, so the per-module matrix never installs them together; it surfaces only in a combined install like the one above. Raising it separately.

How to test manually

  1. Settings → a Registry Settings section appears, in the same style as Programs Settings, containing Restrict Registry Edits to Admin Only.
  2. The old Farmer Registry Settings / SP-MIS Settings sections are gone.
  3. Turn the toggle on: a non-admin registry user can still read registrants but cannot create, edit or delete. Turn it off: they can edit again.
  4. Settings → Technical → System Parameters, search registry_admin_only_crud — both keys follow the toggle in both directions.
  5. Registry → Configuration no longer holds API V2 or Import Match; both are under Settings → Registry and work as before.
  6. As OpenSPP Administrator and as Registry Configuration Admin: the Settings app is visible and Settings → Registry is reachable, with everything else under Settings still gated.

Related links

…p it per program

Every card on the Configuration tab was filled through an inline list with a
manager_ref_id Reference field. That control asks for a model and then a record
of it, and both halves offered other programs' managers — the Reference picker
directly, and on the Many2many cards the link dialog behind "Add a line". A
manager picked that way keeps running against the program it was created for,
so the second program's form showed configuration that was never going to
apply to it.

Adding now goes through one dialog for every card: which method, what to call
it, then the method's own form to configure it. The methods on offer come from
the wrapper's _selection_manager_ref_id(), so a module that registers one is
included without editing the wizard, and a category with none says so instead
of opening an empty list.

Eligibility, Entitlement, Cycle, Compliance, Payment and Notifications now
share one shape: a badge, an Add button, a row per method with its own cog, an
empty state, and an Edit button only when there is exactly one method — it used
to open the first of several silently. Notifications was the last section still
rendered as a bare group and is now a card like the rest. The rows deny both
'create' and 'link'; for a Many2many the renderer reads the second, which is
why create="0" alone never suppressed the row. 'unlink' is untouched, so the x
still removes a method.

Isolation no longer depends on the form: create and write refuse a manager
owned by another program, and duplicating a program copies its methods instead
of linking the original's. Only what a write adds is checked, so a database
that already holds a cross-program link stays editable and the link can be
removed.

Duplicate Detection is deliberately untouched here — its card is being
converted under OP#1171 on another branch. The isolation rules still cover it.
@emjay0921

Copy link
Copy Markdown
Contributor Author

Closing: opened from the wrong head branch by mistake — this carried the OP#1172 branch's commits under an OP#1009 title. Reopening against feat/1009-registry-settings. Nothing here was reviewed or merged.

@emjay0921 emjay0921 closed this Aug 18, 2026
@codecov

codecov Bot commented Aug 18, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.96875% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 73.20%. Comparing base (0820667) to head (468f888).

Files with missing lines Patch % Lines
spp_programs/wizard/manager_setup_wizard.py 90.76% 6 Missing ⚠️
spp_programs/models/program_manager_ui.py 85.00% 3 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             19.0     #439      +/-   ##
==========================================
+ Coverage   72.24%   73.20%   +0.95%     
==========================================
  Files         419      481      +62     
  Lines       29813    32339    +2526     
==========================================
+ Hits        21539    23673    +2134     
- Misses       8274     8666     +392     
Flag Coverage Δ
spp_api_v2_cycles 71.03% <ø> (ø)
spp_api_v2_entitlements 70.23% <ø> (ø)
spp_api_v2_programs 92.22% <ø> (ø)
spp_api_v2_simulation 71.19% <ø> (?)
spp_base_common 91.07% <ø> (ø)
spp_case_entitlements 100.00% <ø> (?)
spp_case_programs 100.00% <ø> (?)
spp_cr_type_assign_program 92.07% <ø> (ø)
spp_dci_compliance 93.01% <ø> (?)
spp_dci_demo 94.28% <ø> (ø)
spp_dci_server_social 89.57% <ø> (?)
spp_farmer_registry_demo 61.06% <ø> (ø)
spp_gis_report_programs 100.00% <ø> (?)
spp_grm_demo 80.13% <ø> (?)
spp_grm_programs 92.13% <ø> (?)
spp_hazard_programs 98.55% <ø> (?)
spp_programs 66.31% <92.96%> (+1.03%) ⬆️
spp_registry 87.22% <ø> (+0.07%) ⬆️
spp_security 69.56% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
spp_programs/models/constants.py 100.00% <100.00%> (ø)
spp_programs/models/programs.py 89.12% <100.00%> (+1.65%) ⬆️
spp_programs/wizard/__init__.py 100.00% <100.00%> (ø)
spp_programs/models/program_manager_ui.py 42.32% <85.00%> (+4.46%) ⬆️
spp_programs/wizard/manager_setup_wizard.py 90.76% <90.76%> (ø)

... and 65 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant