From 2b46ff032ca8c459c78533d540aec83f5bfc1df2 Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 24 Sep 2020 14:21:27 +0200 Subject: [PATCH] base_jsonify: return one record on demand If you use this module extensively - as I do - you've done this tons of time. For sure :) This little change simplifies your code base where needed. --- base_jsonify/models/models.py | 10 ++++++++-- base_jsonify/tests/test_get_parser.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) 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 = [