source: cowsclient/trunk/cowsclient/controllers/wcsdown.py @ 5836

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

Added regular expression matching to the layer defaults settings, also added urllib unquoting of values from the displayOptions file (to allow commas to be passed through to the actual value sent.)

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
8"""
9
10import time
11import logging
12
13import paste
14from owslib.wcs import WebCoverageService
15
16import cowsclient.lib.utils as utils
17from cowsclient.lib.base import BaseController, g, response, config, request, c, render
18from cowsclient.lib.wmc_util import proxyFix, resetProxy
19from cowsclient.model.date_time_options import DateTimeOptionsBuilder
20from cowsclient.lib.wmc_util import parseEndpointString
21
22log = logging.getLogger(__name__)
23
24class WcsdownController(BaseController):
25   
26   
27    def index(self):
28        """
29        Default controller method to handle the initial requests to the page
30        """
31        st = time.time()
32        params = self._getParams()
33
34        #get the list of default WCS endpoints
35        c.defaultWCSEndpoints =  utils.toJSON(utils.readEndpoints().get('WCS',None))
36       
37        log.debug("params = %s" % (params,))
38       
39        endpoint = params.get('ENDPOINT', None)
40        bbox = params.get('BBOX', None)
41        c.time = params.get('TIME', None)
42        c.time_end = params.get('TIME_END', None)
43        layer = params.get('LAYER', None)
44        format = params.get('FORMAT', None)
45        crs = params.get('CRS', None)
46        c.message = params.get('MESSAGE', "")
47        c.singleTimePoint = params.get('SINGLE_TIME', "")
48       
49        layers = []
50        supportedFormats = []
51        supportedCRS = []
52        bboxLimits = None
53        timepositions = None
54       
55        if endpoint != None:
56           
57            st1 = time.time()
58            wcs, layers = self._getWCSObj(endpoint)
59            log.debug("retrieved wcs metadata in  = %s" % (time.time() - st1,))
60           
61            if layer != None:
62                st1 = time.time()
63                layerMetadata, bboxLimits, timepositions, supportedFormats, supportedCRS =\
64                       self._getWCSMetadata(wcs, layer)
65                log.debug("retrieved layer metadata in  = %s" % (time.time() - st1,))
66               
67       
68        if bbox != None:
69            c.selected_bbox = bbox
70        elif bboxLimits != None:
71            c.selected_bbox = bboxLimits
72        else:
73            c.selected_bbox = '-180.0,-90.0,180.0,90.0'
74       
75       
76        if timepositions != None:
77            builder = DateTimeOptionsBuilder(timepositions)
78            options = builder.buildOptions()
79            #log.debug("options = %s" % (options,))
80            c.timedata = utils.toJSON(options) 
81           
82        c.endpoint = endpoint
83       
84        c.selected_layer = layer
85        c.layer_options = [(x,x) for x in layers]
86        c.layer_options.insert(0, ("","")) #add an empty value at the start
87       
88        c.selected_format = format
89        c.format_options = [(x,x) for x in supportedFormats]
90        c.format_options.insert(0, ("","")) #add an empty value at the start
91       
92        c.selected_crs = crs
93        c.crs_options = [(x,x) for x in supportedCRS]
94        c.crs_options.insert(0, ("","")) #add an empty value at the start
95       
96        #get server information from config file
97        g.server=config['app_conf']['serverurl']
98       
99        params = {}
100        for paramString in config['download_baselayer.params'].split(','):
101            key, value = paramString.split(':')
102            params[key] = value
103       
104        baseLayerObj = {"url":config['download_baselayer.url'], "params": params }
105       
106        c.baseLayerJSON = utils.toJSON(baseLayerObj) 
107       
108        log.debug("rendering template after %ss" % (time.time() - st,))
109        return render('wcsdown')
110   
111   
112    def download(self):
113       
114        params = self._getParams()
115        log.debug("params = %s" % (params,))
116       
117        endpoint = params.get('ENDPOINT')
118       
119        args = {}
120        args['identifier'] = params['LAYER']
121        args['bbox'] = tuple(params.get('BBOX').split(','))
122        args['format'] = params['FORMAT']
123        args['crs'] = params['CRS']
124
125        if (params.get('SINGLE_TIME',"").upper() == 'TRUE'):
126            args['time'] = [params.get('TIME')]
127        else:
128            args['time'] = [params.get('TIME'), params.get('TIME_END')]
129       
130        wcs, layers = self._getWCSObj(endpoint)
131       
132        log.debug("wcs.url = %s" % (wcs.url,))
133       
134        assert args['identifier'] in layers
135       
136        log.debug("args = %s" % (args,))
137       
138        oldProxy = proxyFix(endpoint)
139        try:
140            output = wcs.getCoverage(**args)
141        except Exception, e:
142            log.exception("Exception occurred")
143            raise
144        finally:
145            resetProxy(oldProxy)
146       
147        log.debug("output = %s" % (output,))
148       
149        log.debug("output.headers.keys() = %s" % (output.headers.keys(),))
150        log.debug("output.geturl() = %s" % (output.geturl(),))
151       
152        response.headers['Content-Type']=output.headers['Content-Type']
153       
154        if 'Content-Disposition' in output.headers.keys():
155            log.debug("output.headers['Content-Disposition'] = %s" % (output.headers['Content-Disposition'],))
156            response.headers['Content-Disposition'] = output.headers['Content-Disposition']
157        else:
158            response.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename='download')
159           
160        return output.read()
161       
162       
163
164    def _getWCSObj(self, endpoint):
165        oldProxy = proxyFix(endpoint)
166        try:
167           
168            log.debug("wcs endpoint = %s" % (endpoint,))
169           
170            getCapabilitiesEndpoint = parseEndpointString(endpoint, 
171                        {'Service':'WCS', 'Request':'GetCapabilities'})
172           
173            log.debug("wcs endpoint = %s" % (getCapabilitiesEndpoint,))
174           
175            wcs=WebCoverageService(getCapabilitiesEndpoint, version='1.0.0')
176           
177            layers = [x[0] for x in wcs.items()]
178        finally:
179            resetProxy(oldProxy)
180       
181        return wcs, layers
182   
183    def _getWCSMetadata(self, wcs, layer):
184       
185        oldProxy = proxyFix(wcs.url)
186        try:
187            layerMetadata = wcs[layer]
188            bboxLimits = ','.join([str(x) for x in layerMetadata.boundingBoxWGS84])
189            timepositions = layerMetadata.timepositions
190            supportedFormats = layerMetadata.supportedFormats 
191            supportedCRS = layerMetadata.supportedCRS         
192
193        finally:
194            resetProxy(oldProxy)
195       
196        return layerMetadata, bboxLimits, timepositions, supportedFormats, supportedCRS
197       
198    def _getParams(self):
199       
200        params = {}
201        for k in request.params.keys():
202            value = request.params[k]
203            if value == "":
204                value = None
205           
206            if value.__class__ == unicode:
207                value = value.encode('latin-1')
208               
209            params[k.upper()] = value
210       
211        return params
212       
Note: See TracBrowser for help on using the repository browser.