## ## 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 applications. """ import grok from waeup.sirp.interfaces import IWAeUPSIRPPluggable from waeup.sirp.applications.interfaces import IApplicationsRoot class ApplicationsRoot(grok.Container): """The root of student applications-related components. """ grok.implements(IApplicationsRoot) def addApplicationContainer(self, container, name=None): """Add an application container. Adds an application container that implements `interface` under the name `name`. `container` the container instance to be added. Should implement :class:`IApplicationContainer`. `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 applications for a certain screening type (``pume``) and of the year 2011. """ self[name] = container return class ApplicationsPlugin(grok.GlobalUtility): """A WAeUPSIRPPlugin that creates an applications 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('applications') grok.implements(IWAeUPSIRPPluggable) log_prefix = 'ApplicationsPlugin' def setup(self, site, name, logger): """Create a new :class:`ApplicationsRoot` instance in `site`. """ site['applications'] = ApplicationsRoot() logger.info( '%s: Installed applications root.' % (self.log_prefix,) ) return def update(self, site, name, logger): """Update site wide ``applications`` root. If the site already contains a suitable ``applications`` root, leave it that way. If not create one and delete the old one if appropriate. """ app_folder = site.get('applications', None) site_name = getattr(site, '__name__', 'Unnamed Site?') if IApplicationsRoot.providedBy(app_folder): # Applications 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: # Applications need update. Remove old instance. logger.warn( '%s: Outdated applications folder detected at site %s.' 'Removing it.' % (self.log_prefix, site_name) ) del site['applications'] # Add new applications. logger.info( '%s: Updating site at %s. Installing ' 'applications.' % (self.log_prefix, site_name,) ) self.setup(site, name, logger) return