The __rpc__ attribute is currently filled by method in ModelView. Allowing fields to define themselves what endpoints should be remotely callable make this process more flexible. issue4044 review30991002
78 lines
2.7 KiB
Python
78 lines
2.7 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 sys
|
|
import warnings
|
|
|
|
from sql import Query, Expression
|
|
|
|
from ... import backend
|
|
from .field import Field, FieldTranslate, size_validate, SQLType
|
|
from ...rpc import RPC
|
|
|
|
|
|
class Char(FieldTranslate):
|
|
'''
|
|
Define a char field (``unicode``).
|
|
'''
|
|
_type = 'char'
|
|
|
|
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
|
|
__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)
|
|
|
|
@staticmethod
|
|
def sql_format(value):
|
|
if isinstance(value, (Query, Expression)):
|
|
return value
|
|
if value is None:
|
|
return None
|
|
elif isinstance(value, str) and sys.version_info < (3,):
|
|
return unicode(value, 'utf-8')
|
|
assert isinstance(value, unicode)
|
|
return value
|
|
|
|
def sql_type(self):
|
|
db_type = backend.name()
|
|
if self.size and db_type != 'sqlite':
|
|
return SQLType('VARCHAR', 'VARCHAR(%s)' % self.size)
|
|
elif db_type == 'mysql':
|
|
return SQLType('CHAR', 'VARCHAR(255)')
|
|
return SQLType('VARCHAR', '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))
|