Files
tryton/trytond/model/fields/char.py
T
Cédric Krier a1671ab214 Forbid all white spaces except space in Char field
They can not be displayed by all clients (nor OS).
But also they can be trimmed automatically by web input which breaks comparison
against changes.

issue9248
review312681002
2020-11-05 23:58:15 +01:00

84 lines
3.1 KiB
Python

# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import warnings
from trytond.rpc import RPC
from trytond.transaction import Transaction
from .field import Field, FieldTranslate, size_validate
class Char(FieldTranslate):
'''
Define a char field (``unicode``).
'''
_type = 'char'
_py_type = str
forbidden_chars = '\t\n\r\x0b\x0c'
def __init__(self, string='', size=None, help='', required=False,
readonly=False, domain=None, states=None, translate=False,
select=False, on_change=None, on_change_with=None, depends=None,
context=None, loading=None, autocomplete=None):
'''
:param translate: A boolean. If ``True`` the field is translatable.
:param size: A integer. If set defines the maximum size of the values.
'''
if loading is None:
loading = 'lazy' if translate else 'eager'
super(Char, self).__init__(string=string, help=help, required=required,
readonly=readonly, domain=domain, states=states, select=select,
on_change=on_change, on_change_with=on_change_with,
depends=depends, context=context, loading=loading)
self.autocomplete = set()
if autocomplete:
warnings.warn('autocomplete argument is deprecated, use the '
'depends decorator', DeprecationWarning, stacklevel=2)
self.autocomplete |= set(autocomplete)
self.translate = translate
self.__size = None
self.size = size
self.search_unaccented = True
__init__.__doc__ += Field.__init__.__doc__
def _get_size(self):
return self.__size
def _set_size(self, value):
size_validate(value)
self.__size = value
size = property(_get_size, _set_size)
@property
def _sql_type(self):
return 'VARCHAR(%s)' % self.size if self.size else 'VARCHAR'
def set_rpc(self, model):
super(Char, self).set_rpc(model)
if self.autocomplete:
func_name = 'autocomplete_%s' % self.name
assert hasattr(model, func_name), \
'Missing %s on model %s' % (func_name, model.__name__)
model.__rpc__.setdefault(func_name, RPC(instantiate=0))
def _domain_column(self, operator, column):
column = super(Char, self)._domain_column(operator, column)
if self.search_unaccented and operator.endswith('ilike'):
database = Transaction().database
column = database.unaccent(column)
return column
def _domain_value(self, operator, value):
value = super(Char, self)._domain_value(operator, value)
if self.search_unaccented and operator.endswith('ilike'):
database = Transaction().database
value = database.unaccent(value)
return value
def definition(self, model, language):
definition = super().definition(model, language)
definition['autocomplete'] = list(self.autocomplete)
if self.size is not None:
definition['size'] = self.size
return definition