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

UIDReferenceWidget.update()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
# -*- coding: utf-8 -*-
2
3
from bika.lims import api
4
from senaite.core.interfaces import ISenaiteFormLayer
5
from senaite.core.schema.interfaces import IUIDReferenceField
6
from senaite.core.z3cform.interfaces import IUIDReferenceWidget
7
from z3c.form import interfaces
8
from z3c.form.browser import widget
9
from z3c.form.browser.textlines import TextLinesWidget
10
from z3c.form.converter import TextLinesConverter
11
from z3c.form.interfaces import IFieldWidget
12
from z3c.form.widget import FieldWidget
13
from zope.component import adapter
14
from zope.interface import implementer
15
16
17
@adapter(IUIDReferenceField, interfaces.IWidget)
18
class UIDReferenceDataConverter(TextLinesConverter):
19
    """Converts the raw field data for widget/field usage
20
    """
21
22
    def toWidgetValue(self, value):
23
        """Converts a list of UIDs for the display/hidden widget
24
25
        returns a list of UIDs when widget is in "display" mode
26
        returns a unicode string when widget is in "hidden" mode
27
        """
28
        if self.widget.mode == "display":
29
            return value
30
        return super(UIDReferenceDataConverter, self).toWidgetValue(value)
31
32
    def toFieldValue(self, value):
33
        """Converts a unicode string to a list of UIDs
34
        """
35
        return super(UIDReferenceDataConverter, self).toFieldValue(value)
36
37
38
@implementer(IUIDReferenceWidget)
39
class UIDReferenceWidget(TextLinesWidget):
40
    """Senaite UID reference widget
41
    """
42
    klass = u"uidreference-widget"
43
44
    def __init__(self, request, *args, **kw):
45
        super(UIDReferenceWidget, self).__init__(request)
46
        self.request = request
47
48
    def update(self):
49
        super(UIDReferenceWidget, self).update()
50
        widget.addFieldClass(self)
51
52
    def get_info_for(self, uid):
53
        obj = api.get_object(uid)
54
        return {
55
            "title": api.get_title(obj),
56
            "path": api.get_path(obj),
57
            "url": api.get_url(obj),
58
        }
59
60
61
@adapter(IUIDReferenceField, ISenaiteFormLayer)
62
@implementer(IFieldWidget)
63
def UIDReferenceWidgetFactory(field, request):
64
    """Widget factory for UIDReferenceField
65
    """
66
    return FieldWidget(field, UIDReferenceWidget(request))
67