source: TI05-delivery/ows_framework/trunk/ows_server/ows_server/lib/base.py @ 2800

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI05-delivery/ows_framework/trunk/ows_server/ows_server/lib/base.py@2800
Revision 2800, 5.4 KB checked in by lawrence, 13 years ago (diff)

Changing to the new tab layout ... (incomplete)

Line 
1from pylons import Response, c, g, cache, request, session
2from pylons.controllers import WSGIController
3from pylons.decorators import jsonify, validate
4from pylons.templating import render, render_response
5from pylons.helpers import abort, redirect_to, etag_cache
6from pylons.i18n import N_, _, ungettext
7from paste.request import construct_url
8import ows_server.models as model
9import ows_server.lib.helpers as h
10from ows_server.lib.security_util import setSecuritySession, LoginServiceQuery
11from ows_common import exceptions as OWS_E
12from ows_common.operations_metadata import OperationsMetadata, Operation, RequestMethod
13from ows_common.get_capabilities import ServiceMetadata
14import ows_common.xml
15
16
17try:
18    from xml.etree import ElementTree as ET
19except ImportError:
20    from elementtree import ElementTree as ET
21
22import logging
23logger = logging.getLogger('ows_server.lib.base')
24
25class BaseController(WSGIController):
26   
27    def __call__(self, environ, start_response):
28        # Insert any code to be run per request here. The Routes match
29        # is under environ['pylons.routes_dict'] should you want to check
30        # the action or route vars here
31        c.requestURL=construct_url(environ)
32        if 'h' in request.params:
33            setSecuritySession()
34           
35            if 'panelView' not in session:
36                session['panelView']='History'
37            session.save()
38           
39            # TODO Make the redirect tidier ...
40            qs = LoginServiceQuery.stripFromURI()
41
42            cc=construct_url(environ,querystring=qs)
43            h.redirect_to(cc)
44       
45        c.pageTabs=[('Search',g.discoveryURL)]
46        if 'results' in session: c.pageTabs.append(('Results',session['results']))
47        if 'lastViewed' in session: c.pageTabs.append(('Display',session['lastViewed']))
48       
49        if 'ndgSec' in session:
50            c.pageTabs.append(('Selections','Blah'))
51            c.pageTabs.append(('Visualise','Blah'))
52
53        return WSGIController.__call__(self, environ, start_response)
54   
55class OwsController(BaseController):
56    def __call__(self, environ, start_response):
57
58        # All OWS parameter names are case insensitive.
59        req = request._current_obj()
60        self.ows_params = {}
61        for k in req.params:
62            self.ows_params[k.lower()] = req.params[k]       
63
64        try:
65            self._fixOwsAction(environ)
66            return super(OwsController, self).__call__(environ, start_response)
67        except OWS_E.OwsError, e:
68            logger.exception(e)
69            return render_response('exception_report', report=e.report,
70                                   format='xml')
71           
72 
73    def _fixOwsAction(self, environ):
74        # Override the Routes action from the request query parameter
75        try:
76            action = self.ows_params['request']
77        except KeyError:
78            raise OWS_E.MissingParameterValue('REQUEST parameter not specified', 'REQUEST')
79
80        # Check action is a method in self
81        if not getattr(self, action):
82            raise OWS_E.InvalidParameterValue('request=%s not supported' % action, 'REQUEST')
83
84        # override routes action with request
85        environ['pylons.routes_dict']['action'] = action
86        del self.ows_params['request']
87
88    def _loadCapabilities(self):
89        """
90        creates an ows_common.get_capabilities.ServiceMetadata object
91        by consulting the paste configuration and annotations in the
92        controller definition.
93
94        """
95        # Deduce ows_endpoint from routes
96        ows_endpoint = h.url_for(controller=request.environ['pylons.routes_dict']['controller'])
97       
98        # Get the server-level configuration data from an XML file
99        config = request.environ['paste.config']
100        sm_tree = ET.parse(config['ows_common_config'])
101        sm = ows_common.xml.service_metadata(sm_tree.getroot())
102       
103        # Extract service-level parameters and constraint
104        parameters = getattr(self, '_ows_parameters', {})
105        constraints = getattr(self, '_ows_constraints', {})
106        versions = getattr(self, '_ows_versions', [])
107       
108        # Extract operation-level parameters and constraints
109        od = {}
110        for attr in dir(self):
111            op = getattr(self, attr)
112            if hasattr(op, '_ows_name'):
113                p = getattr(op, '_ows_parameters', {})
114                c = getattr(op, '_ows_constraints', {})
115                od[op._ows_name] = Operation(get=RequestMethod(href=ows_endpoint),
116                                             post=None,
117                                             parameters=p,
118                                             constraints=c,
119                                             name=op._ows_name)
120       
121        sm.operationsMetadata = OperationsMetadata(od, constraints, parameters)
122        sm.serviceIdentification.serviceTypeVersions = versions
123        return sm
124
125    def _renderCapabilities(self, template='ows/get_capabilities'):
126        """
127        The standard way of returning a Capabilities document.
128
129        Each subclass should implement self._load_capabilities() and call
130        this method to return a response object.
131
132        """
133        c.service_metadata = self._loadCapabilities()       
134        r = render_response(template, format='xml')
135        r.headers['content-type'] = 'text/xml'
136        return r
137
138
139# Include the '_' function in the public names
140__all__ = [__name for __name in locals().keys() if not __name.startswith('_') \
141           or __name == '_']
Note: See TracBrowser for help on using the repository browser.