Merge lp:~aelkner/schooltool.gradebook/flourish into lp:schooltool.gradebook/flourish

Proposed by Gediminas Paulauskas
Status: Rejected
Rejected by: Alan Elkner
Proposed branch: lp:~aelkner/schooltool.gradebook/flourish
Merge into: lp:schooltool.gradebook/flourish
Diff against target: 1514 lines (+1162/-21) (has conflicts)
22 files modified
CHANGES.txt (+4/-0)
src/schooltool/gradebook/README.txt (+19/-0)
src/schooltool/gradebook/activity.py (+55/-2)
src/schooltool/gradebook/browser/course_worksheets.py (+452/-0)
src/schooltool/gradebook/browser/flourish.zcml (+180/-10)
src/schooltool/gradebook/browser/gradebook.py (+10/-2)
src/schooltool/gradebook/browser/report_card.py (+14/-0)
src/schooltool/gradebook/browser/resources/f_gradebook.css (+5/-0)
src/schooltool/gradebook/browser/templates/f_course_worksheet_edit.pt (+45/-0)
src/schooltool/gradebook/browser/templates/f_course_worksheet_templates.pt (+26/-0)
src/schooltool/gradebook/browser/templates/f_course_worksheets.pt (+111/-0)
src/schooltool/gradebook/browser/templates/f_deploy_as_course_worksheet.pt (+61/-0)
src/schooltool/gradebook/browser/templates/f_hide_unhide_course_worksheets.pt (+44/-0)
src/schooltool/gradebook/browser/templates/f_manage_course_worksheet_templates.pt (+10/-0)
src/schooltool/gradebook/browser/templates/f_manage_course_worksheets.pt (+21/-0)
src/schooltool/gradebook/browser/templates/f_manage_report_sheet_templates_overview.pt (+12/-0)
src/schooltool/gradebook/browser/templates/f_manage_report_sheets_overview.pt (+2/-2)
src/schooltool/gradebook/browser/templates/f_template_manage.pt (+1/-1)
src/schooltool/gradebook/browser/templates/f_templates_overview.pt (+4/-0)
src/schooltool/gradebook/configure.zcml (+51/-0)
src/schooltool/gradebook/interfaces.py (+28/-3)
src/schooltool/gradebook/tests/test_gradebook.py (+7/-1)
Text conflict in CHANGES.txt
To merge this branch: bzr merge lp:~aelkner/schooltool.gradebook/flourish
Reviewer Review Type Date Requested Status
Gediminas Paulauskas (community) Needs Fixing
Review via email: mp+86728@code.launchpad.net

Description of the change

Don't you think such a new big feature, that no one understands until they see it, implies a need for a merge request?

+ At a time when I have said I am making a 2.0.1 release
+ 3 test failures!
+ Behavior has changed, as evidenced by broken tests

To post a comment you must log in.
Revision history for this message
Gediminas Paulauskas (menesis) wrote :

I have removed your merge from flourish branch.

# Your local branch will conflict. Push it aside
# $ bzr branch . ../flourish-rejected
# and get the real trunk
# $ bzr pull --overwrite lp:schooltool.gradebook

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

Tests have to be looked at, and something needs fixing.

I don't see any tests or documentation on this feature.
Except a few lines in src/schooltool/gradebook/README.txt

No "What's this?" description of a new feature.

review: Needs Fixing
Revision history for this message
Tom Hoffman (tom-hoffman) wrote :

This doesn't need to be merged right now -- we'll be returning to these issues after the holidays.

415. By Gediminas Paulauskas

Preparing release 2.0.1

416. By Gediminas Paulauskas

Back to development: 2.0.2

Unmerged revisions

476. By Alan Elkner

merged with trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CHANGES.txt'
--- CHANGES.txt 2011-12-22 15:15:53 +0000
+++ CHANGES.txt 2011-12-22 16:21:13 +0000
@@ -6,7 +6,11 @@
6------------------6------------------
77
8- Allow scoresystem point value be equal to the previous grade (https://launchpad.net/bugs/899228)8- Allow scoresystem point value be equal to the previous grade (https://launchpad.net/bugs/899228)
9<<<<<<< TREE
9- Updated translations10- Updated translations
11=======
12- Added course worksheets feature
13>>>>>>> MERGE-SOURCE
1014
1115
122.0.0 (2011-11-22)162.0.0 (2011-11-22)
1317
=== modified file 'src/schooltool/gradebook/README.txt'
--- src/schooltool/gradebook/README.txt 2011-08-30 17:24:02 +0000
+++ src/schooltool/gradebook/README.txt 2011-12-22 16:21:13 +0000
@@ -661,3 +661,22 @@
661 >>> linked_activity.scoresystem.max661 >>> linked_activity.scoresystem.max
662 Decimal("20")662 Decimal("20")
663663
664Course Activities
665-----------------
666
667Course leaders can create a set of worksheets that they can later choose to
668deploy to all the sections of that course for specific terms or the whole
669school year. There is an adapter that returns this set, which it locates
670in the course's annotations.
671
672 >>> alg1_act = interfaces.ICourseActivities(alg1)
673 >>> alg1_act
674 CourseActivities(u'Course Activities')
675
676There is also an adapter that returns the deployed worksheets for the course,
677also stored as annotations.
678
679 >>> alg1_deployed = interfaces.ICourseDeployedWorksheets(alg1)
680 >>> alg1_deployed
681 CourseDeployedWorksheets(u'Deployed Worksheets')
682
664683
=== modified file 'src/schooltool/gradebook/activity.py'
--- src/schooltool/gradebook/activity.py 2011-09-01 13:46:58 +0000
+++ src/schooltool/gradebook/activity.py 2011-12-22 16:21:13 +0000
@@ -37,6 +37,7 @@
37from schooltool.app.interfaces import ISchoolToolApplication37from schooltool.app.interfaces import ISchoolToolApplication
38from schooltool.gradebook import GradebookMessage as _38from schooltool.gradebook import GradebookMessage as _
39from schooltool.requirement import requirement, scoresystem39from schooltool.requirement import requirement, scoresystem
40from schooltool.requirement.interfaces import IRangedValuesScoreSystem
40from schooltool.gradebook import interfaces41from schooltool.gradebook import interfaces
41from schooltool.term.interfaces import IDateManager42from schooltool.term.interfaces import IDateManager
42from schooltool.course.interfaces import ISection43from schooltool.course.interfaces import ISection
@@ -44,6 +45,8 @@
44ACTIVITIES_KEY = 'schooltool.gradebook.activities'45ACTIVITIES_KEY = 'schooltool.gradebook.activities'
45CURRENT_WORKSHEET_KEY = 'schooltool.gradebook.currentworksheet'46CURRENT_WORKSHEET_KEY = 'schooltool.gradebook.currentworksheet'
46CATEGORY_WEIGHTS_KEY = 'schooltool.gradebook.categoryweights'47CATEGORY_WEIGHTS_KEY = 'schooltool.gradebook.categoryweights'
48COURSE_ACTIVITIES_KEY = 'schooltool.gradebook.course_activities'
49COURSE_DEPLOYED_WORKSHEETS_KEY = 'schooltool.gradebook.course_deployed'
4750
4851
49def ensureAtLeastOneWorksheet(activities):52def ensureAtLeastOneWorksheet(activities):
@@ -170,6 +173,14 @@
170 return []173 return []
171174
172175
176class CourseActivities(requirement.Requirement):
177 zope.interface.implements(interfaces.ICourseActivities)
178
179
180class CourseDeployedWorksheets(requirement.Requirement):
181 zope.interface.implements(interfaces.ICourseDeployedWorksheets)
182
183
173class Worksheet(requirement.Requirement):184class Worksheet(requirement.Requirement):
174 zope.interface.implements(interfaces.IWorksheet, 185 zope.interface.implements(interfaces.IWorksheet,
175 annotation.interfaces.IAttributeAnnotatable)186 annotation.interfaces.IAttributeAnnotatable)
@@ -198,6 +209,12 @@
198 ann[CATEGORY_WEIGHTS_KEY] = persistent.dict.PersistentDict()209 ann[CATEGORY_WEIGHTS_KEY] = persistent.dict.PersistentDict()
199 ann[CATEGORY_WEIGHTS_KEY][category] = weight210 ann[CATEGORY_WEIGHTS_KEY][category] = weight
200211
212 def canAverage(self):
213 for activity in self.values():
214 if IRangedValuesScoreSystem(activity.scoresystem, None) is None:
215 return False
216 return True
217
201218
202class ReportWorksheet(requirement.Requirement):219class ReportWorksheet(requirement.Requirement):
203 zope.interface.implements(interfaces.IReportWorksheet)220 zope.interface.implements(interfaces.IReportWorksheet)
@@ -205,6 +222,12 @@
205 deployed = False222 deployed = False
206223
207224
225class CourseWorksheet(requirement.Requirement):
226 zope.interface.implements(interfaces.ICourseWorksheet)
227
228 deployed = False
229
230
208class Activity(requirement.Requirement):231class Activity(requirement.Requirement):
209 zope.interface.implements(interfaces.IActivity)232 zope.interface.implements(interfaces.IActivity)
210233
@@ -237,8 +260,6 @@
237 return annotations[ACTIVITIES_KEY]260 return annotations[ACTIVITIES_KEY]
238 except KeyError:261 except KeyError:
239 activities = Activities(_('Activities'))262 activities = Activities(_('Activities'))
240 # Make sure that the sections activities include all the activities of
241 # the courses as well
242 annotations[ACTIVITIES_KEY] = activities263 annotations[ACTIVITIES_KEY] = activities
243 zope.container.contained.contained(264 zope.container.contained.contained(
244 activities, context, 'activities')265 activities, context, 'activities')
@@ -248,6 +269,38 @@
248getSectionActivities.factory = Activities269getSectionActivities.factory = Activities
249270
250271
272def getCourseActivities(context):
273 '''IAttributeAnnotatable object to ICourseActivities adapter.'''
274 annotations = annotation.interfaces.IAnnotations(context)
275 try:
276 return annotations[COURSE_ACTIVITIES_KEY]
277 except KeyError:
278 activities = CourseActivities(_('Course Activities'))
279 annotations[COURSE_ACTIVITIES_KEY] = activities
280 zope.container.contained.contained(
281 activities, context, 'activities')
282 return activities
283
284# Convention to make adapter introspectable
285getCourseActivities.factory = CourseActivities
286
287
288def getCourseDeployedWorksheets(context):
289 '''IAttributeAnnotatable object to ICourseDeployedWorksheets adapter.'''
290 annotations = annotation.interfaces.IAnnotations(context)
291 try:
292 return annotations[COURSE_DEPLOYED_WORKSHEETS_KEY]
293 except KeyError:
294 worksheets = CourseDeployedWorksheets(_('Deployed Worksheets'))
295 annotations[COURSE_DEPLOYED_WORKSHEETS_KEY] = worksheets
296 zope.container.contained.contained(
297 worksheets, context, 'deployed_worksheets')
298 return worksheets
299
300# Convention to make adapter introspectable
301getCourseDeployedWorksheets.factory = CourseDeployedWorksheets
302
303
251class LinkedActivity(Activity):304class LinkedActivity(Activity):
252 zope.interface.implements(interfaces.ILinkedActivity)305 zope.interface.implements(interfaces.ILinkedActivity)
253306
254307
=== added file 'src/schooltool/gradebook/browser/course_worksheets.py'
--- src/schooltool/gradebook/browser/course_worksheets.py 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/course_worksheets.py 2011-12-22 16:21:13 +0000
@@ -0,0 +1,452 @@
1#
2# SchoolTool - common information systems platform for school administration
3# Copyright (c) 2005 Shuttleworth Foundation
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 2 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18#
19"""
20Course Worksheet Views
21"""
22
23from zope.container.interfaces import INameChooser
24from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
25from zope.security.checker import canWrite
26from zope.security.interfaces import Unauthorized
27from zope.security.proxy import removeSecurityProxy
28from zope.traversing.api import getName
29from zope.traversing.browser.absoluteurl import absoluteURL
30from zope.i18n import translate
31
32from z3c.form import form, field, button
33
34from schooltool.app.interfaces import ISchoolToolApplication
35from schooltool.gradebook import GradebookMessage as _
36from schooltool.common.inlinept import InheritTemplate
37from schooltool.common.inlinept import InlineViewPageTemplate
38from schooltool.course.interfaces import ISectionContainer, ISection
39from schooltool.person.interfaces import IPerson
40from schooltool.schoolyear.interfaces import ISchoolYear
41from schooltool.schoolyear.interfaces import ISchoolYearContainer
42from schooltool.skin import flourish
43from schooltool.skin.flourish.page import TertiaryNavigationManager
44from schooltool.term.interfaces import ITerm
45
46from schooltool.gradebook.interfaces import (IActivities, ICourseActivities,
47 ICourseWorksheet, ICourseDeployedWorksheets, IGradebookRoot)
48from schooltool.gradebook.activity import CourseWorksheet, Activity, Worksheet
49from schooltool.gradebook.browser.activity import (FlourishActivityAddView,
50 FlourishActivityEditView)
51from schooltool.gradebook.browser.report_card import copyActivities
52
53
54class FlourishCourseTemplatesView(flourish.page.Page):
55 """A flourish view for managing course worksheet templates"""
56
57 @property
58 def title(self):
59 return self.context.__parent__.title
60
61 @property
62 def worksheets(self):
63 return tuple(removeSecurityProxy(self.context).values())
64
65
66class FlourishCourseWorksheetsLinks(flourish.page.RefineLinksViewlet):
67 """flourish course worksheet templates add links viewlet."""
68
69
70class FlourishCourseWorksheetAddView(flourish.form.AddForm):
71 """flourish view for adding a course worksheet."""
72
73 fields = field.Fields(ICourseWorksheet).select('title')
74 template = InheritTemplate(flourish.page.Page.template)
75 label = None
76 legend = _('Course Worksheet Details')
77
78 @property
79 def title(self):
80 return self.context.__parent__.title
81
82 @button.buttonAndHandler(_('Submit'), name='add')
83 def handleAdd(self, action):
84 super(FlourishCourseWorksheetAddView, self).handleAdd.func(self, action)
85
86 @button.buttonAndHandler(_("Cancel"))
87 def handle_cancel_action(self, action):
88 url = absoluteURL(self.context, self.request)
89 self.request.response.redirect(url)
90
91 def create(self, data):
92 worksheet = CourseWorksheet(data['title'])
93 return worksheet
94
95 def add(self, worksheet):
96 chooser = INameChooser(self.context)
97 name = chooser.chooseName(worksheet.title, worksheet)
98 self.context[name] = worksheet
99 self._worksheet = worksheet
100 return worksheet
101
102 def nextURL(self):
103 return absoluteURL(self.context, self.request)
104
105 def updateActions(self):
106 super(FlourishCourseWorksheetAddView, self).updateActions()
107 self.actions['add'].addClass('button-ok')
108 self.actions['cancel'].addClass('button-cancel')
109
110
111class FlourishCourseWorksheetEditView(flourish.form.Form, form.EditForm):
112
113 template = InheritTemplate(flourish.page.Page.template)
114 label = None
115 legend = _('Course Worksheet Template Information')
116 fields = field.Fields(ICourseWorksheet).select('title')
117
118 @property
119 def title(self):
120 return self.context.title
121
122 def update(self):
123 if 'form-submitted' in self.request:
124 for activity in self.context.values():
125 name = 'delete.%s' % activity.__name__
126 if name in self.request:
127 del self.context[activity.__name__]
128 break
129 return form.EditForm.update(self)
130
131 @button.buttonAndHandler(_('Submit'), name='apply')
132 def handleApply(self, action):
133 super(FlourishCourseWorksheetEditView, self).handleApply.func(self, action)
134 # XXX: hacky sucessful submit check
135 if (self.status == self.successMessage or
136 self.status == self.noChangesMessage):
137 self.request.response.redirect(self.nextURL())
138
139 @button.buttonAndHandler(_("Cancel"))
140 def handle_cancel_action(self, action):
141 self.request.response.redirect(self.nextURL())
142
143 def nextURL(self):
144 return absoluteURL(self.context.__parent__, self.request)
145
146 def updateActions(self):
147 super(FlourishCourseWorksheetEditView, self).updateActions()
148 self.actions['apply'].addClass('button-ok')
149 self.actions['cancel'].addClass('button-cancel')
150
151
152class CourseWorksheetAddLinks(flourish.page.RefineLinksViewlet):
153 """Course worksheet add links viewlet."""
154
155
156class FlourishCourseActivityAddView(FlourishActivityAddView):
157 legend = _('Course Activity Details')
158
159
160class CourseActivityAddTertiaryNavigationManager(
161 flourish.page.TertiaryNavigationManager):
162
163 template = InlineViewPageTemplate("")
164
165
166class FlourishCourseActivityEditView(FlourishActivityEditView):
167 legend = _('Course Activity Details')
168
169 def nextURL(self):
170 return absoluteURL(self.context.__parent__, self.request)
171
172
173class FlourishCourseWorksheetsBase(object):
174
175 @property
176 def course(self):
177 return self.context
178
179 @property
180 def schoolyear(self):
181 return ISchoolYear(self.course)
182
183 @property
184 def deployed(self):
185 return ICourseDeployedWorksheets(self.course)
186
187 @property
188 def activities(self):
189 return ICourseActivities(self.course)
190
191 def sheets(self):
192 return [sheet for sheet in self.all_sheets() if not sheet['checked']]
193
194 def all_sheets(self):
195 schoolyear = self.schoolyear
196 deployments = {}
197 for nm, sheet in self.deployed.items():
198 sheet = removeSecurityProxy(sheet)
199 index = int(sheet.__name__[sheet.__name__.rfind('_') + 1:])
200 deployment = deployments.setdefault(index, {
201 'obj': sheet,
202 'index': str(index),
203 'checked': sheet.hidden,
204 'terms': [False] * len(schoolyear),
205 })
206 for index, term in enumerate(schoolyear.values()):
207 prefix = 'course_%s_%s' % (self.course.__name__, term.__name__)
208 if sheet.__name__.startswith(prefix):
209 deployment['terms'][index] = True
210 sheets = [v for k, v in sorted(deployments.items())]
211 return ([sheet for sheet in sheets if not sheet['checked']] +
212 [sheet for sheet in sheets if sheet['checked']])
213
214 @property
215 def terms(self):
216 result = [{
217 'name': '',
218 'title': _('-- Entire year --'),
219 'selected': 'selected',
220 }]
221 for term in self.schoolyear.values():
222 result.append({
223 'name': term.__name__,
224 'title': term.title,
225 'selected': '',
226 })
227 return result
228
229 def getNewIndex(self, sheet, template_title):
230 if sheet.title.startswith(template_title):
231 rest = sheet.title[len(template_title):]
232 if not rest:
233 return 1
234 elif len(rest) > 1 and rest[0] == '-' and rest[1:].isdigit():
235 return int(rest[1:])
236 return 0
237
238 def deploy(self, term, template):
239 # get the next index and title
240 highest, title_index = 0, 0
241 template_title = self.alternate_title
242 for sheet in self.deployed.values():
243 index = int(sheet.__name__[sheet.__name__.rfind('_') + 1:])
244 if index > highest:
245 highest = index
246 new_index = self.getNewIndex(sheet, template_title)
247 if new_index > title_index:
248 title_index = new_index
249 root = IGradebookRoot(ISchoolToolApplication(None))
250 prefix = self.schoolyear.__name__ + '_'
251 for sheet in root.deployed.values():
252 if sheet.__name__.startswith(prefix):
253 new_index = self.getNewIndex(sheet, template_title)
254 if new_index > title_index:
255 title_index = new_index
256 title = template_title
257 if title_index:
258 title += '-%s' % (title_index + 1)
259
260 # copy worksheet template to the term or whole year
261 if term:
262 terms = [term]
263 else:
264 terms = self.schoolyear.values()
265 for term in terms:
266 deployedKey = 'course_%s_%s_%s' % (self.course.__name__,
267 term.__name__, highest + 1)
268 deployedWorksheet = Worksheet(title)
269 self.deployed[deployedKey] = deployedWorksheet
270 copyActivities(removeSecurityProxy(template), deployedWorksheet)
271
272 # now copy the template to all sections in the term
273 sections = ISectionContainer(term)
274 for section in sections.values():
275 if self.course not in section.courses:
276 continue
277 worksheetCopy = Worksheet(deployedWorksheet.title)
278 worksheetCopy.deployed = True
279 IActivities(section)[deployedWorksheet.__name__] = worksheetCopy
280 copyActivities(deployedWorksheet, worksheetCopy)
281
282
283class FlourishManageCourseWorksheetTemplatesOverview(flourish.page.Content):
284 """A flourish viewlet for showing worksheet templates in course view"""
285
286 body_template = ViewPageTemplateFile(
287 'templates/f_manage_course_worksheet_templates.pt')
288
289
290class FlourishManageCourseSheetsOverview(FlourishCourseWorksheetsBase,
291 flourish.page.Content):
292 """A flourish viewlet for showing deployed worksheets in course view"""
293
294 body_template = ViewPageTemplateFile(
295 'templates/f_manage_course_worksheets.pt')
296
297
298class FlourishCourseWorksheetsView(FlourishCourseWorksheetsBase,
299 flourish.page.Page):
300 """A flourish view for managing corse worksheet deployment"""
301
302 def __init__(self, context, request):
303 super(FlourishCourseWorksheetsView, self).__init__(context, request)
304 self.alternate_title = self.request.get('alternate_title')
305
306 @property
307 def subtitle(self):
308 subtitle = _(u'Worksheets for ${year}',
309 mapping={'year': self.schoolyear.title})
310 return translate(subtitle, context=self.request)
311
312 @property
313 def has_error(self):
314 return self.no_template or self.no_title
315
316 @property
317 def no_template(self):
318 return 'SUBMIT' in self.request and not self.request.get('template')
319
320 @property
321 def no_title(self):
322 return ('SUBMIT' in self.request and
323 not self.request.get('alternate_title'))
324
325 @property
326 def templates(self):
327 result = [{
328 'name': '',
329 'title': _('-- Select a template --'),
330 'selected': 'selected',
331 }]
332 for template in self.activities.values():
333 result.append({
334 'name': template.__name__,
335 'title': template.title,
336 'selected': '',
337 })
338 return result
339
340 def update(self):
341 if 'CANCEL' in self.request:
342 self.request.response.redirect(self.nextURL())
343 if 'SUBMIT' in self.request:
344 if self.request.get('template') and self.alternate_title:
345 template = self.activities[self.request['template']]
346 term = self.request.get('term')
347 if term:
348 term = self.schoolyear[term]
349 self.deploy(term, template)
350 self.alternate_title = ''
351
352 def nextURL(self):
353 return absoluteURL(self.context, self.request)
354
355
356class CourseWorksheetsActionLinks(flourish.page.RefineLinksViewlet):
357 """Course worksheets view action links viewlet."""
358
359
360class FlourishHideUnhideCourseWorkheetsView(FlourishCourseWorksheetsBase,
361 flourish.page.Page):
362 """A flourish view for hiding/unhiding course worksheet deployments"""
363
364 @property
365 def subtitle(self):
366 title = _(u'Hide/unhide Deployed Worksheets for ${year}',
367 mapping={'year': self.schoolyear.title})
368 return translate(title, context=self.request)
369
370 def update(self):
371 if 'CANCEL' in self.request:
372 self.request.response.redirect(self.nextURL())
373 elif 'SUBMIT' in self.request:
374 hidden = self.request.get('hidden', [])
375 schoolyear = self.schoolyear
376 for nm, sheet in self.deployed.items():
377 sheet = removeSecurityProxy(sheet)
378 index = sheet.__name__[sheet.__name__.rfind('_') + 1:]
379 self.handleSheet(sheet, index, hidden)
380 self.request.response.redirect(self.nextURL())
381
382 def handleSheet(self, sheet, index, hidden):
383 if index in hidden and not sheet.hidden:
384 sheet.hidden = True
385 elif index not in hidden and sheet.hidden:
386 sheet.hidden = False
387 else:
388 return
389 schoolyear = self.schoolyear
390 for term in schoolyear.values():
391 deployedKey = 'course_%s_%s_%s' % (self.context.__name__,
392 term.__name__, index)
393 if sheet.__name__ == deployedKey:
394 for section in ISectionContainer(term).values():
395 if self.context not in section.courses:
396 continue
397 activities = IActivities(section)
398 activities[deployedKey].hidden = sheet.hidden
399 return
400
401 def nextURL(self):
402 url = absoluteURL(self.context, self.request)
403 return url + '/deployed_worksheets.html'
404
405
406class FlourishDeployAsCourseWorksheetView(FlourishCourseWorksheetsBase,
407 flourish.page.Page):
408 """A flourish view for deploying current gradebook worksheet as a
409 course worksheet. If form data is valid, it creates a course
410 worksheet template as a copy of the context and then deploys that
411 to the course for the given term.."""
412
413 @property
414 def course(self):
415 courses = list(ISection(self.context).courses)
416 if not courses:
417 return None
418 return courses[0]
419
420 @property
421 def has_error(self):
422 return self.no_title
423
424 @property
425 def no_title(self):
426 return 'SUBMIT' in self.request and not self.alternate_title
427
428 @property
429 def alternate_title(self):
430 if 'alternate_title' in self.request:
431 return self.request['alternate_title']
432 return self.context.title
433
434 def update(self):
435 if 'CANCEL' in self.request:
436 self.request.response.redirect(self.nextURL())
437 if 'SUBMIT' in self.request:
438 if not self.has_error:
439 template = Worksheet(self.alternate_title)
440 chooser = INameChooser(self.activities)
441 name = chooser.chooseName(template.title, template)
442 self.activities[name] = template
443 copyActivities(removeSecurityProxy(self.context), template)
444 term = self.request.get('term')
445 if term:
446 term = self.schoolyear[term]
447 self.deploy(term, template)
448 self.request.response.redirect(self.nextURL())
449
450 def nextURL(self):
451 return absoluteURL(self.context, self.request) + '/gradebook'
452
0453
=== modified file 'src/schooltool/gradebook/browser/flourish.zcml'
--- src/schooltool/gradebook/browser/flourish.zcml 2011-11-07 06:19:05 +0000
+++ src/schooltool/gradebook/browser/flourish.zcml 2011-12-22 16:21:13 +0000
@@ -140,6 +140,17 @@
140 />140 />
141141
142 <flourish:viewlet142 <flourish:viewlet
143 name="gradebook_actions"
144 after="gradebook_settings"
145 manager="schooltool.skin.flourish.page.IPageRefineManager"
146 class=".gradebook.FlourishGradebookActionsLinks"
147 for="..interfaces.IGradebook"
148 title="Actions"
149 permission="schooltool.edit"
150 view=".gradebook.FlourishGradebookOverview"
151 />
152
153 <flourish:viewlet
143 name="select_year"154 name="select_year"
144 class=".gradebook.FlourishGradebookYearNavigationViewlet"155 class=".gradebook.FlourishGradebookYearNavigationViewlet"
145 manager=".gradebook.FlourishGradebookYearNavigation"156 manager=".gradebook.FlourishGradebookYearNavigation"
@@ -372,8 +383,17 @@
372383
373 <!-- Report Sheets -->384 <!-- Report Sheets -->
374 <flourish:viewlet385 <flourish:viewlet
386 name="manage-report-sheet-templates-overview"
387 after="manage-resources-overview"
388 view="schooltool.app.browser.app.ManageSchool"
389 permission="schooltool.edit"
390 manager="schooltool.skin.flourish.page.IPageContentManager"
391 class=".report_card.FlourishManageReportSheetTemplatesOverview"
392 />
393
394 <flourish:viewlet
375 name="manage-report-sheets-overview"395 name="manage-report-sheets-overview"
376 after="manage-resources-overview"396 after="manage-report-sheet-templates-overview"
377 view="schooltool.app.browser.app.ManageSchool"397 view="schooltool.app.browser.app.ManageSchool"
378 permission="schooltool.edit"398 permission="schooltool.edit"
379 manager="schooltool.skin.flourish.page.IPageContentManager"399 manager="schooltool.skin.flourish.page.IPageContentManager"
@@ -518,15 +538,6 @@
518 />538 />
519 </configure>539 </configure>
520540
521 <flourish:viewlet
522 name="gradebook/templates"
523 before="report_card_layout"
524 title="Report Sheet Templates"
525 class="schooltool.skin.flourish.page.LinkViewlet"
526 manager="schooltool.app.browser.app.CustomizeSchoolLinks"
527 permission="schooltool.edit"
528 />
529
530 <flourish:page541 <flourish:page
531 name="report_sheets"542 name="report_sheets"
532 for="schooltool.app.interfaces.ISchoolToolApplication"543 for="schooltool.app.interfaces.ISchoolToolApplication"
@@ -958,4 +969,163 @@
958 />969 />
959 </configure>970 </configure>
960971
972 <!-- Course Worksheets -->
973 <flourish:viewlet
974 name="manage-course-worksheet-templates"
975 before="manage-course-worksheets"
976 view="schooltool.course.browser.course.FlourishCourseView"
977 permission="schooltool.edit"
978 manager="schooltool.skin.flourish.page.IPageContentManager"
979 class=".course_worksheets.FlourishManageCourseWorksheetTemplatesOverview"
980 />
981
982 <flourish:viewlet
983 name="manage-course-worksheets"
984 view="schooltool.course.browser.course.FlourishCourseView"
985 permission="schooltool.edit"
986 manager="schooltool.skin.flourish.page.IPageContentManager"
987 class=".course_worksheets.FlourishManageCourseSheetsOverview"
988 />
989
990 <flourish:page
991 name="index.html"
992 for="schooltool.gradebook.interfaces.ICourseActivities"
993 class=".course_worksheets.FlourishCourseTemplatesView"
994 content_template="templates/f_course_worksheet_templates.pt"
995 permission="schooltool.edit"
996 subtitle="Worksheet Templates"
997 />
998
999 <flourish:viewlet
1000 name="course-worksheets"
1001 manager="schooltool.skin.flourish.page.IPageRefineManager"
1002 class=".course_worksheets.FlourishCourseWorksheetsLinks"
1003 for="schooltool.gradebook.interfaces.ICourseActivities"
1004 title="Add"
1005 permission="schooltool.edit"
1006 view=".course_worksheets.FlourishCourseTemplatesView"
1007 />
1008
1009 <flourish:viewlet
1010 name="addCourseWorksheet.html"
1011 title="Course Worksheet"
1012 class="schooltool.skin.flourish.page.LinkViewlet"
1013 manager=".course_worksheets.FlourishCourseWorksheetsLinks"
1014 permission="schooltool.edit"
1015 />
1016
1017 <configure package="schooltool.skin.flourish">
1018 <flourish:page
1019 name="addCourseWorksheet.html"
1020 for="schooltool.gradebook.interfaces.ICourseActivities"
1021 subtitle="New Course Worksheet"
1022 class="schooltool.gradebook.browser.course_worksheets.FlourishCourseWorksheetAddView"
1023 content_template="templates/z3c-schooltool-form.pt"
1024 permission="schooltool.edit"
1025 />
1026
1027 <flourish:page
1028 name="addCourseActivity.html"
1029 for="schooltool.gradebook.interfaces.ICourseWorksheet"
1030 subtitle="New Course Activity"
1031 class="schooltool.gradebook.browser.course_worksheets.FlourishCourseActivityAddView"
1032 content_template="templates/z3c-schooltool-form.pt"
1033 permission="schooltool.edit"
1034 />
1035 </configure>
1036
1037 <flourish:page
1038 name="index.html"
1039 for="schooltool.gradebook.interfaces.ICourseWorksheet"
1040 subtitle="Edit"
1041 class=".course_worksheets.FlourishCourseWorksheetEditView"
1042 content_template="templates/f_course_worksheet_edit.pt"
1043 permission="schooltool.edit"
1044 />
1045
1046 <flourish:viewlet
1047 name="course-worksheet-add-links"
1048 manager="schooltool.skin.flourish.page.IPageRefineManager"
1049 class=".course_worksheets.CourseWorksheetAddLinks"
1050 view=".course_worksheets.FlourishCourseWorksheetEditView"
1051 title="Add"
1052 permission="schooltool.edit"
1053 />
1054
1055 <flourish:viewlet
1056 name="addCourseActivity.html"
1057 title="Course Activity"
1058 class="schooltool.skin.flourish.page.LinkViewlet"
1059 manager=".course_worksheets.CourseWorksheetAddLinks"
1060 permission="schooltool.edit"
1061 />
1062
1063 <flourish:viewletManager
1064 name="tertiary_navigation"
1065 provides="schooltool.skin.flourish.page.ITertiaryNavigationManager"
1066 class=".course_worksheets.CourseActivityAddTertiaryNavigationManager"
1067 view=".course_worksheets.FlourishCourseActivityAddView"
1068 permission="zope.Public"
1069 />
1070
1071 <flourish:page
1072 name="editCourseActivity.html"
1073 for="..interfaces.IActivity"
1074 subtitle="Edit"
1075 content_template="templates/f_add_edit_activity.pt"
1076 class=".course_worksheets.FlourishCourseActivityEditView"
1077 permission="schooltool.edit"
1078 />
1079
1080 <flourish:page
1081 name="deployed_worksheets.html"
1082 for="schooltool.course.interfaces.ICourse"
1083 class=".course_worksheets.FlourishCourseWorksheetsView"
1084 content_template="templates/f_course_worksheets.pt"
1085 permission="schooltool.edit"
1086 />
1087
1088 <flourish:viewlet
1089 name="course-worksheets-action-links"
1090 manager="schooltool.skin.flourish.page.IPageRefineManager"
1091 class=".course_worksheets.CourseWorksheetsActionLinks"
1092 view=".course_worksheets.FlourishCourseWorksheetsView"
1093 title="Action"
1094 permission="schooltool.edit"
1095 />
1096
1097 <flourish:viewlet
1098 name="hide_unhide_worksheets.html"
1099 title="Hide/unhide Worksheets"
1100 class="schooltool.skin.flourish.page.LinkViewlet"
1101 manager=".course_worksheets.CourseWorksheetsActionLinks"
1102 permission="schooltool.edit"
1103 />
1104
1105 <flourish:page
1106 name="hide_unhide_worksheets.html"
1107 for="schooltool.course.interfaces.ICourse"
1108 class=".course_worksheets.FlourishHideUnhideCourseWorkheetsView"
1109 content_template="templates/f_hide_unhide_course_worksheets.pt"
1110 permission="schooltool.edit"
1111 />
1112
1113 <flourish:viewlet
1114 name="../deploy_as_course_worksheet.html"
1115 title="Deploy as Course Worksheet"
1116 class="schooltool.skin.flourish.page.LinkViewlet"
1117 manager=".gradebook.FlourishGradebookActionsLinks"
1118 permission="schooltool.edit"
1119 />
1120
1121 <flourish:page
1122 name="deploy_as_course_worksheet.html"
1123 for="..interfaces.IWorksheet"
1124 subtitle="Deploy as Course Worksheet"
1125 class=".course_worksheets.FlourishDeployAsCourseWorksheetView"
1126 content_template="templates/f_deploy_as_course_worksheet.pt"
1127 permission="schooltool.edit"
1128 />
1129
961</configure>1130</configure>
1131
9621132
=== modified file 'src/schooltool/gradebook/browser/gradebook.py'
--- src/schooltool/gradebook/browser/gradebook.py 2011-12-20 19:41:39 +0000
+++ src/schooltool/gradebook/browser/gradebook.py 2011-12-22 16:21:13 +0000
@@ -415,7 +415,7 @@
415 self.due_date_hide = prefs.get('hide', False)415 self.due_date_hide = prefs.get('hide', False)
416416
417 self.apply_all_colspan = 1417 self.apply_all_colspan = 1
418 if gradebook.context.deployed:418 if not gradebook.context.canAverage():
419 self.total_hide = True419 self.total_hide = True
420 self.average_hide = True420 self.average_hide = True
421 if not self.absences_hide:421 if not self.absences_hide:
@@ -1057,6 +1057,10 @@
1057 """flourish Gradebook Settings links viewlet."""1057 """flourish Gradebook Settings links viewlet."""
10581058
10591059
1060class FlourishGradebookActionsLinks(flourish.page.RefineLinksViewlet):
1061 """flourish Gradebook Actions links viewlet."""
1062
1063
1060class GradebookTertiaryNavigationManager(flourish.page.TertiaryNavigationManager):1064class GradebookTertiaryNavigationManager(flourish.page.TertiaryNavigationManager):
10611065
1062 template = InlineViewPageTemplate("""1066 template = InlineViewPageTemplate("""
@@ -1075,8 +1079,11 @@
1075 current = gradebook.context.__name__1079 current = gradebook.context.__name__
1076 for worksheet in gradebook.worksheets:1080 for worksheet in gradebook.worksheets:
1077 url = '%s/gradebook' % absoluteURL(worksheet, self.request)1081 url = '%s/gradebook' % absoluteURL(worksheet, self.request)
1082 classes = worksheet.__name__ == current and ['active'] or []
1083 if worksheet.deployed:
1084 classes.append('deployed')
1078 result.append({1085 result.append({
1079 'class': worksheet.__name__ == current and 'active' or None,1086 'class': classes and ' '.join(classes) or None,
1080 'viewlet': u'<a href="%s">%s</a>' % (url, worksheet.title[:15]),1087 'viewlet': u'<a href="%s">%s</a>' % (url, worksheet.title[:15]),
1081 })1088 })
1082 return result1089 return result
@@ -1902,3 +1909,4 @@
1902 return None1909 return None
1903 can_view = flourish.canView(self.gradebook)1910 can_view = flourish.canView(self.gradebook)
1904 return can_view1911 return can_view
1912
19051913
=== modified file 'src/schooltool/gradebook/browser/report_card.py'
--- src/schooltool/gradebook/browser/report_card.py 2011-11-12 04:02:28 +0000
+++ src/schooltool/gradebook/browser/report_card.py 2011-12-22 16:21:13 +0000
@@ -221,6 +221,14 @@
221 return []221 return []
222222
223223
224class FlourishManageReportSheetTemplatesOverview(FlourishReportSheetsBase,
225 flourish.page.Content):
226 """A flourish viewlet for showing report sheet templates in school view"""
227
228 body_template = ViewPageTemplateFile(
229 'templates/f_manage_report_sheet_templates_overview.pt')
230
231
224class FlourishManageReportSheetsOverview(FlourishReportSheetsBase,232class FlourishManageReportSheetsOverview(FlourishReportSheetsBase,
225 flourish.page.Content):233 flourish.page.Content):
226 """A flourish viewlet for showing deployed report sheets in school view"""234 """A flourish viewlet for showing deployed report sheets in school view"""
@@ -500,6 +508,12 @@
500 def title(self):508 def title(self):
501 return self.context.title509 return self.context.title
502510
511 def display_scoresystem(self, activity):
512 ss = activity.scoresystem
513 if IRangedValuesScoreSystem.providedBy(ss):
514 return '%s - %s' % (ss.min, ss.max)
515 return ss.title
516
503 def update(self):517 def update(self):
504 if 'form-submitted' in self.request:518 if 'form-submitted' in self.request:
505 for activity in self.context.values():519 for activity in self.context.values():
506520
=== modified file 'src/schooltool/gradebook/browser/resources/f_gradebook.css'
--- src/schooltool/gradebook/browser/resources/f_gradebook.css 2011-08-31 20:16:11 +0000
+++ src/schooltool/gradebook/browser/resources/f_gradebook.css 2011-12-22 16:21:13 +0000
@@ -33,3 +33,8 @@
33 height: 18px;33 height: 18px;
34 width: 104px;34 width: 104px;
35}35}
36
37li.deployed a {
38 font-style: italic;
39}
40
3641
=== added file 'src/schooltool/gradebook/browser/templates/f_course_worksheet_edit.pt'
--- src/schooltool/gradebook/browser/templates/f_course_worksheet_edit.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_course_worksheet_edit.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,45 @@
1<div i18n:domain="schooltool.gradebook">
2 <div metal:use-macro="macro:form">
3 <metal:block fill-slot="bottom">
4 <input type="hidden" name="form-submitted" value="" />
5 <h2 i18n:translate="">Course Activities</h2>
6 <table>
7 <thead>
8 <tr>
9 <th i18n:translate="">Title</th>
10 <th i18n:translate="">Score System</th>
11 <th i18n:translate="">Delete?</th>
12 </tr>
13 </thead>
14 <tal:block repeat="activity context/values">
15 <tr>
16 <td>
17 <span tal:content="activity/title" />
18 <a class="modify" href="" title="Edit"
19 tal:attributes="href string:${activity/@@absolute_url}/editCourseActivity.html"
20 i18n:attributes="title">
21 <img tal:attributes="src context/++resource++schooltool.skin.flourish/edit-icon.png"
22 alt="Edit"
23 i18n:attributes="alt" />
24 </a>
25 </td>
26 <td tal:content="string: ${activity/scoresystem/min} - ${activity/scoresystem/max}"/>
27 <td>
28 <button class="image" type="submit" title="Delete" value="1"
29 tal:attributes="name string:delete.${activity/__name__};"
30 i18n:attributes="title">
31 <img alt="Delete" i18n:attributes="alt"
32 tal:attributes="src context/++resource++schooltool.skin.flourish/remove-icon.png" />
33 </button>
34 </td>
35 </tr>
36 </tal:block>
37 </table>
38 <h3>
39 <a tal:attributes="href view/nextURL"
40 i18n:translate="">Done</a>
41 </h3>
42 </metal:block>
43 </div>
44</div>
45
046
=== added file 'src/schooltool/gradebook/browser/templates/f_course_worksheet_templates.pt'
--- src/schooltool/gradebook/browser/templates/f_course_worksheet_templates.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_course_worksheet_templates.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,26 @@
1<div tal:define="worksheets view/worksheets" i18n:domain="schooltool.gradebook">
2 <form method="post"
3 tal:attributes="action string:${context/@@absolute_url}/worksheet_templates.html">
4 <input type="hidden" name="form-submitted" value="" />
5 <table>
6 <thead>
7 <tr>
8 <th i18n:translate="">Title</th>
9 </tr>
10 </thead>
11 <tr tal:repeat="worksheet worksheets">
12 <td>
13 <tal:block replace="structure worksheet/@@link" />
14 </td>
15 </tr>
16 <tr tal:condition="python: len(worksheets) == 0">
17 <td i18n:translate="">This year has no course worksheets set up.</td>
18 </tr>
19 </table>
20 </form>
21 <h3>
22 <a tal:attributes="href string:${context/__parent__/@@absolute_url}"
23 i18n:translate="">Done</a>
24 </h3>
25</div>
26
027
=== added file 'src/schooltool/gradebook/browser/templates/f_course_worksheets.pt'
--- src/schooltool/gradebook/browser/templates/f_course_worksheets.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_course_worksheets.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,111 @@
1<div i18n:domain="schooltool.gradebook"
2 tal:define="sheets view/sheets; terms view/terms; schoolyear view/schoolyear">
3 <script type="text/javascript">
4 $(document).ready(function() {
5 $('#template').change(function(e) {
6 index = e.target.selectedIndex
7 $('#alternate_title').val(e.target.options[index].text);
8 });
9 });
10 </script>
11 <h3 i18n:translate="">Currently Deployed Worksheets</h3>
12 <table>
13 <thead>
14 <tr>
15 <th i18n:translate="">Workheet</th>
16 <tal:block repeat="term schoolyear/values">
17 <th tal:content="term/title" />
18 </tal:block>
19 </tr>
20 </thead>
21 <tr tal:repeat="sheet sheets">
22 <td tal:content="sheet/obj/title" />
23 <tal:block repeat="term sheet/terms">
24 <td>
25 <span tal:condition="term" class="ui-icon ui-icon-check ui-icon-center"></span>
26 </td>
27 </tal:block>
28 </tr>
29 <tr tal:condition="not: sheets">
30 <td tal:attributes="colspan python:len(schoolyear)+1" i18n:translate="">
31 This year has no worksheets deployed.
32 </td>
33 </tr>
34 </table>
35 <form method="post" class="standalone"
36 tal:attributes="action request/getURL">
37 <div class="viewspace">
38 <div class="status" tal:condition="view/has_error">
39 <div class="summary ui-state-error ui-corner-all">
40 <span class="ui-icon ui-icon-alert">icon</span>
41 <span i18n:domain="schooltool" i18n:translate="">Please correct the marked fields below.</span>
42 </div>
43 </div>
44 <fieldset>
45 <legend>
46 <span i18n:translate="">Select worksheet to deploy</span>
47 </legend>
48 <div class="row">
49 <div class="label">
50 <label for="term">
51 <span i18n:translate="">Term or Year</span>
52 </label>
53 </div>
54 <p class="hint" i18n:translate="">
55 Select a term or deploy to the entire year.
56 </p>
57 <div class="widget">
58 <select id="term" name="term">
59 <tal:block repeat="term terms">
60 <option tal:attributes="value term/name; selected term/selected"
61 tal:content="term/title" />
62 </tal:block>
63 </select>
64 </div>
65 </div>
66 <div class="row">
67 <div class="label">
68 <label for="template">
69 <span i18n:translate="">Worksheet Template</span>
70 </label>
71 </div>
72 <div class="error" tal:condition="view/no_template">
73 <div class="error" i18n:translate="">Required input is missing.</div>
74 </div>
75 <div class="widget">
76 <select id="template" name="template">
77 <tal:block repeat="template view/templates">
78 <option tal:attributes="value template/name; selected template/selected"
79 tal:content="template/title" />
80 </tal:block>
81 </select>
82 </div>
83 </div>
84 <div class="row">
85 <div class="label">
86 <label for="term">
87 <span i18n:translate="">Title</span>
88 </label>
89 </div>
90 <p class="hint" i18n:translate="">
91 If you deploy the same template multiple times, give each deployment
92 an easily distinguishable name.
93 </p>
94 <div class="error" tal:condition="view/no_title">
95 <div class="error" i18n:translate="">Required input is missing.</div>
96 </div>
97 <div class="widget">
98 <input type="text" name="alternate_title" id="alternate_title"
99 tal:attributes="value view/alternate_title" />
100 </div>
101 </div>
102 </fieldset>
103 </div>
104 <div class="buttons controls">
105 <input type="submit" class="button-ok" name="SUBMIT" value="Submit"
106 i18n:attributes="value" />
107 <tal:block metal:use-macro="view/@@standard_macros/cancel-button" />
108 </div>
109 </form>
110</div>
111
0112
=== added file 'src/schooltool/gradebook/browser/templates/f_deploy_as_course_worksheet.pt'
--- src/schooltool/gradebook/browser/templates/f_deploy_as_course_worksheet.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_deploy_as_course_worksheet.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,61 @@
1<div i18n:domain="schooltool.gradebook"
2 tal:define="terms view/terms">
3 <form method="post" class="standalone"
4 tal:attributes="action request/getURL">
5 <div class="viewspace">
6 <div class="status" tal:condition="view/has_error">
7 <div class="summary ui-state-error ui-corner-all">
8 <span class="ui-icon ui-icon-alert">icon</span>
9 <span i18n:domain="schooltool" i18n:translate="">Please correct the marked fields below.</span>
10 </div>
11 </div>
12 <fieldset>
13 <legend>
14 <span i18n:translate="">Select term or year to deploy</span>
15 </legend>
16 <div class="row">
17 <div class="label">
18 <label for="term">
19 <span i18n:translate="">Term or Year</span>
20 </label>
21 </div>
22 <p class="hint" i18n:translate="">
23 Select a term or deploy to the entire year.
24 </p>
25 <div class="widget">
26 <select id="term" name="term">
27 <tal:block repeat="term terms">
28 <option tal:attributes="value term/name; selected term/selected"
29 tal:content="term/title" />
30 </tal:block>
31 </select>
32 </div>
33 </div>
34 <div class="row">
35 <div class="label">
36 <label for="term">
37 <span i18n:translate="">Title</span>
38 </label>
39 </div>
40 <p class="hint" i18n:translate="">
41 If you deploy the same template multiple times, give each deployment
42 an easily distinguishable name.
43 </p>
44 <div class="error" tal:condition="view/no_title">
45 <div class="error" i18n:translate="">Required input is missing.</div>
46 </div>
47 <div class="widget">
48 <input type="text" name="alternate_title" id="alternate_title"
49 tal:attributes="value view/alternate_title" />
50 </div>
51 </div>
52 </fieldset>
53 </div>
54 <div class="buttons controls">
55 <input type="submit" class="button-ok" name="SUBMIT" value="Submit"
56 i18n:attributes="value" />
57 <tal:block metal:use-macro="view/@@standard_macros/cancel-button" />
58 </div>
59 </form>
60</div>
61
062
=== added file 'src/schooltool/gradebook/browser/templates/f_hide_unhide_course_worksheets.pt'
--- src/schooltool/gradebook/browser/templates/f_hide_unhide_course_worksheets.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_hide_unhide_course_worksheets.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,44 @@
1<div i18n:domain="schooltool.gradebook"
2 tal:define="sheets view/all_sheets; schoolyear view/schoolyear">
3 <h3 i18n:translate="">Currently Deployed WorkSheets</h3>
4 <form method="post" class="standalone"
5 tal:attributes="action request/getURL">
6 <table>
7 <thead>
8 <tr>
9 <th i18n:translate="">Deployed Worksheet</th>
10 <th i18n:translate="">Index</th>
11 <tal:block repeat="term schoolyear/values">
12 <th tal:content="term/title" />
13 </tal:block>
14 <th i18n:translate="">Hidden?</th>
15 </tr>
16 </thead>
17 <tr tal:repeat="sheet sheets">
18 <td tal:content="sheet/obj/title" />
19 <td tal:content="sheet/index" />
20 <tal:block repeat="term sheet/terms">
21 <td>
22 <span tal:condition="term" class="ui-icon ui-icon-check ui-icon-center"></span>
23 </td>
24 </tal:block>
25 <td>
26 <input type="checkbox" name="hidden:list"
27 tal:attributes="value sheet/index;
28 checked sheet/checked" />
29 </td>
30 </tr>
31 <tr tal:condition="not: sheets">
32 <td tal:attributes="colspan python:len(schoolyear)+3" i18n:translate="">
33 This year has no worksheets deployed.
34 </td>
35 </tr>
36 </table>
37 <div class="buttons controls">
38 <input type="submit" class="button-ok" name="SUBMIT" value="Submit"
39 i18n:attributes="value" />
40 <tal:block metal:use-macro="view/@@standard_macros/cancel-button" />
41 </div>
42 </form>
43</div>
44
045
=== added file 'src/schooltool/gradebook/browser/templates/f_manage_course_worksheet_templates.pt'
--- src/schooltool/gradebook/browser/templates/f_manage_course_worksheet_templates.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_manage_course_worksheet_templates.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,10 @@
1<div class="manage-view" i18n:domain="schooltool">
2 <h3>
3 <a title="Manage Worksheet Templates"
4 tal:attributes="href string:${context/@@absolute_url}/activities"
5 i18n:attributes="title"
6 i18n:translate="">
7 Worksheet Templates
8 </a>
9 </h3>
10</div>
011
=== added file 'src/schooltool/gradebook/browser/templates/f_manage_course_worksheets.pt'
--- src/schooltool/gradebook/browser/templates/f_manage_course_worksheets.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_manage_course_worksheets.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,21 @@
1<div class="manage-view" i18n:domain="schooltool"
2 tal:define="sheets view/sheets">
3 <h3>
4 <a title="Manage Deployed Worksheets"
5 tal:attributes="href string:${context/@@absolute_url}/deployed_worksheets.html"
6 i18n:attributes="title"
7 i18n:translate="">
8 Deployed Worksheets
9 </a>
10 </h3>
11 <p i18n:translate="" tal:condition="sheets">
12 There are
13 <metal:block tal:replace="python:len(sheets)" i18n:name="count"/>
14 worksheets deployed in
15 <metal:block tal:replace="view/schoolyear/title" i18n:name="schoolyear"/>
16 </p>
17 <p i18n:translate="" tal:condition="not: sheets">
18 There are no worksheets deployed in
19 <metal:block tal:replace="view/schoolyear/title" i18n:name="schoolyear"/>
20 </p>
21</div>
022
=== added file 'src/schooltool/gradebook/browser/templates/f_manage_report_sheet_templates_overview.pt'
--- src/schooltool/gradebook/browser/templates/f_manage_report_sheet_templates_overview.pt 1970-01-01 00:00:00 +0000
+++ src/schooltool/gradebook/browser/templates/f_manage_report_sheet_templates_overview.pt 2011-12-22 16:21:13 +0000
@@ -0,0 +1,12 @@
1<div class="manage-view" i18n:domain="schooltool"
2 tal:condition="view/has_schoolyear"
3 tal:define="sheets view/sheets">
4 <h3>
5 <a title="Manage Report Sheet Templates"
6 tal:attributes="href string:${context/@@absolute_url}/gradebook/templates"
7 i18n:attributes="title"
8 i18n:translate="">
9 Report Sheet Templates
10 </a>
11 </h3>
12</div>
013
=== modified file 'src/schooltool/gradebook/browser/templates/f_manage_report_sheets_overview.pt'
--- src/schooltool/gradebook/browser/templates/f_manage_report_sheets_overview.pt 2011-08-29 01:25:08 +0000
+++ src/schooltool/gradebook/browser/templates/f_manage_report_sheets_overview.pt 2011-12-22 16:21:13 +0000
@@ -2,11 +2,11 @@
2 tal:condition="view/has_schoolyear"2 tal:condition="view/has_schoolyear"
3 tal:define="sheets view/sheets">3 tal:define="sheets view/sheets">
4 <h3>4 <h3>
5 <a title="Manage Report Sheets"5 <a title="Manage Deployed Report Sheets"
6 tal:attributes="href string:${context/@@absolute_url}/report_sheets"6 tal:attributes="href string:${context/@@absolute_url}/report_sheets"
7 i18n:attributes="title"7 i18n:attributes="title"
8 i18n:translate="">8 i18n:translate="">
9 Report Sheets9 Deployed Report Sheets
10 </a>10 </a>
11 </h3>11 </h3>
12 <p i18n:translate="" tal:condition="sheets">12 <p i18n:translate="" tal:condition="sheets">
1313
=== modified file 'src/schooltool/gradebook/browser/templates/f_template_manage.pt'
--- src/schooltool/gradebook/browser/templates/f_template_manage.pt 2011-10-01 07:08:33 +0000
+++ src/schooltool/gradebook/browser/templates/f_template_manage.pt 2011-12-22 16:21:13 +0000
@@ -23,7 +23,7 @@
23 i18n:attributes="alt" />23 i18n:attributes="alt" />
24 </a>24 </a>
25 </td>25 </td>
26 <td tal:content="activity/scoresystem/title "/>26 <td tal:content="python: view.display_scoresystem(activity)" />
27 <td>27 <td>
28 <button class="image" type="submit" title="Delete" value="1"28 <button class="image" type="submit" title="Delete" value="1"
29 tal:attributes="name string:delete.${activity/__name__};"29 tal:attributes="name string:delete.${activity/__name__};"
3030
=== modified file 'src/schooltool/gradebook/browser/templates/f_templates_overview.pt'
--- src/schooltool/gradebook/browser/templates/f_templates_overview.pt 2011-09-26 18:30:13 +0000
+++ src/schooltool/gradebook/browser/templates/f_templates_overview.pt 2011-12-22 16:21:13 +0000
@@ -15,5 +15,9 @@
15 </tr>15 </tr>
16 </table>16 </table>
17 </form>17 </form>
18 <h3>
19 <a tal:attributes="href string:${context/schooltool:app/@@absolute_url}/manage"
20 i18n:translate="">Done</a>
21 </h3>
18</div>22</div>
1923
2024
=== modified file 'src/schooltool/gradebook/configure.zcml'
--- src/schooltool/gradebook/configure.zcml 2011-11-22 17:30:59 +0000
+++ src/schooltool/gradebook/configure.zcml 2011-12-22 16:21:13 +0000
@@ -57,6 +57,18 @@
57 factory=".activity.getSectionActivities"57 factory=".activity.getSectionActivities"
58 trusted="true"58 trusted="true"
59 />59 />
60 <adapter
61 for="schooltool.course.interfaces.ICourse"
62 provides=".interfaces.ICourseActivities"
63 factory=".activity.getCourseActivities"
64 trusted="true"
65 />
66 <adapter
67 for="schooltool.course.interfaces.ICourse"
68 provides=".interfaces.ICourseDeployedWorksheets"
69 factory=".activity.getCourseDeployedWorksheets"
70 trusted="true"
71 />
6072
61 <!-- Activity Content and Security -->73 <!-- Activity Content and Security -->
62 <class class=".gradebook_init.GradebookRoot">74 <class class=".gradebook_init.GradebookRoot">
@@ -109,6 +121,26 @@
109 set_schema=".interfaces.IActivities"121 set_schema=".interfaces.IActivities"
110 />122 />
111 </class>123 </class>
124 <class class=".activity.CourseActivities">
125 <require
126 permission="schooltool.view"
127 interface=".interfaces.ICourseActivities"
128 />
129 <require
130 permission="schooltool.edit"
131 set_schema=".interfaces.ICourseActivities"
132 />
133 </class>
134 <class class=".activity.CourseDeployedWorksheets">
135 <require
136 permission="schooltool.view"
137 interface=".interfaces.ICourseDeployedWorksheets"
138 />
139 <require
140 permission="schooltool.edit"
141 set_schema=".interfaces.ICourseDeployedWorksheets"
142 />
143 </class>
112 <class class=".activity.Worksheet">144 <class class=".activity.Worksheet">
113 <allow interface="zope.interface.common.mapping.IReadMapping" />145 <allow interface="zope.interface.common.mapping.IReadMapping" />
114 <require146 <require
@@ -136,6 +168,19 @@
136 attributes="changePosition"168 attributes="changePosition"
137 />169 />
138 </class>170 </class>
171 <class class=".activity.CourseWorksheet">
172 <allow interface="zope.interface.common.mapping.IReadMapping" />
173 <require
174 permission="schooltool.view"
175 attributes="keys __iter__ values items __len__ title deployed"
176 />
177 <require
178 permission="schooltool.edit"
179 interface="zope.interface.common.mapping.IWriteMapping"
180 set_schema=".interfaces.ICourseWorksheet"
181 attributes="changePosition"
182 />
183 </class>
139 <class class=".activity.Activity">184 <class class=".activity.Activity">
140 <allow interface="zope.interface.common.mapping.IReadMapping" />185 <allow interface="zope.interface.common.mapping.IReadMapping" />
141 <require186 <require
@@ -304,6 +349,12 @@
304 name="activities"349 name="activities"
305 adapter="schooltool.gradebook.interfaces.IActivities"350 adapter="schooltool.gradebook.interfaces.IActivities"
306 />351 />
352 <adapterTraverserPlugin
353 for="schooltool.course.interfaces.ICourse"
354 layer="zope.publisher.interfaces.http.IHTTPRequest"
355 name="activities"
356 adapter="schooltool.gradebook.interfaces.ICourseActivities"
357 />
307358
308 <!-- special traversal adapter for traversing from worksheet to gradebook -->359 <!-- special traversal adapter for traversing from worksheet to gradebook -->
309 <adapter360 <adapter
310361
=== modified file 'src/schooltool/gradebook/interfaces.py'
--- src/schooltool/gradebook/interfaces.py 2011-08-30 16:15:01 +0000
+++ src/schooltool/gradebook/interfaces.py 2011-12-22 16:21:13 +0000
@@ -89,6 +89,18 @@
89 contains('.IWorksheet')89 contains('.IWorksheet')
9090
9191
92class ICourseActivities(interfaces.IRequirement):
93 """Container of Course Worksheet Templates that can be deployed"""
94
95 contains('.ICourseWorksheet')
96
97
98class ICourseDeployedWorksheets(interfaces.IRequirement):
99 """Container of Deployed Course Worksheets (by term)"""
100
101 contains('.IWorksheet')
102
103
92class IWorksheet(interfaces.IRequirement):104class IWorksheet(interfaces.IRequirement):
93 '''A list of activities that must be fulfilled in a course or section.'''105 '''A list of activities that must be fulfilled in a course or section.'''
94106
@@ -111,12 +123,15 @@
111 """Set the weight for the given category. Any numeric type is123 """Set the weight for the given category. Any numeric type is
112 acceptable"""124 acceptable"""
113125
126 def canAverage():
127 """return True if activities have scoresystems that can be averaged"""
128
114 containers(IActivities)129 containers(IActivities)
115 contains('.IActivity')130 contains('.IActivity')
116131
117132
118class IReportWorksheet(interfaces.IRequirement):133class IReportWorksheet(interfaces.IRequirement):
119 '''A list of report card activities that get copied into sections.'''134 '''A worksheet template to get copied into section gradebooks.'''
120135
121 containers(IGradebookTemplates, IGradebookDeployed)136 containers(IGradebookTemplates, IGradebookDeployed)
122 contains('.IReportActivity')137 contains('.IReportActivity')
@@ -126,13 +141,23 @@
126 description=_(u'Identifies the report sheet in teacher gradebooks.'))141 description=_(u'Identifies the report sheet in teacher gradebooks.'))
127142
128143
144class ICourseWorksheet(interfaces.IRequirement):
145 '''A worksheet template to get copied into section gradebooks.'''
146
147 contains('.IActivity')
148
149 title = zope.schema.TextLine(
150 title=_(u'Title'),
151 description=_(u'Identifies the course worksheet in gradebooks.'))
152
153
129class IActivity(interfaces.IRequirement):154class IActivity(interfaces.IRequirement):
130 '''An activity to be graded'''155 '''An activity to be graded'''
131156
132 due_date = zope.schema.Date(157 due_date = zope.schema.Date(
133 title=_("Due Date"),158 title=_("Due Date"),
134 description=_("The date the activity is due to be graded."),159 description=_("The date the activity is due to be graded."),
135 required=True)160 required=False)
136161
137 label = zope.schema.TextLine(162 label = zope.schema.TextLine(
138 title=_(u"Label"),163 title=_(u"Label"),
@@ -164,7 +189,7 @@
164189
165190
166class IReportActivity(IActivity):191class IReportActivity(IActivity):
167 '''An activity to be deployed to section activities'''192 '''A report card activity to be deployed to section activities'''
168193
169 containers(IReportWorksheet)194 containers(IReportWorksheet)
170195
171196
=== modified file 'src/schooltool/gradebook/tests/test_gradebook.py'
--- src/schooltool/gradebook/tests/test_gradebook.py 2011-08-30 16:15:01 +0000
+++ src/schooltool/gradebook/tests/test_gradebook.py 2011-12-22 16:21:13 +0000
@@ -28,7 +28,7 @@
28from zope.component import provideAdapter, provideUtility28from zope.component import provideAdapter, provideUtility
29from zope.interface import classImplements29from zope.interface import classImplements
3030
31from schooltool.course.interfaces import ISection31from schooltool.course.interfaces import ICourse, ISection
32from schooltool.relationship.tests import setUpRelationships32from schooltool.relationship.tests import setUpRelationships
33from schooltool.person.person import Person33from schooltool.person.person import Person
34from schooltool.requirement import testing34from schooltool.requirement import testing
@@ -48,6 +48,12 @@
48 provideAdapter(48 provideAdapter(
49 activity.getSectionActivities,49 activity.getSectionActivities,
50 (ISection,), interfaces.IActivities)50 (ISection,), interfaces.IActivities)
51 provideAdapter(
52 activity.getCourseActivities,
53 (ICourse,), interfaces.ICourseActivities)
54 provideAdapter(
55 activity.getCourseDeployedWorksheets,
56 (ICourse,), interfaces.ICourseDeployedWorksheets)
5157
52 provideAdapter(gradebook.Gradebook)58 provideAdapter(gradebook.Gradebook)
5359

Subscribers

People subscribed via source and target branches

to all changes: