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

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

Moved all the server side config file parsing into a single config_file_parser module.

Also modified how the Endpoint selection works on the UI. The endpoint dropdown is now it's own control allowing its complexity to be hidden form the layerControl.

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, parseEndpointString
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('endtered wmsviz controller index action')
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                log.debug("finished wmsviz controller index action, req = GetWebMapContext")
63                return wmc
64           
65            if self.inputs['REQUEST'] == 'GetWebMapCapabilities':
66                wmcDoc = GetWebMapCapabilities(self.inputs['ENDPOINT'])
67               
68                response.headers['Content-Type'] = 'text/xml'
69                response.write(wmcDoc)
70                log.debug("finished wmsviz controller index action, req = GetWebMapCapabilities")
71                return           
72           
73            elif self.inputs['REQUEST'] == 'GetLegend':
74                resp = GetLegend(self)
75                log.debug("finished wmsviz controller index action, req = GetLegend")
76                return resp
77           
78            if self.inputs['REQUEST'] == 'GetDisplayOptions':
79               
80                jsonTxt = GetResponse(self.inputs['URL'])
81               
82                response.headers['Content-Type'] = 'application/json'
83                response.write(jsonTxt)
84                log.debug("finished wmsviz controller index action, req = GetDisplayOptions")
85                return
86           
87            if self.inputs['REQUEST'] == 'GetAxisConfig':
88               
89                respText = GetResponse(self.inputs['URL'])
90               
91                response.headers['Content-Type'] = 'text/xml'
92                response.write(respText)
93                return           
94               
95
96       
97        #get server information from config file
98        g.server=config['app_conf']['serverurl']
99   
100        statusBuilder = StatusBuilder()
101       
102        status = statusBuilder.getCurrentStatus('wmsviz')
103
104        initialSetup = self._buildInitialSetup(self.inputs.get('ENDPOINT'))
105       
106        #TODO: WORK OUT HOW TO COUPLE THIS TO BROWSE
107        # otherwise, we can get here by two routes:
108        # i) either by clicking on the WMC icon in the details view - if so, get passed endpoint and add to
109        #    selected items;
110        # ii) or from the selections tab - which will already have set up the correct selected items
111           
112        # if ENDPOINT specified, we've reached the page via the WMC icon
113       
114        #This will ensure that NDG security is triggered if a secured dataset is in Endpoint
115        if 'ENDPOINT' in self.inputs:
116        #clear out old endpoints NOTE. this means only one endpoint at a time can be viewed. May want to
117        #rethink this to enable 'shopping cart' type selection.
118#        self.removeAllViewItems()
119            for endpoint in initialSetup:
120                urlstring=endpoint['url']+'?request=GetCapabilities&Service=WMS'
121                urlstring = parseEndpointString(endpoint['url'], 
122                                {'REQUEST':'GetCapabilities', 'SERVICE':'WMS'})
123                #urlstring=str(self.inputs['ENDPOINT'])
124                req = urllib2.Request(urlstring)
125                req.add_header('Cookie', request.headers.get('Cookie', ''))
126                try:
127                    filehandle = openURL(req)
128                    filehandle.close()
129                except urllib2.HTTPError, e:           
130                    log.exception("exception occurred")
131                    if e.code == 401:
132                        log.info ('401 unauthorized error in cowsclient')
133                        return abort(401) #triggers ndg security framework
134                    elif e.code == 403:  #TODO: 403 response is UNTESTED.
135                        # User is authenticated but doesn't have the required permissions
136                        # or an error occurred in the authorization process
137                        # Read response                   
138                        xresponse = e.read()
139                        # Send response to user
140                        self.start_response("%d %s" % (e.code, e.msg), e.headers.dict.items())
141                         
142                        return xresponse
143               
144       
145        # avoid page crashing if we come here without view items defined
146#        if 'viewItems' not in session:
147#            h.redirect_to(h.url_for(controller='discovery'))
148
149        session.save() 
150        log.info('SAVED SESSION')
151       
152        # check if page has been visited before; if not display tab
153#        if (Utilities.isTabRequired(c.pageTabs, 'View')):
154#            c.pageTabs.append(('View', h.url_for(controller='viewItems',action='index')))
155
156        c.initialSetupJSON = utils.toJSON(initialSetup) 
157        c.initialStatus = utils.toJSON(status)
158       
159       
160
161       
162        log.debug("finished wmsviz controller index action")
163       
164        return render('wmsviz')
165
166    def _buildInitialSetup(self, endpointParam):
167        initialSetup = []
168       
169        if endpointParam != None:
170           
171            for ep in self.inputs['ENDPOINT'].split(','):
172                endpoint = {}
173                o = urlparse.urlparse(ep)
174               
175                if o.path.find(':') > 0:
176                    path = o.path[:o.path.find(':')]
177
178                    url = "%(scheme)s://%(hostname)s%(port)s%(path)s" % {
179                        'scheme' : o.scheme if o.scheme != None else '',
180                        'hostname' : o.hostname if o.hostname != None else '',
181                        'port' : ':' + str(o.port) if o.port != None else '',
182                        'path': path,
183                    }
184                    layers = o.path[o.path.find(':')+1:].split('|')
185                   
186                    endpoint['layers'] = layers
187                else:
188                    url = ep
189                    layers = ""
190               
191                endpoint['url'] = url
192
193                initialSetup.append(endpoint)
194               
195        return initialSetup       
196
197    def addViewItem(self,endpoint):
198        """
199        Add a selected item to the session
200         - if this is the first item, then display the selections tab
201         @param endpoint: WMC endpoint
202        """
203       
204        item = selectedItem.SelectedItem(None, None, None, endpoint)
205       
206        selections = [item,]
207        # avoid duplicates
208        if 'viewItems' in session:
209            for selection in session['viewItems']:
210                if selection.wmcURL != endpoint:
211                    selections.append(selection)
212                   
213        session['viewItems'] = selections
214        session.save() 
215       
216   
217    def removeViewItem(self,endpoint):
218        """
219        Remove view item from session data
220        - NB, do this by rebuilding the session data without the input data included
221        @param endpoint: The WMC endpoint of the view item to remove
222        """
223        selections = []
224        for selection in session['viewItems']:
225            if selection.wmcURL != endpoint:
226                selections.append(selection)
227               
228        # if the new list is empty, remove the session variable
229        if len(selections) == 0:
230            del session['viewItems']
231            c.UpdatePageTabs=1
232        else:
233            session['viewItems'] = selections
234        session.save()
235       
236    def removeAllViewItems(self):
237        """
238        Remove all old view items - clears out old endpoints
239        """
240        session['viewItems']=[]
241        session.save()
242       
243
244
245   
246    def get_figure(self):
247        log.debug("running wmsvis.get_figure")
248       
249        params = request.params
250       
251        log.debug("params = %s" % (params,))
252       
253        format = params.pop('figFormat', 'image/png')
254       
255        finalImage = build_figure(params)
256       
257        response.headers['content-type'] = format
258       
259        buffer = StringIO()
260        finalImage.save(buffer, self._pilImageFormats[format])
261       
262        response.headers['Content-Type'] = format
263        response.write(buffer.getvalue()) 
264
265
266
Note: See TracBrowser for help on using the repository browser.