Skip to content
Snippets Groups Projects
Commit c221ac47 authored by Houzefa Abbasbhay's avatar Houzefa Abbasbhay :slight_smile:
Browse files

Fix relation reception

See ``tests/test_relation.py > test_many2one_to_odoo`` for a test case.

``get_instance`` functions can now return a ``Newinstance`` record (record being created).
parent b4c3824e
No related branches found
No related tags found
1 merge request!11Topic/13.0/fix relation tg 496
......@@ -2,6 +2,13 @@
History
*******
1.2.1
=====
Fix relation reception, see ``tests/test_relation.py > test_many2one_to_odoo`` for a test case.
``get_instance`` functions can now return a ``Newinstance`` record (record being created).
1.2.0
=====
......
......@@ -22,7 +22,7 @@
"name": "Converter",
"license": "AGPL-3",
"summary": "Convert odoo records to/from plain data structures.",
"version": "1.2.0",
"version": "1.2.1",
"category": "Hidden",
"author": "XCG Consulting",
"website": "http://odoo.consulting/",
......
......@@ -171,7 +171,7 @@
c: Converter,
) -> models.Model:
instance = c.get_instance(odoo_env, payload)
if not instance:
if not instance or instance is Newinstance:
changes = c.message_to_odoo(
odoo_env, PHASE_PRECREATE, payload, instance
)
......
......@@ -3,7 +3,7 @@
from odoo import api, models
from .base import PHASE_POSTCREATE, Converter, Skip
from .base import PHASE_POSTCREATE, Converter, Newinstance, Skip
import pytz
......@@ -111,7 +111,7 @@
else:
message_value = self.default
# do not include value if already the same
if instance:
if instance and instance is not Newinstance:
value = self.odoo_to_message(instance)
if value is Skip or value == message_value:
return {}
......
from collections import OrderedDict
from typing import Any, Dict, Iterable, List, Mapping, Optional, Tuple
from typing import Any, Dict, Iterable, List, Mapping, Optional, Tuple, Union
from odoo import api, models
......@@ -3,7 +3,14 @@
from odoo import api, models
from .base import ContextBuilder, Converter, Skip, build_context
from .base import (
ContextBuilder,
Converter,
Newinstance,
NewinstanceType,
Skip,
build_context,
)
from .validate import validate
import jsonschema
......@@ -114,9 +121,9 @@
def get_instance(
self, odoo_env: api.Environment, message_data
) -> Optional[models.Model]:
) -> Optional[Union[models.Model, NewinstanceType]]:
""":return: an instance linked to the converter, if any"""
if self._get_instance:
instance = self._converters[self._get_instance].get_instance(
odoo_env, message_data[self._get_instance]
)
......@@ -118,12 +125,10 @@
""":return: an instance linked to the converter, if any"""
if self._get_instance:
instance = self._converters[self._get_instance].get_instance(
odoo_env, message_data[self._get_instance]
)
# Commented as signature in message_to_odoo takes a models.Model
# and code does not expect this
# if instance is None:
# instance = Newinstance
if instance is None:
instance = Newinstance
return instance
return None
......
......@@ -45,6 +45,8 @@
if not value_present:
return {}
post_hook = getattr(self.converter, "post_hook", None)
if self.converter.is_instance_getter():
rel_record = self.converter.get_instance(odoo_env, message_value)
......@@ -60,5 +62,5 @@
if updates:
if rel_record:
rel_record.write(**updates)
rel_record.write(updates)
else:
......@@ -64,5 +66,8 @@
else:
rel_record = odoo_env[self.model_name].create(**updates)
rel_record = odoo_env[self.model_name].create(updates)
if post_hook:
post_hook(rel_record, message_value)
if parent:
field_value = getattr(parent, self.field_name)
......@@ -83,6 +88,8 @@
if updates:
if field_value:
field_value.write(**updates)
field_value.write(updates)
if post_hook:
post_hook(field_value, message_value)
return {}
else:
......@@ -87,6 +94,8 @@
return {}
else:
rel_record = odoo_env[self.model_name].create(**updates)
rel_record = odoo_env[self.model_name].create(updates)
if post_hook:
post_hook(rel_record, message_value)
return {self.field_name: rel_record.id}
......
......@@ -19,7 +19,13 @@
##############################################################################
from odoo import tests
from odoo.addons.converter import RelationToOne, Xref
from odoo.addons.converter import (
Field,
Model,
RelationToOne,
Xref,
message_to_odoo,
)
class Test(tests.TransactionCase):
......@@ -34,9 +40,9 @@
self.user_root = self.env.ref("base.user_root")
self.user_admin = self.env.ref("base.user_admin")
def test_many2one(self):
def test_many2one_from_odoo(self):
message = self.converter1.odoo_to_message(self.user_admin)
self.assertEqual(message, "base.main_company")
message = self.converter1.odoo_to_message(self.user_root)
self.assertEqual(message, "base.main_company")
......@@ -38,8 +44,8 @@
message = self.converter1.odoo_to_message(self.user_admin)
self.assertEqual(message, "base.main_company")
message = self.converter1.odoo_to_message(self.user_root)
self.assertEqual(message, "base.main_company")
def test_empty_many2one(self):
def test_empty_many2one_from_odoo(self):
message = self.converter2.odoo_to_message(self.user_root)
self.assertEqual(message, "")
......@@ -44,2 +50,57 @@
message = self.converter2.odoo_to_message(self.user_root)
self.assertEqual(message, "")
def test_many2one_to_odoo(self):
"""Ensure a sub-object linked from the main one gets updated when Odoo
receives a message.
"""
# This converter wraps a user and adds info from its related partner.
converter = Model(
None,
{
"partner": RelationToOne(
"partner_id",
"res.partner",
Model(
"",
{
"color": Field("color"),
"name": Field("name"),
"xref": Xref("test"),
},
),
),
"xref": Xref("base"),
},
)
user = self.env.ref("base.user_admin")
old_partner = user.partner_id
# Run our message reception.
message = {
"partner": {
"color": 2,
"name": "TEST",
"xref": "new_partner_converter",
},
"xref": "user_admin",
}
message_to_odoo(self.env, message, self.env["res.users"], converter)
# Ensure a new partner got created and that is has an xref (post hook).
# user.refresh()
new_partner = self.env.ref("test.new_partner_converter")
self.assertEqual(user.partner_id, new_partner)
self.assertNotEqual(new_partner, old_partner)
self.assertEqual(new_partner.color, 2)
self.assertEqual(new_partner.name, "TEST")
# Try again with the same partner ref; check update (but no creations).
message["partner"]["color"] = 3
message_to_odoo(self.env, message, self.env["res.users"], converter)
user.refresh()
new_partner.refresh()
self.assertEqual(user.partner_id, new_partner)
self.assertEqual(new_partner.color, 3)
from typing import Any, Dict, Optional
from typing import Any, Dict, Optional, Union
from odoo import models
......@@ -2,7 +2,7 @@
from odoo import models
from .base import Converter
from .base import Converter, NewinstanceType
from .models.ir_model_data import _XREF_IMD_MODULE
......@@ -25,7 +25,9 @@
)
)
def get_instance(self, odoo_env, message_data) -> Optional[models.Model]:
def get_instance(
self, odoo_env, message_data
) -> Optional[Union[models.Model, NewinstanceType]]:
return odoo_env.ref(
".".join([self._module, message_data]), raise_if_not_found=False
)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment