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

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

Get closer to the roots of the problem and override setitem to be
sure we do not store duplicate certificate entries.

File size: 2.6 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    cat = queryUtility(ICatalog, name='certificates_catalog', default=None)
60    if cat is None:
61        return
62    entries = cat.searchResults(
63        code=(certificate.code,certificate.code))
64    if len(entries) == 0:
65        return
66    for entry in entries:
67        if entry is not certificate:
68            # XXX: Evil! We should find a way to block addition _before_
69            #      it actually happens.
70            del certificate.__parent__[certificate.__name__]
71            raise ValueError('Certificate exists already elsewhere: % s' %
72                             (certificate.code, ))
73
Note: See TracBrowser for help on using the repository browser.