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

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

removed commented out 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
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        lp = OutlineLayersConfigParser()
109
110               
111        layersList = lp.getOutlineLayerList('wcsdown')
112        log.debug("layerList = %s" % (layersList,))
113       
114        c.baseLayerJSON = utils.toJSON(layersList) 
115       
116        log.debug("rendering template after %ss" % (time.time() - st,))
117        return render('wcsdown.html')
118   
119   
120    def download(self):
121       
122        params = self._getParams()
123        log.debug("params = %s" % (params,))
124       
125        endpoint = params.get('ENDPOINT')
126       
127        args = {}
128        args['identifier'] = params['LAYER']
129        args['bbox'] = tuple(params.get('BBOX').split(','))
130        args['format'] = params['FORMAT']
131        args['crs'] = params['CRS']
132
133        if (params.get('SINGLE_TIME',"").upper() == 'TRUE'):
134            args['time'] = [params.get('TIME')]
135        else:
136            args['time'] = [params.get('TIME'), params.get('TIME_END')]
137       
138        wcs, layers = self._getWCSObj(endpoint)
139       
140        log.debug("wcs.url = %s" % (wcs.url,))
141       
142        assert args['identifier'] in layers
143       
144        log.debug("args = %s" % (args,))
145       
146        oldProxy = proxyFix(endpoint)
147        try:
148            output = wcs.getCoverage(**args)
149        except Exception, e:
150            log.exception("Exception occurred")
151            raise
152        finally:
153            resetProxy(oldProxy)
154       
155        log.debug("output = %s" % (output,))
156       
157        log.debug("output.headers.keys() = %s" % (output.headers.keys(),))
158        log.debug("output.geturl() = %s" % (output.geturl(),))
159       
160        response.headers['Content-Type']=output.headers['Content-Type']
161       
162        log.debug("output.headers.keys() = %s" % (output.headers.keys(),))
163       
164        contentDescription = None
165       
166        for k in output.headers.keys():
167            if k.lower() == 'content-disposition':
168                contentDescription = output.headers[k]
169       
170        if contentDescription is not None:
171            log.debug("contentDescription = %s" % (contentDescription,))
172            response.headers['Content-Disposition'] = contentDescription
173        else:
174            response.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename='download')
175           
176        return output.read()
177       
178       
179
180    def _getWCSObj(self, endpoint):
181        oldProxy = proxyFix(endpoint)
182        try:
183           
184            log.debug("wcs endpoint = %s" % (endpoint,))
185           
186            getCapabilitiesEndpoint = parseEndpointString(endpoint, 
187                        {'Service':'WCS', 'Request':'GetCapabilities'})
188           
189            log.debug("wcs endpoint = %s" % (getCapabilitiesEndpoint,))
190            #requires OWSLib with cookie support
191            wcs=WebCoverageService(getCapabilitiesEndpoint, version='1.0.0',cookies= request.headers.get('Cookie', ''))
192           
193            layers = [x[0] for x in wcs.items()]
194        finally:
195            resetProxy(oldProxy)
196       
197        return wcs, layers
198   
199    def _getWCSMetadata(self, wcs, layer):
200       
201        oldProxy = proxyFix(wcs.url)
202        try:
203            layerMetadata = wcs[layer]
204            bboxLimits = ','.join([str(x) for x in layerMetadata.boundingBoxWGS84])
205            timepositions = layerMetadata.timepositions
206            supportedFormats = layerMetadata.supportedFormats 
207            supportedCRS = layerMetadata.supportedCRS         
208
209        finally:
210            resetProxy(oldProxy)
211       
212        return layerMetadata, bboxLimits, timepositions, supportedFormats, supportedCRS
213       
214    def _getParams(self):
215       
216        params = {}
217        for k in request.params.keys():
218            value = request.params[k]
219            if value == "":
220                value = None
221           
222            if value.__class__ == unicode:
223                value = value.encode('latin-1')
224               
225            params[k.upper()] = value
226       
227        return params
228       
Note: See TracBrowser for help on using the repository browser.