source: main/waeup.sirp/trunk/src/waeup/sirp/app.py @ 6134

Last change on this file since 6134 was 6134, checked in by uli, 13 years ago

Remove trailing whitespaces.

  • Property svn:eol-style set to native
File size: 5.2 KB
Line 
1import grok
2import logging
3import os
4try:
5    from zope.authentication.interfaces import IAuthentication
6except:
7    # BBB
8    from zope.app.security.interfaces import IAuthentication
9from zope.component import createObject, getUtilitiesFor
10try:
11    from zope.pluggableauth import PluggableAuthentication
12except ImportError:
13    # BBB
14    from zope.app.authentication.authentication import PluggableAuthentication
15
16from waeup.sirp.authentication import setup_authentication
17from waeup.sirp.datacenter import DataCenter
18from waeup.sirp.interfaces import (
19    IUniversity, IDataCenter, IWAeUPSIRPPluggable,
20    IDataCenterStorageMovedEvent)
21from waeup.sirp.users import UserContainer
22
23class University(grok.Application, grok.Container):
24    """A university.
25    """
26    grok.implements(IUniversity)
27
28    # Setup authentication for this app. Note: this is only
29    # initialized, when a new instance of this app is created.
30    grok.local_utility(
31        PluggableAuthentication, provides = IAuthentication,
32        setup = setup_authentication,)
33
34    # The name of the university.
35    name=u'Sample University'
36
37    # The default layout.
38    skin=u'gray waeup theme'
39
40    # The default frontpage.
41    frontpage= """
42This is the default frontpage of the portal written
43in `reStructuredText (reST)
44<http://docutils.sourceforge.net/docs/user/rst/quickref.html>`_
45markup language.
46
47Some more reST examples for getting started:
48
491. Heading
50----------
51
52Text
53
541.2 Heading
55...........
56
57Text
58
592. Heading
60----------
61
62Text
63
642.1 Heading
65...........
66
67Text
68
692.2 Heading
70...........
71
72Text
73
74"""
75
76    # The default title.
77    title=u'Welcome to the Student Information and Registration Portal of %s' % name
78
79    @property
80    def logger(self):
81        """The application logger.
82
83        Returns a standard logger object as provided by :mod:`logging`
84        module from the standard library.
85
86        Other components can use this logger to perform log entries
87        into the 'main' logfile.
88
89        The logger is initialized the first time, it is called.
90        """
91        sitename = self.__name__
92        loggername = 'waeup.sirp.%s' % sitename
93        logger = logging.getLogger(loggername)
94        if not logger.handlers:
95            logger = self._setupLogger(logger)
96        return logger
97
98
99    def __init__(self, name=name, skin=skin, title=title,
100                 frontpage=frontpage, **kw):
101        super(University, self).__init__(**kw)
102        self.name = name
103        self.skin = skin
104        self.title = title
105        self.frontpage = frontpage
106        self.setup()
107
108    def setup(self):
109        """Setup some hard-wired components.
110
111        Create local datacenter, containers for users, students and
112        the like.
113        """
114        self['users'] = UserContainer()
115        self['datacenter'] = DataCenter()
116
117        self['students'] = createObject(u'waeup.StudentContainer')
118        self['hostels'] = createObject(u'waeup.HostelContainer')
119        self._createPlugins()
120
121    def _createPlugins(self):
122        """Create instances of all plugins defined somewhere.
123        """
124        for name, plugin in getUtilitiesFor(IWAeUPSIRPPluggable):
125            plugin.setup(self, name, self.logger)
126        return
127
128    def updatePlugins(self):
129        """Lookup all plugins and call their `update()` method.
130        """
131        from zope.event import notify
132        from zope.lifecycleevent import ObjectAddedEvent
133        #notify(ObjectAddedEvent(self))
134        from zope.component import getGlobalSiteManager
135        from grok.meta import IndexesSetupSubscriber
136        gsm = getGlobalsiteManager()
137        handlers = [x for x in gsm.registeredHandlers()
138                    if isinstance(x.handler, IndexesSetupSubscriber)]
139        import pdb; pdb.set_trace()
140        for name, plugin in getUtilitiesFor(IWAeUPSIRPPluggable):
141            plugin.update(self, name, self.logger)
142        return
143
144    def _setupLogger(self, logger):
145        """Setup general application logger.
146
147        The logfile will be stored in the datacenter logs/ dir.
148        """
149        logdir = os.path.join(self['datacenter'].storage, 'logs')
150        if not os.path.exists(logdir):
151            os.mkdir(logdir)
152        filename = os.path.join(logdir, 'application.log')
153
154        # Create a rotating file handler logger for application.
155        handler = logging.handlers.RotatingFileHandler(
156            filename, maxBytes=5*1024**1, backupCount=7)
157        formatter = logging.Formatter(
158            '%(asctime)s - %(levelname)s - %(message)s')
159        handler.setFormatter(formatter)
160
161        # Don't send log msgs to ancestors. This stops displaying
162        # logmessages on the commandline.
163        logger.propagate = False
164        logger.addHandler(handler)
165        return logger
166
167@grok.subscribe(IDataCenter, IDataCenterStorageMovedEvent)
168def handle_storage_move(obj, event):
169    """Event handler, in case datacenter storage moves.
170
171    We initialize the application log again, then.
172    """
173    app = grok.getSite()
174    if app is None:
175        return
176    if obj is not app['datacenter']:
177        return
178    logger = app.logger
179    logger.warn('Log Dir moved. Closing.')
180    handlers = logger.handlers
181    for handler in handlers:
182        logger.removeHandler(handler)
183    app._setupLogger(logger)
184    logger.warn('Log file moved. Opening.')
Note: See TracBrowser for help on using the repository browser.