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

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

Fixed the wcsdownload bounding box selection map so that it works with the new bounds control.

Also modified the templates to look for a custom config file value to set the Openlayers.js path, otherwise the compressed one will be used. Hopefully this will stop me committing the code with the wrong path.

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
12
13from cowsclient.lib.base import * #BaseController, g, response, config, request, c, session, render etc
14from paste.request import parse_querystring
15#from ows_server.models import Utilities
16from cowsclient.lib.wmc_util import GetWebMapContext, GetWebMapCapabilities, GetLegend, openURL, GetResponse
17from cowsclient.model import selectedItem
18from cowsclient.lib.build_figure import build_figure
19from cowsclient.lib.display_options_config import getDisplayOptionsConfig
20
21import cowsclient.lib.utils as utils
22
23import urlparse
24from cStringIO import StringIO
25
26   
27import logging
28log = logging.getLogger(__name__)
29import urllib, urllib2
30
31class WmsvizController(BaseController):
32   
33    _pilImageFormats = {
34        'image/png': 'PNG',
35        'image/jpg': '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        log.debug("self.inputs = %s" % (self.inputs,))
58        # check if we're doing an AJAX callback to get some WMC data
59        if 'REQUEST' in self.inputs:
60                       
61            if self.inputs['REQUEST'] == 'GetWebMapContext':
62                wmc= GetWebMapContext(self)
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                return           
71           
72            elif self.inputs['REQUEST'] == 'GetLegend':
73                return GetLegend(self)
74           
75            if self.inputs['REQUEST'] == 'GetDisplayOptions':
76               
77                jsonTxt = GetResponse(self.inputs['URL'])
78               
79                response.headers['Content-Type'] = 'application/json'
80                response.write(jsonTxt)
81                return
82               
83
84       
85        #get server information from config file
86        g.server=config['app_conf']['serverurl']
87   
88   
89        initialSetup = self._buildInitialSetup(self.inputs.get('ENDPOINT'))
90       
91        #TODO: WORK OUT HOW TO COUPLE THIS TO BROWSE
92        # otherwise, we can get here by two routes:
93        # i) either by clicking on the WMC icon in the details view - if so, get passed endpoint and add to
94        #    selected items;
95        # ii) or from the selections tab - which will already have set up the correct selected items
96           
97        # if ENDPOINT specified, we've reached the page via the WMC icon
98       
99        session['test'] = "test"
100       
101        #This will ensure that NDG security is triggered if a secured dataset is in Endpoint
102        if 'ENDPOINT' in self.inputs:
103            #clear out old endpoints NOTE. this means only one endpoint at a time can be viewed. May want to
104        #rethink this to enable 'shopping cart' type selection.
105#        self.removeAllViewItems()
106            for endpoint in initialSetup:
107                urlstring=endpoint['url']+'?request=GetCapabilities&Service=WMS'
108                #urlstring=str(self.inputs['ENDPOINT'])
109                req = urllib2.Request(urlstring)
110                req.add_header('Cookie', request.headers.get('Cookie', ''))
111                try:
112                   filehandle = openURL(req)
113                   filehandle.close()
114                except urllib2.HTTPError, e:           
115                    log.exception("exception occurred")
116                    if e.code == 401:
117                        log.info ('401 unauthorized error in cowsclient')
118                        return abort(401) #triggers ndg security framework
119                    elif e.code == 403:  #TODO: 403 response is UNTESTED.
120                        # User is authenticated but doesn't have the required permissions
121                        # or an error occurred in the authorization process
122                        # Read response                   
123                        xresponse = e.read()
124                        # Send response to user
125                        self.start_response("%d %s" % (e.code, e.msg), e.headers.dict.items())
126                        return xresponse
127               
128       
129        # avoid page crashing if we come here without view items defined
130#        if 'viewItems' not in session:
131#            h.redirect_to(h.url_for(controller='discovery'))
132#                                       
133        session.save() 
134        log.info('SAVED SESSION')
135       
136        # check if page has been visited before; if not display tab
137#        if (Utilities.isTabRequired(c.pageTabs, 'View')):
138#            c.pageTabs.append(('View', h.url_for(controller='viewItems',action='index')))
139
140
141        c.defaultWMSEndpoints =  utils.toJSON(utils.readEndpoints().get('WMS',None))
142           
143        c.initialSetupJSON = utils.toJSON(initialSetup) 
144       
145        displayOptsConfig = getDisplayOptionsConfig()
146       
147        if 'HideOptions' in displayOptsConfig:
148            c.hideDisplayOptions = utils.toJSON(displayOptsConfig['HideOptions'])
149
150        if 'DefaultOptions' in displayOptsConfig:
151            c.defaultOptions = utils.toJSON(displayOptsConfig['DefaultOptions'])
152       
153        log.debug("c.defaultOptions = %s" % (c.defaultOptions,))
154       
155        params = {}
156        for paramString in config['baselayer.params'].split(','):
157            key, value = paramString.split(':')
158            params[key] = value
159       
160        baseLayerObj = {"url":config['baselayer.url'], "params": params }
161       
162        c.baseLayerJSON = utils.toJSON(baseLayerObj) 
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.