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

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

Modified the WCS code to work with the csml files in folders in the same way as the WMS code.

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