Merge lp:~replaceafill/schooltool/flourish into lp:schooltool/flourish

Proposed by Douglas Cerna
Status: Merged
Merged at revision: 3289
Proposed branch: lp:~replaceafill/schooltool/flourish
Merge into: lp:schooltool/flourish
Diff against target: 309 lines (+151/-1)
6 files modified
src/schooltool/basicperson/browser/demographics.py (+45/-0)
src/schooltool/basicperson/browser/flourish.zcml (+37/-0)
src/schooltool/basicperson/configure.zcml (+7/-0)
src/schooltool/basicperson/demographics.py (+14/-0)
src/schooltool/basicperson/interfaces.py (+13/-1)
src/schooltool/basicperson/tests/test_demographics.py (+35/-0)
To merge this branch: bzr merge lp:~replaceafill/schooltool/flourish
Reviewer Review Type Date Requested Status
Gediminas Paulauskas (community) Approve
Review via email: mp+87987@code.launchpad.net

Description of the change

Some context about the change:

https://lists.launchpad.net/schooltool-developers/msg00354.html

Basically, I need integer validation for demographics in Cambodia. Then Justas suggested minium/maximum value constraints, so I implemented it too.

To post a comment you must log in.
lp:~replaceafill/schooltool/flourish updated
3287. By Douglas Cerna

Set prompt for required demographics fields (LP: #898219)

3288. By Douglas Cerna

Fixed person edit view to show limited demographics fields (LP: #914609)

Revision history for this message
Gediminas Paulauskas (menesis) wrote :

Looks good, works.

review: Approve
lp:~replaceafill/schooltool/flourish updated
3289. By Douglas Cerna

Added integer demographic fields

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/schooltool/basicperson/browser/demographics.py'
2--- src/schooltool/basicperson/browser/demographics.py 2011-11-08 20:02:56 +0000
3+++ src/schooltool/basicperson/browser/demographics.py 2012-01-09 21:27:26 +0000
4@@ -40,7 +40,9 @@
5 from schooltool.basicperson.demographics import DateFieldDescription
6 from schooltool.basicperson.demographics import BoolFieldDescription
7 from schooltool.basicperson.demographics import EnumFieldDescription
8+from schooltool.basicperson.demographics import IntFieldDescription
9 from schooltool.basicperson.interfaces import IEnumFieldDescription
10+from schooltool.basicperson.interfaces import IIntFieldDescription
11 from schooltool.basicperson.interfaces import IDemographicsFields
12 from schooltool.basicperson.interfaces import IFieldDescription
13 from schooltool.basicperson.interfaces import EnumValueList
14@@ -232,6 +234,20 @@
15 return fd
16
17
18+class IntFieldDescriptionAddView(FieldDescriptionAddView):
19+
20+ fields = field.Fields(IIntFieldDescription).select('title', 'name',
21+ 'min_value', 'max_value', 'required', 'limit_keys')
22+
23+ def create(self, data):
24+ fd = IntFieldDescription(data['title'],
25+ str(data['name']),
26+ data['required'])
27+ form.applyChanges(self, fd, data)
28+ self._fd = fd
29+ return fd
30+
31+
32 class FieldDescriptionEditView(form.EditForm):
33 """Edit form for basic person."""
34 form.extends(form.EditForm)
35@@ -260,6 +276,12 @@
36 'items', 'required', 'limit_keys')
37
38
39+class IntFieldDescriptionEditView(FieldDescriptionEditView):
40+
41+ fields = field.Fields(IIntFieldDescription).select('title',
42+ 'min_value', 'max_value', 'required', 'limit_keys')
43+
44+
45 class FieldDescriptionView(form.DisplayForm):
46 """Display form for a field description."""
47 template = ViewPageTemplateFile('templates/field_description_view.pt')
48@@ -292,6 +314,12 @@
49 fields = field.Fields(IEnumFieldDescription)
50
51
52+class IntFieldDescriptionView(FieldDescriptionView):
53+ """Display form for an int field description."""
54+
55+ fields = field.Fields(IIntFieldDescription)
56+
57+
58 class FlourishDemographicsFieldsLinks(flourish.page.RefineLinksViewlet):
59 """demographics fields add links viewlet."""
60
61@@ -312,6 +340,7 @@
62 'Text': _('Text'),
63 'Bool': _('Yes/No'),
64 'Description': _('Description'),
65+ 'Int': _('Integer'),
66 }
67
68 def table(self):
69@@ -457,6 +486,11 @@
70 pass
71
72
73+class FlourishIntFieldDescriptionAddView(FlourishFieldDescriptionAddView,
74+ IntFieldDescriptionAddView):
75+ pass
76+
77+
78 class FlourishFieldDescriptionEditView(flourish.form.Form,
79 FieldDescriptionEditView):
80
81@@ -502,6 +536,12 @@
82 EnumFieldDescriptionEditView.update(self)
83
84
85+class FlourishIntFieldDescriptionEditView(FlourishFieldDescriptionEditView, IntFieldDescriptionEditView):
86+
87+ def update(self):
88+ IntFieldDescriptionEditView.update(self)
89+
90+
91 class FlourishTextFieldDescriptionView(flourish.page.Page, TextFieldDescriptionView):
92
93 def update(self):
94@@ -532,3 +572,8 @@
95 def update(self):
96 EnumFieldDescriptionView.update(self)
97
98+
99+class FlourishIntFieldDescriptionView(flourish.page.Page, IntFieldDescriptionView):
100+
101+ def update(self):
102+ IntFieldDescriptionView.update(self)
103
104=== modified file 'src/schooltool/basicperson/browser/flourish.zcml'
105--- src/schooltool/basicperson/browser/flourish.zcml 2011-10-28 05:14:33 +0000
106+++ src/schooltool/basicperson/browser/flourish.zcml 2012-01-09 21:27:26 +0000
107@@ -346,6 +346,16 @@
108 />
109
110 <flourish:viewlet
111+ name="addInt.html"
112+ after="addText.html"
113+ before="addDescription.html"
114+ title="Integer Field"
115+ class="schooltool.skin.flourish.page.LinkViewlet"
116+ manager="schooltool.basicperson.browser.demographics.FlourishDemographicsFieldsLinks"
117+ permission="schooltool.edit"
118+ />
119+
120+ <flourish:viewlet
121 name="reorder.html"
122 title="Reorder or Delete Fields"
123 class="schooltool.skin.flourish.page.LinkViewlet"
124@@ -398,6 +408,15 @@
125 subtitle="New Selection List Field"
126 />
127
128+ <flourish:page
129+ name="addInt.html"
130+ for="schooltool.basicperson.interfaces.IDemographicsFields"
131+ class="schooltool.basicperson.browser.demographics.FlourishIntFieldDescriptionAddView"
132+ content_template="templates/z3c_form_edit.pt"
133+ permission="schooltool.edit"
134+ subtitle="New Integer Field"
135+ />
136+
137 <flourish:breadcrumb
138 for="schooltool.basicperson.interfaces.IDemographicsFields"
139 view="schooltool.basicperson.browser.demographics.FlourishFieldDescriptionEditView"
140@@ -457,6 +476,14 @@
141 />
142
143 <flourish:page
144+ name="edit.html"
145+ for="schooltool.basicperson.demographics.IntFieldDescription"
146+ class="schooltool.basicperson.browser.demographics.FlourishIntFieldDescriptionEditView"
147+ content_template="templates/z3c_form_edit.pt"
148+ permission="schooltool.edit"
149+ />
150+
151+ <flourish:page
152 name="index.html"
153 for="schooltool.basicperson.demographics.TextFieldDescription"
154 class="schooltool.basicperson.browser.demographics.FlourishTextFieldDescriptionView"
155@@ -500,6 +527,16 @@
156 permission="schooltool.view"
157 title="View"
158 />
159+
160+ <flourish:page
161+ name="index.html"
162+ for="schooltool.basicperson.demographics.IntFieldDescription"
163+ class="schooltool.basicperson.browser.demographics.FlourishIntFieldDescriptionView"
164+ content_template="templates/z3c_form_display.pt"
165+ permission="schooltool.view"
166+ title="View"
167+ />
168+
169 </configure>
170
171 <!-- Viewlet Mangers -->
172
173=== modified file 'src/schooltool/basicperson/configure.zcml'
174--- src/schooltool/basicperson/configure.zcml 2011-08-10 12:42:42 +0000
175+++ src/schooltool/basicperson/configure.zcml 2012-01-09 21:27:26 +0000
176@@ -73,6 +73,13 @@
177 set_schema="schooltool.basicperson.interfaces.IEnumFieldDescription" />
178 </class>
179
180+ <class class=".demographics.IntFieldDescription">
181+ <allow interface="zope.location.interfaces.ILocation" />
182+ <allow interface="schooltool.basicperson.interfaces.IIntFieldDescription" />
183+ <require permission="schooltool.edit"
184+ set_schema="schooltool.basicperson.interfaces.IIntFieldDescription" />
185+ </class>
186+
187 <adapter
188 factory=".person.BasicPersonCalendarCrowd"
189 provides="schooltool.app.interfaces.ICalendarParentCrowd"
190
191=== modified file 'src/schooltool/basicperson/demographics.py'
192--- src/schooltool/basicperson/demographics.py 2011-11-20 20:21:57 +0000
193+++ src/schooltool/basicperson/demographics.py 2012-01-09 21:27:26 +0000
194@@ -25,6 +25,7 @@
195 from zope.schema._field import Choice
196 from zope.schema._field import Date
197 from zope.schema import TextLine, Bool
198+from zope.schema import Int
199 from zope.location.location import Location
200 from zope.location.location import locate
201 from zope.html.field import HtmlFragment
202@@ -43,6 +44,7 @@
203 from schooltool.app.app import InitBase, StartUpBase
204 from schooltool.app.interfaces import ISchoolToolApplication
205 from schooltool.basicperson.interfaces import IEnumFieldDescription
206+from schooltool.basicperson.interfaces import IIntFieldDescription
207 from schooltool.basicperson.interfaces import IDemographicsFields
208 from schooltool.basicperson.interfaces import IBasicPerson
209 from schooltool.basicperson.interfaces import IDemographics
210@@ -238,3 +240,15 @@
211 def makeField(self):
212 return self.setUpField(HtmlFragment(title=unicode(self.title)))
213
214+
215+class IntFieldDescription(FieldDescription):
216+
217+ implements(IIntFieldDescription)
218+
219+ min_value = None
220+ max_value = None
221+
222+ def makeField(self):
223+ return self.setUpField(Int(title=unicode(self.title),
224+ min=self.min_value,
225+ max=self.max_value))
226
227=== modified file 'src/schooltool/basicperson/interfaces.py'
228--- src/schooltool/basicperson/interfaces.py 2011-11-22 23:59:23 +0000
229+++ src/schooltool/basicperson/interfaces.py 2012-01-09 21:27:26 +0000
230@@ -21,7 +21,7 @@
231 """
232 from zope.container.interfaces import IContainer
233 from zope.container.interfaces import IOrderedContainer
234-from zope.schema import Date, Choice, TextLine, Bool, List
235+from zope.schema import Date, Choice, TextLine, Bool, List, Int
236 from zope.configuration.fields import PythonIdentifier
237 from zope.interface import Interface, Attribute
238
239@@ -166,6 +166,18 @@
240 "as a menu in forms."))
241
242
243+class IIntFieldDescription(IFieldDescription):
244+ """Integer demographics field."""
245+
246+ min_value = Int(
247+ title=_(u'Minimum value'),
248+ required=False)
249+
250+ max_value = Int(
251+ title=_(u'Maximum value'),
252+ required=False)
253+
254+
255 class IFieldFilterVocabulary(IVocabularyTokenized):
256 """Marker interface for vocabularies that give keys that are used
257 to filder demographics fields for the context.
258
259=== modified file 'src/schooltool/basicperson/tests/test_demographics.py'
260--- src/schooltool/basicperson/tests/test_demographics.py 2011-01-14 06:50:22 +0000
261+++ src/schooltool/basicperson/tests/test_demographics.py 2012-01-09 21:27:26 +0000
262@@ -28,6 +28,7 @@
263 from schooltool.basicperson.interfaces import IDemographicsFields
264 from schooltool.basicperson.demographics import DateFieldDescription
265 from schooltool.basicperson.demographics import EnumFieldDescription
266+from schooltool.basicperson.demographics import IntFieldDescription
267 from schooltool.basicperson.demographics import setUpDefaultDemographics
268 from schooltool.basicperson.demographics import IDemographicsForm
269 from schooltool.basicperson.demographics import TextFieldDescription
270@@ -227,6 +228,40 @@
271 """
272
273
274+def doctest_IntFieldDescription():
275+ """Tests for IntFieldDescription
276+
277+ Int field description is a class that defines minimum and maximum
278+ values for an integer field shown in person add/edit form.
279+
280+ >>> fd = IntFieldDescription("tablets", "Tablets")
281+ >>> fd.min_value = 2
282+ >>> fd.max_value = 3
283+ >>> fields = fd.makeField()
284+ >>> len(fields)
285+ 1
286+
287+ >>> field = fields['tablets']
288+ >>> field
289+ <Field 'tablets'>
290+
291+ >>> field.interface
292+ <InterfaceClass schooltool.basicperson.demographics.IDemographicsForm>
293+
294+ >>> field.field
295+ <zope.schema._bootstrapfields.Int object at ...>
296+
297+ >>> field.__name__
298+ 'tablets'
299+
300+ >>> field.field.min
301+ 2
302+ >>> field.field.max
303+ 3
304+
305+ """
306+
307+
308 def doctest_TextFieldDescription():
309 """Tests for TextFieldDescription
310

Subscribers

People subscribed via source and target branches