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

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

Moved some of the initial setup values from the wmsviz controller to a status builder class.

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