source: main/waeup.sirp/trunk/src/waeup/sirp/university/certificatecontainer.py @ 6224

Last change on this file since 6224 was 6224, checked in by uli, 13 years ago

Add docstring.

File size: 2.7 KB
Line 
1"""Containers for certificates.
2"""
3import grok
4from zope.catalog.interfaces import ICatalog
5from zope.component.interfaces import IFactory
6from zope.component import queryUtility
7from zope.interface import implementedBy
8from waeup.sirp.university.interfaces import (
9    ICertificateContainer, ICertificate)
10
11class CertificateContainer(grok.Container):
12    """See interfaces for description.
13    """
14    grok.implements(ICertificateContainer)
15    grok.require('waeup.manageUniversity')
16
17    def __setitem__(self, name, certificate):
18        """XXX: docstring missing.
19        """
20        if not ICertificate.providedBy(certificate):
21            raise TypeError('CertificateContainers contain only '
22                            'ICertificate instances')
23        # Lookup catalog. If we find none: no duplicates possible.
24        cat = queryUtility(ICatalog, name='certificates_catalog', default=None)
25        if cat is not None:
26            entries = cat.searchResults(
27                code=(certificate.code,certificate.code))
28            if len(entries) > 0:
29                raise ValueError('Certificate exists already elsewhere')
30        else:
31            # No catalog, then this addition won't do harm to anything.
32            pass
33        super(CertificateContainer, self).__setitem__(name, certificate)
34
35    def addCertificate(self, certificate):
36        self[getattr(certificate, 'code', None)] = certificate
37
38    def clear(self):
39        keys = self.keys()
40        for key in keys:
41            del self[key]
42
43class CertificateContainerFactory(grok.GlobalUtility):
44    """A factory for certificate containers.
45    """
46    grok.implements(IFactory)
47    grok.name(u'waeup.CertificateContainer')
48    title = u"Create a new certificate container.",
49    description = u"This factory instantiates new certificate containers."
50
51    def __call__(self, *args, **kw):
52        return CertificateContainer(*args, **kw)
53
54    def getInterfaces(self):
55        return implementedBy(CertificateContainer)
56
57@grok.subscribe(ICertificate, grok.IObjectAddedEvent)
58def handle_cert_addition(certificate, event):
59    """XXX: Move me to certificates.py when everything works as expected.
60    """
61    cat = queryUtility(ICatalog, name='certificates_catalog', default=None)
62    if cat is None:
63        return
64    entries = cat.searchResults(
65        code=(certificate.code,certificate.code))
66    if len(entries) == 0:
67        return
68    for entry in entries:
69        if entry is not certificate:
70            # XXX: Evil! We should find a way to block addition _before_
71            #      it actually happens.
72            del certificate.__parent__[certificate.__name__]
73            raise ValueError('Certificate exists already elsewhere: % s' %
74                             (certificate.code, ))
75
Note: See TracBrowser for help on using the repository browser.