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

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

Made some improvements to the wcsdown page and fixed a couple of layout issues.

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