diff --git a/base_jsonify/models/models.py b/base_jsonify/models/models.py index f75d8f21b..b75461100 100644 --- a/base_jsonify/models/models.py +++ b/base_jsonify/models/models.py @@ -26,7 +26,7 @@ class Base(models.AbstractModel): field_name, json_key = field_name.split(":") return field_name, json_key, subparser - def jsonify(self, parser): + def jsonify(self, parser, one=False): """Convert the record according to the given parser. Example of parser: @@ -41,7 +41,8 @@ class Base(models.AbstractModel): ] In order to be consistent with the odoo api the jsonify method always - return a list of object even if there is only one element in input + return a list of object even if there is only one element in input. + You can change this behavior by passing `one=True` to get only one element. By default the key into the json is the name of the field extracted from the model. If you need to specify an alternate name to use as @@ -52,6 +53,9 @@ class Base(models.AbstractModel): ] """ + if one: + self.ensure_one() + result = [] for rec in self: @@ -63,6 +67,8 @@ class Base(models.AbstractModel): else: res[json_key] = rec._jsonify_value(field_name) result.append(res) + if one: + return result[0] if result else {} return result def _jsonify_value(self, field_name): diff --git a/base_jsonify/tests/test_get_parser.py b/base_jsonify/tests/test_get_parser.py index 8ab915cd7..94886b952 100644 --- a/base_jsonify/tests/test_get_parser.py +++ b/base_jsonify/tests/test_get_parser.py @@ -134,6 +134,20 @@ class TestParser(SavepointCase): expected_json["children"] = [] self.assertDictEqual(json_partner[0], expected_json) + def test_one(self): + parser = [ + "name", + ] + expected_json = { + "name": "Akretion", + } + json_partner = self.partner.jsonify(parser, one=True) + self.assertDictEqual(json_partner, expected_json) + # cannot call on multiple records + with self.assertRaises(ValueError) as err: + self.env["res.partner"].search([]).jsonify(parser, one=True) + self.assertIn("Expected singleton", str(err.exception)) + def test_json_export_callable_parser(self): self.partner.__class__.jsonify_custom = jsonify_custom parser = [