/usr/lib/python2.7/dist-packages/trytond/model/fields/function.py is in tryton-server 3.0.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #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 inspect
import copy
from trytond.model.fields.field import Field
class Function(Field):
'''
Define function field (any).
'''
def __init__(self, field, getter, setter=None, searcher=None,
loading='lazy'):
'''
:param field: The field of the function.
:param getter: The name of the function for getting values.
:param setter: The name of the function to set value.
:param searcher: The name of the function to search.
:param loading: Define how the field must be loaded:
``lazy`` or ``eager``.
'''
assert isinstance(field, Field)
self._field = field
self._type = field._type
self.getter = getter
self.setter = setter
if not self.setter:
self._field.readonly = True
self.searcher = searcher
assert loading in ('lazy', 'eager'), \
'loading must be "lazy" or "eager"'
self.loading = loading
__init__.__doc__ += Field.__init__.__doc__
def __copy__(self):
return Function(copy.copy(self._field), self.getter,
setter=self.setter, searcher=self.searcher)
def __deepcopy__(self, memo):
return Function(copy.deepcopy(self._field, memo),
copy.deepcopy(self.getter, memo),
setter=copy.deepcopy(self.setter, memo),
searcher=copy.deepcopy(self.searcher, memo),
loading=copy.deepcopy(self.loading, memo))
def __getattr__(self, name):
return getattr(self._field, name)
def __getitem__(self, name):
return self._field[name]
def __setattr__(self, name, value):
if name in ('_field', '_type', 'getter', 'setter', 'searcher', 'name'):
object.__setattr__(self, name, value)
if name != 'name':
return
setattr(self._field, name, value)
def convert_domain(self, domain, tables, Model):
name, operator, value = domain[:3]
if not self.searcher:
Model.raise_user_error('search_function_missing', name)
return getattr(Model, self.searcher)(name, domain)
def get(self, ids, Model, name, values=None):
'''
Call the getter.
If the function has ``names`` in the function definition then
it will call it with a list of name.
'''
method = getattr(Model, self.getter)
def call(name):
records = Model.browse(ids)
if not hasattr(method, 'im_self') or method.im_self:
return method(records, name)
else:
return dict((r.id, method(r, name)) for r in records)
if isinstance(name, list):
names = name
# Test is the function works with a list of names
if 'names' in inspect.getargspec(method)[0]:
return call(names)
return dict((name, call(name)) for name in names)
else:
# Test is the function works with a list of names
if 'names' in inspect.getargspec(method)[0]:
name = [name]
return call(name)
def set(self, ids, Model, name, value):
'''
Call the setter.
'''
if self.setter:
getattr(Model, self.setter)(Model.browse(ids), name, value)
def __set__(self, inst, value):
self._field.__set__(inst, value)
|