source: cowsclient/tags/1.6.0-py2.6/cowsclient/controllers/wmsviz.py @ 7593

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cowsclient/tags/1.6.0-py2.6/cowsclient/controllers/wmsviz.py@7593
Revision 7593, 7.4 KB checked in by astephen, 10 years ago (diff)

Tagged version updated to be compatible with:

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