Passed
Pull Request — 2.x (#1864)
by Ramon
05:27
created

senaite.core.schema.fields.BaseField.__init__()   A

Complexity

Conditions 1

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 14
dl 0
loc 18
rs 9.7
c 0
b 0
f 0
cc 1
nop 11

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
# -*- coding: utf-8 -*-
2
3
from bika.lims.api.security import check_permission
4
from collective.z3cform.datagridfield import DictRow
5
from Products.CMFCore.permissions import ModifyPortalContent
6
from Products.CMFCore.permissions import View
7
from senaite.core.schema.interfaces import IBaseField
8
from senaite.core.schema.interfaces import IDataGridField
9
from senaite.core.schema.interfaces import IDataGridRow
10
from senaite.core.schema.interfaces import IIntField
11
from zope.interface import implementer
12
from zope.schema import Field
13
from zope.schema import Int
14
from zope.schema import List
15
from zope.schema._bootstrapfields import _NotGiven
16
17
18
@implementer(IBaseField)
19
class BaseField(Field):
20
    """Extensible base field
21
    """
22
23
    def __init__(self, title=u"", description=u"", __name__="",
24
                 required=True, readonly=False, constraint=None,
25
                 default=None, defaultFactory=None,
26
                 missing_value=_NotGiven, **kw):
27
28
        # Call superclass with known keywords
29
        super(BaseField, self).__init__(title=title, description=description,
30
                                        __name__=__name__,
31
                                        required=required,
32
                                        readonly=readonly,
33
                                        constraint=constraint,
34
                                        default=default,
35
                                        defaultFactory=defaultFactory,
36
                                        missing_value=missing_value)
37
38
        # field security
39
        self.read_permission = kw.get("read_permission", View)
40
        self.write_permission = kw.get("write_permission", ModifyPortalContent)
41
42
    def get(self, object):
43
        """Custom field getter
44
        """
45
        return super(BaseField, self).get(object)
46
47
    def query(self, object, default=None):
48
        """Custom field query
49
        """
50
        return super(BaseField, self).query(object, default=default)
51
52
    def set(self, object, value):
53
        """Custom field setter
54
55
        This place would theoretically allow to set custom "change" events or
56
        check permissions to write the field.
57
        """
58
        super(BaseField, self).set(object, value)
59
60
    def can_access(self):
61
        """Checks if the field can be read
62
        """
63
        return check_permission(self.read_permission, self.context)
64
65
    def can_write(self):
66
        """Checks the write permission
67
        """
68
        return check_permission(self.write_permission, self.context)
69
70
71
@implementer(IIntField)
72
class IntField(Int, BaseField):
73
    """A field that handles Integer values
74
    """
75
    def _validate(self, value):
76
        super(IntField, self)._validate(value)
77
78
79
@implementer(IDataGridField)
80
class DataGridField(List, BaseField):
81
    """A field that stores a list of dictionaries
82
    """
83
    def set(self, object, value):
84
        super(DataGridField, self).set(object, value)
85
86
87
@implementer(IDataGridRow)
88
class DataGridRow(DictRow, BaseField):
89
    """A field that stores a data grid row
90
    """
91