source: main/waeup.kofa/trunk/src/waeup/kofa/applicants/container.py @ 13610

Last change on this file since 13610 was 13570, checked in by Henrik Bettermann, 10 years ago

Add further permissions to the local ApplicationsManager? role and
make it assignable at applicants container level.

  • Property svn:keywords set to Id
File size: 4.9 KB
RevLine 
[5649]1## $Id: container.py 13570 2016-01-07 15:26:07Z henrik $
[6077]2##
[6478]3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
[5649]4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
[6077]8##
[5649]9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
[6077]13##
[5649]14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""
[5676]19Containers for university applicants.
[5649]20"""
[7260]21from random import SystemRandom as r
[5649]22import grok
[8665]23import pytz
24from datetime import datetime
[10655]25import zope.location.location
[13077]26from zope.component import getUtility, ComponentLookupError
[6280]27from zope.component.factory import Factory
28from zope.component.interfaces import IFactory
[13217]29from zope.catalog.interfaces import ICatalog
[7847]30from waeup.kofa.interfaces import MessageFactory as _
[7811]31from waeup.kofa.applicants.interfaces import (
[8645]32    IApplicantsContainer, IApplicantsContainerAdd, IApplicant,
33    IApplicantsUtils)
[7811]34from waeup.kofa.utils.helpers import attrs_to_fields
[10655]35from waeup.kofa.utils.batching import VirtualExportJobContainer
[5649]36
[7260]37def generate_applicant_id(container=None):
38    if container is not None:
[8540]39        key = r().randint(99999,1000000)
[8543]40        while str(key) in container.keys():
[8540]41            key = r().randint(99999,1000000)
42        return u"%s_%d" % (container.code, key)
[7260]43    else:
44        # In some tests we don't use containers
45        return u"xxx_1234"
46
[10655]47class VirtualApplicantsExportJobContainer(VirtualExportJobContainer):
48    """A virtual export job container for certificates.
49    """
50
[5676]51class ApplicantsContainer(grok.Container):
52    """An applicants container contains university applicants.
[5649]53    """
[6069]54    grok.implements(IApplicantsContainer,IApplicantsContainerAdd)
[5649]55
[7903]56    description_dict = {}
[6077]57
[13570]58    local_roles = [
59        'waeup.local.ApplicationsManager',
60        ]
[6184]61
[7240]62    def addApplicant(self, applicant):
63        """Add an applicant.
64        """
[8008]65        if not IApplicant.providedBy(applicant):
[7240]66            raise TypeError(
[8008]67                'ApplicantsContainers contain only IApplicant instances')
[8290]68        if applicant.applicant_id is None:
69            applicant_id = generate_applicant_id(container=self)
70            applicant.applicant_id = applicant_id
[7240]71        self[applicant.application_number] = applicant
72        return
73
[8563]74    @property
[13217]75    def counts(self):
76        total = len(self)
77        code = self.code + '+'
78        cat = getUtility(ICatalog, name='applicants_catalog')
79        results = list(
80           cat.searchResults(container_code=(code, code)))
81        return len(self), len(results)
82
83    @property
84    def first_unused(self):
85        code = self.code + '-'
86        cat = getUtility(ICatalog, name='applicants_catalog')
87        results = list(
88           cat.searchResults(container_code=(code, code)))
89        if results:
90            return results[0]
91        return
92
93    @property
[8643]94    def statistics(self):
[13077]95        try:
96          statistics = getUtility(
97              IApplicantsUtils).getApplicantsStatistics(self)
98        except ComponentLookupError:  # happens in unit tests
99            return
100        return statistics
[8643]101
[8665]102    @property
103    def expired(self):
104        # Check if application has started ...
105        if not self.startdate or (
106            self.startdate > datetime.now(pytz.utc)):
107            return True
108        # ... or ended
109        if not self.enddate or (
110            self.enddate < datetime.now(pytz.utc)):
111            return True
112        return False
113
[9531]114    def writeLogMessage(self, view, message):
115        ob_class = view.__implemented__.__name__.replace('waeup.kofa.','')
116        self.__parent__.logger.info(
117            '%s - %s - %s' % (ob_class, self.code, message))
118        return
[8665]119
[10655]120    def traverse(self, name):
[13077]121        """Deliver virtual export container.
[10655]122        """
123        if name == 'exports':
124            # create a virtual exports container and return it
125            container = VirtualApplicantsExportJobContainer()
126            zope.location.location.located(container, self, 'exports')
127            return container
128        return None
129
[6072]130ApplicantsContainer = attrs_to_fields(ApplicantsContainer)
[6077]131
[8008]132# ApplicantsContainers must be importable. So we need a factory.
133class ApplicantsContainerFactory(grok.GlobalUtility):
134    """A factory for student online payments.
[5821]135    """
[8008]136    grok.implements(IFactory)
137    grok.name(u'waeup.ApplicantsContainer')
138    title = u"Create a new container for applicants.",
139    description = u"This factory instantiates new IApplicantsContainer instances."
[5821]140
[8008]141    def __call__(self, *args, **kw):
142        return ApplicantsContainer()
[6280]143
[8008]144    def getInterfaces(self):
145        return implementedBy(ApplicantsContainer)
Note: See TracBrowser for help on using the repository browser.