Add translated descriptor for Reference field

issue5667
review39671002
This commit is contained in:
Cédric Krier
2017-09-26 01:25:26 +02:00
parent 730ecb68b2
commit 9eafd65d2e
5 changed files with 34 additions and 11 deletions
+1
View File
@@ -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
+6
View File
@@ -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
--------
+2 -1
View File
@@ -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``).
'''
+16 -9
View File
@@ -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]
+9 -1
View File
@@ -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)