diff --git a/spp_area/__manifest__.py b/spp_area/__manifest__.py index c20a4a300..1796d61a8 100644 --- a/spp_area/__manifest__.py +++ b/spp_area/__manifest__.py @@ -3,7 +3,7 @@ { "name": "OpenSPP Area Management", - "summary": "This module enables management of geographical areas, linking them to registrants for targeted interventions and analysis in social protection programs.", + "summary": "This module extends the OpenSPP Area (Base) module to include additional features for managing and organizing geographical areas within the system.", "category": "OpenSPP", "version": "17.0.1.3.0", "sequence": 1, @@ -14,25 +14,17 @@ "maintainers": ["jeremi", "gonzalesedwin1123", "reichie020212"], "depends": [ "base", + "spp_area_base", "g2p_registry_base", "g2p_registry_individual", "g2p_registry_group", "queue_job", ], - "external_dependencies": { - "python": [ - "xlrd", - ] - }, + "external_dependencies": {}, "data": [ - "data/area_kind_data.xml", - "data/queue_job_channel.xml", "security/ir.model.access.csv", "views/individual_views.xml", "views/group_views.xml", - "views/area.xml", - "views/area_kind.xml", - "views/area_import_views.xml", ], "assets": {}, "demo": [], diff --git a/spp_area/models/__init__.py b/spp_area/models/__init__.py index 4a350927f..e182f176f 100644 --- a/spp_area/models/__init__.py +++ b/spp_area/models/__init__.py @@ -1,6 +1,4 @@ # Part of OpenSPP. See LICENSE file for full copyright and licensing details. -from . import area from . import registrant -from . import area_import diff --git a/spp_area/models/registrant.py b/spp_area/models/registrant.py index 654097a87..648326548 100644 --- a/spp_area/models/registrant.py +++ b/spp_area/models/registrant.py @@ -10,7 +10,7 @@ def _get_area_domain(self): """ This set up the domain of the area base on its kind """ - area_id = self.env.ref("spp_area.admin_area_kind").id + area_id = self.env.ref("spp_area_base.admin_area_kind").id return [("kind", "=", area_id)] # Custom Fields diff --git a/spp_area/readme/DESCRIPTION.md b/spp_area/readme/DESCRIPTION.md index 538064547..e3dc4d7a2 100644 --- a/spp_area/readme/DESCRIPTION.md +++ b/spp_area/readme/DESCRIPTION.md @@ -1,6 +1,6 @@ # OpenSPP Area -This document describes the **OpenSPP Area** module, which extends the OpenSPP framework by providing features to manage and organize geographical areas within the system. It integrates with the core registry modules to allow associating registrants and other data with specific locations. +This document describes the **OpenSPP Area** module, which extends the OpenSPP Area Base module. ## Purpose diff --git a/spp_area/security/ir.model.access.csv b/spp_area/security/ir.model.access.csv index 0e8ecdf95..ed816fcc3 100644 --- a/spp_area/security/ir.model.access.csv +++ b/spp_area/security/ir.model.access.csv @@ -1,7 +1,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -spp_area_admin,Area Admin Access,spp_area.model_spp_area,g2p_registry_base.group_g2p_admin,1,1,1,1 -spp_area_import_admin,Area Import Admin Access,spp_area.model_spp_area_import,g2p_registry_base.group_g2p_admin,1,1,1,1 -spp_area_import_raw_admin,Area Import Raw Admin Access,spp_area.model_spp_area_import_raw,g2p_registry_base.group_g2p_admin,1,1,1,1 -spp_area_kind_admin,Area Kind Admin Access,spp_area.model_spp_area_kind,g2p_registry_base.group_g2p_admin,1,1,1,1 +spp_area_admin,Area Admin Access,spp_area_base.model_spp_area,g2p_registry_base.group_g2p_admin,1,1,1,1 +spp_area_import_admin,Area Import Admin Access,spp_area_base.model_spp_area_import,g2p_registry_base.group_g2p_admin,1,1,1,1 +spp_area_import_raw_admin,Area Import Raw Admin Access,spp_area_base.model_spp_area_import_raw,g2p_registry_base.group_g2p_admin,1,1,1,1 +spp_area_kind_admin,Area Kind Admin Access,spp_area_base.model_spp_area_kind,g2p_registry_base.group_g2p_admin,1,1,1,1 -spp_area_registrar,Area Registrar Access,spp_area.model_spp_area,g2p_registry_base.group_g2p_registrar,1,1,1,0 +spp_area_registrar,Area Registrar Access,spp_area_base.model_spp_area,g2p_registry_base.group_g2p_registrar,1,1,1,0 diff --git a/spp_area_base/README.rst b/spp_area_base/README.rst new file mode 100644 index 000000000..aaae5ca5b --- /dev/null +++ b/spp_area_base/README.rst @@ -0,0 +1,165 @@ +======================= +OpenSPP Area Management +======================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:e6e98dfbc0dfec92d49f42a8d99cd1c4e2fd8edd889a3165a76df9d78c301196 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OpenSPP%2Fopenspp--modules-lightgray.png?logo=github + :target: https://github.com/OpenSPP/openspp-modules/tree/17.0/spp_area + :alt: OpenSPP/openspp-modules + +|badge1| |badge2| |badge3| + +OpenSPP Area +============ + +This document describes the **OpenSPP Area** module, which extends the +OpenSPP framework by providing features to manage and organize +geographical areas within the system. It integrates with the core +registry modules to allow associating registrants and other data with +specific locations. + +Purpose +------- + +The **OpenSPP Area** module is designed to: + +- **Define and Structure Geographical Areas**: Establish a hierarchical + structure for representing administrative regions, from the highest + level (e.g., country) down to the most granular level (e.g., + village). +- **Manage Area Information**: Store key details about each area, + including its name, code, alternate names, geographical size, and + parent-child relationships within the hierarchy. +- **Associate Registrants with Areas**: Enable the linking of + individual and group registrants to specific areas, facilitating + location-based targeting, analysis, and program implementation. + +Dependencies and Integration +---------------------------- + +1. **G2P Registry: Base + (**\ `g2p_registry_base `__\ **)**: The Area + module utilizes the **Districts (g2p.district)** feature from the + **G2P Registry: Base** module as a foundation. It extends this + concept to create a more comprehensive and flexible system for + managing area data. + +2. **G2P Registry: Individual + (**\ `g2p_registry_individual `__\ **)**: + Integrates with the Individual module by adding a dedicated "Area" + field to the individual registrant form. This field allows users to + assign a specific area to each individual, linking registrant data to + geographical locations. + +3. **G2P Registry: Group + (**\ `g2p_registry_group `__\ **)**: Similar to + the Individual module integration, this module incorporates an "Area" + field into the group registrant form, enabling the association of + groups with specific areas. + +4. **Queue Job (**\ `queue_job `__\ **)**: Leverages the + **Queue Job** module for background processing of large data imports, + improving performance and user experience. This is particularly + beneficial when importing extensive area hierarchies from external + sources. + +Additional Functionality +------------------------ + +- **Hierarchical Area Structure (**\ `spp.area `__\ **)**: + + - Introduces a dedicated model for managing areas, allowing for the + creation of multi-level administrative boundaries with + parent-child relationships. + - Computes and displays the complete area path (e.g., "Country > + Province > District > Village") to provide clear context within + the hierarchy. + - Enforces unique codes for each area to ensure proper + identification and prevent duplicates. + +- **Area Types (**\ `spp.area.kind `__\ **)**: + + - Includes a model for defining and managing different types of + areas (e.g., administrative regions, ecological zones, project + implementation areas). + - Allows for the creation of a hierarchy of area types, providing + further categorization and flexibility. + +- **Area Import Functionality**: + + - Provides tools for importing area data in bulk from Excel files, + streamlining the process of populating the area hierarchy. + - Implements validation rules during the import process to ensure + data integrity, such as checking for required fields, data types, + and hierarchical consistency. + - Utilizes the Queue Job module to perform data validation and + import operations in the background, preventing performance issues + and providing a smoother user experience. + - Ability to localize the name of the imported area. + +Conclusion +---------- + +The **OpenSPP Area** module enhances the OpenSPP platform by providing a +robust and flexible system for managing geographical areas and linking +them to registrant data. Its integration with the core registry modules +ensures that location information is seamlessly incorporated into the +overall system, supporting location-based targeting, analysis, and +program management for social protection programs and farmer registries. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* OpenSPP.org + +Maintainers +----------- + +.. |maintainer-jeremi| image:: https://github.com/jeremi.png?size=40px + :target: https://github.com/jeremi + :alt: jeremi +.. |maintainer-gonzalesedwin1123| image:: https://github.com/gonzalesedwin1123.png?size=40px + :target: https://github.com/gonzalesedwin1123 + :alt: gonzalesedwin1123 +.. |maintainer-reichie020212| image:: https://github.com/reichie020212.png?size=40px + :target: https://github.com/reichie020212 + :alt: reichie020212 + +Current maintainers: + +|maintainer-jeremi| |maintainer-gonzalesedwin1123| |maintainer-reichie020212| + +This module is part of the `OpenSPP/openspp-modules `_ project on GitHub. + +You are welcome to contribute. diff --git a/spp_area_base/__init__.py b/spp_area_base/__init__.py new file mode 100644 index 000000000..d22455abf --- /dev/null +++ b/spp_area_base/__init__.py @@ -0,0 +1,4 @@ +# Part of OpenSPP. See LICENSE file for full copyright and licensing details. + + +from . import models diff --git a/spp_area_base/__manifest__.py b/spp_area_base/__manifest__.py new file mode 100644 index 000000000..fa5fee4cc --- /dev/null +++ b/spp_area_base/__manifest__.py @@ -0,0 +1,38 @@ +# Part of OpenSPP. See LICENSE file for full copyright and licensing details. + + +{ + "name": "OpenSPP Area Management (Base)", + "summary": "This module enables management of geographical areas, linking them to registrants for targeted interventions and analysis in social protection programs.", + "category": "OpenSPP", + "version": "17.0.1.3.0", + "sequence": 1, + "author": "OpenSPP.org", + "website": "https://github.com/OpenSPP/openspp-modules", + "license": "LGPL-3", + "development_status": "Production/Stable", + "maintainers": ["jeremi", "gonzalesedwin1123", "reichie020212"], + "depends": [ + "base", + "queue_job", + ], + "external_dependencies": { + "python": [ + "xlrd", + ] + }, + "data": [ + "data/area_kind_data.xml", + "data/queue_job_channel.xml", + "security/ir.model.access.csv", + "views/area.xml", + "views/area_kind.xml", + "views/area_import_views.xml", + ], + "assets": {}, + "demo": [], + "images": [], + "application": True, + "installable": True, + "auto_install": False, +} diff --git a/spp_area/data/area_kind_data.xml b/spp_area_base/data/area_kind_data.xml similarity index 100% rename from spp_area/data/area_kind_data.xml rename to spp_area_base/data/area_kind_data.xml diff --git a/spp_area/data/queue_job_channel.xml b/spp_area_base/data/queue_job_channel.xml similarity index 100% rename from spp_area/data/queue_job_channel.xml rename to spp_area_base/data/queue_job_channel.xml diff --git a/spp_area_base/i18n/ar.po b/spp_area_base/i18n/ar.po new file mode 100644 index 000000000..6d5ef05ae --- /dev/null +++ b/spp_area_base/i18n/ar.po @@ -0,0 +1,547 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spp_area +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-02-24 02:22+0000\n" +"Last-Translator: Ammar ALBAYATI \n" +"Language-Team: Arabic \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" +"X-Generator: Weblate 4.14\n" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_alt1 +msgid "Admin Alt1" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_alt2 +msgid "Admin Alt2" +msgstr "" + +#. module: spp_area +#: model:spp.area.kind,complete_name:spp_area.admin_area_kind +msgid "Admin Area" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_code +msgid "Admin Code" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_kind +msgid "Admin Kind" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_name +msgid "Admin Name" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_ref +msgid "Admin Ref" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__altnames +msgid "Alternate Name" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea +#: model:ir.model,name:spp_area.model_spp_area +#: model:ir.model.fields,field_description:spp_area.field_res_partner__area_id +#: model:ir.model.fields,field_description:spp_area.field_res_users__area_id +#: model:ir.ui.menu,name:spp_area.area_main_menu_root +#: model:ir.ui.menu,name:spp_area.menu_spparea +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_groups_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_individuals_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area" +msgstr "المركز" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__excel_file +msgid "Area Excel File" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Excel File:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__area_import_id +#: model:ir.ui.menu,name:spp_area.menu_spparea_import +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Import" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import_raw +msgid "Area Import Raw Data" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import_lang +msgid "Area Import Raw Data Languages" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea_kind +#: model:ir.model,name:spp_area.model_spp_area_kind +#: model:ir.ui.menu,name:spp_area.menu_spparea_kind +#, fuzzy +msgid "Area Kind" +msgstr "المركز" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__area_level +msgid "Area Level" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area Name..." +msgstr "المركز..." + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__raw_id +msgid "Area Raw ID" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_view_spparea_import +msgid "Area Upload" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Area already exist!" +msgstr "" + +#. module: spp_area +#: model:ir.ui.menu,name:spp_area.area_main_top_menu +msgid "Areas" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import +msgid "Areas Import Table" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete default Area Type" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete used Area Type" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't edit default Area Type" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Cancel" +msgstr "الغاء" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__cancelled +msgid "Cancelled" +msgstr "ألغيت" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__child_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Child" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Click the create button to enter the information of the Area Kind." +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Click the create button to enter the information of the Area." +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Click the create button to upload a new excel file." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__code +msgid "Code" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_kind_tree +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_tree +msgid "Complete Name" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_res_partner +msgid "Contact" +msgstr "اتصال" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Create a new Area Kind!" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Create a new Area!" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_uid +msgid "Created by" +msgstr "انشأ من قبل" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_date +msgid "Created on" +msgstr "انشأ على" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__dms_directory_ids +#, fuzzy +msgid "DMS Directories" +msgstr "دليل الوثائق" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "DONE" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_imported +msgid "Date Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_uploaded +msgid "Date Uploaded" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_validated +msgid "Date Validated" +msgstr "تاريخ التحقق" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__display_name +msgid "Display Name" +msgstr "الاسم" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__done +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Done" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__draft_name +#, fuzzy +msgid "Draft Name" +msgstr "المركز..." + +#. module: spp_area +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "ERROR: {}" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__error +msgid "Error" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__name +msgid "File Name" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Group By" +msgstr "مجموعة من" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__id +msgid "ID" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "IMPORTED" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__iso_code +msgid "ISO Code" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Import" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__imported +msgid "Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__import_id +msgid "Imported by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__kind +msgid "Kind" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__lang_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__lang_ids +msgid "Languages" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind____last_update +msgid "Last Modified on" +msgstr "تاريخ آخر تعديل" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__level +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__level +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Level" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "NEW" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__complete_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area__name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__complete_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__name +msgid "Name" +msgstr "الإسم" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Name:" +msgstr "اسم:" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__new +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__new +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "New" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_id +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Parent" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_path +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_path +msgid "Parent Path" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Parent:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__posted +msgid "Posted" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__raw_data_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Raw Data" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__remarks +msgid "Remarks/Errors" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__row_index +msgid "Row Index" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Save to Area" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_kind_filter +msgid "Search Area" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Search Imported File" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Select a Parent..." +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "State" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__state +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__state +msgid "Status" +msgstr "الحالة" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__level +msgid "This is the area level for importing" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__area_level +msgid "This is the main area level" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_imported +msgid "Total Rows Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_error +msgid "Total Rows with Error" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__name +msgid "Translate Name" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "UPLOADED" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__updated +msgid "Updated" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Upload an excel file!" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__uploaded +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Uploaded" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__upload_id +msgid "Uploaded by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__validated +msgid "Validated" +msgstr "تم التحقق" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__validate_id +msgid "Validated by" +msgstr "تم التحقق من قبل" diff --git a/spp_area_base/i18n/ckb.po b/spp_area_base/i18n/ckb.po new file mode 100644 index 000000000..c4bd56a9a --- /dev/null +++ b/spp_area_base/i18n/ckb.po @@ -0,0 +1,543 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spp_area +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-01-18 14:42+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: Kurdish (Central) \n" +"Language: ckb\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.14\n" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_alt1 +msgid "Admin Alt1" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_alt2 +msgid "Admin Alt2" +msgstr "" + +#. module: spp_area +#: model:spp.area.kind,complete_name:spp_area.admin_area_kind +msgid "Admin Area" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_code +msgid "Admin Code" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_kind +msgid "Admin Kind" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_name +msgid "Admin Name" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_ref +msgid "Admin Ref" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__altnames +msgid "Alternate Name" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea +#: model:ir.model,name:spp_area.model_spp_area +#: model:ir.model.fields,field_description:spp_area.field_res_partner__area_id +#: model:ir.model.fields,field_description:spp_area.field_res_users__area_id +#: model:ir.ui.menu,name:spp_area.area_main_menu_root +#: model:ir.ui.menu,name:spp_area.menu_spparea +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_groups_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_individuals_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__excel_file +msgid "Area Excel File" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Excel File:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__area_import_id +#: model:ir.ui.menu,name:spp_area.menu_spparea_import +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Import" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import_raw +msgid "Area Import Raw Data" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import_lang +msgid "Area Import Raw Data Languages" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea_kind +#: model:ir.model,name:spp_area.model_spp_area_kind +#: model:ir.ui.menu,name:spp_area.menu_spparea_kind +msgid "Area Kind" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__area_level +msgid "Area Level" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area Name..." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__raw_id +msgid "Area Raw ID" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_view_spparea_import +msgid "Area Upload" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Area already exist!" +msgstr "" + +#. module: spp_area +#: model:ir.ui.menu,name:spp_area.area_main_top_menu +msgid "Areas" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import +msgid "Areas Import Table" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete default Area Type" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete used Area Type" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't edit default Area Type" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Cancel" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__cancelled +msgid "Cancelled" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__child_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Child" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Click the create button to enter the information of the Area Kind." +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Click the create button to enter the information of the Area." +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Click the create button to upload a new excel file." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__code +msgid "Code" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_kind_tree +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_tree +msgid "Complete Name" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_res_partner +msgid "Contact" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Create a new Area Kind!" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Create a new Area!" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_uid +msgid "Created by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_date +msgid "Created on" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__dms_directory_ids +msgid "DMS Directories" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "DONE" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_imported +msgid "Date Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_uploaded +msgid "Date Uploaded" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_validated +msgid "Date Validated" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__display_name +msgid "Display Name" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__done +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Done" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__draft_name +msgid "Draft Name" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "ERROR: {}" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__error +msgid "Error" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__name +msgid "File Name" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Group By" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__id +msgid "ID" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "IMPORTED" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__iso_code +msgid "ISO Code" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Import" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__imported +msgid "Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__import_id +msgid "Imported by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__kind +msgid "Kind" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__lang_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__lang_ids +msgid "Languages" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind____last_update +msgid "Last Modified on" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__level +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__level +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Level" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "NEW" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__complete_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area__name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__complete_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__name +msgid "Name" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Name:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__new +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__new +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "New" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_id +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Parent" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_path +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_path +msgid "Parent Path" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Parent:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__posted +msgid "Posted" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__raw_data_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Raw Data" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__remarks +msgid "Remarks/Errors" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__row_index +msgid "Row Index" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Save to Area" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_kind_filter +msgid "Search Area" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Search Imported File" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Select a Parent..." +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "State" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__state +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__state +msgid "Status" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__level +msgid "This is the area level for importing" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__area_level +msgid "This is the main area level" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_imported +msgid "Total Rows Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_error +msgid "Total Rows with Error" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__name +msgid "Translate Name" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "UPLOADED" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__updated +msgid "Updated" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Upload an excel file!" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__uploaded +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Uploaded" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__upload_id +msgid "Uploaded by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__validated +msgid "Validated" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__validate_id +msgid "Validated by" +msgstr "" diff --git a/spp_area_base/i18n/fr.po b/spp_area_base/i18n/fr.po new file mode 100644 index 000000000..9776df01c --- /dev/null +++ b/spp_area_base/i18n/fr.po @@ -0,0 +1,562 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spp_area +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-01-18 14:42+0000\n" +"Last-Translator: Anonymous \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.14\n" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_alt1 +msgid "Admin Alt1" +msgstr "Administrateur Alt1" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_alt2 +msgid "Admin Alt2" +msgstr "Administrateur Alt2" + +#. module: spp_area +#: model:spp.area.kind,complete_name:spp_area.admin_area_kind +msgid "Admin Area" +msgstr "Zone administrative" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_code +msgid "Admin Code" +msgstr "Code de zone" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_kind +msgid "Admin Kind" +msgstr "Type de zone" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_name +msgid "Admin Name" +msgstr "Nom de la zone" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_ref +msgid "Admin Ref" +msgstr "Réf zone" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__altnames +msgid "Alternate Name" +msgstr "Nom alternatif" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea +#: model:ir.model,name:spp_area.model_spp_area +#: model:ir.model.fields,field_description:spp_area.field_res_partner__area_id +#: model:ir.model.fields,field_description:spp_area.field_res_users__area_id +#: model:ir.ui.menu,name:spp_area.area_main_menu_root +#: model:ir.ui.menu,name:spp_area.menu_spparea +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_groups_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_individuals_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area" +msgstr "Zone" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__excel_file +msgid "Area Excel File" +msgstr "Fichier Excel de la Zone" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Excel File:" +msgstr "Fichier Excel de la zone :" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__area_import_id +#: model:ir.ui.menu,name:spp_area.menu_spparea_import +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Import" +msgstr "Importation de Zone" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import_raw +msgid "Area Import Raw Data" +msgstr "Import de données brutes de la zone" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import_lang +msgid "Area Import Raw Data Languages" +msgstr "Importation de données brutes par zone - Langues" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea_kind +#: model:ir.model,name:spp_area.model_spp_area_kind +#: model:ir.ui.menu,name:spp_area.menu_spparea_kind +msgid "Area Kind" +msgstr "Type de zone" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__area_level +msgid "Area Level" +msgstr "Niveau de zone" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area Name..." +msgstr "Nom de la zone..." + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__raw_id +msgid "Area Raw ID" +msgstr "ID brut de la zone" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_view_spparea_import +msgid "Area Upload" +msgstr "Téléchargement de zone" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Area already exist!" +msgstr "La zone existe déjà !" + +#. module: spp_area +#: model:ir.ui.menu,name:spp_area.area_main_top_menu +msgid "Areas" +msgstr "Zones" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import +msgid "Areas Import Table" +msgstr "Tableau d'importation des zones" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete default Area Type" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete used Area Type" +msgstr "" + +#. module: spp_area +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't edit default Area Type" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Cancel" +msgstr "Annuler" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__cancelled +msgid "Cancelled" +msgstr "Annulé" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__child_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Child" +msgstr "Enfant" + +# +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Click the create button to enter the information of the Area Kind." +msgstr "" +"Cliquez sur le bouton créer pour saisir les informations du Type de Zone." + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Click the create button to enter the information of the Area." +msgstr "Cliquez sur le bouton Créer pour saisir les informations de la Zone." + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Click the create button to upload a new excel file." +msgstr "Cliquez sur le bouton Créer pour télécharger un nouveau fichier Excel." + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__code +msgid "Code" +msgstr "Code" + +# +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_kind_tree +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_tree +msgid "Complete Name" +msgstr "Nom complet" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_res_partner +msgid "Contact" +msgstr "Contact" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Create a new Area Kind!" +msgstr "Créez un nouveau type de zone !" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Create a new Area!" +msgstr "Créez une nouvelle zone !" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_date +msgid "Created on" +msgstr "Créé sur" + +# +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__dms_directory_ids +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__dms_directory_ids +msgid "DMS Directories" +msgstr "Répertoires du DMS" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "DONE" +msgstr "FINI" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_imported +msgid "Date Imported" +msgstr "Date d'importation" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_uploaded +msgid "Date Uploaded" +msgstr "Date de téléchargement" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_validated +msgid "Date Validated" +msgstr "Date de Validation" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__display_name +msgid "Display Name" +msgstr "Afficher un nom" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__done +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Done" +msgstr "Fait" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__draft_name +msgid "Draft Name" +msgstr "Nom du brouillon" + +#. module: spp_area +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "ERROR: {}" +msgstr "ERREUR : {}" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__error +msgid "Error" +msgstr "Erreur" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__name +msgid "File Name" +msgstr "Nom de fichier" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Group By" +msgstr "Groupé par" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__id +msgid "ID" +msgstr "ID" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "IMPORTED" +msgstr "IMPORTÉ" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__iso_code +msgid "ISO Code" +msgstr "Code ISO" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Import" +msgstr "Importer" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__imported +msgid "Imported" +msgstr "Importé" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__import_id +msgid "Imported by" +msgstr "Importé par" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__kind +msgid "Kind" +msgstr "Type" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__lang_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__lang_ids +msgid "Languages" +msgstr "Langues" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw____last_update +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind____last_update +msgid "Last Modified on" +msgstr "Modification le" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_date +msgid "Last Updated on" +msgstr "Mise à jour le" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__level +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__level +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Level" +msgstr "Niveau" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "NEW" +msgstr "NOUVEAU" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__complete_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area__name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__complete_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__name +msgid "Name" +msgstr "Nom" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Name:" +msgstr "Nom :" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__new +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__new +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "New" +msgstr "Nouveau" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_id +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Parent" +msgstr "Parent" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_path +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_path +msgid "Parent Path" +msgstr "Chemin parent" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Parent:" +msgstr "Parent :" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__posted +msgid "Posted" +msgstr "Posté" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__raw_data_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Raw Data" +msgstr "Données brutes" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__remarks +msgid "Remarks/Errors" +msgstr "Remarques/Erreurs" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__row_index +msgid "Row Index" +msgstr "Index de ligne" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Save to Area" +msgstr "Enregistrer dans la zone" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_kind_filter +msgid "Search Area" +msgstr "Zone de recherche" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Search Imported File" +msgstr "Rechercher un fichier importé" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Select a Parent..." +msgstr "Sélectionnez un parent..." + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "State" +msgstr "État" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__state +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__state +msgid "Status" +msgstr "Statut" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__level +#, fuzzy +msgid "This is the area level for importing" +msgstr "Il s'agit du niveau de zone pour l'importation" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__area_level +#, fuzzy +msgid "This is the main area level" +msgstr "Il s'agit du niveau principal de la zone" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_imported +msgid "Total Rows Imported" +msgstr "Nombre total de lignes importées" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_error +#, fuzzy +msgid "Total Rows with Error" +msgstr "Nombre total de lignes avec erreur" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_lang__name +msgid "Translate Name" +msgstr "Traduire le nom" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "UPLOADED" +msgstr "TÉLÉCHARGÉ" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__updated +msgid "Updated" +msgstr "Actualisé" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Upload an excel file!" +msgstr "Téléchargez un fichier excel !" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__uploaded +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Uploaded" +msgstr "Téléchargé" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__upload_id +msgid "Uploaded by" +msgstr "telechargé par" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__validated +msgid "Validated" +msgstr "Validé" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__validate_id +msgid "Validated by" +msgstr "Validé par" + +#, python-format +#~ msgid "Can't delete default Area Kind" +#~ msgstr "Impossible de supprimer le type de zone par défaut" + +#, python-format +#~ msgid "Can't delete used Area Kind" +#~ msgstr "Impossible de supprimer un type de zone utilisé" + +#, python-format +#~ msgid "Can't edit default Area Kind" +#~ msgstr "Impossible de modifier le type de zone par défaut" diff --git a/spp_area_base/i18n/spp_area.pot b/spp_area_base/i18n/spp_area.pot new file mode 100644 index 000000000..0c8d291e0 --- /dev/null +++ b/spp_area_base/i18n/spp_area.pot @@ -0,0 +1,591 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * spp_area +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Warning: Operation in progress: " +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "AREA_SQKM should be numerical." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_code +msgid "Admin Code" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__admin_name +msgid "Admin Name" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__altnames +msgid "Alternate Name" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea +#: model:ir.model,name:spp_area.model_spp_area +#: model:ir.model.fields,field_description:spp_area.field_res_partner__area_id +#: model:ir.model.fields,field_description:spp_area.field_res_users__area_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__area_id +#: model:ir.model.fields,field_description:spp_area.field_spp_attendance_subscriber__area_id +#: model:ir.ui.menu,name:spp_area.area_main_menu_root +#: model:ir.ui.menu,name:spp_area.menu_spparea +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_groups_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_area_individuals_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__area_sqkm +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__area_sqkm +msgid "Area (sq/km)" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__excel_file +msgid "Area Excel File" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Excel File:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__area_import_id +#: model:ir.ui.menu,name:spp_area.menu_spparea_import +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Area Import" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import_raw +msgid "Area Import Raw Data" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__area_level +msgid "Area Level" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Area Name..." +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_spparea_kind +#: model:ir.model,name:spp_area.model_spp_area_kind +#: model:ir.ui.menu,name:spp_area.menu_spparea_kind +msgid "Area Type" +msgstr "" + +#. module: spp_area +#: model:ir.actions.act_window,name:spp_area.action_view_spparea_import +msgid "Area Upload" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area.py:0 code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Area already exist!" +msgstr "" + +#. module: spp_area +#: model:ir.ui.menu,name:spp_area.area_main_top_menu +msgid "Areas" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_spp_area_import +msgid "Areas Import Table" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete default Area Type" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area.py:0 +#, python-format +msgid "Can't delete used Area Type" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Cancel" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__cancelled +msgid "Cancelled" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__child_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Child" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Click the create button to enter the information of the Area Type." +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Click the create button to enter the information of the Area." +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Click the create button to upload a new excel file." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__code +msgid "Code" +msgstr "" + +#. module: spp_area +#: model:ir.model.constraint,message:spp_area.constraint_spp_area_code_unique +msgid "Code is already exists!" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__complete_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__complete_name +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_kind_tree +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_tree +msgid "Complete Name" +msgstr "" + +#. module: spp_area +#: model:ir.model,name:spp_area.model_res_partner +msgid "Contact" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea_kind +msgid "Create a new Area Type!" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_spparea +msgid "Create a new Area!" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_uid +msgid "Created by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__create_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__create_date +msgid "Created on" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "DONE" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_imported +msgid "Date Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_uploaded +msgid "Date Uploaded" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__date_validated +msgid "Date Validated" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__display_name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__display_name +msgid "Display Name" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__done +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Done" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__draft_name +msgid "Draft Name" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "ERROR: {}" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__error +msgid "Error" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__name +msgid "File Name" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Fix Area Level and Kind" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "Fixing area level." +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Group By" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__id +msgid "ID" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "IMPORTED" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Import" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__imported +msgid "Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__import_id +msgid "Imported by" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "Importing data." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__kind +msgid "Kind" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "" +"Language with ISO Code %s is not active.\n" +"Please request the administrator to enable the desired language." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_uid +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__write_date +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__write_date +msgid "Last Updated on" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__level +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__level +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Level" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "Level 0 area should not have a parent name and parent code." +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "Level 1 and above area should have a parent name and parent code." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__locked +msgid "Locked" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__locked_reason +msgid "Locked Reason" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "NEW" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__name +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__name +msgid "Name" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "Name and Code of area is required." +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Name:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__new +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__new +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "New" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "No active language found." +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_id +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_id +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +msgid "Parent" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__parent_code +msgid "Parent Code" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__parent_name +msgid "Parent Name" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area__parent_path +#: model:ir.model.fields,field_description:spp_area.field_spp_area_kind__parent_path +msgid "Parent Path" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Parent:" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__posted +msgid "Posted" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__raw_data_ids +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Raw Data" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Refresh" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Refresh Page" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__remarks +msgid "Remarks/Errors" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Reset to Uploaded" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Save to Area" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_filter +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_kind_filter +msgid "Search Area" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Search Imported File" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_form +msgid "Select a Parent..." +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "State" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__state_order +msgid "State Order" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__state +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import_raw__state +msgid "Status" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__level +msgid "This is the area level for importing" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,help:spp_area.field_spp_area__area_level +msgid "This is the main area level" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_imported +msgid "Total Rows Imported" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__tot_rows_error +msgid "Total Rows with Error" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "UPLOADED" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__updated +msgid "Updated" +msgstr "" + +#. module: spp_area +#: model_terms:ir.actions.act_window,help:spp_area.action_view_spparea_import +msgid "Upload an excel file!" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__uploaded +#: model_terms:ir.ui.view,arch_db:spp_area.spparea_import_filter +msgid "Uploaded" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__upload_id +msgid "Uploaded by" +msgstr "" + +#. module: spp_area +#: model_terms:ir.ui.view,arch_db:spp_area.view_spparea_import_form +msgid "Validate Data" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import__state__validated +#: model:ir.model.fields.selection,name:spp_area.selection__spp_area_import_raw__state__validated +msgid "Validated" +msgstr "" + +#. module: spp_area +#: model:ir.model.fields,field_description:spp_area.field_spp_area_import__validate_id +msgid "Validated by" +msgstr "" + +#. module: spp_area +#. odoo-python +#: code:addons/spp_area/models/area_import.py:0 +#, python-format +msgid "Validating data." +msgstr "" diff --git a/spp_area_base/models/__init__.py b/spp_area_base/models/__init__.py new file mode 100644 index 000000000..840ddfc30 --- /dev/null +++ b/spp_area_base/models/__init__.py @@ -0,0 +1,5 @@ +# Part of OpenSPP. See LICENSE file for full copyright and licensing details. + + +from . import area +from . import area_import diff --git a/spp_area/models/area.py b/spp_area_base/models/area.py similarity index 89% rename from spp_area/models/area.py rename to spp_area_base/models/area.py index 8afe5c5d2..807ad5986 100644 --- a/spp_area/models/area.py +++ b/spp_area_base/models/area.py @@ -6,6 +6,7 @@ from odoo.exceptions import ValidationError _logger = logging.getLogger(__name__) +_kind_model = "spp.area.kind" class OpenSPPArea(models.Model): @@ -23,7 +24,7 @@ class OpenSPPArea(models.Model): _parent_store = True _order = "parent_id,name" - parent_id = fields.Many2one("spp.area", "Parent") + parent_id = fields.Many2one(_name, "Parent") complete_name = fields.Char(compute="_compute_complete_name", recursive=True, translate=True) name = fields.Char(translate=True, compute="_compute_name", store=True) draft_name = fields.Char(required=True, translate=True) @@ -32,8 +33,8 @@ class OpenSPPArea(models.Model): altnames = fields.Char("Alternate Name") level = fields.Integer(help="This is the area level for importing") area_level = fields.Integer(compute="_compute_area_level", store=True, help="This is the main area level") - child_ids = fields.One2many("spp.area", "id", "Child", compute="_compute_get_childs") - kind = fields.Many2one("spp.area.kind") + child_ids = fields.One2many(_name, "id", "Child", compute="_compute_get_childs") + kind = fields.Many2one(_kind_model) area_sqkm = fields.Float("Area (sq/km)") _sql_constraints = [ @@ -67,7 +68,7 @@ def _compute_get_childs(self): and assigns them to the child_ids field. """ for rec in self: - child_ids = self.env["spp.area"].search([("parent_id", "=", rec.id)]) + child_ids = self.env[self._name].search([("parent_id", "=", rec.id)]) rec.child_ids = child_ids @api.depends("parent_id") @@ -139,7 +140,7 @@ def create(self, vals): area_code = self.code if "code" in vals: area_code = vals["code"] - curr_area = self.env["spp.area"].search( + curr_area = self.env[self._name].search( [ ("name", "=", area_name), ("code", "=", area_code), @@ -149,23 +150,23 @@ def create(self, vals): if curr_area: raise ValidationError(_("Area already exist!")) else: - Area = super().create(vals) - Languages = self.env["res.lang"].search([("active", "=", True)]) + area_val = super().create(vals) + languages = self.env["res.lang"].search([("active", "=", True)]) vals_list = [] - for lang_code in Languages: + for lang_code in languages: vals_list.append( { "name": "spp.area,draft_name", "lang": lang_code.code, - "res_id": Area.id, - "src": Area.draft_name, + "res_id": area_val.id, + "src": area_val.draft_name, "value": None, "state": "to_translate", "type": "model", } ) - return Area + return area_val def write(self, vals): """ @@ -184,7 +185,7 @@ def write(self, vals): area_code = rec.code if "code" in vals: area_code = vals["code"] - curr_area = self.env["spp.area"].search( + curr_area = self.env[self._name].search( [ ("name", "=", area_name), ("code", "=", area_code), @@ -206,9 +207,9 @@ def open_area_form(self): return { "name": "Area", "view_mode": "form", - "res_model": "spp.area", + "res_model": self._name, "res_id": rec.id, - "view_id": self.env.ref("spp_area.view_spparea_form").id, + "view_id": self.env.ref("spp_area_base.view_spparea_form").id, "type": "ir.actions.act_window", "target": "new", "flags": {"mode": "readonly"}, @@ -223,14 +224,14 @@ class OpenSPPAreaKind(models.Model): their hierarchical relationships and names. """ - _name = "spp.area.kind" + _name = _kind_model _description = "Area Type" _parent_name = "parent_id" _parent_store = True _rec_name = "complete_name" _order = "parent_id,name" - parent_id = fields.Many2one("spp.area.kind", "Parent") + parent_id = fields.Many2one(_kind_model, "Parent") parent_path = fields.Char(index=True) name = fields.Char(required=True) complete_name = fields.Char(compute="_compute_complete_name", recursive=True, translate=True) @@ -262,12 +263,12 @@ def unlink(self): """ for rec in self: external_identifier = self.env["ir.model.data"].search( - [("res_id", "=", rec.id), ("model", "=", "spp.area.kind")] + [("res_id", "=", rec.id), ("model", "=", _kind_model)] ) if external_identifier and external_identifier.name: raise ValidationError(_("Can't delete default Area Type")) else: - areas = self.env["spp.area"].search([("kind", "=", rec.id)]) + areas = self.env[self._name].search([("kind", "=", rec.id)]) if areas: raise ValidationError(_("Can't delete used Area Type")) else: @@ -284,7 +285,7 @@ def write(self, vals): """ for rec in self: external_identifier = self.env["ir.model.data"].search( - [("res_id", "=", rec.id), ("model", "=", "spp.area.kind")] + [("res_id", "=", rec.id), ("model", "=", _kind_model)] ) if external_identifier and external_identifier.name: vals = {} @@ -293,7 +294,7 @@ def write(self, vals): def update_parent(self): for rec in self: if rec.parent_name and rec.parent_code: - parent_id = self.env["spp.area.kind"].search( + parent_id = self.env[_kind_model].search( [ ("code", "=", rec.parent_code), ], diff --git a/spp_area/models/area_import.py b/spp_area_base/models/area_import.py similarity index 88% rename from spp_area/models/area_import.py rename to spp_area_base/models/area_import.py index 4641ce13c..14f7485cb 100644 --- a/spp_area/models/area_import.py +++ b/spp_area_base/models/area_import.py @@ -12,11 +12,15 @@ from odoo.addons.queue_job.delay import group _logger = logging.getLogger(__name__) +_area_import_raw_model = "spp.area.import.raw" +_res_lang_model = "res.lang" +_area_import_channel = "root.area_import" class OpenSPPAreaImport(models.Model): _name = "spp.area.import" _description = "Areas Import Table" + _users_model = "res.users" MIN_ROW_JOB_QUEUE = 400 @@ -40,12 +44,12 @@ class OpenSPPAreaImport(models.Model): excel_file = fields.Binary("Area Excel File") date_uploaded = fields.Datetime() - upload_id = fields.Many2one("res.users", "Uploaded by") + upload_id = fields.Many2one(_users_model, "Uploaded by") date_imported = fields.Datetime() - import_id = fields.Many2one("res.users", "Imported by") + import_id = fields.Many2one(_users_model, "Imported by") date_validated = fields.Datetime() - validate_id = fields.Many2one("res.users", "Validated by") - raw_data_ids = fields.One2many("spp.area.import.raw", "area_import_id", "Raw Data") + validate_id = fields.Many2one(_users_model, "Validated by") + raw_data_ids = fields.One2many(_area_import_raw_model, "area_import_id", "Raw Data") tot_rows_imported = fields.Integer( "Total Rows Imported", compute="_compute_get_total_rows", @@ -93,7 +97,7 @@ def _compute_get_total_rows(self): """ for rec in self: tot_rows_imported = len(rec.raw_data_ids) - tot_rows_error = self.env["spp.area.import.raw"].search( + tot_rows_error = self.env[_area_import_raw_model].search( [("id", "in", rec.raw_data_ids.ids), ("state", "=", "Error")] ) rec.update( @@ -124,7 +128,7 @@ def get_column_indexes(self, columns, area_level): default_lang = "en_US" default_iso_code = default_lang.split("_")[0].upper() - active_languages = self.env["res.lang"].search([("active", "=", True)]) + active_languages = self.env[_res_lang_model].search([("active", "=", True)]) if not active_languages: raise ValidationError(_("No active language found.")) @@ -194,7 +198,7 @@ def get_area_vals(self, column_indexes, row, sheet, area_level): def create_import_raw(self, vals, column_indexes, row, sheet): self.ensure_one() - import_raw_id = self.env["spp.area.import.raw"].create(vals) + import_raw_id = self.env[_area_import_raw_model].create(vals) for lang_code in column_indexes["name_indexes"]: lang_name = sheet.cell(row, column_indexes["name_indexes"][lang_code]).value import_raw_id.with_context(lang=lang_code).write( @@ -224,7 +228,7 @@ def check_all_languages_activated(self, columns, area_level): """ self.ensure_one() prefix = f"ADM{area_level}_" - active_langs = self.env["res.lang"].search([("active", "=", True)]).mapped("iso_code") + active_langs = self.env[_res_lang_model].search([("active", "=", True)]).mapped("iso_code") for col in columns: if col.startswith(prefix): @@ -273,14 +277,14 @@ def import_data(self): start = i * 1000 end = min((i + 1) * 1000, sheet.nrows) jobs.append( - self.delayable(channel="root.area_import")._import_data( + self.delayable(channel=_area_import_channel)._import_data( sheet_name, column_indexes, start, end, area_level ) ) main_job = group(*jobs) - main_job.on_done(self.delayable(channel="root.area_import")._async_mark_done()) + main_job.on_done(self.delayable(channel=_area_import_channel)._async_mark_done()) main_job.delay() def _import_data(self, sheet_name, column_indexes, start, end, area_level): @@ -320,9 +324,9 @@ def validate_raw_data(self): for i in range(batches): start = i * 1000 end = min((i + 1) * 1000, len(rec.raw_data_ids)) - jobs.append(rec.delayable(channel="root.area_import")._validate_raw_data(rec.raw_data_ids[start:end])) + jobs.append(rec.delayable(channel=_area_import_channel)._validate_raw_data(rec.raw_data_ids[start:end])) main_job = group(*jobs) - main_job.on_done(rec.delayable(channel="root.area_import")._validate_mark_done()) + main_job.on_done(rec.delayable(channel=_area_import_channel)._validate_mark_done()) main_job.delay() def _validate_raw_data(self, raw_data_ids): @@ -336,7 +340,7 @@ def _validate_mark_done(self): self.locked = False self.locked_reason = None self.ensure_one() - if not self.env["spp.area.import.raw"].search([("id", "in", self.raw_data_ids.ids), ("state", "=", "Error")]): + if not self.env[_area_import_raw_model].search([("id", "in", self.raw_data_ids.ids), ("state", "=", "Error")]): self.update( { "state": self.VALIDATED, @@ -353,10 +357,10 @@ def fix_area_level_and_kind(self): start = i * 1000 end = min((i + 1) * 1000, len(rec.raw_data_ids)) jobs.append( - rec.delayable(channel="root.area_import")._fix_area_level_and_kind(rec.raw_data_ids[start:end]) + rec.delayable(channel=_area_import_channel)._fix_area_level_and_kind(rec.raw_data_ids[start:end]) ) main_job = group(*jobs) - main_job.on_done(rec.delayable(channel="root.area_import")._async_mark_done()) + main_job.on_done(rec.delayable(channel=_area_import_channel)._async_mark_done()) main_job.delay() def _fix_area_level_and_kind(self, raw_data_ids): @@ -396,14 +400,14 @@ def _async_recursive_save_to_area(self, raw_data_ids): """ self.ensure_one() jobs = [] - jobs.append(self.delayable(channel="root.area_import")._save_to_area(raw_data_ids[:1000])) + jobs.append(self.delayable(channel=_area_import_channel)._save_to_area(raw_data_ids[:1000])) main_job = group(*jobs) count = len(raw_data_ids) if count <= 1000: - main_job.on_done(self.delayable(channel="root.area_import")._save_to_area_mark_done()) + main_job.on_done(self.delayable(channel=_area_import_channel)._save_to_area_mark_done()) else: main_job.on_done( - self.delayable(channel="root.area_import")._async_recursive_save_to_area(raw_data_ids[1000:]) + self.delayable(channel=_area_import_channel)._async_recursive_save_to_area(raw_data_ids[1000:]) ) main_job.delay() @@ -419,7 +423,7 @@ def _save_to_area_mark_done(self): self.ensure_one() self.locked = False self.locked_reason = None - if not self.env["spp.area.import.raw"].search( + if not self.env[_area_import_raw_model].search( [("id", "in", self.raw_data_ids.ids), ("state", "=", "Validated")] ): self.update( @@ -443,9 +447,10 @@ def refresh_page(self): # Assets Import Raw Data class OpenSPPAreaImportActivities(models.Model): - _name = "spp.area.import.raw" + _name = _area_import_raw_model _description = "Area Import Raw Data" _order = "level" + _area_model = "spp.area" NEW = "New" VALIDATED = "Validated" @@ -461,7 +466,7 @@ class OpenSPPAreaImportActivities(models.Model): (POSTED, POSTED), ] - STATE_ORDER = { + STATE_ORDER_STATE = { ERROR: 0, NEW: 1, VALIDATED: 2, @@ -490,12 +495,12 @@ class OpenSPPAreaImportActivities(models.Model): compute="_compute_state_order", store=True, ) - area_id = fields.Many2one("spp.area", "Area", readonly=True) + area_id = fields.Many2one(_area_model, "Area", readonly=True) @api.depends("state") def _compute_state_order(self): for rec in self: - rec.state_order = self.STATE_ORDER[rec.state] + rec.state_order = self.STATE_ORDER_STATE[rec.state] def check_errors(self): self.ensure_one() @@ -540,7 +545,7 @@ def get_area_vals(self): parent_id = None if self.parent_name and self.parent_code: parent_id = ( - self.env["spp.area"] + self.env[self._area_model] .search( [ ("code", "=", self.parent_code), @@ -562,7 +567,7 @@ def get_area_vals(self): "draft_name": self.admin_name, "code": self.admin_code, "area_sqkm": area_sqkm, - "kind": self.env.ref("spp_area.admin_area_kind").id, + "kind": self.env.ref("spp_area_base.admin_area_kind").id, } def save_to_area(self): @@ -570,15 +575,15 @@ def save_to_area(self): The function saves data to the "spp.area" model in the database, updating existing records if they exist and creating new records if they don't. """ - active_languages = self.env["res.lang"].search([("active", "=", True)]) + active_languages = self.env[_res_lang_model].search([("active", "=", True)]) for rec in self: area_vals = rec.get_area_vals() - if area_id := self.env["spp.area"].search([("code", "=", rec.admin_code)]): + if area_id := self.env[self._area_model].search([("code", "=", rec.admin_code)]): state = self.UPDATED area_id.update(area_vals) else: state = self.POSTED - area_id = self.env["spp.area"].create(area_vals) + area_id = self.env[self._area_model].create(area_vals) for lang in active_languages: area_id.with_context(lang=lang.code).write( @@ -603,7 +608,7 @@ def fix_area_level_and_kind(self): parent_id = None if rec.parent_name and rec.parent_code: parent_id = ( - self.env["spp.area"] + self.env[self._area_model] .search( [ ("code", "=", rec.parent_code), @@ -614,7 +619,7 @@ def fix_area_level_and_kind(self): ) rec.area_id.update( { - "kind": rec.env.ref("spp_area.admin_area_kind").id, + "kind": rec.env.ref("spp_area_base.admin_area_kind").id, "parent_id": parent_id, } ) diff --git a/spp_area_base/pyproject.toml b/spp_area_base/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/spp_area_base/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/spp_area_base/readme/DESCRIPTION.md b/spp_area_base/readme/DESCRIPTION.md new file mode 100644 index 000000000..4e61ab52f --- /dev/null +++ b/spp_area_base/readme/DESCRIPTION.md @@ -0,0 +1,36 @@ +# OpenSPP Area (Base) + +This document describes the **OpenSPP Area (Base)** module, which extends the OpenSPP framework by providing features to manage and organize geographical areas within the system. It integrates with the core registry modules to allow associating registrants and other data with specific locations. + +## Purpose + +The **OpenSPP Area (Base)** module is designed to: + +* **Define and Structure Geographical Areas**: Establish a hierarchical structure for representing administrative regions, from the highest level (e.g., country) down to the most granular level (e.g., village). +* **Manage Area Information**: Store key details about each area, including its name, code, alternate names, geographical size, and parent-child relationships within the hierarchy. +* **Associate Registrants with Areas**: Enable the linking of individual and group registrants to specific areas, facilitating location-based targeting, analysis, and program implementation. + +## Dependencies and Integration + +1. **Queue Job ([queue_job](queue_job))**: Leverages the **Queue Job** module for background processing of large data imports, improving performance and user experience. This is particularly beneficial when importing extensive area hierarchies from external sources. + +## Additional Functionality + +* **Hierarchical Area Structure ([spp.area](spp.area))**: + * Introduces a dedicated model for managing areas, allowing for the creation of multi-level administrative boundaries with parent-child relationships. + * Computes and displays the complete area path (e.g., "Country > Province > District > Village") to provide clear context within the hierarchy. + * Enforces unique codes for each area to ensure proper identification and prevent duplicates. + +* **Area Types ([spp.area.kind](spp.area.kind))**: + * Includes a model for defining and managing different types of areas (e.g., administrative regions, ecological zones, project implementation areas). + * Allows for the creation of a hierarchy of area types, providing further categorization and flexibility. + +* **Area Import Functionality**: + * Provides tools for importing area data in bulk from Excel files, streamlining the process of populating the area hierarchy. + * Implements validation rules during the import process to ensure data integrity, such as checking for required fields, data types, and hierarchical consistency. + * Utilizes the Queue Job module to perform data validation and import operations in the background, preventing performance issues and providing a smoother user experience. + * Ability to localize the name of the imported area. + +## Conclusion + +The **OpenSPP Area** module enhances the OpenSPP platform by providing a robust and flexible system for managing geographical areas and linking them to registrant data. Its integration with the core registry modules ensures that location information is seamlessly incorporated into the overall system, supporting location-based targeting, analysis, and program management for social protection programs and farmer registries. diff --git a/spp_area_base/security/ir.model.access.csv b/spp_area_base/security/ir.model.access.csv new file mode 100644 index 000000000..9c5494fc8 --- /dev/null +++ b/spp_area_base/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +spp_area_sysadmin,Area Admin Access,spp_area_base.model_spp_area,base.group_system,1,1,1,1 +spp_area_import_sysadmin,Area Import Admin Access,spp_area_base.model_spp_area_import,base.group_system,1,1,1,1 +spp_area_import_raw_sysadmin,Area Import Raw Admin Access,spp_area_base.model_spp_area_import_raw,base.group_system,1,1,1,1 +spp_area_kind_sysadmin,Area Kind Admin Access,spp_area_base.model_spp_area_kind,base.group_system,1,1,1,1 diff --git a/spp_area_base/static/description/icon.png b/spp_area_base/static/description/icon.png new file mode 100644 index 000000000..35f8fec26 Binary files /dev/null and b/spp_area_base/static/description/icon.png differ diff --git a/spp_area_base/static/description/icon_area.png b/spp_area_base/static/description/icon_area.png new file mode 100644 index 000000000..b179b8ce3 Binary files /dev/null and b/spp_area_base/static/description/icon_area.png differ diff --git a/spp_area_base/static/description/index.html b/spp_area_base/static/description/index.html new file mode 100644 index 000000000..6465181a1 --- /dev/null +++ b/spp_area_base/static/description/index.html @@ -0,0 +1,482 @@ + + + + + +OpenSPP Area Management + + + +
+

OpenSPP Area Management

+ + +

Production/Stable License: LGPL-3 OpenSPP/openspp-modules

+
+

OpenSPP Area

+

This document describes the OpenSPP Area module, which extends the +OpenSPP framework by providing features to manage and organize +geographical areas within the system. It integrates with the core +registry modules to allow associating registrants and other data with +specific locations.

+
+

Purpose

+

The OpenSPP Area module is designed to:

+
    +
  • Define and Structure Geographical Areas: Establish a hierarchical +structure for representing administrative regions, from the highest +level (e.g., country) down to the most granular level (e.g., +village).
  • +
  • Manage Area Information: Store key details about each area, +including its name, code, alternate names, geographical size, and +parent-child relationships within the hierarchy.
  • +
  • Associate Registrants with Areas: Enable the linking of +individual and group registrants to specific areas, facilitating +location-based targeting, analysis, and program implementation.
  • +
+
+
+

Dependencies and Integration

+
    +
  1. G2P Registry: Base +(g2p_registry_base): The Area +module utilizes the Districts (g2p.district) feature from the +G2P Registry: Base module as a foundation. It extends this +concept to create a more comprehensive and flexible system for +managing area data.
  2. +
  3. G2P Registry: Individual +(g2p_registry_individual): +Integrates with the Individual module by adding a dedicated “Area” +field to the individual registrant form. This field allows users to +assign a specific area to each individual, linking registrant data to +geographical locations.
  4. +
  5. G2P Registry: Group +(g2p_registry_group): Similar to +the Individual module integration, this module incorporates an “Area” +field into the group registrant form, enabling the association of +groups with specific areas.
  6. +
  7. Queue Job (queue_job): Leverages the +Queue Job module for background processing of large data imports, +improving performance and user experience. This is particularly +beneficial when importing extensive area hierarchies from external +sources.
  8. +
+
+
+

Additional Functionality

+
    +
  • Hierarchical Area Structure (spp.area):
      +
    • Introduces a dedicated model for managing areas, allowing for the +creation of multi-level administrative boundaries with +parent-child relationships.
    • +
    • Computes and displays the complete area path (e.g., “Country > +Province > District > Village”) to provide clear context within +the hierarchy.
    • +
    • Enforces unique codes for each area to ensure proper +identification and prevent duplicates.
    • +
    +
  • +
  • Area Types (spp.area.kind):
      +
    • Includes a model for defining and managing different types of +areas (e.g., administrative regions, ecological zones, project +implementation areas).
    • +
    • Allows for the creation of a hierarchy of area types, providing +further categorization and flexibility.
    • +
    +
  • +
  • Area Import Functionality:
      +
    • Provides tools for importing area data in bulk from Excel files, +streamlining the process of populating the area hierarchy.
    • +
    • Implements validation rules during the import process to ensure +data integrity, such as checking for required fields, data types, +and hierarchical consistency.
    • +
    • Utilizes the Queue Job module to perform data validation and +import operations in the background, preventing performance issues +and providing a smoother user experience.
    • +
    • Ability to localize the name of the imported area.
    • +
    +
  • +
+
+
+

Conclusion

+

The OpenSPP Area module enhances the OpenSPP platform by providing a +robust and flexible system for managing geographical areas and linking +them to registrant data. Its integration with the core registry modules +ensures that location information is seamlessly incorporated into the +overall system, supporting location-based targeting, analysis, and +program management for social protection programs and farmer registries.

+

Table of contents

+
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • OpenSPP.org
  • +
+
+
+

Maintainers

+

Current maintainers:

+

jeremi gonzalesedwin1123 reichie020212

+

This module is part of the OpenSPP/openspp-modules project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/spp_area_base/static/src/img/icons/contacts.png b/spp_area_base/static/src/img/icons/contacts.png new file mode 100644 index 000000000..8582a80b5 Binary files /dev/null and b/spp_area_base/static/src/img/icons/contacts.png differ diff --git a/spp_area_base/tests/__init__.py b/spp_area_base/tests/__init__.py new file mode 100644 index 000000000..2bb125bfe --- /dev/null +++ b/spp_area_base/tests/__init__.py @@ -0,0 +1,6 @@ +# Part of OpenG2P Registry. See LICENSE file for full copyright and licensing details. + +from . import common +from . import test_area +from . import test_area_import +from . import test_area_import_raw diff --git a/spp_area_base/tests/common.py b/spp_area_base/tests/common.py new file mode 100644 index 000000000..3213bb138 --- /dev/null +++ b/spp_area_base/tests/common.py @@ -0,0 +1,51 @@ +import base64 +import os + +from odoo.tests.common import TransactionCase + + +class AreaImportBaseTestMixin(TransactionCase): + @staticmethod + def get_file_path_irq(): + return f"{os.path.dirname(os.path.abspath(__file__))}/irq_adminboundaries_tabulardata.xlsx" + + @staticmethod + def get_file_path_pse(): + return f"{os.path.dirname(os.path.abspath(__file__))}/pse_adminboundaries_tabulardata.xlsx" + + @classmethod + def setUpClass(cls): + super().setUpClass() + # Greater than or equal to 400 rows + xls_file = None + xls_file_name = None + + file_path = cls.get_file_path_irq() + with open(file_path, "rb") as f: + xls_file_name = f.name + xls_file = base64.b64encode(f.read()) + + cls.area_import_id = cls.env["spp.area.import"].create( + { + "excel_file": xls_file, + "name": xls_file_name, + "state": "Uploaded", + } + ) + + # Less than 400 rows + xls_file_2 = None + xls_file_name_2 = None + + file_path_2 = cls.get_file_path_pse() + with open(file_path_2, "rb") as f: + xls_file_name_2 = f.name + xls_file_2 = base64.b64encode(f.read()) + + cls.area_import_id_2 = cls.env["spp.area.import"].create( + { + "excel_file": xls_file_2, + "name": xls_file_name_2, + "state": "Uploaded", + } + ) diff --git a/spp_area_base/tests/irq_adminboundaries_tabulardata.xlsx b/spp_area_base/tests/irq_adminboundaries_tabulardata.xlsx new file mode 100644 index 000000000..7e6599836 Binary files /dev/null and b/spp_area_base/tests/irq_adminboundaries_tabulardata.xlsx differ diff --git a/spp_area_base/tests/pse_adminboundaries_tabulardata.xlsx b/spp_area_base/tests/pse_adminboundaries_tabulardata.xlsx new file mode 100644 index 000000000..204ead273 Binary files /dev/null and b/spp_area_base/tests/pse_adminboundaries_tabulardata.xlsx differ diff --git a/spp_area_base/tests/test_area.py b/spp_area_base/tests/test_area.py new file mode 100644 index 000000000..4b3e40f08 --- /dev/null +++ b/spp_area_base/tests/test_area.py @@ -0,0 +1,32 @@ +# Part of OpenG2P Registry. See LICENSE file for full copyright and licensing details. + +import logging + +from odoo.tests.common import TransactionCase + +_logger = logging.getLogger(__name__) + + +# @tagged("post_install", "-at_install") +class BaseAreaTest(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + # Initial Setup of Variables + cls.area_1 = cls.env["spp.area"].create( + { + "draft_name": "Testing Area", + } + ) + cls.area_1_child = cls.env["spp.area"].create( + { + "draft_name": "Testing Area Child", + "parent_id": cls.area_1.id, + } + ) + + def test_01_check_childs(self): + self.area_1._compute_get_childs() + + self.assertEqual(len(self.area_1.child_ids), 1) diff --git a/spp_area_base/tests/test_area_import.py b/spp_area_base/tests/test_area_import.py new file mode 100644 index 000000000..04dc481d1 --- /dev/null +++ b/spp_area_base/tests/test_area_import.py @@ -0,0 +1,54 @@ +import logging + +from odoo.exceptions import ValidationError + +from .common import AreaImportBaseTestMixin + +_logger = logging.getLogger(__name__) + + +class BaseAreaImportTest(AreaImportBaseTestMixin): + def test_01_cancel_area_import(self): + self.area_import_id.cancel_import() + + self.assertEqual(self.area_import_id.state, "Cancelled") + + def test_02_reset_to_uploaded_area(self): + self.area_import_id.reset_to_uploaded() + + self.assertEqual(self.area_import_id.state, "Uploaded") + + def test_03_import_area_data(self): + with self.assertRaises(ValidationError): + self.area_import_id.import_data() + + lang = self.env["res.lang"].with_context(active_test=False).search([("iso_code", "=", "ar")]) + lang.active = True + + self.area_import_id.import_data() + raw_area_data_ids = self.area_import_id.raw_data_ids + + self.assertEqual(len(raw_area_data_ids.ids), self.area_import_id.tot_rows_imported) + self.assertEqual(0, self.area_import_id.tot_rows_error) + self.assertEqual(self.area_import_id.state, "Uploaded") + self.assertEqual( + len(self.env["spp.area.import.raw"].search([("id", "in", raw_area_data_ids.ids), ("state", "=", "New")])), + self.area_import_id.tot_rows_imported, + ) + + def test_06_reload_page(self): + action = self.area_import_id.refresh_page() + + self.assertEqual( + action, + { + "type": "ir.actions.client", + "tag": "reload", + }, + ) + + def test_07_async_mark_import_done(self): + self.area_import_id._async_mark_done() + + self.assertFalse(self.area_import_id.locked) + self.assertFalse(self.area_import_id.locked_reason) diff --git a/spp_area_base/tests/test_area_import_raw.py b/spp_area_base/tests/test_area_import_raw.py new file mode 100644 index 000000000..8a4d29d9e --- /dev/null +++ b/spp_area_base/tests/test_area_import_raw.py @@ -0,0 +1,75 @@ +from .common import AreaImportBaseTestMixin + + +class BaseAreaImportRawTest(AreaImportBaseTestMixin): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.area_import_raw_data_id = cls.env["spp.area.import.raw"].create( + { + "area_import_id": cls.area_import_id.id, + "admin_name": "Philippines", + "admin_code": "PH", + "parent_name": "", + "parent_code": "", + "level": 0, + "area_sqkm": "194000.23", + } + ) + + cls.area_import_raw_data_child_id = cls.env["spp.area.import.raw"].create( + { + "area_import_id": cls.area_import_id.id, + "admin_name": "Manila", + "admin_code": "MNL", + "parent_name": "Philippines", + "parent_code": "PH", + "level": 1, + "area_sqkm": "200.23", + } + ) + + def test_01_validate_import_raw_data_no_error(self): + result = self.area_import_raw_data_id.validate_raw_data() + result_child = self.area_import_raw_data_child_id.validate_raw_data() + + self.assertFalse(result) + self.assertEqual(self.area_import_raw_data_id.state, "Validated") + self.assertEqual(self.area_import_raw_data_id.remarks, "No Error") + + self.assertFalse(result_child) + self.assertEqual(self.area_import_raw_data_child_id.state, "Validated") + self.assertEqual(self.area_import_raw_data_child_id.remarks, "No Error") + + def test_02_validate_import_raw_data_with_error(self): + self.area_import_raw_data_id.admin_name = "" + self.area_import_raw_data_id.area_sqkm = "text" + self.area_import_raw_data_id.parent_name = "MNL" + self.area_import_raw_data_child_id.parent_name = "" + + self.area_import_raw_data_id.validate_raw_data() + self.area_import_raw_data_child_id.validate_raw_data() + + self.assertEqual(self.area_import_raw_data_id.state, "Error") + self.assertIn("Name and Code of area is required.", self.area_import_raw_data_id.remarks) + self.assertIn("AREA_SQKM should be numerical.", self.area_import_raw_data_id.remarks) + self.assertIn( + "Level 0 area should not have a parent name and parent code.", + self.area_import_raw_data_id.remarks, + ) + + self.assertEqual(self.area_import_raw_data_child_id.state, "Error") + self.assertIn( + "Level 1 and above area should have a parent name and parent code.", + self.area_import_raw_data_child_id.remarks, + ) + + def test_03_save_import_to_area(self): + self.area_import_raw_data_id.area_sqkm = "" + + self.area_import_raw_data_id.save_to_area() + self.assertEqual(self.area_import_raw_data_id.state, "Posted") + + self.area_import_raw_data_id.save_to_area() + self.assertEqual(self.area_import_raw_data_id.state, "Updated") diff --git a/spp_area/views/area.xml b/spp_area_base/views/area.xml similarity index 98% rename from spp_area/views/area.xml rename to spp_area_base/views/area.xml index a2518bfd3..8cab508b4 100644 --- a/spp_area/views/area.xml +++ b/spp_area_base/views/area.xml @@ -178,7 +178,7 @@ @@ -189,8 +189,8 @@ id="menu_spparea" name="Area" action="action_spparea" - parent="spp_area.area_main_top_menu" + parent="spp_area_base.area_main_top_menu" sequence="105" - groups="g2p_registry_base.group_g2p_admin" + groups="base.group_system" /> diff --git a/spp_area/views/area_import_views.xml b/spp_area_base/views/area_import_views.xml similarity index 99% rename from spp_area/views/area_import_views.xml rename to spp_area_base/views/area_import_views.xml index 7e3992e80..eb4245506 100644 --- a/spp_area/views/area_import_views.xml +++ b/spp_area_base/views/area_import_views.xml @@ -252,7 +252,7 @@ action="action_view_spparea_import" parent="area_main_top_menu" sequence="106" - groups="g2p_registry_base.group_g2p_admin" + groups="base.group_system" /> diff --git a/spp_area/views/area_kind.xml b/spp_area_base/views/area_kind.xml similarity index 95% rename from spp_area/views/area_kind.xml rename to spp_area_base/views/area_kind.xml index 0ea689c16..88a5030e3 100644 --- a/spp_area/views/area_kind.xml +++ b/spp_area_base/views/area_kind.xml @@ -51,8 +51,8 @@ id="menu_spparea_kind" name="Area Type" action="action_spparea_kind" - parent="spp_area.area_main_top_menu" + parent="spp_area_base.area_main_top_menu" sequence="110" - groups="g2p_registry_base.group_g2p_admin" + groups="base.group_system" /> diff --git a/spp_area_gis/views/area.xml b/spp_area_gis/views/area.xml index 964aa86ad..04e86f61c 100644 --- a/spp_area_gis/views/area.xml +++ b/spp_area_gis/views/area.xml @@ -3,7 +3,7 @@ custom_view_spparea_form spp.area - + @@ -60,7 +60,7 @@ - + tree,form,gis diff --git a/spp_change_request/security/ir.model.access.csv b/spp_change_request/security/ir.model.access.csv index 19719064a..bf690a71d 100644 --- a/spp_change_request/security/ir.model.access.csv +++ b/spp_change_request/security/ir.model.access.csv @@ -26,7 +26,7 @@ spp_change_request_validation_stage_validator,Change Request Validation Stage Va spp_change_request_group_members_validator,Change Request Group Membership Validator Access,spp_change_request.model_spp_change_request_group_members,spp_change_request.group_spp_change_request_validator,1,0,0,0 spp_change_request_user_assign_wizard_validator,Change Request User Assignment Validator Access,spp_change_request.model_spp_change_request_user_assign_wizard,spp_change_request.group_spp_change_request_validator,1,1,1,1 spp_change_request_reject_wizard_validator,Change Request Reject Validator Access,spp_change_request.model_spp_change_request_reject_wizard,spp_change_request.group_spp_change_request_validator,1,1,1,1 -spp_change_request_area_validator,SPP-CR Area Validator Access,spp_area.model_spp_area,spp_change_request.group_spp_change_request_validator,1,0,0,0 +spp_change_request_area_validator,SPP-CR Area Validator Access,spp_area_base.model_spp_area,spp_change_request.group_spp_change_request_validator,1,0,0,0 spp_change_request_service_point_validator,SPP-CR Service Point Validator Access,spp_service_points.model_spp_service_point,spp_change_request.group_spp_change_request_validator,1,0,0,0 spp_change_request_g2p_group_membership_validator,G2P Group Membership Validator Access,g2p_registry_membership.model_g2p_group_membership,spp_change_request.group_spp_change_request_validator,1,1,1,0 spp_change_request_g2p_group_membership_kind_validator,G2P Group Membership Kind Validator Access,g2p_registry_membership.model_g2p_group_membership_kind,spp_change_request.group_spp_change_request_validator,1,0,0,0 @@ -52,7 +52,7 @@ spp_change_request_validation_stage_hq_validator,Change Request HQ Validator Sta spp_change_request_group_members_hq_validator,Change Request Group Membership HQ Validator Access,spp_change_request.model_spp_change_request_group_members,spp_change_request.group_spp_change_request_hq_validator,1,0,0,0 spp_change_request_user_assign_wizard_hq_validator,Change Request User Assignment HQ Validator Access,spp_change_request.model_spp_change_request_user_assign_wizard,spp_change_request.group_spp_change_request_hq_validator,1,1,1,1 spp_change_request_reject_wizard_hq_validator,Change Request Reject HQ Validator Access,spp_change_request.model_spp_change_request_reject_wizard,spp_change_request.group_spp_change_request_hq_validator,1,1,1,1 -spp_change_request_area_hq_validator,SPP-CR Area HQ Validator Access,spp_area.model_spp_area,spp_change_request.group_spp_change_request_hq_validator,1,1,0,0 +spp_change_request_area_hq_validator,SPP-CR Area HQ Validator Access,spp_area_base.model_spp_area,spp_change_request.group_spp_change_request_hq_validator,1,1,0,0 spp_change_request_service_point_hq_validator,SPP-CR Service Point HQ Validator Access,spp_service_points.model_spp_service_point,spp_change_request.group_spp_change_request_hq_validator,1,0,0,0 spp_change_request_g2p_group_membership_hq_validator,G2P Group Membership HQ Validator Access,g2p_registry_membership.model_g2p_group_membership,spp_change_request.group_spp_change_request_hq_validator,1,1,1,0 spp_change_request_g2p_group_membership_kind_hq_validator,G2P Group Membership Kind HQ Validator Access,g2p_registry_membership.model_g2p_group_membership_kind,spp_change_request.group_spp_change_request_hq_validator,1,0,0,0 @@ -78,7 +78,7 @@ spp_change_request_validation_stage_administrator,Change Request Validation Stag spp_change_request_group_members_administrator,Change Request Group Membership Administrator Access,spp_change_request.model_spp_change_request_group_members,spp_change_request.group_spp_change_request_administrator,1,1,1,1 spp_change_request_user_assign_wizard_administrator,Change Request User Assignment Administrator Access,spp_change_request.model_spp_change_request_user_assign_wizard,spp_change_request.group_spp_change_request_administrator,1,1,1,1 spp_change_request_reject_wizard_administrator,Change Request Reject Administrator Access,spp_change_request.model_spp_change_request_reject_wizard,spp_change_request.group_spp_change_request_administrator,1,1,1,1 -spp_change_request_area_administrator,SPP-CR Area Administrator Access,spp_area.model_spp_area,spp_change_request.group_spp_change_request_administrator,1,0,0,0 +spp_change_request_area_administrator,SPP-CR Area Administrator Access,spp_area_base.model_spp_area,spp_change_request.group_spp_change_request_administrator,1,0,0,0 spp_change_request_service_point_administrator,SPP-CR Service Point Administrator Access,spp_service_points.model_spp_service_point,spp_change_request.group_spp_change_request_administrator,1,0,0,0 spp_change_request_g2p_group_membership_administrator,G2P Group Membership Administrator Access,g2p_registry_membership.model_g2p_group_membership,spp_change_request.group_spp_change_request_administrator,1,1,1,0 spp_change_request_g2p_group_membership_kind_administrator,G2P Group Membership Kind Administrator Access,g2p_registry_membership.model_g2p_group_membership_kind,spp_change_request.group_spp_change_request_administrator,1,0,0,0 @@ -104,7 +104,7 @@ spp_change_request_validation_stage_applicator,Change Request Validation Stage A spp_change_request_group_members_applicator,Change Request Group Membership Applicator Access,spp_change_request.model_spp_change_request_group_members,spp_change_request.group_spp_change_request_applicator,1,0,0,0 spp_change_request_user_assign_wizard_applicator,Change Request User Assignment Applicator Access,spp_change_request.model_spp_change_request_user_assign_wizard,spp_change_request.group_spp_change_request_applicator,1,1,1,1 spp_change_request_reject_wizard_applicator,Change Request Reject Applicator Access,spp_change_request.model_spp_change_request_reject_wizard,spp_change_request.group_spp_change_request_applicator,1,1,1,1 -spp_change_request_area_applicator,SPP-CR Area Applicator Access,spp_area.model_spp_area,spp_change_request.group_spp_change_request_applicator,1,1,0,0 +spp_change_request_area_applicator,SPP-CR Area Applicator Access,spp_area_base.model_spp_area,spp_change_request.group_spp_change_request_applicator,1,1,0,0 spp_change_request_service_point_applicator,SPP-CR Service Point Applicator Access,spp_service_points.model_spp_service_point,spp_change_request.group_spp_change_request_applicator,1,0,0,0 spp_change_request_g2p_group_membership_applicator,G2P Group Membership Applicator Access,g2p_registry_membership.model_g2p_group_membership,spp_change_request.group_spp_change_request_applicator,1,1,1,0 spp_change_request_g2p_group_membership_kind_applicator,G2P Group Membership Kind Applicator Access,g2p_registry_membership.model_g2p_group_membership_kind,spp_change_request.group_spp_change_request_applicator,1,0,0,0 @@ -128,7 +128,7 @@ spp_change_request_validators_agent,Change Request Validators Agent Access,spp_c spp_change_request_validation_sequence_agent,Change Request Validation Sequence Agent Access,spp_change_request.model_spp_change_request_validation_sequence,spp_change_request.group_spp_change_request_agent,1,1,1,0 spp_change_request_validation_stage_agent,Change Request Validation Stage Agent Access,spp_change_request.model_spp_change_request_validation_stage,spp_change_request.group_spp_change_request_agent,1,0,0,0 spp_change_request_group_members_agent,Change Request Group Membership Agent Access,spp_change_request.model_spp_change_request_group_members,spp_change_request.group_spp_change_request_agent,1,1,1,1 -spp_change_request_area_agent,SPP-CR Area Agent Access,spp_area.model_spp_area,spp_change_request.group_spp_change_request_agent,1,0,0,0 +spp_change_request_area_agent,SPP-CR Area Agent Access,spp_area_base.model_spp_area,spp_change_request.group_spp_change_request_agent,1,0,0,0 spp_change_request_service_point_agent,SPP-CR Service Point Agent Access,spp_service_points.model_spp_service_point,spp_change_request.group_spp_change_request_agent,1,0,0,0 spp_change_request_g2p_group_membership_agent,G2P Group Membership Agent Access,g2p_registry_membership.model_g2p_group_membership,spp_change_request.group_spp_change_request_agent,1,0,0,0 spp_change_request_g2p_group_membership_kind_agent,G2P Group Membership Kind Agent Access,g2p_registry_membership.model_g2p_group_membership_kind,spp_change_request.group_spp_change_request_agent,1,0,0,0 diff --git a/spp_eligibility_tags/models/eligibility_manager.py b/spp_eligibility_tags/models/eligibility_manager.py index bb8ead823..e8224678c 100644 --- a/spp_eligibility_tags/models/eligibility_manager.py +++ b/spp_eligibility_tags/models/eligibility_manager.py @@ -29,7 +29,7 @@ class TagBasedEligibilityManager(models.Model): tags_id = fields.Many2one("g2p.registrant.tags", string="Tags") area_id = fields.Many2one( "spp.area", - domain=lambda self: [("kind", "=", self.env.ref("spp_area.admin_area_kind").id)], + domain=lambda self: [("kind", "=", self.env.ref("spp_area_base.admin_area_kind").id)], ) custom_domain = fields.Text(string="Tags Domain", default="[]", readonly=True, compute="_compute_custom_domain") diff --git a/spp_eligibility_tags/tests/test_eligibility_manager.py b/spp_eligibility_tags/tests/test_eligibility_manager.py index c5c7eb72c..cac5380d8 100644 --- a/spp_eligibility_tags/tests/test_eligibility_manager.py +++ b/spp_eligibility_tags/tests/test_eligibility_manager.py @@ -34,7 +34,7 @@ def setUpClass(cls): cls.area_id = cls.env["spp.area"].create( { "code": "101-1", - "kind": cls.env.ref("spp_area.admin_area_kind").id, + "kind": cls.env.ref("spp_area_base.admin_area_kind").id, "draft_name": "1", } ) diff --git a/spp_eligibility_tags/wizard/create_program_wizard.py b/spp_eligibility_tags/wizard/create_program_wizard.py index 5066133f6..b9daf2077 100644 --- a/spp_eligibility_tags/wizard/create_program_wizard.py +++ b/spp_eligibility_tags/wizard/create_program_wizard.py @@ -19,7 +19,7 @@ class SPPCreateNewProgramWiz(models.TransientModel): tags_id = fields.Many2one("g2p.registrant.tags", string="Tags") area_id = fields.Many2one( "spp.area", - domain=lambda self: [("kind", "=", self.env.ref("spp_area.admin_area_kind").id)], + domain=lambda self: [("kind", "=", self.env.ref("spp_area_base.admin_area_kind").id)], ) custom_domain = fields.Text(string="Tags Domain", default="[]", readonly=True) diff --git a/spp_programs/models/managers/eligibility_manager.py b/spp_programs/models/managers/eligibility_manager.py index dffa0b669..a4e9d13d8 100644 --- a/spp_programs/models/managers/eligibility_manager.py +++ b/spp_programs/models/managers/eligibility_manager.py @@ -11,7 +11,7 @@ class SPPDefaultEligibilityManager(models.Model): @api.model def _get_admin_area_domain(self): - return [("kind", "=", self.env.ref("spp_area.admin_area_kind").id)] + return [("kind", "=", self.env.ref("spp_area_base.admin_area_kind").id)] admin_area_ids = fields.Many2many("spp.area", domain=_get_admin_area_domain) target_type = fields.Selection(related="program_id.target_type") diff --git a/spp_programs/security/ir.model.access.csv b/spp_programs/security/ir.model.access.csv index bab0fbd0b..fd9fd29e6 100644 --- a/spp_programs/security/ir.model.access.csv +++ b/spp_programs/security/ir.model.access.csv @@ -29,7 +29,7 @@ spp_programs_stock_location_program_manager,SPP Entitlement Stock Location Progr spp_programs_stock_route_program_manager,SPP Entitlement Stock Location Route Program Manager Access,stock.model_stock_route,g2p_programs.g2p_program_manager,1,0,0,0 spp_programs_stock_move_program_manager,SPP Entitlement Stock Move Program Manager Access,stock.model_stock_move,g2p_programs.g2p_program_manager,1,1,1,0 spp_programs_stock_rule_program_manager,SPP Entitlement Stock Rule Program Manager Access,stock.model_stock_rule,g2p_programs.g2p_program_manager,1,0,0,0 -spp_programs_spp_area_program_manager,SPP Area Program Manager Access,spp_area.model_spp_area,g2p_programs.g2p_program_manager,1,0,0,0 +spp_programs_spp_area_program_manager,SPP Area Program Manager Access,spp_area_base.model_spp_area,g2p_programs.g2p_program_manager,1,0,0,0 spp_programs_entitlement_inkind_program_validator,SPP Entitlement In-Kind Program Validator Access,spp_programs.model_g2p_entitlement_inkind,g2p_programs.g2p_program_validator,1,1,0,0 g2p_entitlement_inkind_report_wizard_program_validator,SPP Entitlement In-Kind Report Wizard Program Validator Access,spp_programs.model_g2p_entitlement_inkind_report_wizard,g2p_programs.g2p_program_validator,1,1,1,1 diff --git a/spp_programs/wizard/create_program_wizard.py b/spp_programs/wizard/create_program_wizard.py index bbe16353b..c00e91674 100644 --- a/spp_programs/wizard/create_program_wizard.py +++ b/spp_programs/wizard/create_program_wizard.py @@ -15,7 +15,7 @@ class SPPCreateNewProgramWiz(models.TransientModel): @api.model def _get_admin_area_domain(self): - return [("kind", "=", self.env.ref("spp_area.admin_area_kind").id)] + return [("kind", "=", self.env.ref("spp_area_base.admin_area_kind").id)] admin_area_ids = fields.Many2many("spp.area", domain=_get_admin_area_domain) diff --git a/spp_user_roles/security/ir.model.access.csv b/spp_user_roles/security/ir.model.access.csv index 0628ef75a..b6f7a91ff 100644 --- a/spp_user_roles/security/ir.model.access.csv +++ b/spp_user_roles/security/ir.model.access.csv @@ -1,5 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -spp_area_local_registrar,SPP Area Local Registrar Access,spp_area.model_spp_area,spp_user_roles.group_local_registrar,1,0,0,0 +spp_area_local_registrar,SPP Area Local Registrar Access,spp_area_base.model_spp_area,spp_user_roles.group_local_registrar,1,0,0,0 spp_res_users_local_registrar,SPP Users Local Registrar Access,base.model_res_users,spp_user_roles.group_local_registrar,1,0,0,0 spp_res_users_role_local_registrar,SPP Users Role Local Registrar Access,base_user_role.model_res_users_role,spp_user_roles.group_local_registrar,1,0,0,0 spp_res_users_role_line_local_registrar,SPP Users Role Lines Local Registrar Access,base_user_role.model_res_users_role_line,spp_user_roles.group_local_registrar,1,0,0,0