This file is indexed.

/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)