From 07804d9547b08cf50c65421fd7ac174687acd7b7 Mon Sep 17 00:00:00 2001 From: Ivan Yelizariev Date: Fri, 28 Feb 2025 15:11:14 +0100 Subject: [PATCH 1/2] :zap: sync: improve sync.order --- sync/__manifest__.py | 2 +- sync/data/sync_project_unittest_demo.xml | 1 + sync/doc/changelog.rst | 6 +++ sync/models/sync_order.py | 60 ++++++++++++++++++++++-- sync/models/sync_project.py | 9 +++- sync/models/sync_task.py | 7 ++- sync/models/sync_trigger_automation.py | 4 +- sync/security/ir.model.access.csv | 3 ++ sync/views/sync_order_views.xml | 34 ++++++++++---- sync/views/sync_project_views.xml | 7 ++- 10 files changed, 114 insertions(+), 19 deletions(-) diff --git a/sync/__manifest__.py b/sync/__manifest__.py index bd105d80..9d2a9410 100644 --- a/sync/__manifest__.py +++ b/sync/__manifest__.py @@ -7,7 +7,7 @@ "name": "Sync 🪬 Studio", "summary": """Join the Amazing 😍 Community ⤵️""", "category": "VooDoo ✨ Magic", - "version": "17.0.13.0.1", + "version": "17.0.14.0.0", "application": True, "author": "Ivan Yelizariev", "support": "info@odoomagic.com", diff --git a/sync/data/sync_project_unittest_demo.xml b/sync/data/sync_project_unittest_demo.xml index 3d543c88..8644cdc4 100644 --- a/sync/data/sync_project_unittest_demo.xml +++ b/sync/data/sync_project_unittest_demo.xml @@ -15,6 +15,7 @@ Assign ref to new partners + test -from odoo import api, fields, models +# Copyright 2024-2025 Ivan Yelizariev +from odoo import fields, models class SyncOrder(models.Model): @@ -16,12 +16,17 @@ class SyncOrder(models.Model): ondelete="cascade", required=True, ) + sync_job_id = fields.Many2one("sync.job") description = fields.Html(related="sync_task_id.sync_order_description") + # DEPRECATED. Use line_ids.record_id instead record_id = fields.Reference( string="Blackjack", selection="_selection_record_id", help="Optional extra information to perform this task", ) + line_ids = fields.One2many( + "sync.order.line", "sync_order_id", string="Linked Records" + ) partner_ids = fields.Many2many("res.partner", string="Partners") state = fields.Selection( @@ -34,7 +39,6 @@ class SyncOrder(models.Model): default="draft", ) - @api.model def _selection_record_id(self): mm = self.sync_task_id.sync_order_model_id if not mm: @@ -53,3 +57,53 @@ def action_cancel(self): def action_refresh(self): # Magic pass + + +class SyncOrderLine(models.Model): + _name = "sync.order.line" + _description = "Sync Order Records" + + sync_order_id = fields.Many2one("sync.order") + record_id = fields.Reference( + string="Linked Record", + selection="_selection_record_id", + help="Optional extra information to perform this task", + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("open", "In Progress"), + ("done", "Done"), + ("error", "Failed"), + ("cancel", "Canceled"), + ], + default="draft", + ) + value = fields.Char("Extra Input") + result = fields.Char("Result") + + def _selection_record_id(self): + mm = self.sync_order_id.sync_task_id.sync_order_model_id + if not mm: + return [] + return [(mm.model, mm.name)] + + def action_done(self, msg=None): + self.write({"state": "done"}) + if msg: + self.write({"result": msg}) + + def action_confirm(self, msg=None): + self.write({"state": "open"}) + if msg: + self.write({"result": msg}) + + def action_error(self, msg=None): + self.write({"state": "error"}) + if msg: + self.write({"result": msg}) + + def action_cancel(self, msg=None): + self.write({"state": "cancel"}) + if msg: + self.write({"result": msg}) diff --git a/sync/models/sync_project.py b/sync/models/sync_project.py index be8fe4c1..20c629b0 100644 --- a/sync/models/sync_project.py +++ b/sync/models/sync_project.py @@ -1,4 +1,4 @@ -# Copyright 2020,2022,2024 Ivan Yelizariev +# Copyright 2020,2022,2024-2025 Ivan Yelizariev # Copyright 2020-2021 Denis Mudarisov # Copyright 2021 Ilya Ilchenko # License MIT (https://opensource.org/licenses/MIT). @@ -519,6 +519,12 @@ def link_src_dst(src_data, dst_ref): "sync_external": sync_external, } + def task(self, technical_name): + """Finds task by technical_name""" + return self.task_ids.filtered( + lambda task: task.technical_name == technical_name + )[:1] + def magic_upgrade(self): self.ensure_one() if not self.source_url: @@ -645,6 +651,7 @@ def magic_upgrade(self): task_vals = { "name": task_name, + "technical_name": task_technical_name, "code": file_content, "magic_button": meta.get("MAGIC_BUTTON", "Magic ✨ Button") if has_handle_button diff --git a/sync/models/sync_task.py b/sync/models/sync_task.py index 4f4be285..8a04b63e 100644 --- a/sync/models/sync_task.py +++ b/sync/models/sync_task.py @@ -1,4 +1,4 @@ -# Copyright 2020 Ivan Yelizariev +# Copyright 2020,2025 Ivan Yelizariev # Copyright 2021 Denis Mudarisov # License MIT (https://opensource.org/licenses/MIT). @@ -23,6 +23,11 @@ class SyncTask(models.Model): project_id = fields.Many2one("sync.project", ondelete="cascade") name = fields.Char("Name", help="e.g. Sync Products", required=True) + technical_name = fields.Char( + "Technical Name", + help="Identifier equal to gist file name after removing prefix 'task.' and suffix '.py'", + required=True, + ) code = fields.Text("Code") code_check = fields.Text("Syntax check", store=False, readonly=True) active = fields.Boolean(default=True) diff --git a/sync/models/sync_trigger_automation.py b/sync/models/sync_trigger_automation.py index e211d68d..fe9ffe40 100644 --- a/sync/models/sync_trigger_automation.py +++ b/sync/models/sync_trigger_automation.py @@ -52,7 +52,9 @@ def create(self, vals_list): def start(self, records): if self.active: - self.sync_task_id.start(self, args=(records,), with_delay=True) + sync_job = self.sync_task_id.start(self, args=(records,), with_delay=True) + if records._name == "sync.order": + records.write({"sync_job_id": sync_job.id}) def get_code(self): return ( diff --git a/sync/security/ir.model.access.csv b/sync/security/ir.model.access.csv index fa317b6b..7de65d7d 100644 --- a/sync/security/ir.model.access.csv +++ b/sync/security/ir.model.access.csv @@ -8,6 +8,9 @@ access_sync_task_manager,sync.task manager,model_sync_task,sync_group_manager,1, access_sync_order_user,sync.order user,model_sync_order,sync_group_user,1,0,0,0 access_sync_order_dev,sync.order dev,model_sync_order,sync_group_dev,1,1,1,1 access_sync_order_manager,sync.order manager,model_sync_order,sync_group_manager,1,1,1,1 +access_sync_order_line_user,sync.order_line user,model_sync_order_line,sync_group_user,1,0,0,0 +access_sync_order_line_dev,sync.order_line dev,model_sync_order_line,sync_group_dev,1,1,1,1 +access_sync_order_line_manager,sync.order_line manager,model_sync_order_line,sync_group_manager,1,1,1,1 access_sync_data_user,sync.data user,model_sync_data,sync_group_user,1,0,0,0 access_sync_data_dev,sync.data dev,model_sync_data,sync_group_dev,1,1,1,1 access_sync_data_manager,sync.data manager,model_sync_data,sync_group_manager,1,1,1,1 diff --git a/sync/views/sync_order_views.xml b/sync/views/sync_order_views.xml index d68ecf86..7b18ab2b 100644 --- a/sync/views/sync_order_views.xml +++ b/sync/views/sync_order_views.xml @@ -55,21 +55,35 @@ - + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + +
diff --git a/sync/views/sync_project_views.xml b/sync/views/sync_project_views.xml index d6d41c57..9022ff71 100644 --- a/sync/views/sync_project_views.xml +++ b/sync/views/sync_project_views.xml @@ -178,7 +178,7 @@ />