source: main/waeup.sirp/trunk/src/waeup/sirp/university/coursecontainer.py @ 6429

Last change on this file since 6429 was 6245, checked in by Henrik Bettermann, 13 years ago

Use and raise DuplicationError? for Courses too.

File size: 2.3 KB
RevLine 
[4255]1"""Course containers.
2"""
3import grok
4from zope.interface import implementedBy
[6216]5from zope.component.interfaces import IFactory, ComponentLookupError
6from zope.catalog.interfaces import ICatalog
[6245]7from zope.component import queryUtility
8from waeup.sirp.interfaces import DuplicationError
[5005]9from waeup.sirp.university.interfaces import ICourseContainer, ICourse
[4255]10
11class CourseContainer(grok.Container):
12    """See interfaces for description.
13    """
14    grok.implements(ICourseContainer)
15    grok.require('waeup.manageUniversity')
16
[6245]17    def __setitem__(self, name, course):
18        """See corresponding docstring in certificatecontainer.py.
[4738]19        """
[4255]20        if not ICourse.providedBy(course):
[6245]21            raise TypeError('CourseContainers contain only '
22                            'ICourse instances')
[4255]23
[6245]24        # Only accept courses with code == key.
25        if course.code != name:
26            raise ValueError('key must match course code: '
27                             '%s, %s' % (name, course.code))
28
29        # Lookup catalog. If we find none: no duplicates possible.
30        cat = queryUtility(ICatalog, name='courses_catalog', default=None)
31        if cat is not None:
32            entries = cat.searchResults(
33                code=(course.code,course.code))
34            if len(entries) > 0:
35                raise DuplicationError(
36                    'Course exists already elsewhere.', entries)
37        else:
38            # No catalog, then this addition won't do harm to anything.
39            pass
40        super(CourseContainer, self).__setitem__(name, course)
41
42    def addCourse(self, course):
43        """See corresponding docstring in certificatecontainer.py.
44        """
45        self[getattr(course, 'code', None)] = course
46
[4255]47    def clear(self):
[6245]48        """See corresponding docstring and comments in certificatecontainer.py.
[4738]49        """
[6245]50        self._SampleContainer__data.clear()
51        del self.__dict__['_BTreeContainer__len']
[4255]52
53class CourseContainerFactory(grok.GlobalUtility):
54    """A factory for course containers.
55    """
56    grok.implements(IFactory)
57    grok.name(u'waeup.CourseContainer')
58    title = u"Create a new course container.",
59    description = u"This factory instantiates new course containers."
60
[4363]61    def __call__(self, *args, **kw):
62        return CourseContainer(*args, **kw)
[4255]63
64    def getInterfaces(self):
65        return implementedBy(CourseContainer)
Note: See TracBrowser for help on using the repository browser.