Skip to content

Commit 07804d9

Browse files
committed
⚡ sync: improve sync.order
1 parent 13636ae commit 07804d9

File tree

10 files changed

+114
-19
lines changed

10 files changed

+114
-19
lines changed

sync/__manifest__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"name": "Sync 🪬 Studio",
88
"summary": """Join the Amazing 😍 Community ⤵️""",
99
"category": "VooDoo ✨ Magic",
10-
"version": "17.0.13.0.1",
10+
"version": "17.0.14.0.0",
1111
"application": True,
1212
"author": "Ivan Yelizariev",
1313
"support": "info@odoomagic.com",

sync/data/sync_project_unittest_demo.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
</record>
1616
<record id="test_task" model="sync.task">
1717
<field name="name">Assign ref to new partners</field>
18+
<field name="technical_name">test</field>
1819
<field name="project_id" ref="sync.test_project" />
1920
<field name="code">
2021
<![CDATA[

sync/doc/changelog.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
`13.0.1`
22
-------
33

4+
- **New:** sync.order: attaching multiple records via new line_ids field; automatic link to sync.job record.
5+
- **New:** sync.task: save technical_name of the task for a better integration with Odoo UI (e.g. to call task via custom action)
6+
7+
`13.0.1`
8+
-------
9+
410
- **Fix:** update params updating on existing records
511

612
`13.0.0`

sync/models/sync_order.py

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
# Copyright 2024 Ivan Yelizariev <https://twitter.com/yelizariev>
2-
from odoo import api, fields, models
1+
# Copyright 2024-2025 Ivan Yelizariev <https://twitter.com/yelizariev>
2+
from odoo import fields, models
33

44

55
class SyncOrder(models.Model):
@@ -16,12 +16,17 @@ class SyncOrder(models.Model):
1616
ondelete="cascade",
1717
required=True,
1818
)
19+
sync_job_id = fields.Many2one("sync.job")
1920
description = fields.Html(related="sync_task_id.sync_order_description")
21+
# DEPRECATED. Use line_ids.record_id instead
2022
record_id = fields.Reference(
2123
string="Blackjack",
2224
selection="_selection_record_id",
2325
help="Optional extra information to perform this task",
2426
)
27+
line_ids = fields.One2many(
28+
"sync.order.line", "sync_order_id", string="Linked Records"
29+
)
2530

2631
partner_ids = fields.Many2many("res.partner", string="Partners")
2732
state = fields.Selection(
@@ -34,7 +39,6 @@ class SyncOrder(models.Model):
3439
default="draft",
3540
)
3641

37-
@api.model
3842
def _selection_record_id(self):
3943
mm = self.sync_task_id.sync_order_model_id
4044
if not mm:
@@ -53,3 +57,53 @@ def action_cancel(self):
5357
def action_refresh(self):
5458
# Magic
5559
pass
60+
61+
62+
class SyncOrderLine(models.Model):
63+
_name = "sync.order.line"
64+
_description = "Sync Order Records"
65+
66+
sync_order_id = fields.Many2one("sync.order")
67+
record_id = fields.Reference(
68+
string="Linked Record",
69+
selection="_selection_record_id",
70+
help="Optional extra information to perform this task",
71+
)
72+
state = fields.Selection(
73+
[
74+
("draft", "Draft"),
75+
("open", "In Progress"),
76+
("done", "Done"),
77+
("error", "Failed"),
78+
("cancel", "Canceled"),
79+
],
80+
default="draft",
81+
)
82+
value = fields.Char("Extra Input")
83+
result = fields.Char("Result")
84+
85+
def _selection_record_id(self):
86+
mm = self.sync_order_id.sync_task_id.sync_order_model_id
87+
if not mm:
88+
return []
89+
return [(mm.model, mm.name)]
90+
91+
def action_done(self, msg=None):
92+
self.write({"state": "done"})
93+
if msg:
94+
self.write({"result": msg})
95+
96+
def action_confirm(self, msg=None):
97+
self.write({"state": "open"})
98+
if msg:
99+
self.write({"result": msg})
100+
101+
def action_error(self, msg=None):
102+
self.write({"state": "error"})
103+
if msg:
104+
self.write({"result": msg})
105+
106+
def action_cancel(self, msg=None):
107+
self.write({"state": "cancel"})
108+
if msg:
109+
self.write({"result": msg})

sync/models/sync_project.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2020,2022,2024 Ivan Yelizariev <https://twitter.com/yelizariev>
1+
# Copyright 2020,2022,2024-2025 Ivan Yelizariev <https://twitter.com/yelizariev>
22
# Copyright 2020-2021 Denis Mudarisov <https://github.com/trojikman>
33
# Copyright 2021 Ilya Ilchenko <https://github.com/mentalko>
44
# License MIT (https://opensource.org/licenses/MIT).
@@ -519,6 +519,12 @@ def link_src_dst(src_data, dst_ref):
519519
"sync_external": sync_external,
520520
}
521521

522+
def task(self, technical_name):
523+
"""Finds task by technical_name"""
524+
return self.task_ids.filtered(
525+
lambda task: task.technical_name == technical_name
526+
)[:1]
527+
522528
def magic_upgrade(self):
523529
self.ensure_one()
524530
if not self.source_url:
@@ -645,6 +651,7 @@ def magic_upgrade(self):
645651

646652
task_vals = {
647653
"name": task_name,
654+
"technical_name": task_technical_name,
648655
"code": file_content,
649656
"magic_button": meta.get("MAGIC_BUTTON", "Magic ✨ Button")
650657
if has_handle_button

sync/models/sync_task.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2020 Ivan Yelizariev <https://twitter.com/yelizariev>
1+
# Copyright 2020,2025 Ivan Yelizariev <https://twitter.com/yelizariev>
22
# Copyright 2021 Denis Mudarisov <https://github.com/trojikman>
33
# License MIT (https://opensource.org/licenses/MIT).
44

@@ -23,6 +23,11 @@ class SyncTask(models.Model):
2323

2424
project_id = fields.Many2one("sync.project", ondelete="cascade")
2525
name = fields.Char("Name", help="e.g. Sync Products", required=True)
26+
technical_name = fields.Char(
27+
"Technical Name",
28+
help="Identifier equal to gist file name after removing prefix 'task.' and suffix '.py'",
29+
required=True,
30+
)
2631
code = fields.Text("Code")
2732
code_check = fields.Text("Syntax check", store=False, readonly=True)
2833
active = fields.Boolean(default=True)

sync/models/sync_trigger_automation.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ def create(self, vals_list):
5252

5353
def start(self, records):
5454
if self.active:
55-
self.sync_task_id.start(self, args=(records,), with_delay=True)
55+
sync_job = self.sync_task_id.start(self, args=(records,), with_delay=True)
56+
if records._name == "sync.order":
57+
records.write({"sync_job_id": sync_job.id})
5658

5759
def get_code(self):
5860
return (

sync/security/ir.model.access.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ access_sync_task_manager,sync.task manager,model_sync_task,sync_group_manager,1,
88
access_sync_order_user,sync.order user,model_sync_order,sync_group_user,1,0,0,0
99
access_sync_order_dev,sync.order dev,model_sync_order,sync_group_dev,1,1,1,1
1010
access_sync_order_manager,sync.order manager,model_sync_order,sync_group_manager,1,1,1,1
11+
access_sync_order_line_user,sync.order_line user,model_sync_order_line,sync_group_user,1,0,0,0
12+
access_sync_order_line_dev,sync.order_line dev,model_sync_order_line,sync_group_dev,1,1,1,1
13+
access_sync_order_line_manager,sync.order_line manager,model_sync_order_line,sync_group_manager,1,1,1,1
1114
access_sync_data_user,sync.data user,model_sync_data,sync_group_user,1,0,0,0
1215
access_sync_data_dev,sync.data dev,model_sync_data,sync_group_dev,1,1,1,1
1316
access_sync_data_manager,sync.data manager,model_sync_data,sync_group_manager,1,1,1,1

sync/views/sync_order_views.xml

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,35 @@
5555
</div>
5656
<group>
5757
<group>
58-
<field name="record_id" />
58+
<field name="sync_project_id" readonly="1" />
59+
<field name="sync_task_id" readonly="1" />
60+
</group>
61+
<group>
62+
<field name="sync_job_id" readonly="1" />
63+
</group>
64+
</group>
65+
<notebook>
66+
<page string="Linked Records">
67+
<field name="line_ids">
68+
<tree editable="bottom">
69+
<field name="record_id" />
70+
<field name="value" />
71+
<field name="state" readonly="1" />
72+
<field name="result" readonly="1" />
73+
</tree>
74+
</field>
75+
</page>
76+
<page string="Linked Partners">
5977
<field
6078
name="partner_ids"
6179
widget="many2many_tags"
6280
options="{'color_field': 'country_id', 'no_create_edit': True}"
6381
/>
64-
</group>
65-
<group>
66-
<field name="sync_project_id" readonly="1" />
67-
<field name="sync_task_id" readonly="1" />
68-
</group>
69-
</group>
70-
<separator string="Input ⬇️" />
71-
<field name="body" />
72-
<separator string="Input ⬆️" />
82+
</page>
83+
<page string="Text Input">
84+
<field name="body" />
85+
</page>
86+
</notebook>
7387
<div class="html_field_container">
7488
<field name="description" nolabel="1" />
7589
</div>

sync/views/sync_project_views.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@
178178
/>
179179
<field
180180
name="sync_order_description"
181-
invisible="1"
181+
column_invisible="True"
182182
/>
183183
<button
184184
name="action_magic_button"
@@ -188,7 +188,10 @@
188188
class="oe_highlight"
189189
invisible="not magic_button"
190190
/>
191-
<field name="magic_button" invisible="1" />
191+
<field
192+
name="magic_button"
193+
column_invisible="True"
194+
/>
192195
<field
193196
name="active_cron_ids"
194197
widget="many2many_tags"

0 commit comments

Comments
 (0)