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

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

Changed the download action to pickup the 'Content-Type' and 'Content-Disposition' form the response of the wcs server.

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