## ## root.py ## Login : ## Started on Thu Jan 20 04:17:59 2011 Uli Fouquet ## $Id$ ## ## Copyright (C) 2011 Uli Fouquet ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## """ The root for applicants. """ import grok from waeup.sirp.interfaces import IWAeUPSIRPPluggable from waeup.sirp.accesscodes import get_access_code from waeup.sirp.applicants.interfaces import IApplicantsRoot class ApplicantsRoot(grok.Container): """The root of applicants-related components. It contains primarily containers for applicants. """ grok.implements(IApplicantsRoot) def addApplicantsContainer(self, container, name=None): """Add an applicants container. Adds an applicants container that implements `interface` under the name `name`. `container` the container instance to be added. Should implement :class:`IApplicantsContainer`. `name` the name under which the container will be accessible. We usually use names like ``pume_2011`` to indicate, that the new container will contain student applicants for a certain screening type (``pume``) and of the year 2011. """ self[name] = container return class ApplicantsPlugin(grok.GlobalUtility): """A WAeUPSIRPPlugin that creates an applicants root in portal. This plugin should be called by a typical `waeup.sirp.app.Universtiy` instance on creation time. The :meth:`update` method normally can also be triggered manually over the main site configuration. Implements :class:`waeup.sirp.interfaces.IWAeUPSIRPPluggable` """ grok.name('applicants') grok.implements(IWAeUPSIRPPluggable) log_prefix = 'ApplicantsPlugin' def setup(self, site, name, logger): """Create a new :class:`ApplicantsRoot` instance in `site`. """ site['applicants'] = ApplicantsRoot() logger.info( '%s: Installed applicants root.' % (self.log_prefix,) ) return def update(self, site, name, logger): """Update site wide ``applicants`` root. If the site already contains a suitable ``applicants`` root, leave it that way. If not create one and delete the old one if appropriate. """ app_folder = site.get('applicants', None) site_name = getattr(site, '__name__', '') if IApplicantsRoot.providedBy(app_folder): # Applicants up to date. Return. logger.info( '%s: Updating site at %s: Nothing to do.' % ( self.log_prefix, site_name,) ) return elif app_folder is not None: # Applicants need update. Remove old instance. logger.warn( '%s: Outdated applicants folder detected at site %s.' 'Removing it.' % (self.log_prefix, site_name) ) del site['applicants'] # Add new applicants. logger.info( '%s: Updating site at %s. Installing ' 'applicants.' % (self.log_prefix, site_name,) ) self.setup(site, name, logger) return def get_applicant_data(identifier): """Get applicant data associated with `identifier`. Returns the applicant object if successful and ``None`` else. As `identifier` we expect an access code in format like ``PREFIX-XXX-YYYYYYYY`` where ``PREFIX`` is something like ``APP`` or ``PUDE``, ``XXX`` the access code series and ``YYYYYYYYYY`` the real accesscode number. """ site = grok.getSite() for container in site['applicants'].values(): applicant_data = container.get(identifier, None) if applicant_data is not None: return applicant_data return None def application_exists(identifier): """Check whether an application for the given identifier already exists. `identifier` will normally be an access code. """ site = grok.getSite() for container in site['applicants'].values(): if identifier in container.keys(): return True return False