source: cowsclient/trunk/cowsclient/controllers/wmsviz.py @ 5851

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cowsclient/trunk/cowsclient/controllers/wmsviz.py@5851
Revision 5851, 9.0 KB checked in by pnorton, 11 years ago (diff)

Added some code to display the split axis selects when the xml file is included in the getCapabilities metadata.

Line 
1# Copyright (C) 2007 STFC & NERC (Science and Technology Facilities Council).
2# This software may be distributed under the terms of the
3# Q Public License, version 1.0 or later.
4# http://ndg.nerc.ac.uk/public_docs/QPublic_license.txt
5#
6"""
7 Controller for the 'View' tab - allowing the display of WMC map layers
8
9 @author C Byrom Feb 08, Modified D Lowe, May 09
10"""
11
12import logging
13import urllib2
14import urlparse
15from cStringIO import StringIO
16
17#from ows_server.models import Utilities
18from paste.request import parse_querystring
19import cowsclient.lib.utils as utils
20
21# cowsclient imports
22from cowsclient.model import selectedItem
23from cowsclient.lib.base import BaseController, g, response, config, request, c, session, render, abort
24from cowsclient.lib.wmc_util import GetWebMapContext, GetWebMapCapabilities, GetLegend, openURL, GetResponse
25from cowsclient.lib.build_figure import build_figure
26from cowsclient.lib.status_builder import StatusBuilder
27
28log = logging.getLogger(__name__)
29
30class WmsvizController(BaseController):
31   
32    _pilImageFormats = {
33        'image/png': 'PNG',
34        'image/jpg': 'JPEG',
35        'image/jpeg': 'JPEG',
36        'image/gif': 'GIF',
37        'image/tiff': 'TIFF'
38    }
39   
40    def index(self):
41        """
42        Default controller method to handle the initial requests to the page
43        """
44        log.debug('wmsviz controller')
45       
46        g.helpIcon='layout/icons/help.png'  #needs to go in config
47       
48        self.inputs=dict(parse_querystring(request.environ))
49        log.info(self.inputs)
50        c.wmcURL = ""
51       
52        # check if all we're doing is removing a view item
53        if 'removeItem' in self.inputs:
54            return self.removeViewItem(self.inputs['removeItem'])
55       
56       
57        # check if we're doing an AJAX callback to get some WMC data
58        if 'REQUEST' in self.inputs:
59                       
60            if self.inputs['REQUEST'] == 'GetWebMapContext':
61                wmc= GetWebMapContext(self)
62                return wmc
63           
64            if self.inputs['REQUEST'] == 'GetWebMapCapabilities':
65                wmcDoc = GetWebMapCapabilities(self.inputs['ENDPOINT'])
66               
67                response.headers['Content-Type'] = 'text/xml'
68                response.write(wmcDoc)
69                return           
70           
71            elif self.inputs['REQUEST'] == 'GetLegend':
72                return GetLegend(self)
73           
74            if self.inputs['REQUEST'] == 'GetDisplayOptions':
75               
76                jsonTxt = GetResponse(self.inputs['URL'])
77               
78                response.headers['Content-Type'] = 'application/json'
79                response.write(jsonTxt)
80                return
81           
82            if self.inputs['REQUEST'] == 'GetAxisConfig':
83               
84                respText = GetResponse(self.inputs['URL'])
85               
86                response.headers['Content-Type'] = 'text/xml'
87                response.write(respText)
88                return           
89               
90
91       
92        #get server information from config file
93        g.server=config['app_conf']['serverurl']
94   
95   
96       
97        statusBuilder = StatusBuilder()
98       
99        status = statusBuilder.getCurrentStatus()
100
101        initialSetup = self._buildInitialSetup(self.inputs.get('ENDPOINT'))
102       
103        #TODO: WORK OUT HOW TO COUPLE THIS TO BROWSE
104        # otherwise, we can get here by two routes:
105        # i) either by clicking on the WMC icon in the details view - if so, get passed endpoint and add to
106        #    selected items;
107        # ii) or from the selections tab - which will already have set up the correct selected items
108           
109        # if ENDPOINT specified, we've reached the page via the WMC icon
110       
111        #This will ensure that NDG security is triggered if a secured dataset is in Endpoint
112        if 'ENDPOINT' in self.inputs:
113        #clear out old endpoints NOTE. this means only one endpoint at a time can be viewed. May want to
114        #rethink this to enable 'shopping cart' type selection.
115#        self.removeAllViewItems()
116            for endpoint in initialSetup:
117                urlstring=endpoint['url']+'?request=GetCapabilities&Service=WMS'
118                #urlstring=str(self.inputs['ENDPOINT'])
119                req = urllib2.Request(urlstring)
120                req.add_header('Cookie', request.headers.get('Cookie', ''))
121                try:
122                    filehandle = openURL(req)
123                    filehandle.close()
124                except urllib2.HTTPError, e:           
125                    log.exception("exception occurred")
126                    if e.code == 401:
127                        log.info ('401 unauthorized error in cowsclient')
128                        return abort(401) #triggers ndg security framework
129                    elif e.code == 403:  #TODO: 403 response is UNTESTED.
130                        # User is authenticated but doesn't have the required permissions
131                        # or an error occurred in the authorization process
132                        # Read response                   
133                        xresponse = e.read()
134                        # Send response to user
135                        self.start_response("%d %s" % (e.code, e.msg), e.headers.dict.items())
136                        return xresponse
137               
138       
139        # avoid page crashing if we come here without view items defined
140#        if 'viewItems' not in session:
141#            h.redirect_to(h.url_for(controller='discovery'))
142
143        session.save() 
144        log.info('SAVED SESSION')
145       
146        # check if page has been visited before; if not display tab
147#        if (Utilities.isTabRequired(c.pageTabs, 'View')):
148#            c.pageTabs.append(('View', h.url_for(controller='viewItems',action='index')))
149
150        c.initialSetupJSON = utils.toJSON(initialSetup) 
151        c.initialStatus = utils.toJSON(status)
152       
153        return render('wmsviz')
154
155    def _buildInitialSetup(self, endpointParam):
156        initialSetup = []
157       
158        if endpointParam != None:
159           
160            for ep in self.inputs['ENDPOINT'].split(','):
161                endpoint = {}
162                o = urlparse.urlparse(ep)
163               
164                if o.path.find(':') > 0:
165                    path = o.path[:o.path.find(':')]
166
167                    url = "%(scheme)s://%(hostname)s%(port)s%(path)s" % {
168                        'scheme' : o.scheme if o.scheme != None else '',
169                        'hostname' : o.hostname if o.hostname != None else '',
170                        'port' : ':' + str(o.port) if o.port != None else '',
171                        'path': path,
172                    }
173                    layers = o.path[o.path.find(':')+1:].split('|')
174                   
175                    endpoint['layers'] = layers
176                else:
177                    url = ep
178                    layers = ""
179               
180                endpoint['url'] = url
181
182                initialSetup.append(endpoint)
183               
184        return initialSetup       
185
186    def addViewItem(self,endpoint):
187        """
188        Add a selected item to the session
189         - if this is the first item, then display the selections tab
190         @param endpoint: WMC endpoint
191        """
192       
193        item = selectedItem.SelectedItem(None, None, None, endpoint)
194       
195        selections = [item,]
196        # avoid duplicates
197        if 'viewItems' in session:
198            for selection in session['viewItems']:
199                if selection.wmcURL != endpoint:
200                    selections.append(selection)
201                   
202        session['viewItems'] = selections
203        session.save() 
204       
205   
206    def removeViewItem(self,endpoint):
207        """
208        Remove view item from session data
209        - NB, do this by rebuilding the session data without the input data included
210        @param endpoint: The WMC endpoint of the view item to remove
211        """
212        selections = []
213        for selection in session['viewItems']:
214            if selection.wmcURL != endpoint:
215                selections.append(selection)
216               
217        # if the new list is empty, remove the session variable
218        if len(selections) == 0:
219            del session['viewItems']
220            c.UpdatePageTabs=1
221        else:
222            session['viewItems'] = selections
223        session.save()
224       
225    def removeAllViewItems(self):
226        """
227        Remove all old view items - clears out old endpoints
228        """
229        session['viewItems']=[]
230        session.save()
231       
232
233
234   
235    def get_figure(self):
236        log.debug("running wmsvis.get_figure")
237       
238        params = request.params
239       
240        log.debug("params = %s" % (params,))
241       
242        format = params.pop('figFormat', 'image/png')
243       
244        finalImage = build_figure(params)
245       
246        response.headers['content-type'] = format
247       
248        buffer = StringIO()
249        finalImage.save(buffer, self._pilImageFormats[format])
250       
251        response.headers['Content-Type'] = format
252        response.write(buffer.getvalue()) 
253
254
255
Note: See TracBrowser for help on using the repository browser.