Files
tryton/trytond/model/fields/function.py
T
Cédric Krier 65d0a9494b Update model documentation.
Use autodoc in sphinx
Add missing and fix docstring
2009-03-01 13:37:31 +01:00

123 lines
4.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.
from trytond.model.fields.field import Field
import inspect
class Function(Field):
'''
Define function field (any)
'''
_type = 'float'
def __init__(self, fnct, arg=None, fnct_inv='', fnct_inv_arg=None,
type='float', fnct_search='', model_name=None, selection=None,
digits=None, relation=None, add_remove=None, string='', help='',
required=False, readonly=False, domain=None, states=None,
priority=0, change_default=False, translate=False, select=0,
on_change=None, on_change_with=None, depends=None, order_field=None,
context=None):
'''
:param fnct: The name of the function.
:param arg: Argument for the function.
:param fnct_inv: The name of the function to write.
:param fnct_inv_arg: Argument for the function to write.
:param type: The type of field.
:param fnct_search: The name of the function to search.
:param model_name: See Many2One.
:param selection: See Selection.
:param digits: See Float.
:param relation: Like model_name.
:param add_remove: See Many2One.
'''
super(Function, self).__init__(string=string, help=help,
required=required, readonly=readonly, domain=domain,
states=states, priority=priority, change_default=change_default,
translate=translate, select=select, on_change=on_change,
on_change_with=on_change_with, depends=depends,
order_field=order_field, context=context)
self.model_name = model_name
self.fnct = fnct
self.arg = arg
self.fnct_inv = fnct_inv
self.fnct_inv_arg = fnct_inv_arg
if not self.fnct_inv:
self.readonly = True
self._type = type
self.fnct_search = fnct_search
self.selection = selection
self.digits = digits
if relation:
self.model_name = relation
self.add_remove = add_remove
__init__.__doc__ += Field.__init__.__doc__
def search(self, cursor, user, model, name, args, context=None):
'''
Call the fnct_search.
:param cursor: The database cursor.
:param user: The user id.
:param model: The model.
:param args: The search domain. See ModelStorage.search
:param context: The context.
:return: New list of domain.
'''
if not self.fnct_search:
return []
return getattr(model, self.fnct_search)(cursor, user, name, args,
context=context)
def get(self, cursor, user, ids, model, name, values=None, context=None):
'''
Call the fnct.
If the function has ``names`` in the function definition then
it will call it with a list of name.
:param cursor: The database cursor.
:param user: The user id.
:param ids: A list of ids.
:param model: The model.
:param name: The name of the field or a list of name field.
:param values:
:param context: The contest.
:return: a dictionary with ids as key and values as value or
a dictionary with name as key and a dictionary as value if
name is a list of field name.
'''
if isinstance(name, list):
names = name
# Test is the function works with a list of names
if 'names' in inspect.getargspec(getattr(model, self.fnct))[0]:
return getattr(model, self.fnct)(cursor, user, ids, names,
self.arg, context=context)
res = {}
for name in names:
res[name] = getattr(model, self.fnct)(cursor, user, ids, name,
self.arg, context=context)
return res
else:
# Test is the function works with a list of names
if 'names' in inspect.getargspec(getattr(model, self.fnct))[0]:
name = [name]
return getattr(model, self.fnct)(cursor, user, ids, name, self.arg,
context=context)
def set(self, cursor, user, record_id, model, name, value, context=None):
'''
Call the fnct_inv.
:param cursor: The database cursor.
:param user: The user id.
:param record_id: The record id.
:param model: The model.
:param name: The name of the field.
:param value: The value to set.
:param context: The context.
'''
if self.fnct_inv:
getattr(model, self.fnct_inv)(cursor, user, record_id, name, value,
self.fnct_inv_arg, context=context)