source: main/waeup.kofa/branches/uli-zc-async/src/waeup/kofa/applicants/container.py @ 10687

Last change on this file since 10687 was 9211, checked in by uli, 12 years ago

Rollback r9209. Looks like multiple merges from trunk confuse svn when merging back into trunk.

  • Property svn:keywords set to Id
File size: 4.4 KB
RevLine 
[5649]1## $Id: container.py 9211 2012-09-21 08:19:35Z uli $
[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
[8643]25from zope.component import getUtility
[6280]26from zope.component.factory import Factory
27from zope.component.interfaces import IFactory
[7847]28from waeup.kofa.interfaces import MessageFactory as _
[7811]29from waeup.kofa.applicants.interfaces import (
[8645]30    IApplicantsContainer, IApplicantsContainerAdd, IApplicant,
31    IApplicantsUtils)
[7811]32from waeup.kofa.utils.helpers import attrs_to_fields
[5649]33
[8645]34
[7260]35def generate_applicant_id(container=None):
36    if container is not None:
[8540]37        key = r().randint(99999,1000000)
[8543]38        while str(key) in container.keys():
[8540]39            key = r().randint(99999,1000000)
40        return u"%s_%d" % (container.code, key)
[7260]41    else:
42        # In some tests we don't use containers
43        return u"xxx_1234"
44
[5676]45class ApplicantsContainer(grok.Container):
46    """An applicants container contains university applicants.
[5649]47    """
[6069]48    grok.implements(IApplicantsContainer,IApplicantsContainerAdd)
[5649]49
[7903]50    #: A dictionary to hold per language translations of description string.
51    description_dict = {}
[6077]52
[9211]53    @property
54    def local_roles(self):
55        return []
[6184]56
[5649]57    def archive(self, app_ids=None):
[5676]58        """Create on-dist archive of applicants stored in this term.
[5649]59
[5676]60        If app_ids is `None`, all applicants are archived.
[5649]61
62        If app_ids contains a single id string, only the respective
[5676]63        applicants are archived.
[5649]64
65        If app_ids contains a list of id strings all of the respective
[5676]66        applicants types are saved to disk.
[5649]67        """
[6601]68        raise NotImplementedError()
[5649]69
70    def clear(self, app_ids=None, archive=True):
[5676]71        """Remove applicants of type given by 'id'.
[5649]72
[5676]73        Optionally archive the applicants.
[6077]74
[5676]75        If id is `None`, all applicants are archived.
[5649]76
77        If id contains a single id string, only the respective
[5676]78        applicants are archived.
[5649]79
80        If id contains a list of id strings all of the respective
[5676]81        applicant types are saved to disk.
[5649]82
83        If `archive` is ``False`` none of the archive-handling is done
[5676]84        and respective applicants are simply removed from the
[5649]85        database.
86        """
[6601]87        raise NotImplementedError()
[6072]88
[7240]89    def addApplicant(self, applicant):
90        """Add an applicant.
91        """
[8008]92        if not IApplicant.providedBy(applicant):
[7240]93            raise TypeError(
[8008]94                'ApplicantsContainers contain only IApplicant instances')
[8290]95        if applicant.applicant_id is None:
96            applicant_id = generate_applicant_id(container=self)
97            applicant.applicant_id = applicant_id
[7240]98        self[applicant.application_number] = applicant
99        return
100
[8563]101    @property
[8643]102    def statistics(self):
[8645]103        return getUtility(IApplicantsUtils).getApplicantsStatistics(self)
[8643]104
[8665]105    @property
106    def expired(self):
107        # Check if application has started ...
108        if not self.startdate or (
109            self.startdate > datetime.now(pytz.utc)):
110            return True
111        # ... or ended
112        if not self.enddate or (
113            self.enddate < datetime.now(pytz.utc)):
114            return True
115        return False
116
117
[6072]118ApplicantsContainer = attrs_to_fields(ApplicantsContainer)
[6077]119
[8008]120# ApplicantsContainers must be importable. So we need a factory.
121class ApplicantsContainerFactory(grok.GlobalUtility):
122    """A factory for student online payments.
[5821]123    """
[8008]124    grok.implements(IFactory)
125    grok.name(u'waeup.ApplicantsContainer')
126    title = u"Create a new container for applicants.",
127    description = u"This factory instantiates new IApplicantsContainer instances."
[5821]128
[8008]129    def __call__(self, *args, **kw):
130        return ApplicantsContainer()
[6280]131
[8008]132    def getInterfaces(self):
133        return implementedBy(ApplicantsContainer)
Note: See TracBrowser for help on using the repository browser.