/
checkbox.py
100 lines (82 loc) · 3.42 KB
/
checkbox.py
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
##############################################################################
#
# Copyright (c) 2007 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Text Widget Implementation
$Id$
"""
__docformat__ = "reStructuredText"
import zope.component
import zope.interface
import zope.schema
import zope.schema.interfaces
from zope.schema import vocabulary
from zope.i18n import translate
from z3c.form import interfaces, term, util
from z3c.form.widget import SequenceWidget, FieldWidget
from z3c.form.browser import widget
@zope.interface.implementer_only(interfaces.ICheckBoxWidget)
class CheckBoxWidget(widget.HTMLInputWidget, SequenceWidget):
"""Input type checkbox widget implementation."""
klass = u'checkbox-widget'
css = u'checkbox'
items = ()
def isChecked(self, term):
return term.token in self.value
def items(self):
if self.terms is None:
return ()
items = []
for count, term in enumerate(self.terms):
checked = self.isChecked(term)
id = '%s-%i' % (self.id, count)
if zope.schema.interfaces.ITitledTokenizedTerm.providedBy(term):
label = translate(term.title, context=self.request,
default=term.title)
else:
label = util.toUnicode(term.value)
items.append(
{'id': id, 'name': self.name + ':list', 'value': term.token,
'label': label, 'checked': checked})
return items
def update(self):
"""See z3c.form.interfaces.IWidget."""
super(CheckBoxWidget, self).update()
widget.addFieldClass(self)
def json_data(self):
data = super(CheckBoxWidget, self).json_data()
data['options'] = list(self.items())
data['type'] = 'check'
return data
@zope.component.adapter(zope.schema.interfaces.IField, interfaces.IFormLayer)
@zope.interface.implementer(interfaces.IFieldWidget)
def CheckBoxFieldWidget(field, request):
"""IFieldWidget factory for CheckBoxWidget."""
return FieldWidget(field, CheckBoxWidget(request))
@zope.interface.implementer_only(interfaces.ISingleCheckBoxWidget)
class SingleCheckBoxWidget(CheckBoxWidget):
"""Single Input type checkbox widget implementation."""
klass = u'single-checkbox-widget'
def updateTerms(self):
if self.terms is None:
self.terms = term.Terms()
self.terms.terms = vocabulary.SimpleVocabulary((
vocabulary.SimpleTerm('selected', 'selected',
self.label or self.field.title), ))
return self.terms
@zope.component.adapter(zope.schema.interfaces.IBool, interfaces.IFormLayer)
@zope.interface.implementer(interfaces.IFieldWidget)
def SingleCheckBoxFieldWidget(field, request):
"""IFieldWidget factory for CheckBoxWidget."""
widget = FieldWidget(field, SingleCheckBoxWidget(request))
widget.label = u'' # don't show the label twice
return widget