source: TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/wsgi/openid/relyingparty/signin_interface/genshi/__init__.py @ 7077

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg-security/TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/wsgi/openid/relyingparty/signin_interface/genshi/__init__.py@7077
Revision 7077, 5.1 KB checked in by pjkersha, 11 years ago (diff)
  • Property svn:keywords set to Id
Line 
1"""NDG Security OpenID Relying Party Genshi based Sign in template
2
3NERC DataGrid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "20/01/2009"
7__copyright__ = "(C) 2009 Science and Technology Facilities Council"
8__license__ = "BSD - see top-level directory for LICENSE file"
9__contact__ = "Philip.Kershaw@stfc.ac.uk"
10__revision__ = "$Id$"
11import logging
12log = logging.getLogger(__name__)
13
14from os import path
15
16from paste.cascade import Cascade
17from paste.urlparser import StaticURLParser     
18from genshi.template import TemplateLoader
19
20from ndg.security.server.wsgi.openid.relyingparty import (SigninInterface, 
21    SigninInterfaceConfigError)
22
23
24class GenshiSigninTemplate(SigninInterface):
25    """Provide Templating for OpenID Relying Party Middleware Sign in interface
26    via Buffet class"""
27    DEFAULT_TEMPLATES_DIR = path.join(path.dirname(__file__), 'templates')
28    DEFAULT_STATIC_CONTENT_DIR = path.join(path.dirname(__file__), 'public')
29   
30    SIGNIN_TEMPLATE_NAME = 'signin.html'
31   
32    propertyDefaults = {
33        'templateRootDir': DEFAULT_TEMPLATES_DIR,
34        'staticContentRootDir': None,
35        'baseURL': 'http://localhost',
36        'initialOpenID': '',
37        'heading': '',
38        'leftLogo': None,
39        'leftAlt': '',
40        'leftLink': None,
41        'leftImage': None,
42        'footerText': 'Test deployment only',
43        'rightLink': None,
44        'rightImage': None,
45        'rightAlt': '',
46        'helpIcon': None
47    }
48   
49    def __init__(self, app, global_conf, **local_conf):
50        '''Extend SignInterface to include config and set-up for Genshi
51        object
52       
53        @type app: callable following WSGI interface
54        @param app: next middleware application in the chain     
55        @type global_conf: dict       
56        @param global_conf: PasteDeploy global configuration dictionary
57        enables other global configuration parameters to be filtered out
58        @type local_conf: dict       
59        @param local_conf: PasteDeploy application specific configuration
60        dictionary
61        '''
62        super(GenshiSigninTemplate, self).__init__(app, 
63                                                   global_conf, 
64                                                   **local_conf)
65           
66        self.__loader = TemplateLoader(self.templateRootDir, auto_reload=True)
67       
68        self.title = "Enter your OpenID to Sign in"
69        self.xml = ''
70        self.headExtras = ''
71        self.loginStatus = True
72        self.loggedIn = False
73       
74        # TODO: handle session object scope
75        self.session = {'username': ''}
76       
77        if self.staticContentRootDir is not None:
78            staticApp = StaticURLParser(self.staticContentRootDir)
79            self._app = Cascade([staticApp, self._app], catch=(404, 401))
80
81    def _getStaticContentRootDir(self):
82        return self.__staticContentRootDir
83
84    def _setStaticContentRootDir(self, value):
85        if not isinstance(value, (basestring, type(None))):
86            raise TypeError('Expecting string or None type for '
87                            "'staticContentRootDir'; got %r" % type(value))
88       
89        if value is not None and not path.isdir(value):
90            raise AttributeError("'staticContentRootDir' setting %r is not a "
91                                 "valid directory" % value)
92           
93        self.__staticContentRootDir = value
94
95    staticContentRootDir = property(_getStaticContentRootDir, 
96                                    _setStaticContentRootDir, 
97                                    doc="StaticContentRootDir's Docstring")
98
99    def _getLoader(self):
100        return self.__loader
101
102    def _setLoader(self, value):
103        if not isinstance(value, TemplateLoader):
104            raise TypeError('Expecting %r type for "loader"; got %r' % 
105                            type(value))
106        self.__loader = value
107
108    loader = property(_getLoader, _setLoader, 
109                      doc="Genshi TemplateLoader instance")
110
111    def _render(self, templateName, c=None, **kw):
112        '''Wrapper for Genshi template rendering
113        @type templateName: basestring
114        @param templateName: name of template file to load
115        @type c: None/object
116        @param c: reference to object to pass into template - defaults to self
117        @type kw: dict
118        @param kw: keywords to pass to template
119        @rtype: string
120        @return: rendered template
121        '''
122        if c is None:
123            c = self
124           
125        kw['c'] = c
126       
127        tmpl = self.loader.load(templateName)
128        rendering = tmpl.generate(**kw).render('html', doctype='html')
129
130        return rendering
131   
132    def makeTemplate(self):
133        '''
134        @rtype: string
135        @return: rendered template
136        '''
137        return self._render(GenshiSigninTemplate.SIGNIN_TEMPLATE_NAME, c=self)
138   
139    def getTemplateFunc(self):
140        """Set-up template for OpenID Provider Login
141        @rtype: callable
142        @return: rendering function
143        """
144        def _makeTemplate():
145            return self.makeTemplate()
146           
147        return _makeTemplate
148   
149    def __call__(self, environ, start_response):
150        return self._app(environ, start_response)
Note: See TracBrowser for help on using the repository browser.