Add translated descriptor for Reference field
issue5667 review39671002
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
--------
|
||||
|
||||
@@ -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``).
|
||||
'''
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user