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

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

Modified the legendContainer to use a generic ajax retriever instead of one just for legends, hopefully this can be reused in other places.

Also fixed a problem with the template that caused invalid JSON to be created if the python object was None or an empty string.

Did some tidying up of the jsvascript files using jslint.

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
165        return render('wmsviz')
166
167    def _buildInitialSetup(self, endpointParam):
168        initialSetup = []
169       
170        if endpointParam != None:
171           
172            for ep in self.inputs['ENDPOINT'].split(','):
173                endpoint = {}
174                o = urlparse.urlparse(ep)
175               
176                if o.path.find(':') > 0:
177                    path = o.path[:o.path.find(':')]
178
179                    url = "%(scheme)s://%(hostname)s%(port)s%(path)s" % {
180                        'scheme' : o.scheme if o.scheme != None else '',
181                        'hostname' : o.hostname if o.hostname != None else '',
182                        'port' : ':' + str(o.port) if o.port != None else '',
183                        'path': path,
184                    }
185                    layers = o.path[o.path.find(':')+1:].split('|')
186                   
187                    endpoint['layers'] = layers
188                else:
189                    url = ep
190                    layers = ""
191               
192                endpoint['url'] = url
193
194                initialSetup.append(endpoint)
195               
196        return initialSetup       
197
198    def addViewItem(self,endpoint):
199        """
200        Add a selected item to the session
201         - if this is the first item, then display the selections tab
202         @param endpoint: WMC endpoint
203        """
204       
205        item = selectedItem.SelectedItem(None, None, None, endpoint)
206       
207        selections = [item,]
208        # avoid duplicates
209        if 'viewItems' in session:
210            for selection in session['viewItems']:
211                if selection.wmcURL != endpoint:
212                    selections.append(selection)
213                   
214        session['viewItems'] = selections
215        session.save() 
216       
217   
218    def removeViewItem(self,endpoint):
219        """
220        Remove view item from session data
221        - NB, do this by rebuilding the session data without the input data included
222        @param endpoint: The WMC endpoint of the view item to remove
223        """
224        selections = []
225        for selection in session['viewItems']:
226            if selection.wmcURL != endpoint:
227                selections.append(selection)
228               
229        # if the new list is empty, remove the session variable
230        if len(selections) == 0:
231            del session['viewItems']
232            c.UpdatePageTabs=1
233        else:
234            session['viewItems'] = selections
235        session.save()
236       
237    def removeAllViewItems(self):
238        """
239        Remove all old view items - clears out old endpoints
240        """
241        session['viewItems']=[]
242        session.save()
243       
244
245
246   
247    def get_figure(self):
248        log.debug("running wmsvis.get_figure")
249       
250        params = request.params
251       
252        log.debug("params = %s" % (params,))
253       
254        format = params.pop('figFormat', 'image/png')
255       
256        finalImage = build_figure(params)
257       
258        response.headers['content-type'] = format
259       
260        buffer = StringIO()
261        finalImage.save(buffer, self._pilImageFormats[format])
262       
263        response.headers['Content-Type'] = format
264        response.write(buffer.getvalue()) 
265
266
267
Note: See TracBrowser for help on using the repository browser.