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

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

First attempt at extending the make figure code to include metadata and legends.

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, parseEndpointString
25from cowsclient.lib.build_figure import build_figure
26from cowsclient.lib.status_builder import StatusBuilder
27
28from cowsclient.lib.base import request
29
30log = logging.getLogger(__name__)
31
32class WmsvizController(BaseController):
33   
34    _pilImageFormats = {
35        'image/png': 'PNG',
36        'image/jpg': 'JPEG',
37        'image/jpeg': 'JPEG',
38        'image/gif': 'GIF',
39        'image/tiff': 'TIFF'
40    }
41   
42    indexTemplate = 'wmsviz'
43   
44    def index(self):
45        """
46        Default controller method to handle the initial requests to the page
47        """
48        log.debug('endtered wmsviz controller index action')
49       
50        g.helpIcon='layout/icons/help.png'  #needs to go in config
51       
52        self.inputs=dict(parse_querystring(request.environ))
53        log.info(self.inputs)
54        c.wmcURL = ""
55       
56        # check if all we're doing is removing a view item
57        if 'removeItem' in self.inputs:
58            return self.removeViewItem(self.inputs['removeItem'])
59       
60       
61        # check if we're doing an AJAX callback to get some WMC data
62        if 'REQUEST' in self.inputs:
63                       
64            if self.inputs['REQUEST'] == 'GetWebMapContext':
65                wmc= GetWebMapContext(self)
66                log.debug("finished wmsviz controller index action, req = GetWebMapContext")
67                return wmc
68           
69            if self.inputs['REQUEST'] == 'GetWebMapCapabilities':
70                wmcDoc = GetWebMapCapabilities(self.inputs['ENDPOINT'])
71               
72                response.headers['Content-Type'] = 'text/xml'
73                response.write(wmcDoc)
74                log.debug("finished wmsviz controller index action, req = GetWebMapCapabilities")
75                return           
76           
77            elif self.inputs['REQUEST'] == 'GetLegend':
78                resp = GetLegend(self)
79                log.debug("finished wmsviz controller index action, req = GetLegend")
80                return resp
81           
82            if self.inputs['REQUEST'] == 'GetDisplayOptions':
83               
84                jsonTxt = GetResponse(self.inputs['URL'])
85               
86                response.headers['Content-Type'] = 'application/json'
87                response.write(jsonTxt)
88                log.debug("finished wmsviz controller index action, req = GetDisplayOptions")
89                return
90           
91            if self.inputs['REQUEST'] == 'GetAxisConfig':
92               
93                respText = GetResponse(self.inputs['URL'])
94               
95                response.headers['Content-Type'] = 'text/xml'
96                response.write(respText)
97                return           
98               
99
100       
101        #get server information from config file
102        g.server=config['app_conf']['serverurl']
103   
104        statusBuilder = StatusBuilder()
105       
106        status = statusBuilder.getCurrentStatus('wmsviz')
107
108        initialSetup = self._buildInitialSetup(self.inputs.get('ENDPOINT'))
109       
110
111        session.save() 
112        log.info('SAVED SESSION')
113
114        c.initialSetupJSON = utils.toJSON(initialSetup) 
115        c.initialStatus = utils.toJSON(status)
116       
117       
118        log.debug("request.params = %s" % (request.params,))
119        log.debug("request.headers = %s" % (request.headers,))
120       
121        log.debug("finished wmsviz controller index action")
122       
123        return render(self.indexTemplate)
124
125    def _buildInitialSetup(self, endpointParam):
126        initialSetup = []
127       
128        if endpointParam != None:
129           
130            for ep in self.inputs['ENDPOINT'].split(','):
131                endpoint = {}
132                o = urlparse.urlparse(ep)
133               
134                if o.path.find(':') > 0:
135                    path = o.path[:o.path.find(':')]
136
137                    url = "%(scheme)s://%(hostname)s%(port)s%(path)s" % {
138                        'scheme' : o.scheme if o.scheme != None else '',
139                        'hostname' : o.hostname if o.hostname != None else '',
140                        'port' : ':' + str(o.port) if o.port != None else '',
141                        'path': path,
142                    }
143                    layers = o.path[o.path.find(':')+1:].split('|')
144                   
145                    endpoint['layers'] = layers
146                else:
147                    url = ep
148                    layers = ""
149               
150                endpoint['url'] = url
151
152                initialSetup.append(endpoint)
153               
154        return initialSetup       
155
156    def addViewItem(self,endpoint):
157        """
158        Add a selected item to the session
159         - if this is the first item, then display the selections tab
160         @param endpoint: WMC endpoint
161        """
162       
163        item = selectedItem.SelectedItem(None, None, None, endpoint)
164       
165        selections = [item,]
166        # avoid duplicates
167        if 'viewItems' in session:
168            for selection in session['viewItems']:
169                if selection.wmcURL != endpoint:
170                    selections.append(selection)
171                   
172        session['viewItems'] = selections
173        session.save() 
174       
175   
176    def removeViewItem(self,endpoint):
177        """
178        Remove view item from session data
179        - NB, do this by rebuilding the session data without the input data included
180        @param endpoint: The WMC endpoint of the view item to remove
181        """
182        selections = []
183        for selection in session['viewItems']:
184            if selection.wmcURL != endpoint:
185                selections.append(selection)
186               
187        # if the new list is empty, remove the session variable
188        if len(selections) == 0:
189            del session['viewItems']
190            c.UpdatePageTabs=1
191        else:
192            session['viewItems'] = selections
193        session.save()
194       
195    def removeAllViewItems(self):
196        """
197        Remove all old view items - clears out old endpoints
198        """
199        session['viewItems']=[]
200        session.save()
201       
202
203
204   
205    def get_figure(self):
206        log.debug("running wmsvis.get_figure")
207       
208        params = request.params
209       
210        log.debug("params = %s" % (params,))
211       
212        format = params.pop('figFormat', 'image/png')
213       
214        finalImage = build_figure(params)
215       
216        response.headers['content-type'] = format
217       
218        buffer = StringIO()
219        finalImage.save(buffer, self._pilImageFormats[format])
220       
221        response.headers['Content-Type'] = format
222        response.write(buffer.getvalue()) 
223
224
225
Note: See TracBrowser for help on using the repository browser.