[IMP] base_jsonify: simplify full parser API when not using translations

pull/2418/head
nans 2020-09-09 10:45:46 +02:00 committed by Sébastien BEAU
parent 8380df640e
commit 09aff57cd0
5 changed files with 66 additions and 11 deletions

View File

@ -90,11 +90,12 @@ To use these features, a full parser follows the following structure:
.. code-block:: python .. code-block:: python
parser = { parser = {
"resolver": ir.exports.resolver(3), "resolver": 3,
"language_agnostic": True,
"langs": { "langs": {
False: [ False: [
{'name': 'description'}, {'name': 'description'},
{'name': 'number', 'resolver': ir.exports.resolver(5)}, {'name': 'number', 'resolver': 5},
({'name': 'partner_id', 'alias': 'partners'}, [{'name': 'display_name'}]) ({'name': 'partner_id', 'alias': 'partners'}, [{'name': 'display_name'}])
], ],
'fr_FR': [ 'fr_FR': [
@ -105,6 +106,23 @@ To use these features, a full parser follows the following structure:
} }
Note that a resolver can be passed either as a recordset or as an id, so as to be fully serializable.
A slightly simpler version in case the translation of fields is not needed,
but other features like custom resolvers are:
.. code-block:: python
parser = {
"resolver": 3,
"language_agnostic": True,
"fields": [
{'name': 'description'},
{'name': 'number', 'resolver': 5},
({'name': 'partner_id', 'alias': 'partners'}, [{'name': 'display_name'}]),
],
}
A simple parser is simply translated into a full parser at export. A simple parser is simply translated into a full parser at export.
If the global resolver is given, then the json_dict goes through: If the global resolver is given, then the json_dict goes through:

View File

@ -99,7 +99,10 @@ class IrExport(models.Model):
options = {"resolver": line.resolver_id, "function": line.function} options = {"resolver": line.resolver_id, "function": line.function}
update_dict(dict_parser, names, options) update_dict(dict_parser, names, options)
lang_parsers[lang] = convert_dict(dict_parser) lang_parsers[lang] = convert_dict(dict_parser)
parser["langs"] = lang_parsers if list(lang_parsers.keys()) == [False]:
parser["fields"] = lang_parsers[False]
else:
parser["langs"] = lang_parsers
if self.global_resolver_id: if self.global_resolver_id:
parser["resolver"] = self.global_resolver_id parser["resolver"] = self.global_resolver_id
return parser return parser

View File

@ -43,7 +43,7 @@ class Base(models.AbstractModel):
result.append((_f(f), _convert_parser(sub))) result.append((_f(f), _convert_parser(sub)))
return result return result
return {"language_agnostic": False, "langs": {False: _convert_parser(parser)}} return {"language_agnostic": False, "fields": _convert_parser(parser)}
@api.model @api.model
def _jsonify_bad_parser_error(self, field_name): def _jsonify_bad_parser_error(self, field_name):
@ -144,11 +144,12 @@ class Base(models.AbstractModel):
resolver = parser.get("resolver") resolver = parser.get("resolver")
results = [{} for record in self] results = [{} for record in self]
for lang in parser["langs"]: parsers = {False: parser["fields"]} if "fields" in parser else parser["langs"]
translate = lang or parser["language_agnostic"] for lang in parsers:
translate = lang or parser.get("language_agnostic")
records = self.with_context(lang=lang) if translate else self records = self.with_context(lang=lang) if translate else self
for record, json in zip(records, results): for record, json in zip(records, results):
self._jsonify_record(parser["langs"][lang], record, json) self._jsonify_record(parsers[lang], record, json)
results = self._resolve(resolver, results, self) if resolver else results results = self._resolve(resolver, results, self) if resolver else results
return results[0] if one else results return results[0] if one else results

View File

@ -63,11 +63,12 @@ To use these features, a full parser follows the following structure:
.. code-block:: python .. code-block:: python
parser = { parser = {
"resolver": ir.exports.resolver(3), "resolver": 3,
"language_agnostic": True,
"langs": { "langs": {
False: [ False: [
{'name': 'description'}, {'name': 'description'},
{'name': 'number', 'resolver': ir.exports.resolver(5)}, {'name': 'number', 'resolver': 5},
({'name': 'partner_id', 'alias': 'partners'}, [{'name': 'display_name'}]) ({'name': 'partner_id', 'alias': 'partners'}, [{'name': 'display_name'}])
], ],
'fr_FR': [ 'fr_FR': [
@ -78,6 +79,23 @@ To use these features, a full parser follows the following structure:
} }
Note that a resolver can be passed either as a recordset or as an id, so as to be fully serializable.
A slightly simpler version in case the translation of fields is not needed,
but other features like custom resolvers are:
.. code-block:: python
parser = {
"resolver": 3,
"language_agnostic": True,
"fields": [
{'name': 'description'},
{'name': 'number', 'resolver': 5},
({'name': 'partner_id', 'alias': 'partners'}, [{'name': 'display_name'}]),
],
}
A simple parser is simply translated into a full parser at export. A simple parser is simply translated into a full parser at export.
If the global resolver is given, then the json_dict goes through: If the global resolver is given, then the json_dict goes through:

View File

@ -418,11 +418,12 @@ It is also to specify a lang to extract the translation of any given field.</p>
<p>To use these features, a full parser follows the following structure:</p> <p>To use these features, a full parser follows the following structure:</p>
<pre class="code python literal-block"> <pre class="code python literal-block">
<span class="n">parser</span> <span class="o">=</span> <span class="p">{</span> <span class="n">parser</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;resolver&quot;</span><span class="p">:</span> <span class="n">ir</span><span class="o">.</span><span class="n">exports</span><span class="o">.</span><span class="n">resolver</span><span class="p">(</span><span class="mi">3</span><span class="p">),</span> <span class="s2">&quot;resolver&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
<span class="s2">&quot;language_agnostic&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;langs&quot;</span><span class="p">:</span> <span class="p">{</span> <span class="s2">&quot;langs&quot;</span><span class="p">:</span> <span class="p">{</span>
<span class="kc">False</span><span class="p">:</span> <span class="p">[</span> <span class="kc">False</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'description'</span><span class="p">},</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'description'</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'number'</span><span class="p">,</span> <span class="s1">'resolver'</span><span class="p">:</span> <span class="n">ir</span><span class="o">.</span><span class="n">exports</span><span class="o">.</span><span class="n">resolver</span><span class="p">(</span><span class="mi">5</span><span class="p">)},</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'number'</span><span class="p">,</span> <span class="s1">'resolver'</span><span class="p">:</span> <span class="mi">5</span><span class="p">},</span>
<span class="p">({</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'partner_id'</span><span class="p">,</span> <span class="s1">'alias'</span><span class="p">:</span> <span class="s1">'partners'</span><span class="p">},</span> <span class="p">[{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'display_name'</span><span class="p">}])</span> <span class="p">({</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'partner_id'</span><span class="p">,</span> <span class="s1">'alias'</span><span class="p">:</span> <span class="s1">'partners'</span><span class="p">},</span> <span class="p">[{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'display_name'</span><span class="p">}])</span>
<span class="p">],</span> <span class="p">],</span>
<span class="s1">'fr_FR'</span><span class="p">:</span> <span class="p">[</span> <span class="s1">'fr_FR'</span><span class="p">:</span> <span class="p">[</span>
@ -432,6 +433,20 @@ It is also to specify a lang to extract the translation of any given field.</p>
<span class="p">}</span> <span class="p">}</span>
<span class="p">}</span> <span class="p">}</span>
</pre> </pre>
<p>Note that a resolver can be passed either as a recordset or as an id, so as to be fully serializable.
A slightly simpler version in case the translation of fields is not needed,
but other features like custom resolvers are:</p>
<pre class="code python literal-block">
<span class="n">parser</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;resolver&quot;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
<span class="s2">&quot;language_agnostic&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;fields&quot;</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'description'</span><span class="p">},</span>
<span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'number'</span><span class="p">,</span> <span class="s1">'resolver'</span><span class="p">:</span> <span class="mi">5</span><span class="p">},</span>
<span class="p">({</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'partner_id'</span><span class="p">,</span> <span class="s1">'alias'</span><span class="p">:</span> <span class="s1">'partners'</span><span class="p">},</span> <span class="p">[{</span><span class="s1">'name'</span><span class="p">:</span> <span class="s1">'display_name'</span><span class="p">}]),</span>
<span class="p">],</span>
<span class="p">}</span>
</pre>
<p>A simple parser is simply translated into a full parser at export.</p> <p>A simple parser is simply translated into a full parser at export.</p>
<p>If the global resolver is given, then the json_dict goes through:</p> <p>If the global resolver is given, then the json_dict goes through:</p>
<pre class="code python literal-block"> <pre class="code python literal-block">