From 9eafd65d2e348c07fbb7fd6b00dcbde4ad9c844b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 26 Sep 2017 01:25:26 +0200 Subject: [PATCH] Add translated descriptor for Reference field issue5667 review39671002 --- CHANGELOG | 1 + doc/ref/models/fields.rst | 6 ++++++ trytond/model/fields/reference.py | 3 ++- trytond/model/fields/selection.py | 25 ++++++++++++++++--------- trytond/tests/test_exportdata.py | 10 +++++++++- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a493d98444..79d848bbda 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Add translated descriptor for Reference field * Implement alter_type and alter_size for sqlite backend * Add a maximum size for request * Add support for single record report diff --git a/doc/ref/models/fields.rst b/doc/ref/models/fields.rst index e357b30e35..cb6bfdaa32 100644 --- a/doc/ref/models/fields.rst +++ b/doc/ref/models/fields.rst @@ -507,6 +507,12 @@ But a ``tuple`` can be used to search or set value. Same as :attr:`Many2One.datetime_field` +Instance methods: + +.. method:: Reference.translated([name]) + + Same as :meth:`~Selection.translated` but for the translated name of the + target model. Many2One -------- diff --git a/trytond/model/fields/reference.py b/trytond/model/fields/reference.py index 0e56cd666f..e297350902 100644 --- a/trytond/model/fields/reference.py +++ b/trytond/model/fields/reference.py @@ -6,12 +6,13 @@ from sql import Cast, Literal, Query, Expression from sql.functions import Substring, Position from .field import Field +from .selection import SelectionMixin from ...transaction import Transaction from ...pool import Pool from ...rpc import RPC -class Reference(Field): +class Reference(Field, SelectionMixin): ''' Define a reference field (``str``). ''' diff --git a/trytond/model/fields/selection.py b/trytond/model/fields/selection.py index e7fddb0deb..f6c475a3e7 100644 --- a/trytond/model/fields/selection.py +++ b/trytond/model/fields/selection.py @@ -10,7 +10,18 @@ from .field import Field from ...rpc import RPC -class Selection(Field): +class SelectionMixin: + + def translated(self, name=None): + "Return a descriptor for the translated value of the field" + if name is None: + name = self.name + if name is None: + raise ValueError('Missing name argument') + return TranslatedSelection(name) + + +class Selection(Field, SelectionMixin): ''' Define a selection field (``str``). ''' @@ -70,14 +81,6 @@ class Selection(Field): whens.append((column == key, value)) return [Case(*whens, else_=column)] - def translated(self, name=None): - "Return a descriptor for the translated value of the field" - if name is None: - name = self.name - if name is None: - raise ValueError('Missing name argument') - return TranslatedSelection(name) - class TranslatedSelection(object): 'A descriptor for translated value of Selection field' @@ -86,6 +89,7 @@ class TranslatedSelection(object): self.name = name def __get__(self, inst, cls): + from ..model import Model if inst is None: return self with Transaction().set_context(getattr(inst, '_context', {})): @@ -102,4 +106,7 @@ class TranslatedSelection(object): if value is None or value == '': if value not in selection: value = {None: '', '': None}[value] + # Use Model __name__ for Reference field + elif isinstance(value, Model): + value = value.__name__ return selection[value] diff --git a/trytond/tests/test_exportdata.py b/trytond/tests/test_exportdata.py index 93868b11af..bd72e7f453 100644 --- a/trytond/tests/test_exportdata.py +++ b/trytond/tests/test_exportdata.py @@ -341,7 +341,7 @@ class ExportDataTestCase(unittest.TestCase): ExportData = pool.get('test.export_data') ExportDataTarget = pool.get('test.export_data.target') - target1, = ExportDataTarget.create([{}]) + target1, = ExportDataTarget.create([{'name': "Target test"}]) export1, = ExportData.create([{ 'reference': str(target1), }]) @@ -360,6 +360,14 @@ class ExportDataTestCase(unittest.TestCase): ['reference']), [[str(target1)], ['']]) + self.assertEqual( + ExportData.export_data([export1], ['reference/rec_name']), + [[target1.rec_name]]) + + self.assertEqual( + ExportData.export_data([export1], ['reference.translated']), + [["Target"]]) + def suite(): return unittest.TestLoader().loadTestsFromTestCase(ExportDataTestCase)