~replaceafill/ubuntu/trusty/schooltool/2.8_custom-css

« back to all changes in this revision

Viewing changes to src/schooltool/schoolyear/browser/schoolyear.py

  • Committer: Gediminas Paulauskas
  • Date: 2014-05-08 15:13:41 UTC
  • mfrom: (1.1.34)
  • Revision ID: menesis@pov.lt-20140508151341-wcsbt3m1lxbrc90x
Tags: 1:2.8.0-0ubuntu1
* New upstream release.
* debian/patches/ckeditor4.patch: remove, fixed upstream.
* debian/copyright: add a section for included d3 javascript library.
* debian/missing-sources: add sources for included javascript libraries:
  - d3 2.9.7
  - jquery 1.7.1
  - jquery-scrollto 1.4.2
  - jquery-ui 1.8.18

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
"""
19
19
Views for school years and school year container implementation
20
20
"""
21
 
import cPickle
22
 
from StringIO import StringIO
23
 
 
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
59
57
import schooltool.skin.flourish.breadcrumbs
60
58
from schooltool.app.browser.app import ActiveSchoolYearContentMixin
61
59
from schooltool.app.interfaces import ISchoolToolApplication
 
60
from schooltool.app.interfaces import IApplicationPreferences
62
61
from schooltool.common import DateRange
63
62
from schooltool.common import SchoolToolMessage as _
64
63
from schooltool.common.inlinept import InheritTemplate
81
80
from schooltool.skin import flourish
82
81
from schooltool.table import table
83
82
from schooltool.timetable.interfaces import ITimetableContainer
84
 
 
 
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
85
91
 
86
92
class SchoolYearContainerAbsoluteURLAdapter(AbsoluteURL):
87
93
 
338
344
            for level in course.levels:
339
345
                new_course.levels.add(removeSecurityProxy(level))
340
346
 
341
 
    def copyTimetable(self, timetable):
342
 
        # XXX: copy-pasted old hack, would be nice
343
 
        #      to replace with something decent!
344
 
 
345
 
        tmp = StringIO()
346
 
        persistent = CopyPersistent(timetable)
347
 
 
348
 
        # Pickle the object to a temporary file
349
 
        pickler = cPickle.Pickler(tmp, 2)
350
 
        pickler.persistent_id = persistent.id
351
 
        pickler.dump(timetable)
352
 
 
353
 
        # Now load it back
354
 
        tmp.seek(0)
355
 
        unpickler = cPickle.Unpickler(tmp)
356
 
        unpickler.persistent_load = persistent.load
357
 
        new_tt = unpickler.load()
358
 
        return new_tt
 
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')
 
354
        notify(object_event)
 
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')
 
371
        notify(object_event)
 
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
359
380
 
360
381
    def importAllTimetables(self):
361
382
        if not self.shouldImportAllTimetables():
362
383
            return
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,
 
393
                timezone=tzname)
 
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