19
19
Views for school years and school year container implementation
22
from StringIO import StringIO
24
21
from zope.viewlet.viewlet import ViewletBase
25
22
from zope.publisher.interfaces.browser import IBrowserRequest
26
23
from zope.cachedescriptors.property import Lazy
27
24
from zope.component import adapts, getMultiAdapter
25
from zope.event import notify
28
26
from zope.security import checkPermission
29
27
from zope.schema import Date, TextLine
30
28
from zope.schema.interfaces import ValidationError
31
29
from zope.interface.exceptions import Invalid
32
30
from zope.interface import implements
33
31
from zope.interface import Interface
34
from zope.location.pickling import CopyPersistent
35
32
from zope.traversing.browser.absoluteurl import AbsoluteURL
36
33
from zope.traversing.browser.interfaces import IAbsoluteURL
37
34
from zope.traversing.browser import absoluteURL
38
35
from zope.container.interfaces import INameChooser
36
from zope.container.contained import containedEvent
39
37
from zope.browserpage.viewpagetemplatefile import ViewPageTemplateFile
40
38
from zope.proxy import sameProxiedObjects
41
39
from zope.i18n import translate
81
80
from schooltool.skin import flourish
82
81
from schooltool.table import table
83
82
from schooltool.timetable.interfaces import ITimetableContainer
83
from schooltool.timetable.timetable import Timetable
84
from schooltool.timetable.interfaces import IWeekDayTemplates
85
from schooltool.timetable.interfaces import ISchoolDayTemplates
86
from schooltool.timetable.daytemplates import WeekDayTemplates
87
from schooltool.timetable.daytemplates import SchoolDayTemplates
88
from schooltool.timetable.daytemplates import DayTemplate
89
from schooltool.timetable.daytemplates import TimeSlot
90
from schooltool.timetable.schedule import Period
86
92
class SchoolYearContainerAbsoluteURLAdapter(AbsoluteURL):
338
344
for level in course.levels:
339
345
new_course.levels.add(removeSecurityProxy(level))
341
def copyTimetable(self, timetable):
342
# XXX: copy-pasted old hack, would be nice
343
# to replace with something decent!
346
persistent = CopyPersistent(timetable)
348
# Pickle the object to a temporary file
349
pickler = cPickle.Pickler(tmp, 2)
350
pickler.persistent_id = persistent.id
351
pickler.dump(timetable)
355
unpickler = cPickle.Unpickler(tmp)
356
unpickler.persistent_load = persistent.load
357
new_tt = unpickler.load()
347
def setUpTimetable(self, timetable, old_timetable):
348
if IWeekDayTemplates.providedBy(old_timetable.time_slots):
349
timetable.time_slots, object_event = containedEvent(
350
WeekDayTemplates(), timetable, 'time_slots')
351
elif ISchoolDayTemplates.providedBy(old_timetable.time_slots):
352
timetable.time_slots, object_event = containedEvent(
353
SchoolDayTemplates(), timetable, 'time_slots')
355
timetable.time_slots.initTemplates()
356
old_templates = old_timetable.time_slots.templates
357
for old_template_key, old_template in old_templates.items():
358
template = DayTemplate(old_template.title)
359
timetable.time_slots.templates[old_template_key] = template
360
for old_timeslot_key, old_timeslot in old_template.items():
361
timeslot = TimeSlot(old_timeslot.tstart,
362
old_timeslot.duration,
363
old_timeslot.activity_type)
364
template[old_timeslot_key] = timeslot
365
if IWeekDayTemplates.providedBy(old_timetable.periods):
366
timetable.periods, object_event = containedEvent(
367
WeekDayTemplates(), timetable, 'periods')
368
elif ISchoolDayTemplates.providedBy(old_timetable.periods):
369
timetable.periods, object_event = containedEvent(
370
SchoolDayTemplates(), timetable, 'periods')
372
timetable.periods.initTemplates()
373
old_templates = old_timetable.periods.templates
374
for old_template_key, old_template in old_templates.items():
375
template = DayTemplate(old_template.title)
376
timetable.periods.templates[old_template_key] = template
377
for old_period_key, old_period in old_template.items():
378
period = Period(old_period.title, old_period.activity_type)
379
template[old_period_key] = period
360
381
def importAllTimetables(self):
361
382
if not self.shouldImportAllTimetables():
363
384
oldTimetables = ITimetableContainer(self.activeSchoolyear)
364
385
newTimetables = ITimetableContainer(self.newSchoolyear)
386
chooser = INameChooser(newTimetables)
387
app = ISchoolToolApplication(None)
388
tzname = IApplicationPreferences(app).timezone
365
389
for schooltt in oldTimetables.values():
366
newSchooltt = self.copyTimetable(schooltt)
367
newSchooltt.exceptions.clear()
368
newSchooltt.__parent__ = None
369
newTimetables[newSchooltt.__name__] = newSchooltt
390
newSchooltt = Timetable(
391
self.newSchoolyear.first, self.newSchoolyear.last,
392
title=schooltt.title,
394
name = chooser.chooseName(schooltt.__name__, newSchooltt)
395
newTimetables[name] = newSchooltt
396
self.setUpTimetable(newSchooltt, schooltt)
370
397
if (oldTimetables.default is not None and
371
398
sameProxiedObjects(oldTimetables.default, schooltt)):
372
399
newTimetables.default = newSchooltt