diff --git a/.oca/oca-port/blacklist/edi_core_oca.json b/.oca/oca-port/blacklist/edi_core_oca.json new file mode 100644 index 000000000..c05809bec --- /dev/null +++ b/.oca/oca-port/blacklist/edi_core_oca.json @@ -0,0 +1,5 @@ +{ + "pull_requests": { + "OCA/edi-framework#238": "not used in 19.0" + } +} diff --git a/README.md b/README.md index 969da9b0b..c5a5ead17 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,9 @@ Available addons addon | version | maintainers | summary --- | --- | --- | --- [edi_component_oca](edi_component_oca/) | 19.0.1.1.0 | simahawk etobella | Allow to use Connector as a source in EDI -[edi_core_oca](edi_core_oca/) | 19.0.1.1.1 | simahawk etobella | Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. +[edi_core_oca](edi_core_oca/) | 19.0.1.2.0 | simahawk etobella | Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. [edi_endpoint_oca](edi_endpoint_oca/) | 19.0.1.1.1 | | Base module allowing configuration of custom endpoints for EDI framework. +[edi_product_oca](edi_product_oca/) | 19.0.1.0.0 | | EDI framework configuration and base logic for products and units of measure [edi_purchase_oca](edi_purchase_oca/) | 19.0.1.0.0 | | Define EDI Configuration for Purchase Orders [edi_queue_oca](edi_queue_oca/) | 19.0.1.0.0 | | Set Queue Jobs on EDI [edi_record_metadata_oca](edi_record_metadata_oca/) | 19.0.1.0.1 | simahawk | Allow to store metadata for related records. diff --git a/edi_core_oca/README.rst b/edi_core_oca/README.rst index f6e2f1f85..dfe98e764 100644 --- a/edi_core_oca/README.rst +++ b/edi_core_oca/README.rst @@ -11,7 +11,7 @@ EDI !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:6de4d001a15163487f927339a07e683d6b1f2af518d9064dc8146f109ae8957d + !! source digest: sha256:46139d4cc31684944b8784e2503633ab59a96d8b072b42ee5ab30cd8f2177930 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/edi_core_oca/__manifest__.py b/edi_core_oca/__manifest__.py index ebbc2617e..5496b6981 100644 --- a/edi_core_oca/__manifest__.py +++ b/edi_core_oca/__manifest__.py @@ -9,7 +9,7 @@ Define backends, exchange types, exchange records, basic automation and views for handling EDI exchanges. """, - "version": "19.0.1.1.1", + "version": "19.0.1.2.0", "website": "https://github.com/OCA/edi-framework", "development_status": "Beta", "license": "LGPL-3", @@ -27,6 +27,8 @@ "data/ir_actions_server.xml", "data/sequence.xml", "data/edi_configuration.xml", + "data/ir_cron_archive_old_edi_records.xml", + "data/ir_cron_delete_old_archived_edi_records.xml", "security/res_groups.xml", "security/ir_model_access.xml", "views/edi_backend_views.xml", diff --git a/edi_core_oca/data/ir_cron_archive_old_edi_records.xml b/edi_core_oca/data/ir_cron_archive_old_edi_records.xml new file mode 100644 index 000000000..b1e8dc78d --- /dev/null +++ b/edi_core_oca/data/ir_cron_archive_old_edi_records.xml @@ -0,0 +1,27 @@ + + + + Archive Old EDI Exchange Records + + code + +# Archive old EDI exchange records based on backend configuration +backends = env['edi.backend'].search([ + ('auto_archive_records_after_days', '>', 0) +]) +for backend in backends: + cutoff_date = datetime.datetime.now() - datetime.timedelta(days=backend.auto_archive_records_after_days) + records = model.search([ + ('backend_id', '=', backend.id), + ('create_date', '<', cutoff_date), + ('active', '=', True) + ], limit=10000, order="create_date asc") + if records: + records.action_archive() + + 1 + days + + + + diff --git a/edi_core_oca/data/ir_cron_delete_old_archived_edi_records.xml b/edi_core_oca/data/ir_cron_delete_old_archived_edi_records.xml new file mode 100644 index 000000000..05d05a111 --- /dev/null +++ b/edi_core_oca/data/ir_cron_delete_old_archived_edi_records.xml @@ -0,0 +1,27 @@ + + + + Delete Old Archived EDI Exchange Records + + code + +# Delete old archived EDI exchange records based on backend configuration +backends = env['edi.backend'].search([ + ('auto_delete_records_after_days', '>', 0) +]) +for backend in backends: + cutoff_date = datetime.datetime.now() - datetime.timedelta(days=backend.auto_delete_records_after_days) + records = model.search([ + ('backend_id', '=', backend.id), + ('create_date', '<', cutoff_date), + ('active', '=', False) + ], limit=100, order="create_date asc") + if records: + records.unlink() + + 3 + hours + + + + diff --git a/edi_core_oca/i18n/edi_core_oca.pot b/edi_core_oca/i18n/edi_core_oca.pot index 94dfe6786..680230e58 100644 --- a/edi_core_oca/i18n/edi_core_oca.pot +++ b/edi_core_oca/i18n/edi_core_oca.pot @@ -89,6 +89,11 @@ msgid "" "* Custom: let devs handle a custom behavior with specific developments\n" msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -192,10 +197,12 @@ msgstr "" #: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration_trigger__active +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type_rule__active #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_search +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_search msgid "Active" @@ -240,11 +247,17 @@ msgstr "" msgid "Apply to this model" msgstr "" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_archive_old_edi_records_ir_actions_server +msgid "Archive Old EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_trigger_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form @@ -264,6 +277,30 @@ msgid "" "will take care of generating the output when not set yet. " msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "Auto-archive records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "Auto-delete archived records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "" +"Automatically archive EDI exchange records after X days. Set to <= 0 to " +"disable auto-archiving." +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "" +"Automatically delete archived EDI exchange records after X days. Set to <= 0" +" to disable auto-deletion." +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__backend_id #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__backend_id @@ -416,6 +453,11 @@ msgstr "" msgid "Decoding Error Handler" msgstr "" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_delete_old_archived_edi_records_ir_actions_server +msgid "Delete Old Archived EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration__description #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration_trigger__description @@ -739,6 +781,7 @@ msgstr "" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "" @@ -881,6 +924,7 @@ msgstr "" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "" @@ -1394,6 +1438,11 @@ msgstr "" msgid "Record ID=%d is not meant to be sent!" msgstr "" +#. module: edi_core_oca +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +msgid "Records retention" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_form msgid "Regenerate" @@ -1638,7 +1687,8 @@ msgstr "" #: model:ir.model.fields,help:edi_core_oca.field_edi_exchange_type__quick_exec msgid "" "When active, records of this type will be processed immediately without " -"waiting for the cron to pass by." +"waiting for the cron to pass by. Requires auto generate flag to be active as" +" well. The cron will skip these records unless forced." msgstr "" #. module: edi_core_oca diff --git a/edi_core_oca/i18n/es.po b/edi_core_oca/i18n/es.po index 922cada7b..dec364c6f 100644 --- a/edi_core_oca/i18n/es.po +++ b/edi_core_oca/i18n/es.po @@ -93,6 +93,11 @@ msgid "" "* Custom: let devs handle a custom behavior with specific developments\n" msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -196,10 +201,12 @@ msgstr "" #: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration_trigger__active +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type_rule__active #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_search +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_search msgid "Active" @@ -244,11 +251,17 @@ msgstr "" msgid "Apply to this model" msgstr "" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_archive_old_edi_records_ir_actions_server +msgid "Archive Old EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_trigger_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form @@ -268,6 +281,30 @@ msgid "" "will take care of generating the output when not set yet. " msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "Auto-archive records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "Auto-delete archived records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "" +"Automatically archive EDI exchange records after X days. Set to <= 0 to " +"disable auto-archiving." +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "" +"Automatically delete archived EDI exchange records after X days. Set to <= 0 " +"to disable auto-deletion." +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__backend_id #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__backend_id @@ -420,6 +457,11 @@ msgstr "" msgid "Decoding Error Handler" msgstr "" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_delete_old_archived_edi_records_ir_actions_server +msgid "Delete Old Archived EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration__description #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration_trigger__description @@ -743,6 +785,7 @@ msgstr "" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "" @@ -885,6 +928,7 @@ msgstr "" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "" @@ -1402,6 +1446,11 @@ msgstr "" msgid "Record ID=%d is not meant to be sent!" msgstr "" +#. module: edi_core_oca +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +msgid "Records retention" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_form msgid "Regenerate" @@ -1647,7 +1696,8 @@ msgstr "" #: model:ir.model.fields,help:edi_core_oca.field_edi_exchange_type__quick_exec msgid "" "When active, records of this type will be processed immediately without " -"waiting for the cron to pass by." +"waiting for the cron to pass by. Requires auto generate flag to be active as " +"well. The cron will skip these records unless forced." msgstr "" #. module: edi_core_oca diff --git a/edi_core_oca/i18n/fr.po b/edi_core_oca/i18n/fr.po index f05fb4159..4962aea13 100644 --- a/edi_core_oca/i18n/fr.po +++ b/edi_core_oca/i18n/fr.po @@ -95,6 +95,11 @@ msgid "" "* Custom: let devs handle a custom behavior with specific developments\n" msgstr "" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -201,10 +206,12 @@ msgstr "" #: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration_trigger__active +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type_rule__active #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_search +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_search msgid "Active" @@ -251,11 +258,17 @@ msgstr "" msgid "Apply to this model" msgstr "" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_archive_old_edi_records_ir_actions_server +msgid "Archive Old EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_trigger_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form @@ -278,6 +291,30 @@ msgstr "" "utile est manquante. Si cette option est active, un cron se chargera de " "générer la sortie lorsqu'elle n'est pas encore définie. " +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "Auto-archive records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "Auto-delete archived records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "" +"Automatically archive EDI exchange records after X days. Set to <= 0 to " +"disable auto-archiving." +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "" +"Automatically delete archived EDI exchange records after X days. Set to <= 0 " +"to disable auto-deletion." +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__backend_id #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__backend_id @@ -430,6 +467,11 @@ msgstr "" msgid "Decoding Error Handler" msgstr "" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_delete_old_archived_edi_records_ir_actions_server +msgid "Delete Old Archived EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration__description #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration_trigger__description @@ -753,6 +795,7 @@ msgstr "" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "" @@ -896,6 +939,7 @@ msgstr "" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "" @@ -1420,6 +1464,11 @@ msgstr "" msgid "Record ID=%d is not meant to be sent!" msgstr "" +#. module: edi_core_oca +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +msgid "Records retention" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_form msgid "Regenerate" @@ -1665,7 +1714,8 @@ msgstr "" #: model:ir.model.fields,help:edi_core_oca.field_edi_exchange_type__quick_exec msgid "" "When active, records of this type will be processed immediately without " -"waiting for the cron to pass by." +"waiting for the cron to pass by. Requires auto generate flag to be active as " +"well. The cron will skip these records unless forced." msgstr "" #. module: edi_core_oca diff --git a/edi_core_oca/i18n/it.po b/edi_core_oca/i18n/it.po index 774219a6c..86758cb0d 100644 --- a/edi_core_oca/i18n/it.po +++ b/edi_core_oca/i18n/it.po @@ -154,6 +154,11 @@ msgstr "" "* Personalizzato: consente agli sviluppatori di gestire un comportamento " "personalizzato con sviluppo personalizzato\n" +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_count +msgid "# Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_consumer_mixin_buttons msgid " EDI actions" @@ -259,10 +264,12 @@ msgstr "Riemesso ACK: stato riportato a '%s'" #: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration_trigger__active +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__active #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type_rule__active #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_search +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_search msgid "Active" @@ -309,11 +316,17 @@ msgstr "" msgid "Apply to this model" msgstr "Applica a questo modello" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_archive_old_edi_records_ir_actions_server +msgid "Archive Old EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_trigger_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_configuration_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_form #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_rule_view_search #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form @@ -336,6 +349,30 @@ msgstr "" "contenuto. Se attiva, un cron gestirà la generazione dell'output quando non " "ancora impostato. " +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "Auto-archive records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "Auto-delete archived records after (days)" +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_archive_records_after_days +msgid "" +"Automatically archive EDI exchange records after X days. Set to <= 0 to " +"disable auto-archiving." +msgstr "" + +#. module: edi_core_oca +#: model:ir.model.fields,help:edi_core_oca.field_edi_backend__auto_delete_records_after_days +msgid "" +"Automatically delete archived EDI exchange records after X days. Set to <= 0 " +"to disable auto-deletion." +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_configuration__backend_id #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_record__backend_id @@ -488,6 +525,11 @@ msgstr "Personalizzato" msgid "Decoding Error Handler" msgstr "Gestore errore decodifica" +#. module: edi_core_oca +#: model:ir.actions.server,name:edi_core_oca.ir_cron_delete_old_archived_edi_records_ir_actions_server +msgid "Delete Old Archived EDI Exchange Records" +msgstr "" + #. module: edi_core_oca #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration__description #: model:ir.model.fields,help:edi_core_oca.field_edi_configuration_trigger__description @@ -815,6 +857,7 @@ msgstr "Sequenza nome file scambio" #. module: edi_core_oca #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_consumer_mixin__exchange_record_ids #: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_related_record__exchange_record_id +#: model:ir.model.fields,field_description:edi_core_oca.field_edi_exchange_type__exchange_record_ids msgid "Exchange Record" msgstr "Record di scambio" @@ -959,6 +1002,7 @@ msgstr "Scambiato oggi" #: model:ir.actions.act_window,name:edi_core_oca.act_open_edi_exchange_record_view #: model:ir.ui.menu,name:edi_core_oca.menu_edi_exchange_record_root #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_type_view_form msgid "Exchanges" msgstr "Scambi" @@ -1500,6 +1544,11 @@ msgstr "Record ID=%d non è previsto che sia elaborato" msgid "Record ID=%d is not meant to be sent!" msgstr "Record ID=%d non è previsto che sia inviato!" +#. module: edi_core_oca +#: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_backend_view_form +msgid "Records retention" +msgstr "" + #. module: edi_core_oca #: model_terms:ir.ui.view,arch_db:edi_core_oca.edi_exchange_record_view_form msgid "Regenerate" @@ -1756,10 +1805,9 @@ msgstr "Cronologia comunicazioni sito web" #: model:ir.model.fields,help:edi_core_oca.field_edi_exchange_type__quick_exec msgid "" "When active, records of this type will be processed immediately without " -"waiting for the cron to pass by." +"waiting for the cron to pass by. Requires auto generate flag to be active as " +"well. The cron will skip these records unless forced." msgstr "" -"Quando attiva, i record di questo tipo verranno elaborati immediatamente " -"senza attendere il cron." #. module: edi_core_oca #: model:ir.model.fields,help:edi_core_oca.field_edi_exchange_consumer_mixin__edi_disable_auto @@ -1787,6 +1835,13 @@ msgstr "errore nell'invio" msgid "id" msgstr "id" +#~ msgid "" +#~ "When active, records of this type will be processed immediately without " +#~ "waiting for the cron to pass by." +#~ msgstr "" +#~ "Quando attiva, i record di questo tipo verranno elaborati immediatamente " +#~ "senza attendere il cron." + #~ msgid "" #~ "\n" #~ " The related record is not available " diff --git a/edi_core_oca/models/edi_backend.py b/edi_core_oca/models/edi_backend.py index e6d4b9f6a..6a065ae34 100644 --- a/edi_core_oca/models/edi_backend.py +++ b/edi_core_oca/models/edi_backend.py @@ -64,6 +64,18 @@ class EDIBackend(models.Model): ) active = fields.Boolean(default=True) company_id = fields.Many2one("res.company", string="Company") + auto_archive_records_after_days = fields.Integer( + string="Auto-archive records after (days)", + default=0, + help="Automatically archive EDI exchange records after X days. " + "Set to <= 0 to disable auto-archiving.", + ) + auto_delete_records_after_days = fields.Integer( + string="Auto-delete archived records after (days)", + default=0, + help="Automatically delete archived EDI exchange records after X days. " + "Set to <= 0 to disable auto-deletion.", + ) @property def exchange_record_model(self): @@ -384,6 +396,15 @@ def _output_new_records_domain(self, record_ids=None): ] if record_ids: domain.append(("id", "in", record_ids)) + # By default, it's pointless to consider records with quick_exec + # because they will be executed right away when created. + domain.append( + ( + "type_id.quick_exec", + "=", + self.env.context.get("edi__quick_exec", False), + ) + ) return domain def _output_pending_records_domain(self, skip_sent=True, record_ids=None): @@ -439,6 +460,7 @@ def exchange_process(self, exchange_record): old_state = state = exchange_record.edi_exchange_state error = traceback = False message = None + res = None try: res = self._exchange_process(exchange_record) except self._swallable_exceptions() as err: diff --git a/edi_core_oca/models/edi_exchange_record.py b/edi_core_oca/models/edi_exchange_record.py index ce150f044..207464d39 100644 --- a/edi_core_oca/models/edi_exchange_record.py +++ b/edi_core_oca/models/edi_exchange_record.py @@ -145,6 +145,7 @@ class EDIExchangeRecord(models.Model): help="The record state can be rolled back manually in case of failure.", ) company_id = fields.Many2one("res.company", string="Company") + active = fields.Boolean(default=True) _identifier_uniq = models.Constraint( "unique(identifier)", "The identifier must be unique." @@ -379,10 +380,11 @@ def _execute_next_action(self): # The backend already knows how to handle records # according to their direction and status. # Let it decide. + backend = self.backend_id.with_context(edi__quick_exec=True) if self.type_id.direction == "output": - self.backend_id._check_output_exchange_sync(record_ids=self.ids) + backend._check_output_exchange_sync(record_ids=self.ids) else: - self.backend_id._check_input_exchange_sync(record_ids=self.ids) + backend._check_input_exchange_sync(record_ids=self.ids) @api.constrains("backend_id", "type_id") def _constrain_backend(self): diff --git a/edi_core_oca/models/edi_exchange_type.py b/edi_core_oca/models/edi_exchange_type.py index d6a2cab96..c8be3ebb6 100644 --- a/edi_core_oca/models/edi_exchange_type.py +++ b/edi_core_oca/models/edi_exchange_type.py @@ -147,6 +147,14 @@ class EDIExchangeType(models.Model): """, ) advanced_settings = Serialized(default={}, compute="_compute_advanced_settings") + exchange_record_ids = fields.One2many( + comodel_name="edi.exchange.record", + inverse_name="type_id", + ) + exchange_record_count = fields.Integer( + string="# Exchange Records", + compute="_compute_exchange_record_count", + ) rule_ids = fields.One2many( comodel_name="edi.exchange.type.rule", inverse_name="type_id", @@ -155,7 +163,9 @@ class EDIExchangeType(models.Model): quick_exec = fields.Boolean( string="Quick execution", help="When active, records of this type will be processed immediately " - "without waiting for the cron to pass by.", + "without waiting for the cron to pass by. " + "Requires auto generate flag to be active as well. " + "The cron will skip these records unless forced.", ) partner_ids = fields.Many2many( string="Enabled for partners", @@ -234,6 +244,17 @@ def _compute_ack_for_type_ids(self): for rec in self: rec.ack_for_type_ids = [x.id for x in by_type_id.get(rec.id, [])] + @api.depends("exchange_record_ids") + def _compute_exchange_record_count(self): + data = self.env["edi.exchange.record"]._read_group( + [("type_id", "in", self.ids)], + groupby=["type_id"], + aggregates=["__count"], + ) + mapped_data = {type_.id: count for type_, count in data} + for rec in self: + rec.exchange_record_count = mapped_data.get(rec.id, 0) + def get_settings(self): return self.advanced_settings @@ -325,3 +346,16 @@ def copy_data(self, default=None): default = dict(default or {}) default.setdefault("code", f"{self.code}_COPY_FIXME") return super().copy_data(default=default) + + def action_view_exchange_records(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id( + "edi_core_oca.act_open_edi_exchange_record_view" + ) + action["domain"] = [("type_id", "=", self.id)] + action["context"] = { + "default_type_id": self.id, + "default_backend_id": self.backend_id.id, + "search_default_type_id": self.id, + } + return action diff --git a/edi_core_oca/static/description/index.html b/edi_core_oca/static/description/index.html index 8c3e944a6..03d5c155b 100644 --- a/edi_core_oca/static/description/index.html +++ b/edi_core_oca/static/description/index.html @@ -372,7 +372,7 @@

EDI

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:6de4d001a15163487f927339a07e683d6b1f2af518d9064dc8146f109ae8957d +!! source digest: sha256:46139d4cc31684944b8784e2503633ab59a96d8b072b42ee5ab30cd8f2177930 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: LGPL-3 OCA/edi-framework Translate me on Weblate Try me on Runboat

Base EDI backend.

diff --git a/edi_core_oca/tests/test_backend_base.py b/edi_core_oca/tests/test_backend_base.py index 87219bea0..8e42f8203 100644 --- a/edi_core_oca/tests/test_backend_base.py +++ b/edi_core_oca/tests/test_backend_base.py @@ -12,6 +12,14 @@ class EDIBackendTestCaseBase(EDIBackendCommonTestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.default_record = cls.backend.create_record( + "test_csv_input", + {"model": cls.partner._name, "res_id": cls.partner.id}, + ) + @classmethod def _setup_records(cls): # pylint:disable=missing-return super()._setup_records() @@ -96,3 +104,61 @@ def test_get_handler_no_handler(self): for action in ["receive", "input_validate", "process"]: with self.assertRaises(EDINotImplementedError): self.backend._get_exec_handler(record, action) + + # ---- conf / env_ctx resolution ------------------------------------------ + + def test_get_conf_for_record(self): + """`_get_conf_for_record` returns the action conf, or {} when missing.""" + self.exchange_type_in.advanced_settings_edit = ( + "execution_model:\n" + " receive:\n" + " env_ctx:\n" + " foo: bar\n" + " other_key: 1\n" + ) + record = self.default_record + # Action declared -> its conf + self.assertEqual( + self.backend._get_conf_for_record(record, "receive"), + {"env_ctx": {"foo": "bar"}, "other_key": 1}, + ) + # Action not declared -> empty + self.assertEqual(self.backend._get_conf_for_record(record, "process"), {}) + + def test_get_record_env_ctx(self): + """`_get_record_env_ctx` returns env_ctx for the action, else {}.""" + self.exchange_type_in.advanced_settings_edit = ( + "execution_model:\n" + " receive:\n" + " env_ctx:\n" + " foo: bar\n" + " flag: true\n" + " process:\n" + " other_key: 1\n" + ) + record = self.default_record + # Action with env_ctx -> mapping + self.assertEqual( + self.backend._get_record_env_ctx(record, "receive"), + {"foo": "bar", "flag": True}, + ) + # Action present but no env_ctx -> empty + self.assertEqual(self.backend._get_record_env_ctx(record, "process"), {}) + + def test_get_exec_handler_propagates_env_ctx(self): + """The handler returned by `_get_exec_handler` carries env_ctx keys.""" + self.exchange_type_in.advanced_settings_edit = ( + "execution_model:\n" + " receive:\n" + " env_ctx:\n" + " edi_test_marker: hello\n" + " edi_test_flag: true\n" + ) + record = self.default_record + handler = self.backend._get_exec_handler(record, "receive") + ctx = handler.__self__.env.context + self.assertEqual(ctx.get("edi_test_marker"), "hello") + self.assertEqual(ctx.get("edi_test_flag"), True) + # Action without env_ctx -> handler context not polluted + handler_proc = self.backend._get_exec_handler(record, "process") + self.assertNotIn("edi_test_marker", handler_proc.__self__.env.context) diff --git a/edi_core_oca/tests/test_edi_backend_cron.py b/edi_core_oca/tests/test_edi_backend_cron.py index 3e8f49147..88e3538d9 100644 --- a/edi_core_oca/tests/test_edi_backend_cron.py +++ b/edi_core_oca/tests/test_edi_backend_cron.py @@ -82,14 +82,8 @@ def test_exchange_generate_new_auto_skip_send(self): # TODO: test better? self.assertFalse(rec.ack_exchange_id) - @mute_logger(*LOGGERS) - def test_exchange_generate_new_auto_send(self): - self.exchange_type_out.exchange_file_auto_generate = True - # No content ready to be sent, will get the content and send it - for rec in self.records: - self.assertEqual(rec.edi_exchange_state, "new") - self.backend._cron_check_output_exchange_sync() - for rec in self.records: + def _test_generate_new_auto_send(self, records): + for rec in records: self.assertEqual(rec.edi_exchange_state, "output_sent") self.assertTrue( self.ExecutionAbstractModel.check_called_for(rec, "generate") @@ -99,6 +93,26 @@ def test_exchange_generate_new_auto_send(self): ) self.assertTrue(self.ExecutionAbstractModel.check_called_for(rec, "send")) + @mute_logger(*LOGGERS) + def test_exchange_generate_new_auto_send(self): + self.exchange_type_out.exchange_file_auto_generate = True + # No content ready to be sent, will get the content and send it + for rec in self.records: + self.assertEqual(rec.edi_exchange_state, "new") + self.backend._cron_check_output_exchange_sync() + self._test_generate_new_auto_send(self.records) + + @mute_logger(*LOGGERS) + def test_exchange_generate_new_quick_exec_skip_cron(self): + self.exchange_type_out.exchange_file_auto_generate = True + self.exchange_type_out.quick_exec = True + for rec in self.records: + self.assertEqual(rec.edi_exchange_state, "new") + # Records w/ quick exec should be skipped by the cron + self.backend._cron_check_output_exchange_sync() + for rec in self.records: + self.assertEqual(rec.edi_exchange_state, "new") + @mute_logger(*LOGGERS) def test_exchange_generate_output_ready_auto_send(self): # No content ready to be sent, will get the content and send it diff --git a/edi_core_oca/tests/test_exchange_type.py b/edi_core_oca/tests/test_exchange_type.py index 34b8bc958..2c1a11c28 100644 --- a/edi_core_oca/tests/test_exchange_type.py +++ b/edi_core_oca/tests/test_exchange_type.py @@ -167,3 +167,40 @@ def test_archive_rules(self): rule2.invalidate_recordset() self.assertFalse(rule1.active) self.assertFalse(rule2.active) + + def _create_exchange_record(self, exc_type): + return self.backend.create_record( + exc_type.code, + {"model": self.partner._name, "res_id": self.partner.id}, + ) + + def test_exchange_record_count(self): + exc_type = self.exchange_type_out + self.assertEqual(exc_type.exchange_record_count, 0) + rec1 = self._create_exchange_record(exc_type) + rec2 = self._create_exchange_record(exc_type) + # Record on a different type must not be counted + self._create_exchange_record(self.exchange_type_in) + self.assertEqual(exc_type.exchange_record_count, 2) + self.assertEqual(set(exc_type.exchange_record_ids.ids), {rec1.id, rec2.id}) + + def test_action_view_exchange_records(self): + exc_type = self.exchange_type_out + rec = self._create_exchange_record(exc_type) + action = exc_type.action_view_exchange_records() + self.assertEqual(action["type"], "ir.actions.act_window") + self.assertEqual(action["res_model"], "edi.exchange.record") + self.assertIn(("type_id", "=", exc_type.id), action["domain"]) + ctx = action["context"] + self.assertEqual(ctx.get("default_type_id"), exc_type.id) + self.assertEqual(ctx.get("default_backend_id"), exc_type.backend_id.id) + self.assertEqual(ctx.get("search_default_type_id"), exc_type.id) + # The action's domain must actually match the created exchange record + records = self.env[action["res_model"]].search(action["domain"]) + self.assertIn(rec, records) + + def test_action_view_exchange_records_requires_singleton(self): + with self.assertRaises(ValueError): + ( + self.exchange_type_out | self.exchange_type_in + ).action_view_exchange_records() diff --git a/edi_core_oca/views/edi_backend_views.xml b/edi_core_oca/views/edi_backend_views.xml index 2f557e0d3..5c4aea4f4 100644 --- a/edi_core_oca/views/edi_backend_views.xml +++ b/edi_core_oca/views/edi_backend_views.xml @@ -57,7 +57,14 @@ - + + + + + + + + diff --git a/edi_core_oca/views/edi_exchange_record_views.xml b/edi_core_oca/views/edi_exchange_record_views.xml index 137805ab9..3b1a3f529 100644 --- a/edi_core_oca/views/edi_exchange_record_views.xml +++ b/edi_core_oca/views/edi_exchange_record_views.xml @@ -265,6 +265,17 @@ help="Show all records created in the last 7 days" /> + + + diff --git a/edi_core_oca/views/edi_exchange_type_views.xml b/edi_core_oca/views/edi_exchange_type_views.xml index e7f0be5e1..76bb21a4c 100644 --- a/edi_core_oca/views/edi_exchange_type_views.xml +++ b/edi_core_oca/views/edi_exchange_type_views.xml @@ -26,6 +26,20 @@ bg_color="bg-danger" invisible="active" /> +
+ +