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

Last change on this file since 13247 was 13217, checked in by Henrik Bettermann, 9 years ago

Add pre-fill UI components.

Take unused records first during self-registration.

  • Property svn:keywords set to Id
File size: 4.9 KB
RevLine 
[5649]1## $Id: container.py 13217 2015-08-24 06:34:28Z 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
[8993]58    local_roles = []
[6184]59
[7240]60    def addApplicant(self, applicant):
61        """Add an applicant.
62        """
[8008]63        if not IApplicant.providedBy(applicant):
[7240]64            raise TypeError(
[8008]65                'ApplicantsContainers contain only IApplicant instances')
[8290]66        if applicant.applicant_id is None:
67            applicant_id = generate_applicant_id(container=self)
68            applicant.applicant_id = applicant_id
[7240]69        self[applicant.application_number] = applicant
70        return
71
[8563]72    @property
[13217]73    def counts(self):
74        total = len(self)
75        code = self.code + '+'
76        cat = getUtility(ICatalog, name='applicants_catalog')
77        results = list(
78           cat.searchResults(container_code=(code, code)))
79        return len(self), len(results)
80
81    @property
82    def first_unused(self):
83        code = self.code + '-'
84        cat = getUtility(ICatalog, name='applicants_catalog')
85        results = list(
86           cat.searchResults(container_code=(code, code)))
87        if results:
88            return results[0]
89        return
90
91    @property
[8643]92    def statistics(self):
[13077]93        try:
94          statistics = getUtility(
95              IApplicantsUtils).getApplicantsStatistics(self)
96        except ComponentLookupError:  # happens in unit tests
97            return
98        return statistics
[8643]99
[8665]100    @property
101    def expired(self):
102        # Check if application has started ...
103        if not self.startdate or (
104            self.startdate > datetime.now(pytz.utc)):
105            return True
106        # ... or ended
107        if not self.enddate or (
108            self.enddate < datetime.now(pytz.utc)):
109            return True
110        return False
111
[9531]112    def writeLogMessage(self, view, message):
113        ob_class = view.__implemented__.__name__.replace('waeup.kofa.','')
114        self.__parent__.logger.info(
115            '%s - %s - %s' % (ob_class, self.code, message))
116        return
[8665]117
[10655]118    def traverse(self, name):
[13077]119        """Deliver virtual export container.
[10655]120        """
121        if name == 'exports':
122            # create a virtual exports container and return it
123            container = VirtualApplicantsExportJobContainer()
124            zope.location.location.located(container, self, 'exports')
125            return container
126        return None
127
[6072]128ApplicantsContainer = attrs_to_fields(ApplicantsContainer)
[6077]129
[8008]130# ApplicantsContainers must be importable. So we need a factory.
131class ApplicantsContainerFactory(grok.GlobalUtility):
132    """A factory for student online payments.
[5821]133    """
[8008]134    grok.implements(IFactory)
135    grok.name(u'waeup.ApplicantsContainer')
136    title = u"Create a new container for applicants.",
137    description = u"This factory instantiates new IApplicantsContainer instances."
[5821]138
[8008]139    def __call__(self, *args, **kw):
140        return ApplicantsContainer()
[6280]141
[8008]142    def getInterfaces(self):
143        return implementedBy(ApplicantsContainer)
Note: See TracBrowser for help on using the repository browser.