source: cowsclient/branches/migrate-py26-pylons10/cowsclient/controllers/wcsdown.py @ 7348

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cowsclient/branches/migrate-py26-pylons10/cowsclient/controllers/wcsdown.py@7348
Revision 7348, 7.9 KB checked in by spascoe, 10 years ago (diff)

Various controller and template upgrades for 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
8"""
9
10import time
11import logging
12
13import paste
14from owslib.wcs import WebCoverageService
15
16from cowsclient.lib.base import BaseController, response, config, request, c, render
17from cowsclient.lib.base import app_globals as g
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.html')
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            #requires OWSLib with cookie support
199            wcs=WebCoverageService(getCapabilitiesEndpoint, version='1.0.0',cookies= request.headers.get('Cookie', ''))
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.