Skip to content

Commit ed4aca7

Browse files
[BPRT] edi: Backport from 14.0 (third part)
1 parent c9f0723 commit ed4aca7

14 files changed

+68
-50
lines changed

edi_oca/__manifest__.py

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"depends": [
1919
"base_edi",
2020
"component_event",
21+
"http_routing",
2122
"mail",
2223
"base_sparse_field",
2324
"queue_job",

edi_oca/models/edi_backend.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ def exchange_generate(self, exchange_record, store=True, force=False, **kw):
223223
"edi_exchange_state": "output_pending",
224224
}
225225
)
226+
exchange_record._onchange_edi_exchange_state()
226227
try:
227228
# TODO: Remove this on 15.0, we will keep it in order to not break current
228229
# installations
@@ -240,6 +241,7 @@ def exchange_generate(self, exchange_record, store=True, force=False, **kw):
240241
exchange_record.update(
241242
{"edi_exchange_state": state, "exchange_error": error}
242243
)
244+
exchange_record._onchange_edi_exchange_state()
243245
exchange_record.notify_action_complete("generate", message=message)
244246
return message
245247

@@ -330,6 +332,7 @@ def exchange_send(self, exchange_record):
330332
"exchanged_on": fields.Datetime.now(),
331333
}
332334
)
335+
exchange_record._onchange_edi_exchange_state()
333336
exchange_record.notify_action_complete("send", message=message)
334337
return res
335338

@@ -491,6 +494,7 @@ def exchange_process(self, exchange_record):
491494
"exchange_error": error,
492495
}
493496
)
497+
exchange_record._onchange_edi_exchange_state()
494498
if (
495499
state == "input_processed_error"
496500
and old_state != "input_processed_error"
@@ -551,6 +555,7 @@ def exchange_receive(self, exchange_record):
551555
"exchanged_on": fields.Datetime.now(),
552556
}
553557
)
558+
exchange_record._onchange_edi_exchange_state()
554559
exchange_record.notify_action_complete("receive", message=message)
555560
return res
556561

@@ -637,7 +642,8 @@ def _find_existing_exchange_records(
637642
return self.env["edi.exchange.record"].search(domain, count=count_only)
638643

639644
def action_view_exchanges(self):
640-
action = self.env.ref("edi_oca.act_open_edi_exchange_record_view")
645+
action = self.env.ref(
646+
"edi_oca.act_open_edi_exchange_record_view").sudo().read()[0]
641647
action["context"] = {
642648
"search_default_backend_id": self.id,
643649
"default_backend_id": self.id,
@@ -646,7 +652,8 @@ def action_view_exchanges(self):
646652
return action
647653

648654
def action_view_exchange_types(self):
649-
action = self.env.ref("edi_oca.act_open_edi_exchange_type_view")
655+
action = self.env.ref(
656+
"edi_oca.act_open_edi_exchange_type_view").sudo().read()[0]
650657
action["context"] = {
651658
"search_default_backend_id": self.id,
652659
"default_backend_id": self.id,

edi_oca/models/edi_exchange_consumer_mixin.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ def edi_create_exchange_record(self, exchange_type_id):
184184
return self._edi_get_create_record_wiz_action(exchange_type_id)
185185

186186
def _edi_get_create_record_wiz_action(self, exchange_type_id):
187-
action = self.env.ref("edi_oca.edi_exchange_record_create_act_window")
187+
action = self.env.ref(
188+
"edi_oca.edi_exchange_record_create_act_window").sudo().read()[0]
188189
action["context"] = {
189190
"default_res_id": self.id,
190191
"default_model": self._name,
@@ -244,7 +245,8 @@ def _compute_exchange_record_count(self):
244245

245246
def action_view_edi_records(self):
246247
self.ensure_one()
247-
action = self.env.ref("edi_oca.act_open_edi_exchange_record_view")
248+
action = self.env.ref(
249+
"edi_oca.act_open_edi_exchange_record_view").sudo().read()[0]
248250
action["domain"] = [("model", "=", self._name), ("res_id", "=", self.id)]
249251
# Purge default search filters from ctx to avoid hiding records
250252
ctx = action.get("context") or {}

edi_oca/models/edi_exchange_record.py

+16-13
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from collections import defaultdict
99

1010
from odoo import _, api, exceptions, fields, models
11-
from odoo import SUPERUSER_ID
1211
from odoo.exceptions import MissingError
1312

1413
_logger = logging.getLogger(__name__)
@@ -132,8 +131,8 @@ def _compute_exchange_filename(self):
132131
if not rec.exchange_filename:
133132
rec.exchange_filename = rec.type_id._make_exchange_filename(rec)
134133

135-
@api.constrains("edi_exchange_state")
136-
def _compute_exchanged_on(self):
134+
@api.onchange("edi_exchange_state")
135+
def _onchange_edi_exchange_state(self):
137136
for rec in self:
138137
if rec.edi_exchange_state in ("input_received", "output_sent"):
139138
rec.exchanged_on = fields.Datetime.now()
@@ -193,9 +192,11 @@ def record(self):
193192
# data from parent
194193
if not self.model and not self.parent_id:
195194
return None
196-
if not self.model and self.parent_id:
195+
elif not self.model and self.parent_id:
197196
return self.parent_id.record
198-
return self.env[self.model].browse(self.res_id).exists()
197+
elif self.model in self.env.registry.models:
198+
return self.env[self.model].browse(self.res_id).exists()
199+
return None
199200

200201
def _set_file_content(
201202
self, output_string, encoding="utf-8", field_name="exchange_file"
@@ -222,7 +223,7 @@ def name_get(self):
222223
result = []
223224
for rec in self:
224225
rec_name = rec.identifier
225-
if rec.res_id and rec.model:
226+
if rec.res_id and rec.model and rec.record:
226227
rec_name = rec.record.display_name
227228
name = "[{}] {}".format(rec.type_id.name, rec_name)
228229
result.append((rec.id, name))
@@ -356,7 +357,8 @@ def action_open_related_exchanges(self):
356357
self.ensure_one()
357358
if not self.related_exchange_ids:
358359
return {}
359-
action = self.env.ref("edi_oca.act_open_edi_exchange_record_view")
360+
action = self.env.ref(
361+
"edi_oca.act_open_edi_exchange_record_view").sudo().read()[0]
360362
action["domain"] = [("id", "in", self.related_exchange_ids.ids)]
361363
return action
362364

@@ -453,8 +455,8 @@ def _search(
453455
count=False,
454456
access_rights_uid=access_rights_uid,
455457
)
456-
if self._uid == SUPERUSER_ID:
457-
# rules do not apply for the superuser
458+
if self.env.user._is_system():
459+
# rules do not apply to group "Settings"
458460
return len(ids) if count else ids
459461

460462
# TODO highlight orphaned EDI records in UI:
@@ -531,7 +533,7 @@ def check_access_rule(self, operation):
531533
"""In order to check if we can access a record, we are checking if we can access
532534
the related document"""
533535
super(EDIExchangeRecord, self).check_access_rule(operation)
534-
if self._uid == SUPERUSER_ID:
536+
if self.env.user._is_superuser():
535537
return
536538
default_checker = self.env["edi.exchange.consumer.mixin"].get_edi_access
537539
by_model_rec_ids = defaultdict(set)
@@ -584,8 +586,9 @@ def _inverse_res_id(self):
584586
if not rec.model or not rec.res_id:
585587
continue
586588
try:
587-
rec.env[rec.model].browse(rec.res_id).write({
588-
'exchange_record_ids': [(4, rec.id)]
589-
})
589+
if "exchange_record_ids" in rec.env[rec.model]._fields:
590+
rec.env[rec.model].browse(rec.res_id).write({
591+
'exchange_record_ids': [(4, rec.id)]
592+
})
590593
except (KeyError, ValueError, MissingError):
591594
continue

edi_oca/models/edi_exchange_type.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ def _compute_ack_for_type_ids(self):
185185
for rec in self:
186186
rec.ack_for_type_ids = [x.id for x in by_type_id.get(rec.id, [])]
187187

188+
@api.multi
189+
@api.returns('self', lambda value: value.id)
190+
def copy(self, default=None):
191+
rec = super(EDIExchangeType, self.with_context(
192+
deprecated_rule_fields_bypass_inverse=True)).copy(default)
193+
return rec
194+
188195
def get_settings(self):
189196
return self.advanced_settings
190197

@@ -237,7 +244,8 @@ def _make_exchange_filename(self, exchange_record):
237244
)
238245

239246
def _get_record_name(self, exchange_record):
240-
if not exchange_record.res_id or not exchange_record.model:
247+
if (not exchange_record.res_id or not exchange_record.model or
248+
not exchange_record.record):
241249
return slugify(exchange_record.display_name)
242250
if hasattr(exchange_record.record, "_get_edi_exchange_record_name"):
243251
return exchange_record.record._get_edi_exchange_record_name(exchange_record)

edi_oca/security/ir_model_access.xml

-9
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,6 @@
9090
<field name="perm_write" eval="1" />
9191
<field name="perm_unlink" eval="1" />
9292
</record>
93-
<record model="ir.model.access" id="access_edi_exchange_record_create_user">
94-
<field name="name">access_edi_exchange_record user</field>
95-
<field name="model_id" ref="model_edi_exchange_record_create_wiz" />
96-
<field name="group_id" ref="base.group_user" />
97-
<field name="perm_read" eval="1" />
98-
<field name="perm_create" eval="1" />
99-
<field name="perm_write" eval="1" />
100-
<field name="perm_unlink" eval="1" />
101-
</record>
10293
<record id="rule_edi_exchange_record_user" model="ir.rule">
10394
<field name="name">Assigned EDI exchange records</field>
10495
<field name="model_id" ref="edi_oca.model_edi_exchange_record" />

edi_oca/tests/test_backend_input.py

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ def test_receive_record_nothing_todo(self):
4040

4141
def test_receive_record(self):
4242
self.record.edi_exchange_state = "input_pending"
43+
self.record._onchange_edi_exchange_state()
4344
self.backend.with_context(fake_output="yeah!").exchange_receive(self.record)
4445
self.assertEqual(self.record._get_file_content(), "yeah!")
4546
self.assertRecordValues(self.record, [{"edi_exchange_state": "input_received"}])

edi_oca/tests/test_backend_output.py

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def test_generate_record_output_pdf(self):
4646

4747
def test_send_record(self):
4848
self.record.write({"edi_exchange_state": "output_pending"})
49+
self.record._onchange_edi_exchange_state()
4950
self.record._set_file_content("TEST %d" % self.record.id)
5051
self.assertFalse(self.record.exchanged_on)
5152
now = fields.Datetime.now()
@@ -58,6 +59,7 @@ def test_send_record(self):
5859

5960
def test_send_record_with_error(self):
6061
self.record.write({"edi_exchange_state": "output_pending"})
62+
self.record._onchange_edi_exchange_state()
6163
self.record._set_file_content("TEST %d" % self.record.id)
6264
self.assertFalse(self.record.exchanged_on)
6365
self.record.with_context(

edi_oca/tests/test_backend_process.py

+3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def setUp(self):
3434

3535
def test_process_record(self):
3636
self.record.write({"edi_exchange_state": "input_received"})
37+
self.record._onchange_edi_exchange_state()
3738
now = fields.Datetime.now()
3839
self.record.action_exchange_process()
3940
self.assertTrue(FakeInputProcess.check_called_for(self.record))
@@ -47,6 +48,7 @@ def test_process_record(self):
4748

4849
def test_process_record_with_error(self):
4950
self.record.write({"edi_exchange_state": "input_received"})
51+
self.record._onchange_edi_exchange_state()
5052
self.record._set_file_content("TEST %d" % self.record.id)
5153
self.record.with_context(
5254
test_break_process="OOPS! Something went wrong :("
@@ -65,6 +67,7 @@ def test_process_record_with_error(self):
6567
@mute_logger("odoo.models.unlink")
6668
def test_process_no_file_record(self):
6769
self.record.write({"edi_exchange_state": "input_received"})
70+
self.record._onchange_edi_exchange_state()
6871
self.record.exchange_file = False
6972
with self.assertRaises(UserError):
7073
self.record.action_exchange_process()

edi_oca/tests/test_backend_validate.py

+4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def setUp(self):
4444

4545
def test_receive_validate_record(self):
4646
self.record_in.write({"edi_exchange_state": "input_pending"})
47+
self.record_in._onchange_edi_exchange_state()
4748
self.backend.exchange_receive(self.record_in)
4849
self.assertTrue(FakeInputValidate.check_called_for(self.record_in))
4950
self.assertRecordValues(
@@ -52,6 +53,7 @@ def test_receive_validate_record(self):
5253

5354
def test_receive_validate_record_error(self):
5455
self.record_in.write({"edi_exchange_state": "input_pending"})
56+
self.record_in._onchange_edi_exchange_state()
5557
exc = EDIValidationError("Data seems wrong!")
5658
self.backend.with_context(test_break_validate=exc).exchange_receive(
5759
self.record_in
@@ -69,6 +71,7 @@ def test_receive_validate_record_error(self):
6971

7072
def test_generate_validate_record(self):
7173
self.record_out.write({"edi_exchange_state": "new"})
74+
self.record_out._onchange_edi_exchange_state()
7275
self.backend.exchange_generate(self.record_out)
7376
self.assertTrue(FakeOutputValidate.check_called_for(self.record_out))
7477
self.assertRecordValues(
@@ -77,6 +80,7 @@ def test_generate_validate_record(self):
7780

7881
def test_generate_validate_record_error(self):
7982
self.record_out.write({"edi_exchange_state": "new"})
83+
self.record_out._onchange_edi_exchange_state()
8084
exc = EDIValidationError("Data seems wrong!")
8185
self.backend.with_context(test_break_validate=exc).exchange_generate(
8286
self.record_out

edi_oca/tests/test_consumer_mixin.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
from lxml import etree
1111
from odoo_test_helper import FakeModelLoader
12-
from odoo.tools.safe_eval import safe_eval
1312

1413
from odoo.tests.common import Form
1514

@@ -49,7 +48,7 @@ def _setup_records(cls):
4948
direction="output",
5049
exchange_file_ext="csv",
5150
backend_id=False,
52-
exchange_filename_pattern="{record.name}-{type.code}-{dt}",
51+
exchange_filename_pattern="{record_name}-{type.code}-{dt}",
5352
rule_ids=[(0, 0, rule_vals)],
5453
)
5554
rule_vals = {
@@ -91,7 +90,7 @@ def test_mixin(self):
9190
self.consumer_record.refresh()
9291
self.assertEqual(
9392
exchange_record, self.env["edi.exchange.record"].search(
94-
safe_eval(action["domain"]))
93+
action["domain"])
9594
)
9695
self.assertTrue(
9796
self.consumer_record._has_exchange_record(
@@ -165,10 +164,9 @@ def test_multiple_backend(self):
165164
)
166165
self.assertNotEqual(action["res_model"], "edi.exchange.record")
167166
self.assertEqual(action["res_model"], "edi.exchange.record.create.wiz")
168-
context = safe_eval(action["context"])
169167
wizard = (
170168
self.env[action["res_model"]]
171-
.with_context(**context)
169+
.with_context(**action["context"])
172170
.create({"backend_id": self.backend_02.id})
173171
)
174172
wizard.create_edi()

edi_oca/tests/test_edi_backend_cron.py

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def test_exchange_generate_output_ready_auto_send(self):
8383
self.assertEqual(rec.edi_exchange_state, "new")
8484
self.record1._set_file_content("READY")
8585
self.record1.edi_exchange_state = "output_sent"
86+
self.record1._onchange_edi_exchange_state()
8687
self.backend.with_context(
8788
fake_update_values={"edi_exchange_state": "output_sent_and_processed"}
8889
)._cron_check_output_exchange_sync(skip_sent=False)

edi_oca/tests/test_record.py

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def test_record_exchange_date(self):
6969
self.assertFalse(record.exchanged_on)
7070
now = fields.Datetime.now()
7171
record.edi_exchange_state = "output_sent"
72+
record._onchange_edi_exchange_state()
7273
record.refresh()
7374
self.assertAlmostEqual(
7475
(record.exchanged_on - now).total_seconds(), 0, places=2
@@ -209,6 +210,7 @@ def test_retry(self):
209210
record0 = self.backend.create_record("test_csv_output", vals)
210211
self.assertFalse(record0.retryable)
211212
record0.edi_exchange_state = "output_error_on_send"
213+
record0._onchange_edi_exchange_state()
212214
self.assertTrue(record0.retryable)
213215
with mock.patch.object(type(record0), "_execute_next_action") as mocked:
214216
record0.action_retry()

0 commit comments

Comments
 (0)