diff --git a/g2p_connect_demo/__manifest__.py b/g2p_connect_demo/__manifest__.py index bc1a54490..378223d0d 100644 --- a/g2p_connect_demo/__manifest__.py +++ b/g2p_connect_demo/__manifest__.py @@ -16,22 +16,15 @@ "g2p_registry_group", "g2p_registry_membership", "g2p_programs", - # "g2p_bank", "spp_custom_field", - # "spp_custom_fields_ui", "spp_entitlement_cash", - # "spp_dashboard", "spp_idpass", "spp_idqueue", "spp_area", - # "spp_change_request", "spp_event_data", "spp_service_points", "theme_openspp_muk", - # "spp_pos", - # "spp_sms", "queue_job", - # "spp_change_request_add_children_demo", "spp_custom_filter", "product", "stock", @@ -39,10 +32,8 @@ "external_dependencies": {"python": ["faker"]}, "data": [ "security/ir.model.access.csv", - # "data/users_data.xml", "data/sample_data.xml", "views/generate_data_view.xml", - # "views/generate_change_request_data_view.xml", "views/groups_view.xml", "views/individuals_view.xml", ], diff --git a/g2p_connect_demo/models/__init__.py b/g2p_connect_demo/models/__init__.py index acc4f9044..53ae26874 100644 --- a/g2p_connect_demo/models/__init__.py +++ b/g2p_connect_demo/models/__init__.py @@ -3,6 +3,5 @@ from . import registrant from . import generate_group -# from . import generate_change_request from . import individual from . import group diff --git a/g2p_connect_demo/models/generate_change_request.py b/g2p_connect_demo/models/generate_change_request.py index eb1ef1bdb..37e364946 100644 --- a/g2p_connect_demo/models/generate_change_request.py +++ b/g2p_connect_demo/models/generate_change_request.py @@ -72,6 +72,8 @@ def _generate_sample_data(self, **kwargs): res_id = kwargs.get("res_id") res = self.browse(res_id) + res_partner_model_obj = self.env["res.partner"] + registrants = kwargs.get("registrant_ids") membership_kinds = kwargs.get("membership_kinds") num_crs = min(res.num_crs, 1000) @@ -83,7 +85,7 @@ def _generate_sample_data(self, **kwargs): registrant_id = random.choice(registrants) # Get applicants based on registrant_id - registrant = self.env["res.partner"].search([("id", "=", registrant_id)])[0] + registrant = res_partner_model_obj.search([("id", "=", registrant_id)])[0] if registrant.lang: lang = registrant.lang else: @@ -95,7 +97,7 @@ def _generate_sample_data(self, **kwargs): applicant_id = random.choice(applicant_ids) # TODO: Fix error in phone number format - applicant = self.env["res.partner"].search([("id", "=", applicant_id)]) + applicant = res_partner_model_obj.search([("id", "=", applicant_id)]) if applicant.phone: applicant_phone = applicant.phone else: @@ -126,7 +128,6 @@ def _generate_sample_data(self, **kwargs): date_start = datetime.datetime.now() - relativedelta(years=100) date_end = datetime.datetime.now() birthdate = fake.date_between_dates(date_start=date_start, date_end=date_end).isoformat() - # phone = fake.phone_number() uid_number = str(random.randint(100000000000, 999999999999)) kind = random.choice(membership_kinds) applicant_relation = random.choice(["father", "mother", "grandfather"] * 50) diff --git a/g2p_connect_demo/models/generate_group.py b/g2p_connect_demo/models/generate_group.py index 85e9f780c..bae09009b 100644 --- a/g2p_connect_demo/models/generate_group.py +++ b/g2p_connect_demo/models/generate_group.py @@ -62,15 +62,16 @@ def _generate_sample_data(self, **kwargs): res = self.browse(res_id) fake = create_faker(res.locale) - # sex_choice_range = ["Female", "Male"] * 50 + ["Other"] - sex_choices = self.env["gender.type"].search([]).mapped("value") - sex_choice_range = sex_choices * 50 + res_partner_model_obj = self.env["res.partner"] + g2p_group_membership_model_obj = self.env["g2p.group.membership"] + + gender_choices = self.env["gender.type"].search([]).mapped("value") + gender_choice_range = gender_choices * 50 age_group_range = ["A", "C", "N"] * 2 + ["E"] group_size_range = list(range(1, 2)) * 2 + list(range(3, 5)) * 4 + list(range(6, 8)) group_membership_kind_head_id = self.env.ref("g2p_registry_membership.group_membership_kind_head").id group_kind_household_id = self.env.ref("g2p_registry_group.group_kind_household").id - # group_kind_family_id = self.env.ref("g2p_registry_group.group_kind_family").id num_groups = min(res.num_groups, 1000) @@ -98,7 +99,7 @@ def _generate_sample_data(self, **kwargs): head = res._generate_individual_data( fake, last_name, - sex_choice_range, + gender_choice_range, ["A", "E"], registration_date, bank_id, @@ -138,7 +139,7 @@ def _generate_sample_data(self, **kwargs): "bank_ids": bank_ids, } - create_group_id = self.env["res.partner"].create(group) + create_group_id = res_partner_model_obj.create(group) head["id"] = f"{group_id}-0" members = [head] @@ -147,7 +148,7 @@ def _generate_sample_data(self, **kwargs): data = res._generate_individual_data( fake, last_name, - sex_choice_range, + gender_choice_range, age_group_range, registration_date, bank_id, @@ -169,8 +170,8 @@ def _generate_sample_data(self, **kwargs): if is_head: member.pop("is_head", None) member.pop("is_principal_recipient", None) - create_member_id = self.env["res.partner"].create(member) - self.env["g2p.group.membership"].create( + create_member_id = res_partner_model_obj.create(member) + g2p_group_membership_model_obj.create( { "group": create_group_id.id, "individual": create_member_id.id, @@ -186,8 +187,8 @@ def _generate_sample_data(self, **kwargs): elif is_principal_recipient: member.pop("is_head", None) member.pop("is_principal_recipient", None) - create_member_id = self.env["res.partner"].create(member) - self.env["g2p.group.membership"].create( + create_member_id = res_partner_model_obj.create(member) + g2p_group_membership_model_obj.create( { "group": create_group_id.id, "individual": create_member_id.id, @@ -196,8 +197,8 @@ def _generate_sample_data(self, **kwargs): ) else: - create_member_id = self.env["res.partner"].create(member) - self.env["g2p.group.membership"].create( + create_member_id = res_partner_model_obj.create(member) + g2p_group_membership_model_obj.create( { "group": create_group_id.id, "individual": create_member_id.id, @@ -210,8 +211,6 @@ def _generate_sample_data(self, **kwargs): ) _logger.info(msg) return {"result": msg, "res_model": self._name, "res_ids": [res_id]} - # _logger.info("-" * 80) - # _logger.info(json.dumps({"group": group, "members": members}, indent=4)) def mark_as_done(self): self.update({"state": "generate"}) @@ -220,14 +219,14 @@ def _generate_individual_data( self, fake, last_name, - sex_choice_range, + gender_choice_range, age_group_range, registration_date, bank_id, ): - sex = random.choice(sex_choice_range) + gender = random.choice(gender_choice_range) age_group = random.choice(age_group_range) - first_name = fake.first_name_male() if sex == "Male" else fake.first_name_female() + first_name = fake.first_name_male() if gender == "Male" else fake.first_name_female() different_last_name = random.randint(0, 100) < 10 if age_group == "N": date_start = datetime.datetime.now() - relativedelta(years=1) @@ -269,10 +268,11 @@ def _generate_individual_data( registration_date = fake.date_between_dates(date_start=dob, date_end=datetime.datetime.now()).isoformat() dob = dob.isoformat() - fullname = f"{first_name} {last_name}" + full_name = f"{first_name} {last_name}" bank_ids = [] phone = "" - # Do not give bank account to kids + + # Do not assign bank accounts to children if age_group != "C": val = { "bank_id": bank_id.id, @@ -280,11 +280,12 @@ def _generate_individual_data( } bank_ids.append([0, 0, val]) phone = fake.phone_number() + data = { - "name": fullname, + "name": full_name, "given_name": first_name, "family_name": last_name, - "gender": sex, + "gender": gender, "birthdate": dob, "is_registrant": True, "is_group": False, diff --git a/spp_api/controllers/main.py b/spp_api/controllers/main.py index c90412373..5460f8b86 100644 --- a/spp_api/controllers/main.py +++ b/spp_api/controllers/main.py @@ -28,10 +28,6 @@ class OAS(http.Controller): ) def index(self, **params): primary_name = params.get("urls.primaryName") - # swagger_settings = { - # "urls": self._get_api_urls(), - # "urls.primaryName": primary_name, - # } values = { "urls": json.dumps(self._get_api_urls()), @@ -56,20 +52,6 @@ def _get_api_urls(self): } ) - # services_registry = _rest_services_databases.get(request.env.cr.dbname, {}) - # api_urls = [] - # for rest_root_path, spec in list(services_registry.items()): - # collection_path = rest_root_path[1:-1] # remove '/' - # collection_name = spec["collection_name"] - # for service in self._get_service_in_collection(collection_name): - # api_urls.append( - # { - # "name": "{}: {}".format(collection_path, service._usage), - # "url": "/api-docs/%s/%s.json" - # % (collection_path, service._usage), - # } - # ) - # api_urls = sorted(api_urls, key=lambda k: k["name"]) return api_urls @http.route( diff --git a/spp_api/controllers/pinguin.py b/spp_api/controllers/pinguin.py index 2140b06e4..602f75a78 100644 --- a/spp_api/controllers/pinguin.py +++ b/spp_api/controllers/pinguin.py @@ -373,29 +373,28 @@ def _create_log_record( :returns: New 'openapi.log' record. :rtype: ..models.openapi_log.Log """ - if True: # just to keep original indent - log_data = { - "namespace_id": namespace_id, - "request": "%s | %s | %d" % (user_request.url, user_request.method, user_response.status_code), - "request_data": None, - "response_data": None, - } - if namespace_log_request == "debug": - log_data["request_data"] = user_request.__dict__ - elif namespace_log_request == "info": - log_data["request_data"] = user_request.__dict__ - for k in ["form", "files"]: - try: - del log_data["request_data"][k] - except KeyError: - _logger.debug("Key %s not found in request_data" % k) + log_data = { + "namespace_id": namespace_id, + "request": "%s | %s | %d" % (user_request.url, user_request.method, user_response.status_code), + "request_data": None, + "response_data": None, + } + if namespace_log_request == "debug": + log_data["request_data"] = user_request.__dict__ + elif namespace_log_request == "info": + log_data["request_data"] = user_request.__dict__ + for k in ["form", "files"]: + try: + del log_data["request_data"][k] + except KeyError: + _logger.debug("Key %s not found in request_data" % k) - if namespace_log_response == "debug": - log_data["response_data"] = user_response.__dict__ - elif namespace_log_response == "error" and user_response.status_code > 400: - log_data["response_data"] = user_response.__dict__ + if namespace_log_response == "debug": + log_data["response_data"] = user_response.__dict__ + elif namespace_log_response == "error" and user_response.status_code > 400: + log_data["response_data"] = user_response.__dict__ - return env["spp_api.log"].create(log_data) + return env["spp_api.log"].create(log_data) # Patched http route diff --git a/spp_api/tests/__init__.py b/spp_api/tests/__init__.py index 8fca755a9..24329ecbd 100644 --- a/spp_api/tests/__init__.py +++ b/spp_api/tests/__init__.py @@ -7,3 +7,4 @@ from . import test_res_users from . import test_ir_model_fields from . import test_apijsonrequest +from . import test_main_controller diff --git a/spp_api/tests/test_main_controller.py b/spp_api/tests/test_main_controller.py new file mode 100644 index 000000000..ee992a004 --- /dev/null +++ b/spp_api/tests/test_main_controller.py @@ -0,0 +1,66 @@ +from odoo.tests import tagged +from odoo.tests.common import HttpCase + + +@tagged("post_install", "-at_install", "test_main_controller") +class TestOASController(HttpCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + # Create test namespace + cls.test_namespace = cls.env["spp_api.namespace"].create( + {"name": "test", "version_name": "1.0", "active": True, "token": "test_token"} + ) + + def setUp(self): + super().setUp() + # Set up request environment + self.authenticate("admin", "admin") + self.url_open("/") # This initializes the request object + + def test_01_index(self): + """Test the index method of OAS controller""" + # Test the index endpoint directly + response = self.url_open("/doc/api-docs/index.html") + self.assertEqual(response.status_code, 200) + + def test_02_get_api_urls(self): + """Test the _get_api_urls method of OAS controller""" + # Test the endpoint that uses _get_api_urls + response = self.url_open("/doc/api-docs/index.html") + self.assertEqual(response.status_code, 200) + + # Verify the namespace is accessible + namespace = self.env["spp_api.namespace"].sudo().search([("name", "=", "test"), ("version_name", "=", "1.0")]) + self.assertTrue(namespace) + self.assertTrue(namespace.active) + + def test_03_oas_json_spec_download(self): + """Test the oas_json_spec_download method of OAS controller""" + # Test with valid namespace and token + response = self.url_open(f"/api/test/1.0/swagger.json?token={self.test_namespace.token}") + self.assertEqual(response.status_code, 200) + self.assertEqual(response.headers["Content-Type"], "application/json") + + # Test with invalid namespace + response = self.url_open("/api/invalid/1.0/swagger.json?token=test_token", allow_redirects=False) + self.assertEqual(response.status_code, 404) + + # Test with invalid token + response = self.url_open("/api/test/1.0/swagger.json?token=invalid_token", allow_redirects=False) + self.assertEqual(response.status_code, 403) + + def test_04_oas_document(self): + """Test the oas_document method of OAS controller""" + # Test with valid namespace and token + response = self.url_open(f"/api/swagger-doc/test/1.0?token={self.test_namespace.token}") + self.assertEqual(response.status_code, 200) + self.assertTrue(response.headers["Content-Type"].startswith("text/html")) + + # Test with invalid namespace + response = self.url_open("/api/swagger-doc/invalid/1.0?token=test_token", allow_redirects=False) + self.assertEqual(response.status_code, 404) + + # Test with invalid token + response = self.url_open("/api/swagger-doc/test/1.0?token=invalid_token", allow_redirects=False) + self.assertEqual(response.status_code, 403) diff --git a/spp_farmer_registry_demo/models/generate_farmer_data.py b/spp_farmer_registry_demo/models/generate_farmer_data.py index 2c76edd13..efdcda08c 100644 --- a/spp_farmer_registry_demo/models/generate_farmer_data.py +++ b/spp_farmer_registry_demo/models/generate_farmer_data.py @@ -110,13 +110,13 @@ def _generate_sample_data(self, **kwargs): fake = create_faker(res.locale) # Get available gender field selections - sex_choices = self.env["gender.type"].search([]).mapped("id") - sex_choice_range = sex_choices * 50 + gender_choices = self.env["gender.type"].search([]).mapped("id") + gender_choice_range = gender_choices * 50 num_groups = min(num_groups, self.GROUPS_PER_BATCH) for i in range(0, num_groups): - group_id = res._generate_group_data(i, fake, sex_choice_range, kind_farm_id) + group_id = res._generate_group_data(i, fake, gender_choice_range, kind_farm_id) land_record_id = res._generate_land_record_record(group_id, res.locale) group_id.farm_land_rec_id = land_record_id.id @@ -178,8 +178,8 @@ def _generate_sample_data(self, **kwargs): return {"result": msg, "res_model": self._name, "res_ids": [res.id]} - def _generate_group_data(self, index, fake, sex_choice_range, kind_id): - sex = random.choice(sex_choice_range) + def _generate_group_data(self, index, fake, gender_choice_range, kind_id): + sex = random.choice(gender_choice_range) last_name = fake.last_name() first_name = fake.first_name_male() if sex == "Male" else fake.first_name_female() addl_name = fake.first_name_male() if sex == "Male" else fake.first_name_female() diff --git a/spp_mis_demo/models/generate_group.py b/spp_mis_demo/models/generate_group.py index 5505bf725..31ee42b6e 100644 --- a/spp_mis_demo/models/generate_group.py +++ b/spp_mis_demo/models/generate_group.py @@ -69,8 +69,8 @@ def _generate_sample_data(self, **kwargs): fake = Faker(locales) # Get available gender field selections - sex_choices = self.env["gender.type"].search([]).mapped("id") - sex_choice_range = sex_choices * 50 + gender_choices = self.env["gender.type"].search([]).mapped("id") + gender_choice_range = gender_choices * 50 age_group_range = ["A", "C"] * 2 + ["E"] group_size_range = list(range(1, 2)) * 2 + list(range(3, 5)) * 4 + list(range(6, 8)) @@ -97,7 +97,7 @@ def _generate_sample_data(self, **kwargs): head = res._generate_individual_data( fake[locale], last_name, - sex_choice_range, + gender_choice_range, age_group_range, registration_date, ) @@ -126,7 +126,7 @@ def _generate_sample_data(self, **kwargs): data = res._generate_individual_data( fake[locale], last_name, - sex_choice_range, + gender_choice_range, age_group_range, registration_date, ) @@ -191,13 +191,11 @@ def _generate_sample_data(self, **kwargs): ) _logger.info(msg) return {"result": msg, "res_model": self._name, "res_ids": [res_id]} - # _logger.info("-" * 80) - # _logger.info(json.dumps({"group": group, "members": members}, indent=4)) - def _generate_individual_data(self, fake, last_name, sex_choice_range, age_group_range, registration_date): - sex = random.choice(sex_choice_range) + def _generate_individual_data(self, fake, last_name, gender_choice_range, age_group_range, registration_date): + gender = random.choice(gender_choice_range) age_group = random.choice(age_group_range) - first_name = fake.first_name_male() if sex == "Male" else fake.first_name_female() + first_name = fake.first_name_male() if gender == "Male" else fake.first_name_female() different_last_name = random.randint(0, 100) < 10 registration_date_days = datetime.datetime.now() - datetime.datetime.strptime(registration_date, "%Y-%m-%d") registration_date_days = registration_date_days.days + 1 @@ -223,7 +221,7 @@ def _generate_individual_data(self, fake, last_name, sex_choice_range, age_group pregnancy_start = None lactation_start = None - if sex == "Female" and age_group == "A": + if gender == "Female" and age_group == "A": rnd = random.randint(0, 100) if rnd < 15: pregnancy_start = fake.date_between_dates( @@ -237,13 +235,13 @@ def _generate_individual_data(self, fake, last_name, sex_choice_range, age_group ).isoformat() dob = fake.date_between_dates(date_start=date_start, date_end=date_end).isoformat() - fullname = f"{first_name} {last_name}" + full_name = f"{first_name} {last_name}" return { - "name": fullname, + "name": full_name, "given_name": first_name, "family_name": last_name, - "gender": sex, + "gender": gender, "birthdate": dob, "is_registrant": True, "is_group": False, diff --git a/spp_starter/__manifest__.py b/spp_starter/__manifest__.py index 65c63ef20..dae70cf8e 100644 --- a/spp_starter/__manifest__.py +++ b/spp_starter/__manifest__.py @@ -7,7 +7,7 @@ "license": "LGPL-3", "development_status": "Beta", "maintainers": ["jeremi", "gonzalesedwin1123"], - "depends": ["base"], + "depends": ["base", "product"], "data": [ "security/ir.model.access.csv", "wizards/spp_starter_views.xml", diff --git a/spp_starter/tests/test_spp_starter.py b/spp_starter/tests/test_spp_starter.py index d30916683..2c19ff66c 100644 --- a/spp_starter/tests/test_spp_starter.py +++ b/spp_starter/tests/test_spp_starter.py @@ -1,4 +1,4 @@ -from odoo.tests import TransactionCase, tagged +from odoo.tests import TransactionCase, patch, tagged from odoo.tools.safe_eval import safe_eval @@ -10,9 +10,9 @@ def setUpClass(cls): cls.sgd = cls.env.ref("base.SGD").id cls.test_record = cls.env["spp.starter"].create( { - "org_name": "Newlogic", - "org_address": "160 Robinson Rd #14-04 SBF Centre Singapore 068914", - "org_phone": "+65 3138 4664", + "org_name": "The Company", + "org_address": "The Address, 12345, Country", + "org_phone": "+1234567890", "org_currency_id": cls.sgd, } ) @@ -97,8 +97,12 @@ def test_04_remove_fake_apps_menu(self): def test_05_remove_default_products_if_needed(self): self.test_record.conducting_inkind_transfer = "yes" + # Skip product-related tests if product module is not installed if "product.template" not in self.env: - self.test_record._remove_default_products_if_needed() + result = self.test_record._remove_default_products_if_needed() + self.assertIsNone(result) + return + fake_product_template = self.env["product.template"].create( { "name": "Fake Test Product", @@ -122,30 +126,35 @@ def test_07_adjust_main_company_details(self): self.assertEqual(company.phone, self.test_record.org_phone) self.assertEqual(company.currency_id, self.test_record.org_currency_id) - # TODO: removed below test cases because they are having errors in the CI - # but they are working fine in the local machine - - # def test_08_install_modules(self): - # def find_module(module_name): - # return self.env.ref(f"base.module_{module_name}", raise_if_not_found=False) - - # spp_theme = find_module("theme_openspp_muk") - # self.assertIn(spp_theme, self.test_record._install_modules()) - # gp2_individual = find_module("g2p_registry_individual") - # gp2_group = find_module("g2p_registry_group") - # self.test_record.managing_target = "group" - # self.assertIn(gp2_group, self.test_record._install_modules()) - # self.test_record.managing_target = "individual" - # self.assertIn(gp2_individual, self.test_record._install_modules()) - - # @patch("odoo.addons.base.models.ir_module.Module.button_immediate_install") - # def test_09_action_done(self, mock_button_immediate_install): - # mock_button_immediate_install.return_value = None - # action = self.test_record.action_done() - # self.assertEqual( - # action, - # { - # "type": "ir.actions.client", - # "tag": "reload", - # }, - # ) + def test_08_install_modules(self): + def find_module(module_name): + return self.env.ref(f"base.module_{module_name}", raise_if_not_found=False) + + # Test SP-MIS modules + self.test_record.registry_target = "spmis" + modules = self.test_record._install_modules() + self.assertTrue(modules, "Should return some modules for SP-MIS") + + # Check for theme module which should always be available + theme_module = find_module("theme_openspp_muk") + self.assertIn(theme_module, modules, "Theme module should be included") + + # Test Farmer Registry modules + self.test_record.registry_target = "farmer" + modules = self.test_record._install_modules() + self.assertTrue(modules, "Should return some modules for Farmer Registry") + + # Check for theme module which should always be available + self.assertIn(theme_module, modules, "Theme module should be included") + + @patch("odoo.addons.base.models.ir_module.Module.button_immediate_install") + def test_09_action_done(self, mock_button_immediate_install): + mock_button_immediate_install.return_value = None + action = self.test_record.action_done() + self.assertEqual( + action, + { + "type": "ir.actions.client", + "tag": "reload", + }, + ) diff --git a/spp_starter/wizards/spp_starter.py b/spp_starter/wizards/spp_starter.py index 849cc1ae4..201216510 100644 --- a/spp_starter/wizards/spp_starter.py +++ b/spp_starter/wizards/spp_starter.py @@ -203,45 +203,66 @@ def _adjust_main_company_details(self): } ) + def _find_module(self, module_name): + return self.env.ref(f"base.module_{module_name}", raise_if_not_found=False) + + def _add_module_if_found(self, res, module_name): + if module := self._find_module(module_name): + res |= module + return res + + def _install_spmis_base_modules(self, res): + for module_name in [ + "spp_base", + "spp_programs", + "spp_change_request", + "spp_change_request_change_info", + "spp_event_data", + ]: + res = self._add_module_if_found(res, module_name) + return res + + def _install_spmis_demo_modules(self, res): + if self.sp_mis_demo_management == "yes": + for module_name in ["spp_base_demo", "spp_mis_demo"]: + res = self._add_module_if_found(res, module_name) + return res + + def _install_spmis_feature_modules(self, res): + module_map = { + "location_assignment": "spp_area", + "service_point_management": "spp_service_points", + "cash_transfer_needed": "spp_entitlement_cash", + "bank_details_needed": "g2p_bank", + "conducting_inkind_transfer": "spp_entitlement_in_kind", + } + for field, module_name in module_map.items(): + if getattr(self, field) == "yes": + res = self._add_module_if_found(res, module_name) + return res + + def _install_farmer_modules(self, res): + res = self._add_module_if_found(res, "spp_farmer_registry_base") + if self.location_assignment == "yes": + res = self._add_module_if_found(res, "spp_area_gis") + if self.farmer_demo_management == "yes": + for module_name in ["spp_base_demo", "spp_farmer_registry_demo", "spp_programs"]: + res = self._add_module_if_found(res, module_name) + return res + def _install_modules(self): self.ensure_one() + res = self._find_module("theme_openspp_muk") or self.env["ir.module.module"] - def find_module(module_name): - return self.env.ref(f"base.module_{module_name}", raise_if_not_found=False) - - res = find_module("theme_openspp_muk") if self.registry_target == "spmis": - res |= find_module("spp_base") - res |= find_module("spp_programs") - res |= find_module("spp_change_request") - res |= find_module("spp_change_request_change_info") - res |= find_module("spp_event_data") - if self.sp_mis_demo_management == "yes": - res |= find_module("spp_base_demo") - res |= find_module("spp_mis_demo") - if self.location_assignment == "yes": - res |= find_module("spp_area") - if self.service_point_management == "yes": - res |= find_module("spp_service_points") - if self.cash_transfer_needed == "yes": - res |= find_module("spp_entitlement_cash") - if self.bank_details_needed == "yes": - res |= find_module("g2p_bank") - if self.conducting_inkind_transfer == "yes": - res |= find_module("spp_entitlement_in_kind") - - if self.registry_target == "farmer": - # TODO: needs to change this once the module for farmer registry default UI is created - res |= find_module("spp_farmer_registry_base") - if self.location_assignment == "yes": - res |= find_module("spp_area_gis") - if self.farmer_demo_management == "yes": - res |= find_module("spp_base_demo") - res |= find_module("spp_farmer_registry_demo") - res |= find_module("spp_programs") + res = self._install_spmis_base_modules(res) + res = self._install_spmis_demo_modules(res) + res = self._install_spmis_feature_modules(res) + elif self.registry_target == "farmer": + res = self._install_farmer_modules(res) if self.id_management == "yes": - res |= find_module("spp_idpass") + res = self._add_module_if_found(res, "spp_idpass") return res