diff --git a/README.md b/README.md index ad42f599..6f2233ce 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -[![Pre-commit Status](https://github.com/openg2p/openg2p-program/actions/workflows/pre-commit.yml/badge.svg?branch=17.0-1.2)](https://github.com/openg2p/openg2p-program/actions/workflows/pre-commit.yml?query=branch%3A17.0-1.2) -[![Build Status](https://github.com/openg2p/openg2p-program/actions/workflows/test.yml/badge.svg?branch=17.0-1.2)](https://github.com/openg2p/openg2p-program/actions/workflows/test.yml?query=branch%3A17.0-1.2) -[![codecov](https://codecov.io/gh/openg2p/openg2p-program/branch/17.0-1.2/graph/badge.svg)](https://codecov.io/gh/openg2p/openg2p-program) +[![Pre-commit Status](https://github.com/openg2p/openg2p-program/actions/workflows/pre-commit.yml/badge.svg?branch=17.0-develop)](https://github.com/openg2p/openg2p-program/actions/workflows/pre-commit.yml?query=branch%3A17.0-develop) +[![Build Status](https://github.com/openg2p/openg2p-program/actions/workflows/test.yml/badge.svg?branch=17.0-develop)](https://github.com/openg2p/openg2p-program/actions/workflows/test.yml?query=branch%3A17.0-develop) +[![codecov](https://codecov.io/gh/openg2p/openg2p-program/branch/17.0-develop/graph/badge.svg)](https://codecov.io/gh/openg2p/openg2p-program) @@ -21,45 +21,45 @@ Available addons ---------------- addon | version | maintainers | summary --- | --- | --- | --- -[g2p_entitlement_differential](g2p_entitlement_differential/) | 17.0.1.2.0 | | OpenG2P Entitlement: Differential -[g2p_entitlement_in_kind](g2p_entitlement_in_kind/) | 17.0.1.2.0 | | OpenG2P Entitlement: In-Kind -[g2p_entitlement_voucher](g2p_entitlement_voucher/) | 17.0.1.2.0 | | OpenG2P Entitlement: Voucher -[g2p_formio](g2p_formio/) | 17.0.1.2.0 | | Form builders allow you to create, manage, and use dynamic forms with ease. -[g2p_mis_importer](g2p_mis_importer/) | 17.0.1.2.0 | | G2P MIS Importer -[g2p_notifications_base](g2p_notifications_base/) | 17.0.1.2.0 | | G2P Notifications: Base -[g2p_notifications_fast2sms](g2p_notifications_fast2sms/) | 17.0.1.2.0 | | G2P Notifications: Fast2SMS Service Provider -[g2p_notifications_voucher](g2p_notifications_voucher/) | 17.0.1.2.0 | | G2P Notifications: Voucher -[g2p_notifications_wiserv](g2p_notifications_wiserv/) | 17.0.1.2.0 | | G2P Notifications: Wiserv SMS Service Provider -[g2p_odk_importer_program](g2p_odk_importer_program/) | 17.0.1.2.0 | | Import records from ODK and add then into Program -[g2p_openid_vci_programs](g2p_openid_vci_programs/) | 17.0.1.2.0 | | G2P OpenID VCI: Program Beneficiaries -[g2p_payment_cash](g2p_payment_cash/) | 17.0.1.2.0 | | OpenG2P Program Payment: Cash -[g2p_payment_files](g2p_payment_files/) | 17.0.1.2.0 | | OpenG2P Program Payments: In Files -[g2p_payment_g2p_connect](g2p_payment_g2p_connect/) | 17.0.1.2.0 | | OpenG2P Program Payment: G2P Connect Payment Manager -[g2p_payment_interop_layer](g2p_payment_interop_layer/) | 17.0.1.2.0 | | OpenG2P Program Payment (Payment Interoperability Layer) -[g2p_payment_phee](g2p_payment_phee/) | 17.0.1.2.0 | | OpenG2P Program Payment (Payment Hub EE) -[g2p_payment_simple_mpesa](g2p_payment_simple_mpesa/) | 17.0.1.2.0 | | OpenG2P Program Payment: Simple Mpesa Payment Manager -[g2p_program_approval](g2p_program_approval/) | 17.0.1.2.0 | | OpenG2P Program: Approval -[g2p_program_assessment](g2p_program_assessment/) | 17.0.1.2.0 | | OpenG2P Program: Assessment -[g2p_program_autoenrol](g2p_program_autoenrol/) | 17.0.1.2.0 | | OpenG2P Programs: Autoenrol -[g2p_program_cycleless](g2p_program_cycleless/) | 17.0.1.2.0 | | OpenG2P Programs: Cycleless -[g2p_program_documents](g2p_program_documents/) | 17.0.1.2.0 | | OpenG2P Program: Documents -[g2p_program_registrant_info](g2p_program_registrant_info/) | 17.0.1.2.0 | | G2P Program: Registrant Info -[g2p_program_reimbursement](g2p_program_reimbursement/) | 17.0.1.2.0 | | OpenG2P Programs: Reimbursement -[g2p_programs](g2p_programs/) | 17.0.1.2.0 | | OpenG2P Programs -[g2p_programs_priority_list](g2p_programs_priority_list/) | 17.0.1.2.0 | | OpenG2P Programs Priority List -[g2p_proxy_means_test](g2p_proxy_means_test/) | 17.0.1.2.0 | | G2P: Proxy Means Test +[g2p_entitlement_differential](g2p_entitlement_differential/) | 17.0.0.0.0 | | OpenG2P Entitlement: Differential +[g2p_entitlement_in_kind](g2p_entitlement_in_kind/) | 17.0.0.0.0 | | OpenG2P Entitlement: In-Kind +[g2p_entitlement_voucher](g2p_entitlement_voucher/) | 17.0.0.0.0 | | OpenG2P Entitlement: Voucher +[g2p_formio](g2p_formio/) | 17.0.0.0.0 | | Form builders allow you to create, manage, and use dynamic forms with ease. +[g2p_mis_importer](g2p_mis_importer/) | 17.0.0.0.0 | | G2P MIS Importer +[g2p_notifications_base](g2p_notifications_base/) | 17.0.0.0.0 | | G2P Notifications: Base +[g2p_notifications_fast2sms](g2p_notifications_fast2sms/) | 17.0.0.0.0 | | G2P Notifications: Fast2SMS Service Provider +[g2p_notifications_voucher](g2p_notifications_voucher/) | 17.0.0.0.0 | | G2P Notifications: Voucher +[g2p_notifications_wiserv](g2p_notifications_wiserv/) | 17.0.0.0.0 | | G2P Notifications: Wiserv SMS Service Provider +[g2p_odk_importer_program](g2p_odk_importer_program/) | 17.0.0.0.0 | | Import records from ODK and add then into Program +[g2p_openid_vci_programs](g2p_openid_vci_programs/) | 17.0.0.0.0 | | G2P OpenID VCI: Program Beneficiaries +[g2p_payment_cash](g2p_payment_cash/) | 17.0.0.0.0 | | OpenG2P Program Payment: Cash +[g2p_payment_files](g2p_payment_files/) | 17.0.0.0.0 | | OpenG2P Program Payments: In Files +[g2p_payment_g2p_connect](g2p_payment_g2p_connect/) | 17.0.0.0.0 | | OpenG2P Program Payment: G2P Connect Payment Manager +[g2p_payment_interop_layer](g2p_payment_interop_layer/) | 17.0.0.0.0 | | OpenG2P Program Payment (Payment Interoperability Layer) +[g2p_payment_phee](g2p_payment_phee/) | 17.0.0.0.0 | | OpenG2P Program Payment (Payment Hub EE) +[g2p_payment_simple_mpesa](g2p_payment_simple_mpesa/) | 17.0.0.0.0 | | OpenG2P Program Payment: Simple Mpesa Payment Manager +[g2p_program_approval](g2p_program_approval/) | 17.0.0.0.0 | | OpenG2P Program: Approval +[g2p_program_assessment](g2p_program_assessment/) | 17.0.0.0.0 | | OpenG2P Program: Assessment +[g2p_program_autoenrol](g2p_program_autoenrol/) | 17.0.0.0.0 | | OpenG2P Programs: Autoenrol +[g2p_program_cycleless](g2p_program_cycleless/) | 17.0.0.0.0 | | OpenG2P Programs: Cycleless +[g2p_program_documents](g2p_program_documents/) | 17.0.0.0.0 | | OpenG2P Program: Documents +[g2p_program_registrant_info](g2p_program_registrant_info/) | 17.0.0.0.0 | | G2P Program: Registrant Info +[g2p_program_reimbursement](g2p_program_reimbursement/) | 17.0.0.0.0 | | OpenG2P Programs: Reimbursement +[g2p_programs](g2p_programs/) | 17.0.0.0.0 | | OpenG2P Programs +[g2p_programs_priority_list](g2p_programs_priority_list/) | 17.0.0.0.0 | | OpenG2P Programs Priority List +[g2p_proxy_means_test](g2p_proxy_means_test/) | 17.0.0.0.0 | | G2P: Proxy Means Test [g2p_reimbursement_portal](g2p_reimbursement_portal/) | 17.0.0.0.0 | | G2P Reimbursement Portal -[g2p_social_registry_importer](g2p_social_registry_importer/) | 17.0.1.2.0 | | Import records from Social Registry -[g2p_theme](g2p_theme/) | 17.0.1.2.0 | | OpenG2P Theme +[g2p_social_registry_importer](g2p_social_registry_importer/) | 17.0.0.0.0 | | Import records from Social Registry +[g2p_theme](g2p_theme/) | 17.0.0.0.0 | | OpenG2P Theme Unported addons --------------- addon | version | maintainers | summary --- | --- | --- | --- -[g2p_notifications_rest_api](g2p_notifications_rest_api/) | 17.0.1.2.0 (unported) | | G2P Notifications: REST API -[g2p_program_registrant_info_rest_api](g2p_program_registrant_info_rest_api/) | 17.0.1.2.0 (unported) | | G2P Program : Program Registrant Info Rest API -[g2p_programs_rest_api](g2p_programs_rest_api/) | 17.0.1.2.0 (unported) | | G2P Programs: REST API +[g2p_notifications_rest_api](g2p_notifications_rest_api/) | 17.0.0.0.0 (unported) | | G2P Notifications: REST API +[g2p_program_registrant_info_rest_api](g2p_program_registrant_info_rest_api/) | 17.0.0.0.0 (unported) | | G2P Program : Program Registrant Info Rest API +[g2p_programs_rest_api](g2p_programs_rest_api/) | 17.0.0.0.0 (unported) | | G2P Programs: REST API [//]: # (end addons) diff --git a/g2p_entitlement_differential/__manifest__.py b/g2p_entitlement_differential/__manifest__.py index 71cbad2c..40d9e86e 100644 --- a/g2p_entitlement_differential/__manifest__.py +++ b/g2p_entitlement_differential/__manifest__.py @@ -2,7 +2,7 @@ "name": "OpenG2P Entitlement: Differential", "category": "G2P", # Part of OpenG2P. See LICENSE file for full copyright and licensing details. - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_entitlement_in_kind/__manifest__.py b/g2p_entitlement_in_kind/__manifest__.py index b57db4c1..765fdd5d 100644 --- a/g2p_entitlement_in_kind/__manifest__.py +++ b/g2p_entitlement_in_kind/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Entitlement: In-Kind", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_entitlement_voucher/__manifest__.py b/g2p_entitlement_voucher/__manifest__.py index 1b51c583..6aabc20f 100644 --- a/g2p_entitlement_voucher/__manifest__.py +++ b/g2p_entitlement_voucher/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Entitlement: Voucher", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_formio/__manifest__.py b/g2p_formio/__manifest__.py index 430f2288..ca8448ce 100644 --- a/g2p_formio/__manifest__.py +++ b/g2p_formio/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Formio", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "summary": "Form builders allow you to create, manage, and use dynamic forms with ease.", "author": "OpenG2P", diff --git a/g2p_mis_importer/__init__.py b/g2p_mis_importer/__init__.py index 8d5bb84e..2c0aa80c 100644 --- a/g2p_mis_importer/__init__.py +++ b/g2p_mis_importer/__init__.py @@ -1,2 +1,2 @@ -# Part of Newlogic G2P. See LICENSE file for full copyright and licensing details. +# Part of OpenG2P. See LICENSE file for full copyright and licensing details. from . import models diff --git a/g2p_mis_importer/__manifest__.py b/g2p_mis_importer/__manifest__.py index bccd9195..a90774e1 100644 --- a/g2p_mis_importer/__manifest__.py +++ b/g2p_mis_importer/__manifest__.py @@ -3,7 +3,7 @@ { "name": "G2P MIS Importer", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "author": "OpenG2P", "website": "https://openg2p.org", "license": "LGPL-3", diff --git a/g2p_mis_importer/models/__init__.py b/g2p_mis_importer/models/__init__.py index 7b70d785..1d699d47 100644 --- a/g2p_mis_importer/models/__init__.py +++ b/g2p_mis_importer/models/__init__.py @@ -1,3 +1,2 @@ -# Part of Newlogic G2P. See LICENSE file for full copyright and licensing details. - +# Part of OpenG2P. See LICENSE file for full copyright and licensing details. from . import mis_config diff --git a/g2p_notifications_base/__manifest__.py b/g2p_notifications_base/__manifest__.py index 8a40ee4e..1e8bb7e4 100644 --- a/g2p_notifications_base/__manifest__.py +++ b/g2p_notifications_base/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Notifications: Base", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_notifications_fast2sms/__manifest__.py b/g2p_notifications_fast2sms/__manifest__.py index d9afb8f6..5d6a1cc8 100644 --- a/g2p_notifications_fast2sms/__manifest__.py +++ b/g2p_notifications_fast2sms/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Notifications: Fast2SMS Service Provider", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_notifications_rest_api/__manifest__.py b/g2p_notifications_rest_api/__manifest__.py index 672fb935..4aa47944 100644 --- a/g2p_notifications_rest_api/__manifest__.py +++ b/g2p_notifications_rest_api/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Notifications: REST API", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_notifications_voucher/__manifest__.py b/g2p_notifications_voucher/__manifest__.py index 82e10f6f..60a6885d 100644 --- a/g2p_notifications_voucher/__manifest__.py +++ b/g2p_notifications_voucher/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Notifications: Voucher", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_notifications_wiserv/__manifest__.py b/g2p_notifications_wiserv/__manifest__.py index ebee6cdc..020f098e 100644 --- a/g2p_notifications_wiserv/__manifest__.py +++ b/g2p_notifications_wiserv/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Notifications: Wiserv SMS Service Provider", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_odk_importer_program/__init__.py b/g2p_odk_importer_program/__init__.py index 1a5b30f8..2c0aa80c 100644 --- a/g2p_odk_importer_program/__init__.py +++ b/g2p_odk_importer_program/__init__.py @@ -1,3 +1,2 @@ -# Part of Newlogic G2P. See LICENSE file for full copyright and licensing details. - +# Part of OpenG2P. See LICENSE file for full copyright and licensing details. from . import models diff --git a/g2p_odk_importer_program/__manifest__.py b/g2p_odk_importer_program/__manifest__.py index f734a310..ceb894ec 100644 --- a/g2p_odk_importer_program/__manifest__.py +++ b/g2p_odk_importer_program/__manifest__.py @@ -4,7 +4,7 @@ "name": "G2P ODK Importer: Program", "category": "Connector", "summary": "Import records from ODK and add then into Program", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 3, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_odk_importer_program/i18n/g2p_odk_importer.pot b/g2p_odk_importer_program/i18n/g2p_odk_importer.pot deleted file mode 100644 index 32e9d4f3..00000000 --- a/g2p_odk_importer_program/i18n/g2p_odk_importer.pot +++ /dev/null @@ -1,261 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * g2p_odk_importer_regisry -# -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: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Restart" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Start" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Stop" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_tree -msgid "Action odk conf action" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__base_url -msgid "Base URL" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields.selection,name:g2p_odk_importer_regisry.selection__odk_config__job_status__completed -msgid "Completed" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.ui.menu,name:g2p_odk_importer_regisry.odk_menu_config -msgid "Configuration" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__create_uid -msgid "Created by" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__create_date -msgid "Created on" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__cron_id -msgid "Cron Job" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__display_name -msgid "Display Name" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields.selection,name:g2p_odk_importer_regisry.selection__odk_config__job_status__draft -msgid "Draft" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__end_datetime -msgid "End Time" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__form_id -msgid "Form ID" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields.selection,name:g2p_odk_importer_regisry.selection__odk_config__target_registry__group -msgid "Group" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__id -msgid "ID" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Import Records" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Import records" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields.selection,name:g2p_odk_importer_regisry.selection__odk_config__target_registry__individual -msgid "Individual" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__interval_hours -msgid "Interval in hours" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__json_formatter -msgid "JSON Formatter" -msgstr "" - -#. module: g2p_odk_importer_regisry -#. odoo-python -#: code:addons/g2p_odk_importer_regisry/models/odk_config.py:0 -#, python-format -msgid "Json Format is not valid pyjq expression." -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__write_uid -msgid "Last Updated by" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__write_date -msgid "Last Updated on" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__last_sync_time -msgid "Last synced on" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__name -msgid "Name" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.ui.menu,name:g2p_odk_importer_regisry.odk_menu_root -msgid "ODK" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "ODK Central" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.actions.server,name:g2p_odk_importer_regisry.action_odk_conf_action -msgid "ODK Config Start" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.actions.act_window,name:g2p_odk_importer_regisry.action_odk_config -#: model:ir.model,name:g2p_odk_importer_regisry.model_odk_config -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "ODK Configuration" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__odk_program_id -msgid "ODK Program ID" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__password -msgid "Password" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Program details" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__project -msgid "Project" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Project details" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_tree -msgid "Restart" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields.selection,name:g2p_odk_importer_regisry.selection__odk_config__job_status__running -msgid "Running" -msgstr "" - -#. module: g2p_odk_importer_regisry -#. odoo-python -#: code:addons/g2p_odk_importer_regisry/models/odk_client.py:0 -#, python-format -msgid "Session not created" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_tree -msgid "Start" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__start_datetime -msgid "Start Time" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields.selection,name:g2p_odk_importer_regisry.selection__odk_config__job_status__started -msgid "Started" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__job_status -msgid "Status" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_tree -msgid "Stop" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__target_registry -msgid "Target Registry" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Target settings" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Test Connection" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model_terms:ir.ui.view,arch_db:g2p_odk_importer_regisry.view_odk_config_form -msgid "Time interval" -msgstr "" - -#. module: g2p_odk_importer_regisry -#: model:ir.model.fields,field_description:g2p_odk_importer_regisry.field_odk_config__username -msgid "Username" -msgstr "" diff --git a/g2p_odk_importer_program/i18n/g2p_odk_importer_program.pot b/g2p_odk_importer_program/i18n/g2p_odk_importer_program.pot deleted file mode 100644 index 62c296de..00000000 --- a/g2p_odk_importer_program/i18n/g2p_odk_importer_program.pot +++ /dev/null @@ -1,24 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * g2p_odk_importer_program -# -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: g2p_odk_importer_program -#: model:ir.model,name:g2p_odk_importer_program.model_odk_import -msgid "ODK Import" -msgstr "" - -#. module: g2p_odk_importer_program -#: model:ir.model.fields,field_description:g2p_odk_importer_program.field_odk_import__target_program -msgid "Target Program" -msgstr "" diff --git a/g2p_odk_importer_program/models/__init__.py b/g2p_odk_importer_program/models/__init__.py index e333f328..4452df31 100644 --- a/g2p_odk_importer_program/models/__init__.py +++ b/g2p_odk_importer_program/models/__init__.py @@ -1,4 +1,2 @@ -# Part of Newlogic G2P. See LICENSE file for full copyright and licensing details. - -from . import odk_client +# Part of OpenG2P. See LICENSE file for full copyright and licensing details. from . import odk_import diff --git a/g2p_odk_importer_program/models/odk_client.py b/g2p_odk_importer_program/models/odk_client.py deleted file mode 100644 index bfa9d916..00000000 --- a/g2p_odk_importer_program/models/odk_client.py +++ /dev/null @@ -1,46 +0,0 @@ -from datetime import date - -import odoo.addons.g2p_odk_importer.models.odk_client as base_odk_client - - -def patched_addl_data(self, mapped_json): - odk_import = self.env["odk.import"].browse(self.id) - - program_id = odk_import.target_program.id - - if program_id: - mapped_json["program_membership_ids"] = [ - ( - 0, - 0, - { - "program_id": program_id, - "state": "draft", - "enrollment_date": date.today(), - }, - ) - ] - - if "program_registrant_info_ids" in mapped_json: - prog_reg_info = mapped_json.get("program_registrant_info_ids", None) - - if not program_id: - del mapped_json["program_registrant_info_ids"] - return mapped_json - - mapped_json["program_registrant_info_ids"] = [ - ( - 0, - 0, - { - "program_id": program_id, - "state": "active", - "program_registrant_info": prog_reg_info if prog_reg_info else None, - }, - ) - ] - - return mapped_json - - -base_odk_client.ODKClient.get_addl_data = patched_addl_data diff --git a/g2p_odk_importer_program/models/odk_import.py b/g2p_odk_importer_program/models/odk_import.py index de02ec5c..09080df6 100644 --- a/g2p_odk_importer_program/models/odk_import.py +++ b/g2p_odk_importer_program/models/odk_import.py @@ -1,3 +1,5 @@ +from datetime import date + from odoo import api, fields, models @@ -10,3 +12,37 @@ class OdkImport(models.Model): def onchange_target_registry(self): for rec in self: rec.target_program = None + + def process_records_handle_addl_data(self, mapped_json): + if self.target_program: + mapped_json["program_membership_ids"] = [ + ( + 0, + 0, + { + "program_id": self.target_program.id, + "state": "draft", + "enrollment_date": date.today(), + }, + ) + ] + + if "program_registrant_info_ids" in mapped_json: + prog_reg_info = mapped_json.get("program_registrant_info_ids", None) + + if not self.target_program: + mapped_json.pop("program_registrant_info_ids") + return mapped_json + + mapped_json["program_registrant_info_ids"] = [ + ( + 0, + 0, + { + "program_id": self.target_program.id, + "state": "active", + "program_registrant_info": prog_reg_info if prog_reg_info else None, + }, + ) + ] + return mapped_json diff --git a/g2p_openid_vci_programs/__manifest__.py b/g2p_openid_vci_programs/__manifest__.py index e9ccfb6f..97910cfe 100644 --- a/g2p_openid_vci_programs/__manifest__.py +++ b/g2p_openid_vci_programs/__manifest__.py @@ -2,7 +2,7 @@ { "name": "G2P OpenID VCI: Program Beneficiaries", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_payment_cash/__manifest__.py b/g2p_payment_cash/__manifest__.py index fc84bf2e..69026c6a 100644 --- a/g2p_payment_cash/__manifest__.py +++ b/g2p_payment_cash/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Program Payment: Cash", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_payment_files/__manifest__.py b/g2p_payment_files/__manifest__.py index 6c5b3f98..862c7ae0 100644 --- a/g2p_payment_files/__manifest__.py +++ b/g2p_payment_files/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Program Payments: In Files", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_payment_files/models/payment_file_config.py b/g2p_payment_files/models/payment_file_config.py index 7b708b79..82f59b3d 100644 --- a/g2p_payment_files/models/payment_file_config.py +++ b/g2p_payment_files/models/payment_file_config.py @@ -1,3 +1,6 @@ +import base64 +import uuid + import pdfkit from odoo import fields, models @@ -18,6 +21,11 @@ class G2PPaymentFileConfig(models.Model): default="pdf", ) + tags_ids = fields.Many2many( + "g2p.document.tag", + default=lambda self: self.env["g2p.document.tag"].get_or_create_tag_from_name("System Generated").ids, + ) + # body_html = fields.Html( # compute="_compute_html_preview", # store=False, @@ -36,7 +44,14 @@ def render_and_store(self, res_model, res_ids, document_store): document_files = [] for res_id in res_ids: document_files.append( - document_store.add_file(self.render_template(res_model, res_id), extension="." + self.type) + self.env["storage.file"].create( + { + "name": f"{str(uuid.uuid4())}.{self.type}", + "backend_id": document_store.id, + "data": base64.b64encode(self.render_template(res_model, res_id)), + "tags_ids": [(4, tag.id) for tag in self.tags_ids], + } + ) ) return document_files diff --git a/g2p_payment_files/models/payment_manager.py b/g2p_payment_files/models/payment_manager.py index 565de31c..bf164ed1 100644 --- a/g2p_payment_files/models/payment_manager.py +++ b/g2p_payment_files/models/payment_manager.py @@ -44,7 +44,7 @@ def _prepare_payments(self, cycle, entitlements): file_document_store = self.file_document_store if not file_document_store: - file_document_store = self.program_id.supporting_documents_store + file_document_store = self.program_id.get_documents_store() if self.create_batch: if batches: # Render all qrcodes and store for all payment batches diff --git a/g2p_payment_files/tests/test_payment_file_config.py b/g2p_payment_files/tests/test_payment_file_config.py index 6aefddb6..71bdd171 100644 --- a/g2p_payment_files/tests/test_payment_file_config.py +++ b/g2p_payment_files/tests/test_payment_file_config.py @@ -1,16 +1,13 @@ import base64 -from unittest.mock import MagicMock, patch +from unittest.mock import patch -from odoo.tests.common import TransactionCase +from odoo.addons.component.tests.common import TransactionComponentCase -from odoo.addons.mail.models.mail_template import MailTemplate - -class TestG2PPaymentFileConfig(TransactionCase): +class TestG2PPaymentFileConfig(TransactionComponentCase): def setUp(self): super().setUp() - self.document_store = MagicMock() - self.document_store.add_file.side_effect = self.mock_add_file + self.document_store = self.env["storage.backend"].create({"name": "Test Storage Backend"}) self.payment_file_config = self.env["g2p.payment.file.config"].create( { "name": "Test Payment File Config", @@ -18,42 +15,39 @@ def setUp(self): "body_string": "

Sample Body

", } ) - MailTemplate._render_template = MagicMock(return_value={1: "

Rendered HTML

"}) - - def mock_add_file(self, file_content, extension): - return { - "name": "Mocked File" + extension, - "content": base64.b64encode(file_content), - } + @patch("odoo.addons.mail.models.mail_render_mixin.MailRenderMixin._render_template") @patch("pdfkit.from_string") - def test_render_and_store_pdf(self, mock_pdfkit): + def test_render_and_store_pdf(self, mock_pdfkit, mock_render_template): + mock_render_template.return_value = {1: "

Rendered HTML

"} mock_pdfkit.return_value = b"PDF Content" document_files = self.payment_file_config.render_and_store( "g2p.entitlement", [1], self.document_store ) self.assertEqual(len(document_files), 1) - self.assertIn(".pdf", document_files[0]["name"]) + self.assertIn(".pdf", document_files[0].name) self.assertIn( "PDF Content", - base64.b64decode(document_files[0]["content"]).decode("utf-8"), + base64.b64decode(document_files[0].data).decode("utf-8"), ) mock_pdfkit.assert_called_once() - def test_render_and_store_csv(self): + @patch("odoo.addons.mail.models.mail_render_mixin.MailRenderMixin._render_template") + def test_render_and_store_csv(self, mock_render_template): + mock_render_template.return_value = {1: "Rendered CSV"} self.payment_file_config.type = "csv" document_files = self.payment_file_config.render_and_store( "g2p.entitlement", [1], self.document_store ) self.assertEqual(len(document_files), 1) - self.assertIn(".csv", document_files[0]["name"]) + self.assertIn(".csv", document_files[0].name) self.assertIn( - "Sample Body", - base64.b64decode(document_files[0]["content"]).decode("utf-8"), + "Rendered CSV", + base64.b64decode(document_files[0].data).decode("utf-8"), ) - @patch("odoo.addons.mail.models.mail_template.MailTemplate._render_template") + @patch("odoo.addons.mail.models.mail_render_mixin.MailRenderMixin._render_template") def test_render_html(self, mock_render_template): - mock_render_template.return_value = {1: "

Rendered HTML

"} + mock_render_template.return_value = {1: "

Sample Body

"} result = self.payment_file_config.render_html("g2p.entitlement", 1) self.assertEqual(result, "

Sample Body

") diff --git a/g2p_payment_files/tests/test_payment_manager.py b/g2p_payment_files/tests/test_payment_manager.py index b31d0969..010e2263 100644 --- a/g2p_payment_files/tests/test_payment_manager.py +++ b/g2p_payment_files/tests/test_payment_manager.py @@ -1,10 +1,11 @@ from datetime import timedelta from odoo import fields -from odoo.tests.common import TransactionCase +from odoo.addons.component.tests.common import TransactionComponentCase -class TestG2PPaymentManager(TransactionCase): + +class TestG2PPaymentManager(TransactionComponentCase): def setUp(self): super().setUp() self.backend = self.env["storage.backend"].create({"name": "Test Backend"}) @@ -66,16 +67,7 @@ def test_payment_manager_creation(self): self.assertIn(self.batch_tag.id, self.files_payment_manager.batch_tag_ids.ids) # TODO : Revisit this code - # @patch("odoo.addons.g2p_program_documents.models.document_store.G2PDocumentStore.add_file") - # def test_prepare_payments_with_batch(self, mock_add_file): - # mock_add_file.return_value = self.env["storage.file"].create( - # { - # "name": "Test", - # "backend_id": self.id, - # "data": base64.b64encode(data), - # "tags_ids": tags_ids, - # } - # ) + # def test_prepare_payments_with_batch(self): # payments, batches = self.files_payment_manager._prepare_payments(self.cycle, self.entitlement) # self.assertEqual(len(payments), 1, "Should create one payment") # self.assertEqual(len(batches), 1, "Should create one batch") diff --git a/g2p_payment_files/views/payment_file_config_view.xml b/g2p_payment_files/views/payment_file_config_view.xml index ff17be1c..13a9c7e2 100644 --- a/g2p_payment_files/views/payment_file_config_view.xml +++ b/g2p_payment_files/views/payment_file_config_view.xml @@ -8,6 +8,7 @@
+ diff --git a/g2p_payment_g2p_connect/__manifest__.py b/g2p_payment_g2p_connect/__manifest__.py index aa674069..c940585c 100644 --- a/g2p_payment_g2p_connect/__manifest__.py +++ b/g2p_payment_g2p_connect/__manifest__.py @@ -1,7 +1,7 @@ { "name": "OpenG2P Program Payment: G2P Connect Payment Manager", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_payment_interop_layer/__manifest__.py b/g2p_payment_interop_layer/__manifest__.py index 5225da6c..5faae601 100644 --- a/g2p_payment_interop_layer/__manifest__.py +++ b/g2p_payment_interop_layer/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Program Payment (Payment Interoperability Layer)", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_payment_phee/__manifest__.py b/g2p_payment_phee/__manifest__.py index ccd2b4c7..c84925cc 100644 --- a/g2p_payment_phee/__manifest__.py +++ b/g2p_payment_phee/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Program Payment (Payment Hub EE)", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_payment_simple_mpesa/__manifest__.py b/g2p_payment_simple_mpesa/__manifest__.py index 23eb80de..fd29a559 100644 --- a/g2p_payment_simple_mpesa/__manifest__.py +++ b/g2p_payment_simple_mpesa/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Program Payment: Simple Mpesa Payment Manager", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_program_approval/__manifest__.py b/g2p_program_approval/__manifest__.py index 7f145ebd..8b8f61b6 100644 --- a/g2p_program_approval/__manifest__.py +++ b/g2p_program_approval/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Program: Approval", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_program_assessment/__manifest__.py b/g2p_program_assessment/__manifest__.py index 2302d5c3..10230c65 100644 --- a/g2p_program_assessment/__manifest__.py +++ b/g2p_program_assessment/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Program: Assessment", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_program_autoenrol/__manifest__.py b/g2p_program_autoenrol/__manifest__.py index a31068fc..2368073c 100644 --- a/g2p_program_autoenrol/__manifest__.py +++ b/g2p_program_autoenrol/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Programs: Autoenrol", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_program_cycleless/__manifest__.py b/g2p_program_cycleless/__manifest__.py index 82d86c35..6afeb501 100644 --- a/g2p_program_cycleless/__manifest__.py +++ b/g2p_program_cycleless/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Programs: Cycleless", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_program_documents/__manifest__.py b/g2p_program_documents/__manifest__.py index 80d2196b..fb6538b7 100644 --- a/g2p_program_documents/__manifest__.py +++ b/g2p_program_documents/__manifest__.py @@ -2,13 +2,13 @@ { "name": "OpenG2P Program: Documents", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", "license": "LGPL-3", "depends": [ - "g2p_documents", + "g2p_registry_documents", "g2p_programs", ], "data": [ diff --git a/g2p_program_documents/models/__init__.py b/g2p_program_documents/models/__init__.py index 168b7559..b29f0214 100644 --- a/g2p_program_documents/models/__init__.py +++ b/g2p_program_documents/models/__init__.py @@ -1,7 +1,6 @@ # Part of OpenG2P. See LICENSE file for full copyright and licensing details. from . import program from . import document_file -from . import document_store from . import entitlement from . import program_membership from . import entitlement_manager diff --git a/g2p_program_documents/models/document_file.py b/g2p_program_documents/models/document_file.py index 55345ccd..fa6dabb0 100644 --- a/g2p_program_documents/models/document_file.py +++ b/g2p_program_documents/models/document_file.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import api, fields, models class G2PDocument(models.Model): @@ -8,10 +8,18 @@ class G2PDocument(models.Model): entitlement_id = fields.Many2one("g2p.entitlement") - def get_record(self): - for record in self: - return { - "mimetype": record.mimetype, - "name": record.name, - "url": record.url if record.url else "#", - } + @api.constrains("entitlement_id") + def _constrains_entitlement_id(self): + for rec in self: + if not rec.program_membership_id: + prog_mem = rec.entitlement_id.partner_id.program_membership_ids.filtered( + lambda x: x.program_id.id == rec.entitlement_id.program_id.id + ) + if prog_mem: + rec.program_membership_id = prog_mem[0] + + @api.constrains("program_membership_id") + def _constrains_program_membership_id(self): + for rec in self: + if not rec.registrant_id: + rec.registrant_id = rec.program_membership_id.partner_id diff --git a/g2p_program_documents/models/document_store.py b/g2p_program_documents/models/document_store.py deleted file mode 100644 index ce504973..00000000 --- a/g2p_program_documents/models/document_store.py +++ /dev/null @@ -1,11 +0,0 @@ -from odoo import models - - -class G2PDocumentStore(models.Model): - _inherit = "storage.backend" - - def add_file(self, data, name=None, extension=None, program_membership=None, **kwargs): - res = super().add_file(data, name=name, extension=extension, **kwargs) - if program_membership: - res.program_membership_id = program_membership - return res diff --git a/g2p_program_documents/models/entitlement.py b/g2p_program_documents/models/entitlement.py index d80605a5..10ca3259 100644 --- a/g2p_program_documents/models/entitlement.py +++ b/g2p_program_documents/models/entitlement.py @@ -11,31 +11,3 @@ class G2PEntitlement(models.Model): def _compute_document_count(self): for record in self: record.document_count = len(record.supporting_document_ids) - - def copy_documents_from_beneficiary(self): - for rec in self: - prog_mem = rec.partner_id.program_membership_ids.filtered( - lambda x: x.program_id.id == rec.program_id.id - )[0] - old_entitlements = rec.partner_id.entitlement_ids.filtered( - lambda x: x.program_id.id == rec.program_id.id and x.id != rec.id - ) - old_entitlements = old_entitlements.sorted("create_date", reverse=True) - old_entitlement = None - if old_entitlements: - old_entitlement = old_entitlements[0] - for document in prog_mem.supporting_documents_ids: - if not document.entitlement_id: - if (not old_entitlement) or (document.create_date > old_entitlement.create_date): - document.entitlement_id = rec - - @api.constrains("supporting_document_ids") - def _constrains_supporting_document_ids(self): - for rec in self: - for document in rec.supporting_document_ids: - if not document.program_membership_id: - prog_mem = rec.partner_id.program_membership_ids.filtered( - lambda x: x.program_id.id == rec.program_id.id - ) - if prog_mem: - document.program_membership_id = prog_mem[0] diff --git a/g2p_program_documents/models/entitlement_manager.py b/g2p_program_documents/models/entitlement_manager.py index d71a1334..af9347e7 100644 --- a/g2p_program_documents/models/entitlement_manager.py +++ b/g2p_program_documents/models/entitlement_manager.py @@ -1,9 +1,5 @@ -import logging - from odoo import models -_logger = logging.getLogger(__name__) - class DefaultEntitlementManagerForDocument(models.Model): _inherit = "g2p.program.entitlement.manager.default" @@ -12,5 +8,22 @@ def prepare_entitlements(self, cycle, beneficiaries): ents = super().prepare_entitlements(cycle, beneficiaries) if ents: - ents.copy_documents_from_beneficiary() + self.copy_documents_from_beneficiary(ents) return ents + + def copy_documents_from_beneficiary(self, entitlements): + for rec in entitlements: + prog_mem = rec.partner_id.program_membership_ids.filtered( + lambda x: x.program_id.id == rec.program_id.id + )[0] + old_entitlements = rec.partner_id.entitlement_ids.filtered( + lambda x: x.program_id.id == rec.program_id.id and x.id != rec.id + ) + old_entitlements = old_entitlements.sorted("create_date", reverse=True) + old_entitlement = None + if old_entitlements: + old_entitlement = old_entitlements[0] + for document in prog_mem.supporting_documents_ids: + if not document.entitlement_id: + if (not old_entitlement) or (document.create_date > old_entitlement.create_date): + document.entitlement_id = rec diff --git a/g2p_program_documents/models/program.py b/g2p_program_documents/models/program.py index 43f8083c..86fa8703 100644 --- a/g2p_program_documents/models/program.py +++ b/g2p_program_documents/models/program.py @@ -5,3 +5,13 @@ class G2PProgram(models.Model): _inherit = "g2p.program" supporting_documents_store = fields.Many2one("storage.backend") + + def get_documents_store(self): + self.ensure_one() + if self.supporting_documents_store: + return self.supporting_documents_store + reg_doc_store = self.env["res.partner"].get_registry_documents_store() + if reg_doc_store: + return reg_doc_store + else: + return None diff --git a/g2p_program_documents/tests/test_document_store.py b/g2p_program_documents/tests/test_document_store.py index 7bfc1f69..d2720424 100644 --- a/g2p_program_documents/tests/test_document_store.py +++ b/g2p_program_documents/tests/test_document_store.py @@ -1,3 +1,4 @@ +import base64 from datetime import datetime, timedelta from odoo.addons.component.tests.common import TransactionComponentCase @@ -30,7 +31,7 @@ def setUp(self): } ) - def test_add_file_with_program_membership(self): + def test_create_file_with_program_membership(self): """Test adding a file with program membership association.""" # triggering entitlement preparation with out membership self.ent_manager.prepare_entitlements(self.cycle, self.env["g2p.program_membership"]) @@ -42,14 +43,26 @@ def test_add_file_with_program_membership(self): "program_id": self.program.id, } ) - data = b"Test data1" - document1 = self.backend.add_file(data, name="test.txt", program_membership=membership) + document1 = self.env["storage.file"].create( + { + "name": "test.txt", + "data": base64.b64encode(b"Test data1"), + "backend_id": self.backend.id, + "program_membership_id": membership.id, + } + ) self.ent_manager.prepare_entitlements(self.cycle, membership) self.assertTrue(document1.program_membership_id) # Retesting with existing document - data = b"Test data2" - self.backend.add_file(data, name="test.txt", program_membership=membership) + _document2 = self.env["storage.file"].create( + { + "name": "test.txt", + "data": base64.b64encode(b"Test data2"), + "backend_id": self.backend.id, + "program_membership_id": membership.id, + } + ) # TODO: will revisit this test case # cycle2 = self.env["g2p.cycle"].create( diff --git a/g2p_program_documents/views/entitlement_view.xml b/g2p_program_documents/views/entitlement_view.xml index e81f436e..a910b2e1 100644 --- a/g2p_program_documents/views/entitlement_view.xml +++ b/g2p_program_documents/views/entitlement_view.xml @@ -11,10 +11,15 @@ + + + + + diff --git a/g2p_program_documents/views/program_membership_view.xml b/g2p_program_documents/views/program_membership_view.xml index 3c42914f..e764c7f0 100644 --- a/g2p_program_documents/views/program_membership_view.xml +++ b/g2p_program_documents/views/program_membership_view.xml @@ -9,11 +9,15 @@ + + - + + + diff --git a/g2p_program_registrant_info/__manifest__.py b/g2p_program_registrant_info/__manifest__.py index cda090e7..b9851fe8 100644 --- a/g2p_program_registrant_info/__manifest__.py +++ b/g2p_program_registrant_info/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Program: Registrant Info", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_program_registrant_info/wizard/g2p_program_registrant_info_wizard.py b/g2p_program_registrant_info/wizard/g2p_program_registrant_info_wizard.py index 4337c098..0e57b9b1 100644 --- a/g2p_program_registrant_info/wizard/g2p_program_registrant_info_wizard.py +++ b/g2p_program_registrant_info/wizard/g2p_program_registrant_info_wizard.py @@ -1,10 +1,8 @@ # Part of OpenG2P. See LICENSE file for full copyright and licensing details. - -import base64 import logging -from io import BytesIO +import uuid -from odoo import models +from odoo import api, models _logger = logging.getLogger(__name__) @@ -42,15 +40,15 @@ def jsonize_form_data(self, data, program, membership=None): if isinstance(data.get(key), list): value = data[key] if value: - if not program.supporting_documents_store: + if not program.get_documents_store(): _logger.error("Supporting Documents Store is not set in Program Configuration") data[key] = None continue data[key] = self.add_files_to_store( value, - program.supporting_documents_store, + program.get_documents_store(), program_membership=membership, - tags=key, + tags=[key], ) if not data[key]: _logger.warning("Empty/No File received for field %s", key) @@ -59,27 +57,27 @@ def jsonize_form_data(self, data, program, membership=None): _logger.exception("An error occurred while jsonizing form data: %s", str(e)) return data - @staticmethod - def add_files_to_store(files, store, program_membership=None, tags=None): + @api.model + def add_files_to_store(self, files, store, program_membership=None, tags=None): file_details = [] + DOC_TAGS = self.env["g2p.document.tag"] try: for file in files: if file and store: - binary_data = base64.b64decode(file.datas) - filestream = BytesIO(binary_data) - document_extenstion = "." + file.mimetype.split("/")[1] - document_file = store.add_file( - filestream.read(), - extension=document_extenstion, - program_membership=program_membership, - tags=tags, + document_file = self.env["storage.file"].create( + { + "name": f"{str(uuid.uuid4())}.{file.mimetype.split('/')[1]}", + "backend_id": store.id, + "data": file.datas, + "program_membership_id": program_membership.id, + "tags_ids": [(4, DOC_TAGS.get_or_create_tag_from_name(tag)) for tag in tags], + } ) if document_file: - document_uuid = document_file.name.split(".")[0] file_details.append( { "document_id": document_file.id, - "document_uuid": document_uuid, + "document_uuid": document_file.name, "document_name": document_file.name, "document_slug": document_file.slug, "document_url": document_file.url, diff --git a/g2p_program_registrant_info_rest_api/__manifest__.py b/g2p_program_registrant_info_rest_api/__manifest__.py index ae8d538d..1beb735a 100644 --- a/g2p_program_registrant_info_rest_api/__manifest__.py +++ b/g2p_program_registrant_info_rest_api/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Program : Program Registrant Info Rest API", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_program_reimbursement/__manifest__.py b/g2p_program_reimbursement/__manifest__.py index 967f9397..c5231ee3 100644 --- a/g2p_program_reimbursement/__manifest__.py +++ b/g2p_program_reimbursement/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Programs: Reimbursement", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_programs/__manifest__.py b/g2p_programs/__manifest__.py index efecb994..88041480 100644 --- a/g2p_programs/__manifest__.py +++ b/g2p_programs/__manifest__.py @@ -2,7 +2,7 @@ { "name": "OpenG2P Programs", "category": "G2P/G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_programs_priority_list/__manifest__.py b/g2p_programs_priority_list/__manifest__.py index 4ea346f2..38245bfc 100644 --- a/g2p_programs_priority_list/__manifest__.py +++ b/g2p_programs_priority_list/__manifest__.py @@ -1,7 +1,7 @@ { "name": "OpenG2P Programs Priority List", "category": "G2P/G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_programs_rest_api/__manifest__.py b/g2p_programs_rest_api/__manifest__.py index 23392730..97aab706 100644 --- a/g2p_programs_rest_api/__manifest__.py +++ b/g2p_programs_rest_api/__manifest__.py @@ -1,7 +1,7 @@ { "name": "G2P Programs: REST API", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_proxy_means_test/__manifest__.py b/g2p_proxy_means_test/__manifest__.py index 36e64833..5af4b7c3 100644 --- a/g2p_proxy_means_test/__manifest__.py +++ b/g2p_proxy_means_test/__manifest__.py @@ -2,7 +2,7 @@ { "name": "G2P: Proxy Means Test", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/g2p_reimbursement_portal/controllers/main.py b/g2p_reimbursement_portal/controllers/main.py index 716296af..64beb891 100644 --- a/g2p_reimbursement_portal/controllers/main.py +++ b/g2p_reimbursement_portal/controllers/main.py @@ -1,5 +1,7 @@ +import base64 import json import logging +import uuid from werkzeug.datastructures import FileStorage from werkzeug.exceptions import Forbidden @@ -126,9 +128,7 @@ def portal_claim_submission(self, _id, **kwargs): # TODO: Check current partner not part of prog memberships of # reimbursement program. - supporting_documents_store = ( - entitlement.program_id.reimbursement_program_id.supporting_documents_store - ) + supporting_documents_store = entitlement.program_id.reimbursement_program_id.get_documents_store() # TODO: remove all hardcoding in the next lines received_code = form_data.get("voucher_code", None) @@ -241,20 +241,25 @@ def add_file_to_store(cls, files, store, program_membership=None, tags=None): files = [ files, ] + DOC_TAGS = store.env["g2p.document.tag"] file_details = [] for file in files: if store and file.filename: + document_uuid = str(uuid.uuid4()) if len(file.filename.split(".")) > 1: - supporting_document_ext = "." + file.filename.split(".")[-1] + document_name = f"{document_uuid}.{file.filename.split('.')[-1]}" else: - supporting_document_ext = None - document_file = store.add_file( - file.stream.read(), - extension=supporting_document_ext, - program_membership=program_membership, - tags=tags, + document_name = document_uuid + document_file = store.env["storage.file"].create( + { + "name": document_name, + "backend_id": store.id, + "data": base64.b64encode(file.stream.read()), + "program_membership_id": program_membership, + "tags_ids": [(4, DOC_TAGS.get_or_create_tag_from_name(tag)) for tag in tags], + } ) - document_uuid = document_file.name.split(".")[0] + file_details.append( { "document_id": document_file.id, @@ -280,6 +285,6 @@ def process_documents(self, documents, store, membership): all_file_details = [] for tag, document in documents.items(): all_file_details += self.add_file_to_store( - document, store, program_membership=membership, tags=tag + document, store, program_membership=membership, tags=[tag] ) return all_file_details diff --git a/g2p_social_registry_importer/__manifest__.py b/g2p_social_registry_importer/__manifest__.py index 4e9eab5d..9e213fb9 100644 --- a/g2p_social_registry_importer/__manifest__.py +++ b/g2p_social_registry_importer/__manifest__.py @@ -4,7 +4,7 @@ "name": "OpenG2P Social Registry Importer", "category": "G2P", "summary": "Import records from Social Registry", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "author": "OpenG2P", "website": "https://openg2p.org", "license": "LGPL-3", diff --git a/g2p_theme/__manifest__.py b/g2p_theme/__manifest__.py index 8dc64019..0485c800 100644 --- a/g2p_theme/__manifest__.py +++ b/g2p_theme/__manifest__.py @@ -1,7 +1,7 @@ { "name": "OpenG2P Theme", "category": "G2P", - "version": "17.0.1.2.0", + "version": "17.0.0.0.0", "sequence": 1, "author": "OpenG2P", "website": "https://openg2p.org", diff --git a/pyproject.toml b/pyproject.toml index eb578a04..898448d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,9 @@ dependencies = [ "odoo-addon-g2p_program_registrant_info @ {root:uri}/g2p_program_registrant_info", "odoo-addon-g2p_program_reimbursement @ {root:uri}/g2p_program_reimbursement", "odoo-addon-g2p_programs @ {root:uri}/g2p_programs", + "odoo-addon-g2p_programs_priority_list @ {root:uri}/g2p_programs_priority_list", "odoo-addon-g2p_proxy_means_test @ {root:uri}/g2p_proxy_means_test", + "odoo-addon-g2p_reimbursement_portal @ {root:uri}/g2p_reimbursement_portal", "odoo-addon-g2p_social_registry_importer @ {root:uri}/g2p_social_registry_importer", "odoo-addon-g2p_theme @ {root:uri}/g2p_theme", ] diff --git a/test-pre-requirements.txt b/test-pre-requirements.txt index 33c3c30a..7caf13b4 100644 --- a/test-pre-requirements.txt +++ b/test-pre-requirements.txt @@ -1,3 +1,3 @@ git+https://github.com/OpenG2P/openg2p-pbms-community-addons@17.0-develop -git+https://github.com/OpenG2P/openg2p-registry@17.0-1.4 +git+https://github.com/OpenG2P/openg2p-registry@17.0-develop