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

Last change on this file since 13365 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
Line 
1## $Id: container.py 13217 2015-08-24 06:34:28Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
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.
8##
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.
13##
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"""
19Containers for university applicants.
20"""
21from random import SystemRandom as r
22import grok
23import pytz
24from datetime import datetime
25import zope.location.location
26from zope.component import getUtility, ComponentLookupError
27from zope.component.factory import Factory
28from zope.component.interfaces import IFactory
29from zope.catalog.interfaces import ICatalog
30from waeup.kofa.interfaces import MessageFactory as _
31from waeup.kofa.applicants.interfaces import (
32    IApplicantsContainer, IApplicantsContainerAdd, IApplicant,
33    IApplicantsUtils)
34from waeup.kofa.utils.helpers import attrs_to_fields
35from waeup.kofa.utils.batching import VirtualExportJobContainer
36
37def generate_applicant_id(container=None):
38    if container is not None:
39        key = r().randint(99999,1000000)
40        while str(key) in container.keys():
41            key = r().randint(99999,1000000)
42        return u"%s_%d" % (container.code, key)
43    else:
44        # In some tests we don't use containers
45        return u"xxx_1234"
46
47class VirtualApplicantsExportJobContainer(VirtualExportJobContainer):
48    """A virtual export job container for certificates.
49    """
50
51class ApplicantsContainer(grok.Container):
52    """An applicants container contains university applicants.
53    """
54    grok.implements(IApplicantsContainer,IApplicantsContainerAdd)
55
56    description_dict = {}
57
58    local_roles = []
59
60    def addApplicant(self, applicant):
61        """Add an applicant.
62        """
63        if not IApplicant.providedBy(applicant):
64            raise TypeError(
65                'ApplicantsContainers contain only IApplicant instances')
66        if applicant.applicant_id is None:
67            applicant_id = generate_applicant_id(container=self)
68            applicant.applicant_id = applicant_id
69        self[applicant.application_number] = applicant
70        return
71
72    @property
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
92    def statistics(self):
93        try:
94          statistics = getUtility(
95              IApplicantsUtils).getApplicantsStatistics(self)
96        except ComponentLookupError:  # happens in unit tests
97            return
98        return statistics
99
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
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
117
118    def traverse(self, name):
119        """Deliver virtual export container.
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
128ApplicantsContainer = attrs_to_fields(ApplicantsContainer)
129
130# ApplicantsContainers must be importable. So we need a factory.
131class ApplicantsContainerFactory(grok.GlobalUtility):
132    """A factory for student online payments.
133    """
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."
138
139    def __call__(self, *args, **kw):
140        return ApplicantsContainer()
141
142    def getInterfaces(self):
143        return implementedBy(ApplicantsContainer)
Note: See TracBrowser for help on using the repository browser.