Passed
Pull Request — 2.x (#1864)
by Ramon
28:02 queued 21:53
created

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

Complexity

Conditions 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nop 1
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