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

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

Added the ability to find WMS and WCS links form a cows server catalog page.

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