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

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

Made some improvements to the wcsdown page and fixed a couple of layout issues.

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 urllib2
30
31class WmsvizController(BaseController):
32   
33    _pilImageFormats = {
34        'image/png': 'PNG',
35        'image/jpg': 'JPEG',
36        'image/jpeg': 'JPEG',
37        'image/gif': 'GIF',
38        'image/tiff': 'TIFF'
39    }
40   
41    def index(self):
42        """
43        Default controller method to handle the initial requests to the page
44        """
45        log.debug('wmsviz controller')
46       
47        g.helpIcon='layout/icons/help.png'  #needs to go in config
48       
49        self.inputs=dict(parse_querystring(request.environ))
50        log.info(self.inputs)
51        c.wmcURL = ""
52       
53        # check if all we're doing is removing a view item
54        if 'removeItem' in self.inputs:
55            return self.removeViewItem(self.inputs['removeItem'])
56       
57       
58        log.debug("self.inputs = %s" % (self.inputs,))
59        # check if we're doing an AJAX callback to get some WMC data
60        if 'REQUEST' in self.inputs:
61                       
62            if self.inputs['REQUEST'] == 'GetWebMapContext':
63                wmc= GetWebMapContext(self)
64                return wmc
65           
66            if self.inputs['REQUEST'] == 'GetWebMapCapabilities':
67                wmcDoc = GetWebMapCapabilities(self.inputs['ENDPOINT'])
68               
69                response.headers['Content-Type'] = 'text/xml'
70                response.write(wmcDoc)
71                return           
72           
73            elif self.inputs['REQUEST'] == 'GetLegend':
74                return GetLegend(self)
75           
76            if self.inputs['REQUEST'] == 'GetDisplayOptions':
77               
78                jsonTxt = GetResponse(self.inputs['URL'])
79               
80                response.headers['Content-Type'] = 'application/json'
81                response.write(jsonTxt)
82                return
83               
84
85       
86        #get server information from config file
87        g.server=config['app_conf']['serverurl']
88   
89   
90        initialSetup = self._buildInitialSetup(self.inputs.get('ENDPOINT'))
91       
92        #TODO: WORK OUT HOW TO COUPLE THIS TO BROWSE
93        # otherwise, we can get here by two routes:
94        # i) either by clicking on the WMC icon in the details view - if so, get passed endpoint and add to
95        #    selected items;
96        # ii) or from the selections tab - which will already have set up the correct selected items
97           
98        # if ENDPOINT specified, we've reached the page via the WMC icon
99       
100        session['test'] = "test"
101       
102        #This will ensure that NDG security is triggered if a secured dataset is in Endpoint
103        if 'ENDPOINT' in self.inputs:
104            #clear out old endpoints NOTE. this means only one endpoint at a time can be viewed. May want to
105        #rethink this to enable 'shopping cart' type selection.
106#        self.removeAllViewItems()
107            for endpoint in initialSetup:
108                urlstring=endpoint['url']+'?request=GetCapabilities&Service=WMS'
109                #urlstring=str(self.inputs['ENDPOINT'])
110                req = urllib2.Request(urlstring)
111                req.add_header('Cookie', request.headers.get('Cookie', ''))
112                try:
113                   filehandle = openURL(req)
114                   filehandle.close()
115                except urllib2.HTTPError, e:           
116                    log.exception("exception occurred")
117                    if e.code == 401:
118                        log.info ('401 unauthorized error in cowsclient')
119                        return abort(401) #triggers ndg security framework
120                    elif e.code == 403:  #TODO: 403 response is UNTESTED.
121                        # User is authenticated but doesn't have the required permissions
122                        # or an error occurred in the authorization process
123                        # Read response                   
124                        xresponse = e.read()
125                        # Send response to user
126                        self.start_response("%d %s" % (e.code, e.msg), e.headers.dict.items())
127                        return xresponse
128               
129       
130        # avoid page crashing if we come here without view items defined
131#        if 'viewItems' not in session:
132#            h.redirect_to(h.url_for(controller='discovery'))
133#                                       
134        session.save() 
135        log.info('SAVED SESSION')
136       
137        # check if page has been visited before; if not display tab
138#        if (Utilities.isTabRequired(c.pageTabs, 'View')):
139#            c.pageTabs.append(('View', h.url_for(controller='viewItems',action='index')))
140
141
142        c.defaultWMSEndpoints =  utils.toJSON(utils.readEndpoints().get('WMS',None))
143           
144        c.initialSetupJSON = utils.toJSON(initialSetup) 
145       
146        displayOptsConfig = getDisplayOptionsConfig()
147       
148        if 'HideOptions' in displayOptsConfig:
149            c.hideDisplayOptions = utils.toJSON(displayOptsConfig['HideOptions'])
150
151        if 'DefaultOptions' in displayOptsConfig:
152            c.defaultOptions = utils.toJSON(displayOptsConfig['DefaultOptions'])
153       
154        log.debug("c.defaultOptions = %s" % (c.defaultOptions,))
155       
156        params = {}
157        for paramString in config['baselayer.params'].split(','):
158            key, value = paramString.split(':')
159            params[key] = value
160       
161        baseLayerObj = {"url":config['baselayer.url'], "params": params }
162       
163        c.baseLayerJSON = utils.toJSON(baseLayerObj) 
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.