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

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

Added the YUI 2.7.0 library to the repository.

Added a combobox to the wcs download page that displays some pre-entered wcs url's.

Also improved the LegendContainer? so that it now uses the url provided in the capabilities response.

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