Changeset 3631 for TI05-delivery/ows_framework
- Timestamp:
- 17/03/08 15:21:06 (13 years ago)
- Location:
- TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server
- Files:
-
- 21 deleted
- 47 edited
- 23 copied
Legend:
- Unmodified
- Added
- Removed
-
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ndgDiscovery.config
r3119 r3631 61 61 selectI: %(layout)stick.png 62 62 Xicon: %(icondir)sxml.png 63 plot: %(icondir)splot.png 63 64 printer: %(icondir)sprinter.png 64 65 helpIcon: %(icondir)shelp.png … … 75 76 [NDG_A_SERVICE] 76 77 badc.nerc.ac.uk: http://glue.badc.rl.ac.uk/cgi-bin/dxui 77 icon: %(icondir)sdata_aservice.png 78 icon: %(icondir)splot.png 79 #%(icondir)sdata_aservice.png 78 80 icon_alt: A Service 79 81 service_name: A -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/config/environment.py
r2916 r3631 1 1 import os 2 2 3 import pylons.config4 3 import webhelpers 5 4 5 from pylons import config 6 7 import ows_server.lib.app_globals as app_globals 8 import ows_server.lib.helpers 6 9 from ows_server.config.routing import make_map 7 10 8 11 def load_environment(global_conf={}, app_conf={}): 9 map = make_map(global_conf, app_conf)10 12 # Setup our paths 11 13 root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 12 paths = {'root _path': root_path,14 paths = {'root': root_path, 13 15 'controllers': os.path.join(root_path, 'controllers'), 14 16 'templates': [os.path.join(root_path, path) for path in \ … … 16 18 'static_files': os.path.join(root_path, 'public') 17 19 } 20 21 # Initialize config with the basic options 22 config.init_app(global_conf, app_conf, package='ows_server', 23 template_engine='kid', paths=paths) 24 25 config['pylons.g'] = app_globals.Globals() 26 config['pylons.h'] = ows_server.lib.helpers 27 config['routes.map'] = make_map() 18 28 19 29 # The following template options are passed to your template engines 20 tmpl_options = {}30 tmpl_options = config['buffet.template_options'] 21 31 tmpl_options['myghty.log_errors'] = True 22 32 tmpl_options['myghty.escapes'] = dict(l=webhelpers.auto_link, s=webhelpers.simple_format) 23 33 24 34 # Add your own template options config options here, note that all config options will override 25 # any Pylons config options 26 27 # Return our loaded config object 28 return pylons.config.Config(tmpl_options, map, paths) 29 35 # any Pylons config options -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/config/middleware.py
r2629 r3631 6 6 from paste.deploy.converters import asbool 7 7 8 from pylons import config 8 9 from pylons.error import error_template 9 10 from pylons.middleware import ErrorHandler, ErrorDocuments, StaticJavascripts, error_mapper 10 import pylons.wsgiapp11 from pylons.wsgiapp import PylonsApp 11 12 12 13 from ows_server.config.environment import load_environment 13 import ows_server.lib.helpers14 import ows_server.lib.app_globals as app_globals15 14 16 15 from ows_server.config.ndgMiddleware import ndgMiddleware … … 34 33 35 34 # Load our Pylons configuration defaults 36 config = load_environment(global_conf, app_conf) 37 config.init_app(global_conf, app_conf, package='ows_server', 38 template_engine='kid') 35 load_environment(global_conf, app_conf) 39 36 40 37 # Load our default Pylons WSGI app and make g available 41 app = pylons.wsgiapp.PylonsApp(config, helpers=ows_server.lib.helpers, 42 g=app_globals.Globals) 38 app = PylonsApp() 43 39 g = app.globals 44 40 app = ConfigMiddleware(app, conf) … … 62 58 63 59 # Error Handling 64 app = ErrorHandler(app, global_conf, error_template=error_template, **config .errorware)60 app = ErrorHandler(app, global_conf, error_template=error_template, **config['pylons.errorware']) 65 61 66 62 # Display error documents for 401, 403, 404 status codes (if debug is disabled also … … 71 67 app = RegistryManager(app) 72 68 73 static_app = StaticURLParser(config.paths['static_files']) 69 # Allow static files from outside the egg too ... g.htdocs defined in ndgDiscovery.config 70 if g.htdocs: 71 static_paths = [g.htdocs,config['pylons.paths']['static_files']] 72 else: static_paths= [config['pylons.paths']['static_files']] 73 static_app = [StaticURLParser(path) for path in static_paths] 74 74 javascripts_app = StaticJavascripts() 75 app = Cascade( [static_app,javascripts_app, app])75 app = Cascade(static_app +[javascripts_app, app]) 76 76 return app -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/config/ndgMiddleware.py
r3120 r3631 19 19 20 20 self.globals=g 21 self.globals.htdocs=cf.get('DEFAULT','htdocs',None) 21 22 self.globals.localLink=cf.get('layout','localLink',None) 22 23 self.globals.localImage=cf.get('layout','localImage',None) … … 32 33 self.globals.pageLogo="bodcHdr" 33 34 self.globals.icons_xml=cf.get('layout','Xicon') 35 self.globals.icons_plot=cf.get('layout','plot') 34 36 self.globals.icons_prn=cf.get('layout','printer') 35 37 self.globals.icons_A=cf.get('NDG_A_SERVICE','icon') -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/config/routing.py
r3119 r3631 5 5 from routes import Mapper 6 6 7 def make_map( global_conf={}, app_conf={}):7 def make_map(): 8 8 root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 9 9 … … 34 34 35 35 # following is the shell for the rest of the ndg 36 map.connect('',controller='discovery') #remote this when we have something on the main page36 37 37 map.connect('login', controller='login') 38 38 map.connect('getCredentials', controller='login', action='getCredentials') … … 44 44 map.connect('correct/:uri', controller='retrieve', action='correct') 45 45 map.connect('retrieve/:uri', controller = 'retrieve') 46 map.connect('selection',controller='selection',action='index') 47 map.connect('expand/:uri',controller='selection',action='expand') 46 map.connect('selectedItems',controller='selectedItems',action='index') 47 map.connect('viewItems',controller='viewItems',action='index') 48 map.connect('removeViewItem',controller='viewItems',action='index') 49 map.connect('addSelectedItem/:entryid/:kmlurl/:wmcurl/:title/:divid', 50 controller='selectedItems',action='addSelectedItem',kmlurl='',wmcurl='') 51 map.connect('unSelectItem/:entryid/:divid', controller='selectedItems',action='unSelectItem') 52 map.connect('removeSelectedItem/:entryid',controller='selectedItems',action='removeSelectedItem') 48 53 map.connect('visualise', controller='visualise', action='index') 49 54 … … 51 56 #map.connect('csml/:uri', controller='csml_api') 52 57 # Below is the way it worked before with added 53 # 54 map.connect('csml/:file.:format', controller='csml_api', action='index',55 56 map.connect('csml/:file/:(feature).:format', action='getFeature',57 58 map.connect('csml/:file/:feature/:action', controller='csml_api')58 #"csml" path component 59 #map.connect('csml/:file.:format', controller='csml_api', action='index', 60 #format='html') 61 #map.connect('csml/:file/:(feature).:format', action='getFeature', 62 #controller='csml_api', format='html') 63 #map.connect('csml/:file/:feature/:action', controller='csml_api') 59 64 60 65 map.connect('trackback/:uri', controller='trackback') 61 66 map.connect('discovery',controller='discovery') 62 map.connect('updatetab/:value',controller='tabs',action='update')63 map.connect('addSelection/:uri/:name',controller='tabs',action='addSelection')64 map.connect('clear/:value',controller='tabs',action='clear')65 67 map.connect('visualise/:dataset/:view',controller='visualise',action='tabChange') 66 68 map.connect('visualise/:view',controller='visualise',action='featureChange') 67 69 #do this last or else you'll get bizarre behaviour 70 map.connect('',controller='discovery',action='index') 68 71 return map -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/csml_api.py
r2674 r3631 21 21 22 22 if format == 'html': 23 return render _response('csml_describe')23 return render('csml_describe') 24 24 else: 25 return Response(ET.tostring(c.dataset.toXML()), mimetype="text/xml") 25 response.headers['Content-Type'] = 'text/xml' 26 return response.write(ET.tostring(c.dataset.toXML())) 26 27 27 28 def getFeature(self, file, feature, format): … … 30 31 if format == 'html': 31 32 c.feature_obj = f 32 return render _response('csml_describe_feature')33 return render('csml_describe_feature') 33 34 else: 34 35 r = ET.Element("CSML_API"); f.toXML(r) 35 return Response(ET.tostring(r), mimetype=format) 36 response.headers['Content-Type'] = format 37 return response.write(ET.tostring(r)) 36 38 37 39 def subsetToGridSeries(self, file, feature): … … 55 57 56 58 # Write bundle to a response object 57 r = Response(open(bundleFile), mimetype='application/octetstream') 59 response.headers['Content-Type'] = 'application/octetstream' 60 r = response.write(open(bundleFile)) 58 61 r.headers['Content-disposition'] = 'attachment; filename=bundle.zip' 59 62 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/csml_wcs1_0_0.py
r3090 r3631 189 189 if not rstatus: 190 190 c.xml='<div class="error">%s</div>'%c.dataset 191 resp=render _response('error')191 resp=render('error') 192 192 return resp 193 193 194 194 if type(c.dataset) is str: 195 195 #If not a csml datset is some message from exist such as 'access denied' 196 return Response(c.dataset)196 return response(c.dataset) 197 197 return self._renderCapabilities('wcs1_0_0_Capabilities') 198 198 except Exception, e: 199 199 if isinstance(e, OWS_E.OwsError): 200 200 c.ex=e.report 201 r=render _response('ogc_se', format='xml')201 r=render('ogc_se', format='xml') 202 202 r.headers['content-type'] = 'text/xml' 203 203 return r 204 204 elif isinstance(e, ValueError): 205 205 c.xml='<div class="error">%s</div>'%e 206 return render _response('error')206 return render('error') 207 207 else: 208 208 raise OWS_E.NoApplicableCode(e) … … 230 230 self.covDescs=self._buildCoverageDescriptions() 231 231 c.covDescs=self.covDescs 232 r=render _response('wcs1_0_0_DescribeCoverageResponse', format='xml')232 r=render('wcs1_0_0_DescribeCoverageResponse', format='xml') 233 233 r.headers['content-type'] = 'text/xml' 234 234 return r … … 236 236 if isinstance(e, OWS_E.OwsError): 237 237 c.ex=e.report 238 r=render _response('ogc_se', format='xml')238 r=render('ogc_se', format='xml') 239 239 r.headers['content-type'] = 'application/vnd.ogc.se_xml' 240 240 return r 241 241 elif isinstance(e, ValueError): 242 242 c.xml='<div class="error">%s</div>'%e 243 return render _response('error')243 return render('error') 244 244 else: 245 245 raise OWS_E.NoApplicableCode(e) … … 265 265 if not rstatus: 266 266 c.xml='<div class="error">%s</div>'%dataset 267 resp=render _response('error')267 resp=render('error') 268 268 return resp 269 269 feature = dataset.getFeature(identifier) … … 310 310 axisNames=feature.getAxisLabels() 311 311 312 # Extract via CSML.subsetToGridSeries()312 # Extract via CSML.subsetToGridSeries() 313 313 if store: 314 314 #need to farm off to WPS … … 335 335 #STORE=true, STATUS = false: Return Coverage XML document with link to file. 336 336 #use the temp file name (minus extension) as an ID 337 337 338 338 try: 339 339 hostname=request.environ['paste.config']['app_conf']['proxyname'] … … 341 341 hostname=hostname=request.environ['HTTP_HOST'] 342 342 c.hyperlink ='http://'+hostname+'/'+os.path.basename(request.environ['paste.config']['app_conf']['publish_dir'])+'/'+os.path.basename(filename) 343 r=render _response('wcs_getCoverageResponse', format='xml')343 r=render('wcs_getCoverageResponse', format='xml') 344 344 r.headers['content-type'] = 'text/xml' 345 345 #write ndgSec to text file and store with coverage file: … … 361 361 else: 362 362 mType='application/unknown' 363 #Differnce in how Content-Types are handled between pylons 0.9.5 and 0.9.6 364 try: 365 #0.9.6 366 pylons.response.headers['Content-Type']=mType 367 pylons.response.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename=f) 368 return pylons.response(content=fileToReturn) 369 except: 370 #0.9.5 371 r=Response(content=fileToReturn, mimetype=mType) 372 r.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename=f) 373 return r 363 364 response.headers['Content-Type']=mType 365 response.headers['Content-Disposition'] = paste.httpheaders.CONTENT_DISPOSITION(attachment=True, filename=f) 366 return response.write(fileToReturn) 367 374 368 except Exception, e: 375 369 if isinstance(e, OWS_E.OwsError): 376 370 c.ex=e.report 377 r=render _response('ogc_se', format='xml')371 r=render('ogc_se', format='xml') 378 372 #r.headers['content-type'] = 'text/xml' 379 373 r.headers['content-type'] = 'application/vnd.ogc.se_xml' … … 381 375 elif isinstance(e, ValueError): 382 376 c.xml='<div class="error">%s</div>'%e 383 return render _response('error')377 return render('error') 384 378 else: 385 379 raise OWS_E.NoApplicableCode(e) -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/csml_wcs1_1_0.py
r3027 r3631 186 186 if not rstatus: 187 187 c.xml='<div class="error">%s</div>'%c.dataset 188 resp=render _response('error')188 resp=render('error') 189 189 return resp 190 190 191 191 if type(c.dataset) is str: 192 192 #If not a csml datset is some message from exist such as 'access denied' 193 return Response(c.dataset) 193 response.write(c.dataset) 194 return response 194 195 return self._renderCapabilities('ows/wcs_capabilities') 195 196 except Exception, e: … … 198 199 elif isinstance(e, ValueError): 199 200 c.xml='<div class="error">%s</div>'%e 200 return render _response('error')201 return render('error') 201 202 else: 202 203 raise OWS_E.NoApplicableCode(e) … … 223 224 self.covDescs=self._buildCoverageDescriptions() 224 225 c.covDescs=self.covDescs 225 r=render _response('wcs_DescribeCoverageResponse', format='xml')226 r=render('wcs_DescribeCoverageResponse', format='xml') 226 227 r.headers['content-type'] = 'text/xml' 227 228 return r … … 231 232 elif isinstance(e, ValueError): 232 233 c.xml='<div class="error">%s</div>'%e 233 return render _response('error')234 return render('error') 234 235 else: 235 236 raise OWS_E.NoApplicableCode(e) … … 251 252 if not rstatus: 252 253 c.xml='<div class="error">%s</div>'%dataset 253 resp=render _response('error')254 resp=render('error') 254 255 return resp 255 256 feature = dataset.getFeature(identifier) … … 320 321 hostname=g.server 321 322 c.hyperlink =hostname+'/'+os.path.basename(request.environ['paste.config']['app_conf']['publish_dir'])+'/'+os.path.basename(filename) 322 r=render _response('wcs_getCoverageResponse', format='xml')323 r=render('wcs_getCoverageResponse', format='xml') 323 324 r.headers['content-type'] = 'text/xml' 324 325 #write ndgSec to text file and store with coverage file: … … 337 338 netcdfFile=open(filename, 'r') 338 339 c.hyperlink="cid:coverage.nc" 339 xmlfile=render _response('wcs_getCoverageResponse', format='xml')340 xmlfile=render('wcs_getCoverageResponse', format='xml') 340 341 xmlfile.headers['content-type'] = 'text/xml' 341 342 multipart=self._createMultipartMime(xmlfile, netcdfFile) 342 343 msg=multipart 343 try: 344 #0.9.6 345 pylons.response.headers['Content-Type']='multipart' 346 return pylons.response(content=msg) 347 except: 348 #0.9.5 349 return Response(content=msg, mimetype='multipart') 344 345 response.headers['Content-Type']='multipart' 346 response.write(msg) 347 return response 350 348 except Exception, e: 351 349 if isinstance(e, OWS_E.OwsError): … … 353 351 elif isinstance(e, ValueError): 354 352 c.xml='<div class="error">%s</div>'%e 355 return render _response('error')353 return render('error') 356 354 else: 357 355 raise OWS_E.NoApplicableCode(e) -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/csml_wms.py
r2989 r3631 15 15 import ows_server.lib.validators as V 16 16 from ows_server.lib.ndgInterface import interface 17 18 try: #python 2.519 from xml.etree import ElementTree as ET20 except ImportError:21 try:22 # if you've installed it yourself it comes this way23 import ElementTree as ET24 except ImportError:25 # if you've egged it this is the way it comes26 from elementtree import ElementTree as ET27 28 17 from ows_common import exceptions as OWS_E 29 18 from ows_common.wms import * … … 122 111 if not rstatus: 123 112 c.xml='<div class="error">%s</div>' % dataset 124 resp = render_response('error') 125 return resp 113 return render('error') 126 114 127 115 return self._renderCapabilities('ows/wms_capabilities') … … 204 192 if not rstatus: 205 193 c.xml='<div class="error">%s</div>' % dataset 206 resp = render_response('error') 207 return resp 194 return render('error') 208 195 209 196 # Retrieve feature from the layers parameter … … 218 205 img.save(buf, 'PNG') 219 206 220 return Response(content=buf.getvalue(), mimetype='image/png') 207 response.headers['Content-Type'] = 'image/png' 208 response.write(content=buf.getvalue()) 209 return response -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/discovery.py
r3093 r3631 3 3 from ows_server.lib.Date import * 4 4 from ows_server.templates import DiscoveryTemplate 5 from ows_server.models import ndgSearch as NS 6 from ows_server.models.DocumentRetrieve import DocumentRetrieve as DR 7 from ows_server.models.DocumentRetrieve import ndgVocabPOX as VS 5 from ndgUtils import ndgSearch as NS 6 from ndgUtils import DocumentRetrieve as DR 7 from ndgUtils.DocumentRetrieve import ndgVocabPOX as VS 8 from ndgUtils import ndgObject 8 9 from ows_server.models.DIF import DIF 9 from ows_server.templates.renderDiscoverySet import renderDiscoverySet10 10 from ows_server.models.DiscoveryState import DiscoveryState,constraints 11 from ows_server.models.ndgObject import ndgObject12 from ows_server.models.Utilities import myConfig13 11 from ows_server.lib.mailer import mailHandler 14 from ows_server.models.xmlHandler2 import xmlHandler12 from ndgUtils.xmlHandler2 import xmlHandler 15 13 debug=0 16 17 14 18 15 class DiscoveryController(BaseController): … … 25 22 self.inputs=dict(parse_querystring(request.environ)) 26 23 self.message='' 24 27 25 28 26 def index(self): … … 58 56 if self.message!='': 59 57 c.xml='Simple %s:'%self.message 60 return render _response('content')58 return render('content') 61 59 62 60 … … 92 90 if self.message!='': 93 91 c.xml=self.message 94 return render _response('content')92 return render('content') 95 93 96 94 … … 113 111 if self.message!='': 114 112 c.xml=self.message 115 return render _response('content')113 return render('content') 116 114 117 115 if 'constrained' in self.inputs: … … 134 132 135 133 if self.inputs['searchTarget']=='Discovery': 136 ws=NS .ndgSearch(logger=logger)134 ws=NS(logger=logger) 137 135 elif self.inputs['searchTarget'] in ['Browse','NumSim']: 138 136 ws=DR(self.exist[0],pwfile=self.exist[1]) … … 142 140 else: 143 141 c.xml='Unknown searchTarget %s'%self.inputs['searchTarget'] 144 return render _response('error')142 return render('error') 145 143 146 144 documents=ws.search(searchString,start=start,howmany=howmany,target=textTarget, … … 150 148 for i in ws.error:m+='<p>%s</p>'%i 151 149 c.xml=m 152 return render _response('content')150 return render('content') 153 151 154 152 #build constraints info for report … … 165 163 if hits==0: 166 164 c.xml='<p>No records found [%s]</p>'%c.state.constraints 167 return render _response('content')165 return render('content') 168 166 169 167 try: … … 183 181 if results==[]: 184 182 c.xml='<p> No results for "%s"!</p>'%searchString 185 return render _response('content')183 return render('content') 186 184 elif difs==[]: 187 185 c.xml='<p>No usable results for "%s"!</p>'%searchString 188 return render _response('content')186 return render('content') 189 187 else: 190 188 if errors<>[]: … … 204 202 c.xml+='<p> Actually, not even an internal error has been logged. <br/>' 205 203 c.xml+='Internal sending of mail failed with error [%s]</p>'%message 206 return render _response('content')204 return render('content') 207 205 208 206 … … 211 209 session['results']=h.current_url() 212 210 session.save() 211 212 # set up the displayed tabs 213 213 if len(c.pageTabs)==1: 214 214 c.pageTabs.append(('Results',session['results'])) 215 c.pageTabs.append(('Selections', 216 h.url_for(controller='selectedItems', 217 action='index'))) 215 218 elif c.pageTabs[1][0]!='Results': 216 219 c.pageTabs.insert(1,('Results',session['results'])) 217 return render_response('results') 220 selectionsNeeded=1 221 for tab in c.pageTabs[0]: 222 if tab == 'Selections': 223 selectionsNeeded=0 224 if selectionsNeeded: 225 c.pageTabs.append(('Selections', 226 h.url_for(controller='selectedItems', 227 action='index'))) 228 229 return render('results') 218 230 219 231 except ValueError,e: … … 222 234 else: 223 235 c.xml='<p> Error retrieving documents for %s hits is [%s]</p>'%(hits,e) 224 return render _response('content')236 return render('content') 225 237 except Exception,e: 226 238 c.xml='Unknown error %s,%s'%(str(Exception),e) 227 return render _response('error')239 return render('error') 228 240 229 241 def __advancedPrompt(self,searchConstraints=None): … … 257 269 c.source=searchConstraints['scope'] 258 270 c.geoSearchType=(searchConstraints['geoSearchType'] or 'overlaps') 259 260 return render_response('advanced') 271 return render('advanced') 261 272 262 273 def __checkbox(self,bbox): … … 300 311 vs=VS(proxyServer=self.cf.get('DEFAULT','proxyServer')) 301 312 if 'searchString' in self.inputs: 302 [broader,narrower,synonyms]=vs.getRelated(self.inputs['searchString']) 303 #get a base string for the links to new searches 304 if 'start' in self.inputs: del self.inputs['start'] 305 if 'howmany' in self.inputs: del self.inputs['howmany'] 306 self.inputs['searchString']='###SEARCHSSTRING###' 307 q='%s/discovery?'%g.server 308 for i in self.inputs: q+='%s=%s&'%(i,self.inputs[i]) 309 url=q[0:-1] 310 # and now build the links 311 c.narrower=[] 312 c.broader=[] 313 c.synonyms=[] 314 for i in narrower: 315 c.narrower.append((i,url.replace('###SEARCHSSTRING###',i))) 316 for i in broader: 317 c.broader.append((i,url.replace('###SEARCHSSTRING###',i))) 318 for i in synonyms: 319 c.synonyms.append((i,url.replace('###SEARCHSSTRING###',i))) 320 if c.narrower!=[] or c.broader!=[] or c.synonyms!=[]: c.semAvailable=1 313 try: 314 [broader,narrower,synonyms]=vs.getRelated(self.inputs['searchString']) 315 #get a base string for the links to new searches 316 if 'start' in self.inputs: del self.inputs['start'] 317 if 'howmany' in self.inputs: del self.inputs['howmany'] 318 self.inputs['searchString']='###SEARCHSSTRING###' 319 q='%s/discovery?'%g.server 320 for i in self.inputs: q+='%s=%s&'%(i,self.inputs[i]) 321 url=q[0:-1] 322 # and now build the links 323 c.narrower=[] 324 c.broader=[] 325 c.synonyms=[] 326 for i in narrower: 327 c.narrower.append((i,url.replace('###SEARCHSSTRING###',i))) 328 for i in broader: 329 c.broader.append((i,url.replace('###SEARCHSSTRING###',i))) 330 for i in synonyms: 331 c.synonyms.append((i,url.replace('###SEARCHSSTRING###',i))) 332 if c.narrower!=[] or c.broader!=[] or c.synonyms!=[]: c.semAvailable=1 333 except IOError,e: 334 c.semAvailable=0 335 c.semError=' (No valid reply from vocabulary service)' 336 #This should go in a log file ... 337 print 'ERROR: Vocabulary Service: %s (for search [%s])'%(str(e),self.inputs['searchString']) 321 338 else: 322 339 broader,narrower,synonyms=[],[],[] 323 340 c.semAvailable=0 324 325 return render_response('semantic',fragment=True) 341 c.semError='.' 342 343 return render('semantic',fragment=True) 326 344 327 345 def moreSearch(self,ws): … … 333 351 r.link={'Browse':n.BURL,'NumSim':n.URL}[c.searchTarget] 334 352 335 return render _response('short_results')353 return render('short_results') 336 354 337 355 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/error.py
r2476 r3631 21 21 'message': request.params.get('message', ''), 22 22 } 23 return Response(page)23 return response.write(page) 24 24 25 25 def img(self, id): -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/fetch.py
r2930 r3631 41 41 mType=self._getMimeType(file) 42 42 43 #Differnce in how Content-Types are handled between pylons 0.9.5 and 0.9.6 44 try: 45 #0.9.6 46 pylons.response.headers['Content-Type']=mType 47 return pylons.response(content=file) 48 except: 49 #0.9.5 50 return Response(content=fileToReturn, mimetype=mType) 43 response.headers['Content-Type']=mType 44 return response.write(fileToReturn) 51 45 else: 52 46 #return access denied message 53 47 c.xml='<div class="error">%s</div>'%'<p> Access Denied </p><p>Not Logged in</p>' 54 return render _response('error')48 return render('error') -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/login.py
r3062 r3631 52 52 if 'ndgSec' not in session: 53 53 log.debug('No security session details found - offering login...') 54 return render _response('login')54 return render('login') 55 55 56 56 # Session is set in this domain - check it … … 71 71 "getSessionStatus call: %s" % e) 72 72 SecuritySession.delete() 73 return Response(render('content'), code=400) 73 response.status_code = 400 74 return render('content') 74 75 75 76 # Check session status … … 83 84 log.error("Session Manager getSessionStatus returned: %s" % e) 84 85 SecuritySession.delete() 85 return Response(render('login'), code=401) 86 response.status_code = 400 87 return render('login') 86 88 87 89 if bSessOK: … … 94 96 "from cookie and re-displaying login...") 95 97 SecuritySession.delete() 96 return render _response('login')98 return render('login') 97 99 98 100 … … 119 121 'the error to your site administrator' 120 122 log.error("Login: initialising SessionMgrClient: %s" % e) 121 return Response(render('content'), code=400) 123 response.status_code = 400 124 return render('content') 122 125 123 126 # Connect to Session Manager … … 130 133 "pass-phrase and try again." 131 134 log.error("Session Manager connect returned: %s" % e) 132 return Response(render('login'), code=401) 135 response.status_code = 401 136 return render('login') 133 137 134 138 # Cache user attributes in Session Manager … … 141 145 log.info("Session expired getting Attribute Certificate: %s" % e) 142 146 c.xml = "Session has expired, please re-login" 143 return Response(render('login'), code=401) 147 response.status_code = 401 148 return render('login') 144 149 145 150 except AttributeRequestDenied, e: … … 147 152 c.xml = "No authorisation roles are available for your " + \ 148 153 "account. Please check with your site administrator." 149 return Response(render('login'), code=401) 154 response.status_code = 401 155 return render('login') 150 156 151 157 except Exception, e: … … 153 159 c.xml = "An internal error occured. Please report this to " + \ 154 160 "your site administrator." 155 return Response(render('login'), code=400) 161 response.status_code = 400 162 return render('login') 156 163 157 164 log.debug('Completing login...') … … 163 170 roles=attCert.roles, 164 171 sid=sessID) 165 session['panelView']='History'166 172 session.save() 167 173 … … 192 198 c.providers=dict([(k, v['loginURI']) for k, v in hosts.items()]) 193 199 194 if 'panelView' in session: del session['panelView']195 200 session.save() 196 201 197 return render _response('wayf')202 return render('wayf') 198 203 199 204 … … 256 261 credentials refused: there is a problem with the SSL certificate of this site. 257 262 Please report this to your site administrator.""" % returnToHostname 258 return Response(render('login'), code=400) 263 response.status_code = 400 264 return render('login') 259 265 finally: 260 266 testConnection.close() … … 264 270 else: 265 271 c.xml='<p> Logged in </p>' 266 return render _response('content')272 return render('content') -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/logout.py
r3056 r3631 100 100 except Exception, e: 101 101 log.error("logout - decoding return URL: %s" % e) 102 return render _response('content')102 return render('content') 103 103 104 104 # and now go back to whence we had come 105 105 h.redirect_to(b64decReturnTo) 106 106 else: 107 return render _response('content')107 return render('content') -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/retrieve.py
r3069 r3631 1 1 2 2 from ows_server.lib.base import * 3 from ows_server.models import ndgObject, Utilities 3 from ows_server.models import Utilities 4 from ndgUtils import ndgObject 4 5 from paste.request import parse_querystring 5 6 from ows_server.models import stubB,DIF … … 7 8 from ows_server.lib.ndgInterface import interface 8 9 from xml.parsers.expat import ExpatError 9 #from ows_server.models import ndgRetrieve10 10 11 11 class RetrieveController(BaseController): … … 17 17 ''' Common setup stuff for all the actions on this controller ''' 18 18 try: 19 self.uri=ndgObject .ndgObject(uri)19 self.uri=ndgObject(uri) 20 20 except ValueError,e: 21 21 return e … … 26 26 if logger: self.logger=logger 27 27 self.inputs=dict(parse_querystring(request.environ)) 28 29 28 30 # NB: we could have two types of query string argument: 29 31 # format= (raw,html) and … … 35 37 36 38 # Add selected granules to context 37 c.selectedGranules = [g_uri for g_uri, g_name in session.get('selection', [])]39 #c.selectedGranules = [g_uri for g_uri, g_name in session.get('selection', [])] 38 40 39 41 … … 45 47 if status: 46 48 c.xml='<p>%s</p>'%status 47 return Response(render('error'),code=400) 49 response.status_code = 400 50 return render('error') 48 51 49 52 status,x=interface.GetXML(uri,outputSchema=self.outputSchema) … … 51 54 #(the return object x is an xmlHandler object) 52 55 c.xml=x.xmls 53 return Response(c.xml,'application/xml') 56 response.headers['Content-Type'] = 'application/xml' 57 response.write(c.xml) 54 58 else: 55 59 e=404 56 60 if x.startswith('<p> Access'): e=401 57 return Response(render('error'),code=e) 61 response.status_code = e 62 return render('error') 58 63 59 64 def view(self,uri): … … 64 69 if status: 65 70 c.xml='<p>%s</p>'%status 66 return Response(render('error'),code=400) 71 response.status_code = 400 72 return render('error') 73 67 74 status,x=interface.GetXML(uri,outputSchema=self.outputSchema) 68 75 c.title='Viewing [%s]'%self.uri … … 84 91 c.xml=x.tohtml() 85 92 r='content' 86 c.tab='D isplay'93 c.tab='Details' 87 94 elif viewFormat=='DIF': 88 95 r='dif' … … 104 111 c.xml=x.tohtml() 105 112 r='content' 106 c.tab='D isplay'113 c.tab='Details' 107 114 elif self.format=='raw': 108 115 c.xml=x.xmls 109 return Response(c.xml,'application/xml') 116 response.headers['Content-Type'] = 'application/xml' 117 return response.write(c.xml) 110 118 111 119 needed=0 112 120 if 'lastViewed' not in session: needed=1 113 121 session['lastViewed']=h.current_url() 114 if needed: c.pageTabs.append(('D isplay',session['lastViewed']))122 if needed: c.pageTabs.append(('Details',session['lastViewed'])) 115 123 116 if 'ndgSec' in session:117 #we can update the history118 if 'history' not in session:119 session['history']=[(name,uri),]120 else:121 rb=Utilities.RingBuffer(10)122 for i in session['history']: rb.append(i)123 #delete it first, so we get to the top of the queue.124 if (name,uri) in rb: rb.remove((name,uri))125 rb.append((name,uri))126 session['history']=rb.tolist()127 124 session.save() 128 125 code=200 … … 131 128 code=401 132 129 else: code=400 133 c.xml=' <div class="error">%s</div>'%x130 c.xml='%s'%x 134 131 r='error' 135 132 print c.xml 136 133 137 if r=='content': 138 #we're showing an xml document ... but it could go wrong if 134 response.status_code = code 135 try: 136 return render(r) 137 except Exception, e: 138 #we may be showing an xml document ... but it could go wrong if 139 139 #we have crap content ... 140 try: 141 resp=render(r) 142 except ExpatError,e: 140 if isinstance(e, ExpatError): 143 141 c.xml='<p> XML content is not well formed </p>' 144 142 c.doc=str(x) 145 resp=render('error') 146 code=400 147 resp=Response(resp,code=code) 148 else: 149 #resp=Response(render(r),code=code) 150 try: 151 resp=Response(render(r),code=code) 152 except Exception,e: 143 else: 153 144 c.xml='<p> Unexpected error [%s] viewing [%s] </p>'%(str(e),uri) 154 145 c.doc='' 155 code=400 156 resp=Response(render('error'),code=code) 157 return resp 146 response.status_code = 400 147 return render('error') 158 148 159 149 def askCorrect(self,uri): … … 161 151 status=self.__setup(uri) 162 152 c.uri=self.uri 163 if status: return Response(status)164 return render _response('correct',fragment=True)153 if status: return response.write(status) 154 return render('correct',fragment=True) 165 155 166 156 … … 169 159 status=self.__setup(uri) 170 160 if 'ndgSec' not in session: 171 return Response('Not Logged In')161 return response.write('Not Logged In') 172 162 body='Metadata Change Request for %s'%uri 173 163 payload='<Change><uri>%s</uri><from>%s</from><Contents>%s</Contents></Change>'%( … … 181 171 else: 182 172 c.xml=message 183 return render _response('content')173 return render('content') 184 174 185 175 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/status.py
r2650 r3631 29 29 c.polluri='http://'+request.environ['HTTP_HOST']+'/'+csmlfile + '/status/' + jobID 30 30 c.filelink = 'http://'+request.environ['HTTP_HOST']+'/'+os.path.basename(request.environ['paste.config']['app_conf']['publish_dir'])+'/csml_wxs_'+jobID+'nc' 31 r=render_response('wcs_ExecuteResponse', format='xml') 32 r.headers['content-type'] = 'text/xml' 33 return r 31 response.headers['content-type'] = 'text/xml' 32 return render('wcs_ExecuteResponse', format='xml') -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/trackback.py
r2971 r3631 49 49 c.message='Unable to forward trackback to designated recipient [%s]'%message 50 50 51 r=render_response('trackback',format='xml') 52 r.headers['content-type'] = 'text/xml' 53 return r 51 response.headers['content-type'] = 'text/xml' 52 return render('trackback',format='xml') -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/visualise.py
r2881 r3631 18 18 if not rstatus: 19 19 c.xml='<div class="error">%s</div>'%dataset 20 return render _response('error')20 return render('error') 21 21 c.selections[uri]=dataset 22 22 c.names[uri]=name … … 28 28 return 0 29 29 30 # Need two fundamental variables: the granules which ha vebeen selected31 # for *possible* visualisation, and the (up to two) which have been30 # Need two fundamental variables: the granules which has been selected 31 # for *possible* visualisation, and the granules (up to two) which have been 32 32 # selected for *actual* visualisation: 33 33 # session['selection'] holds the uris assocated with the first … … 65 65 c.visible='Granules' 66 66 self.__plotops() 67 return render _response('visualise')67 return render('visualise') 68 68 69 69 def tabChange(self,dataset,view): … … 87 87 c.fullpage=0 88 88 self.__plotops() 89 return render _response('visualise',fragment=True)89 return render('visualise',fragment=True) 90 90 91 91 def featureChange(self,view): … … 120 120 c.fullpage=0 121 121 self.__plotops() 122 return render _response('visualise',fragment=True)122 return render('visualise',fragment=True) 123 123 124 124 def tabcontent(self): -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/app_globals.py
r2616 r3631 1 from pylons import config 2 1 3 class Globals(object): 4 def __init__(self): 5 pass 2 6 3 def __init__(self, global_conf, app_conf, **extra):4 """5 Globals acts as a container for objects available throughout6 the life of the application.7 8 One instance of Globals is created by Pylons during9 application initialization and is available during requests10 via the 'g' variable.11 12 ``global_conf``13 The same variable used throughout ``config/middleware.py``14 namely, the variables from the ``[DEFAULT]`` section of the15 configuration file.16 17 ``app_conf``18 The same ``kw`` dictionary used throughout19 ``config/middleware.py`` namely, the variables from the20 section in the config file for your application.21 22 ``extra``23 The configuration returned from ``load_config`` in24 ``config/middleware.py`` which may be of use in the setup of25 your global variables.26 27 """28 29 30 31 32 33 def __del__(self):34 """35 Put any cleanup code to be run when the application finally exits36 here.37 """38 pass -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/base.py
r3184 r3631 2 2 from urlparse import urlsplit, urlunsplit 3 3 from base64 import urlsafe_b64encode 4 from pylons import Response, c, g, cache, request, session4 from pylons import c, g, cache, request, session, response 5 5 from pylons.controllers import WSGIController 6 6 from pylons.decorators import jsonify, validate 7 from pylons.templating import render , render_response8 from pylons. helpersimport abort, redirect_to, etag_cache7 from pylons.templating import render 8 from pylons.controllers.util import abort, redirect_to, etag_cache 9 9 from pylons.i18n import N_, _, ungettext 10 10 from paste.request import construct_url 11 12 11 import ows_server.models as model 13 12 import ows_server.lib.helpers as h 14 13 from ows_server.lib.security_util import setSecuritySession, LoginServiceQuery 15 14 from ows_common import exceptions as OWS_E 15 from ows_common.operations_metadata import OperationsMetadata, Operation, RequestMethod 16 from ows_common.get_capabilities import ServiceMetadata 17 import ows_common.xml 18 19 20 try: 21 from xml.etree import ElementTree as ET 22 except ImportError: 23 from elementtree import ElementTree as ET 16 24 17 25 import logging 18 26 logger = logging.getLogger(__name__) 19 27 20 21 # OwsController is now in a separate module. Eventually it might be loaded from 22 # a separate egg. 23 from ows_controller import OwsController 28 # Configure 29 EXCEPTION_TYPE = request.environ['ndgConfig'].get('OWS_SERVER', 'exception_type', 'ogc').lower() 24 30 25 31 class BaseController(WSGIController): … … 61 67 setSecuritySession() 62 68 63 if 'panelView' not in session:64 session['panelView']='History'65 69 session.save() 66 70 … … 81 85 82 86 c.pageTabs=[('Search',g.discoveryURL)] 83 if 'results' in session: c.pageTabs.append(('Results',session['results'])) 84 if 'lastViewed' in session: c.pageTabs.append(('Display',session['lastViewed'])) 87 if 'results' in session: 88 c.pageTabs.append(('Results',session['results'])) 89 # make selections tab available once results are shown - to simplify associated business logic 90 c.pageTabs.append(('Selections',h.url_for(controller='selectedItems',action='index'))) 91 92 if 'lastViewed' in session: c.pageTabs.append(('Details',session['lastViewed'])) 85 93 86 if 'selection' in session: 87 c.pageTabs.append(('Selections',h.url_for(controller='selection',action='index'))) 88 c.pageTabs.append(('Visualise',h.url_for(controller='visualise', action='index'))) 89 c.pageTabs.append(('Download','Blah')) 94 if 'viewItems' in session: c.pageTabs.append(('View', h.url_for(controller='viewItems',action='index'))) 90 95 96 # c.pageTabs.append(('Visualise',h.url_for(controller='visualise', action='index'))) 97 # c.pageTabs.append(('Download','Blah')) 98 91 99 return WSGIController.__call__(self, environ, start_response) 92 100 101 class OwsController(BaseController): 102 def __call__(self, environ, start_response): 103 104 # All OWS parameter names are case insensitive. 105 req = request._current_obj() 106 self.ows_params = {} 107 for k in req.params: 108 self.ows_params[k.lower()] = req.params[k] 109 110 # If the EXCEPTION_TYPE is 'pylons' let Pylons catch any exceptions. 111 # Otherwise send an OGC exception report for any OWS_E.OwsError 112 if 'pylons' in EXCEPTION_TYPE: 113 self._fixOwsAction(environ) 114 return super(OwsController, self).__call__(environ, start_response) 115 else: 116 try: 117 self._fixOwsAction(environ) 118 return super(OwsController, self).__call__(environ, start_response) 119 except OWS_E.OwsError, e: 120 logger.exception(e) 121 122 response.headers['content-type'] = 'text/xml' 123 return render('exception_report', report=e.report, format='xml') 124 125 126 def _fixOwsAction(self, environ): 127 # Override the Routes action from the request query parameter 128 try: 129 action = self.ows_params['request'] 130 except KeyError: 131 raise OWS_E.MissingParameterValue('REQUEST parameter not specified', 'REQUEST') 132 133 # Check action is a method in self 134 if not getattr(self, action): 135 raise OWS_E.InvalidParameterValue('request=%s not supported' % action, 'REQUEST') 136 137 # override routes action with request 138 environ['pylons.routes_dict']['action'] = action 139 del self.ows_params['request'] 140 141 def _loadCapabilities(self): 142 """ 143 creates an ows_common.get_capabilities.ServiceMetadata object 144 by consulting the paste configuration and annotations in the 145 controller definition. 146 147 """ 148 # Deduce ows_endpoint from routes 149 ows_endpoint = h.url_for(controller=request.environ['pylons.routes_dict']['controller']) 150 151 #Deduce base_url from config 152 base_url =request.environ['ndgConfig'].get('DEFAULT','server') 153 154 155 # Get the server-level configuration data from an XML file 156 config = request.environ['paste.config'] 157 sm_tree = ET.parse(config['ows_common_config']) 158 sm = ows_common.xml.service_metadata(sm_tree.getroot()) 159 160 # Extract service-level parameters and constraint 161 parameters = getattr(self, '_ows_parameters', {}) 162 constraints = getattr(self, '_ows_constraints', {}) 163 versions = getattr(self, '_ows_versions', []) 164 165 # Extract operation-level parameters and constraints 166 od = {} 167 for attr in dir(self): 168 op = getattr(self, attr) 169 if hasattr(op, '_ows_name'): 170 p = getattr(op, '_ows_parameters', {}) 171 c = getattr(op, '_ows_constraints', {}) 172 od[op._ows_name] = Operation(get=RequestMethod(href=base_url+ows_endpoint), 173 post=None, 174 parameters=p, 175 constraints=c, 176 name=op._ows_name) 177 178 sm.operationsMetadata = OperationsMetadata(od, constraints, parameters) 179 sm.serviceIdentification.serviceTypeVersions = versions 180 return sm 181 182 def _renderCapabilities(self, template='ows/get_capabilities'): 183 """ 184 The standard way of returning a Capabilities document. 185 186 Each subclass should implement self._load_capabilities() and call 187 this method to return a response object. 188 189 """ 190 c.service_metadata = self._loadCapabilities() 191 response.headers['content-type'] = 'text/xml' 192 return render(template, format='xml') 193 93 194 94 195 # Include the '_' function in the public names -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/csml_util.py
r3090 r3631 8 8 @author: Stephen Pascoe 9 9 """ 10 from pylons import Response, c, g, cache, request, session10 from pylons import c, g, cache, request, session, response 11 11 import csml, cdms 12 12 import os, string 13 13 import zipfile 14 14 import tempfile 15 from ows_server.models import ndgObject,ndgRetrieve15 from ndgUtils import ndgObject,ndgRetrieve,xmlHandler2 16 16 17 17 def get_csml_doc(fileoruri): … … 46 46 securityTokens=session['ndgSec'] 47 47 else: securityTokens=None 48 status,x=ndgRetrieve .ndgRetrieve(48 status,x=ndgRetrieve( 49 49 uriN,cf,requestor=requestor, 50 50 securityTokens=securityTokens) 51 d=csml.parser.Dataset()52 if type(x) is str:51 52 if not status: 53 53 #then its an access denied message or similar: 54 54 return x 55 56 # otherwise, convert to an XML doc and continue 57 x=xmlHandler2.xmlHandler(x,string=1) 58 d=csml.parser.Dataset() 55 59 d.parseElemTree(x.tree) 60 56 61 return d 57 62 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/helpers.py
r2476 r3631 5 5 """ 6 6 from webhelpers import * 7 from pylons. helpersimport log7 from pylons.controllers.util import log 8 8 from pylons.i18n import get_lang, set_lang -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/ndgInterface.py
r3018 r3631 10 10 import os, tempfile 11 11 import cdms, csml 12 from ows_server.models import ndgRetrieve, ndgObject12 from ndgUtils import ndgRetrieve, ndgObject, xmlHandler2 13 13 from pylons import request,session 14 14 import logging … … 106 106 107 107 try: 108 ndgO=ndgObject .ndgObject(uri)108 ndgO=ndgObject(uri) 109 109 localFile=0 110 110 except ValueError: … … 118 118 cleared=None 119 119 120 if outputSchema !='':120 if outputSchema: 121 121 #bypass the cache ... 122 status,xmlh=ndgRetrieve .ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema)122 status,xmlh=ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema) 123 123 else: 124 124 try: … … 131 131 status,xmlH=self.__getLocal(uri) 132 132 else: 133 status,xmlh=ndgRetrieve .ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema)133 status,xmlh=ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema) 134 134 if status: self.XMLHCache[uri]=xmlh 135 135 136 136 if not status: return status,xmlh 137 137 138 if not status: return status,xmlh 138 # convert doc to an XML tree 139 xmlh=xmlHandler2.xmlHandler(xmlh,string=1) 140 139 141 # valid values of the return objects SHOULD BE 140 142 # ok: status=1, xmlh=an xml handler instance. -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/DIF.py
r3119 r3631 6 6 from People2 import * 7 7 from AccessControl import AccessControl 8 from ETxmlView import loadET, nsdumb8 from ndgUtils.ETxmlView import loadET, nsdumb 9 9 from ServiceBinding import DIFService 10 from ndg Object import ndgObject10 from ndgUtils.ndgObject import ndgObject 11 11 from stubB import collapse2 12 import urllib 13 12 14 try: #python 2.5 13 15 from xml.etree import ElementTree as ET … … 122 124 self.sources=shortLong(self.sources,s,l) 123 125 126 self.projects=[] 127 for project in helper.findall(self.tree,'Project'): 128 s,l=helper.getText(project,'Short_Name'),helper.getText(project,'Long_Name') 129 self.projects=shortLong(self.projects,s,l) 130 131 124 132 #load up information about spatial bounding box 125 133 self.bbox=Bounding(self.tree,helper,entity='DIF') … … 163 171 #services 164 172 self.services=[] 165 173 174 # not all DIFs have KML resource available - set default value 175 # to the entryID to allow routing to work properly 176 self.kmlURL = [] 177 self.wmcURL = [] 166 178 for item in helper.findall(self.tree,'Related_URL'): 179 contentType=helper.getText(item,'URL_Content_Type') 180 serviceURL=helper.cleanup.undo(helper.getText(item,'URL')) 167 181 self.services.append( 168 182 DIFService( 169 helper.getText(item,'URL_Content_Type'),170 helper.getText(item,'URL'),183 contentType, 184 serviceURL, 171 185 helper.getText(item,'Description') )) 172 186 # if there is a KML URL, encode it and add it as a field for 187 # easy access to store in session data for selectedItems 188 # NB, it needs to be encoded to avoid problems whilst sending 189 # via AJAX 190 if contentType.find('KML') > 0: 191 # NB, adding the '' to quote forces forward slashes to be replaced 192 # with unicode equivalent 193 self.kmlURL.append(urllib.quote(serviceURL,'')) 194 elif contentType.find('WEB MAP CONTEXT') > 0: 195 self.wmcURL.append(urllib.quote(serviceURL,'')) 196 173 197 if self.ndgObject is None: 174 198 self.binding=None … … 178 202 #explicitly do late binding on NDG-B URL 179 203 #... and override contents in metadatarecord 180 B='%s__%s__%s'%(self.ndgObject.repository,'NDG-B1',self.ndgObject.localID)181 Bobject=ndgObject(B,config=self.ndgObject.config)182 bdone=0183 if Bobject.gettable!=-1:184 for s in self.services:185 if s.contentType=='NDG_B_SERVICE':186 s.url=Bobject.URL187 bdone=1188 if not bdone: self.services.append(189 DIFService('NDG_B_SERVICE',Bobject.URL,'NDG Browse Metadata Service'))204 #B='%s__%s__%s'%(self.ndgObject.repository,'NDG-B1',self.ndgObject.localID) 205 #Bobject=ndgObject(B,config=self.ndgObject.config) 206 #bdone=0 207 #if Bobject.gettable!=-1: 208 # for s in self.services: 209 # if s.contentType=='NDG_B_SERVICE': 210 # s.url=Bobject.URL 211 # bdone=1 212 # if not bdone: self.services.append( 213 # DIFService('NDG_B_SERVICE',Bobject.URL,'NDG Browse Metadata Service')) 190 214 else: self.binding=None 191 215 if self.debug: … … 209 233 def setUp(self): 210 234 ''' Load example config and DIF files for testing ''' 211 from xmlHandler2 import xmlHandler235 from ndgUtils.xmlHandler2 import xmlHandler 212 236 x=xmlHandler(self.inputFile2) 213 237 self.dif=DIF(x.tree,et=1) … … 227 251 def testDifficult(self): 228 252 ''' Grab a test example from the internet and load it ''' 229 from ndg Retrieve import ndgRetrieve253 from ndgUtils import ndgRetrieve, xmlHandler2 230 254 #testURI='grid.bodc.nerc.ac.uk__DIF__EDMED1048008' 231 255 testURI='neodc.nerc.ac.uk__DIF__NEODC_NEXTMAP' 232 256 uri=ndgObject(testURI,config=self.config) 233 257 status,xml=ndgRetrieve(uri,self.config) 234 258 self.assertEqual(status,1) 259 xml=xmlHandler2.xmlHandler(xml,string=1) 235 260 d=DIF(xml.tree,et=1) 236 261 print d.entryID,[str(i) for i in d.services] -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/DeploymentHandling.py
r2643 r3631 71 71 import unittest 72 72 from xmlHandler import xmlHandler 73 from ETxmlView import nsdumb73 from ndgUtils.ETxmlView import nsdumb 74 74 from Utilities import myConfig 75 75 class TestCase(unittest.TestCase): -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/People.py
r2643 r3631 1 1 from Utilities import wrapGetText 2 from ETxmlView import nsdumb2 from ndgUtils.ETxmlView import nsdumb 3 3 from htmlUtilities import * 4 4 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/People2.py
r2975 r3631 1 1 from Utilities import wrapGetText 2 from ETxmlView import nsdumb2 from ndgUtils.ETxmlView import nsdumb 3 3 from htmlUtilities import * 4 4 from xmlHandler import xmlHandler -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/ServiceBinding.py
r2672 r3631 14 14 15 15 from htmlUtilities import hyperlink,image 16 from ETxmlView import nsdumb,et2text16 from ndgUtils.ETxmlView import nsdumb,et2text 17 17 18 18 class DIFService: -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/Utilities.py
r2755 r3631 9 9 # if you've egged it this is the way it comes 10 10 from elementtree import ElementTree as ET 11 from ETxmlView import * 12 import ConfigParser 13 import os 14 import re 15 import urllib 16 import logging 17 11 from ndgUtils.ETxmlView import * 12 13 import ConfigParser, os, re, urllib, logging 18 14 19 15 class myConfig: … … 171 167 172 168 169 def recreateListFromUnicode(string): 170 ''' Parse a list that has been passed as unicode over http and 171 recreate it in its list form 172 ''' 173 if not string: 174 return 175 176 newList = [] 177 element = [] 178 for c in string: 179 if c == '[' or c == ' ' or c == ']' or c == '\'': 180 continue 181 elif c == ',': 182 if (len(element) > 0): 183 newList.append(''.join(element)) 184 element = [] 185 continue 186 element.append(c) 187 188 # don't forget the last element 189 if (len(element) > 0): 190 newList.append(''.join(element)) 191 192 return newList 193 194 def isTabRequired(pageTabs, string): 195 for tab in pageTabs: 196 if tab[0] == string: 197 return False 198 199 return True 200 173 201 174 202 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/ndgSecurity.py
r3018 r3631 10 10 from ows_common.exception_report import OwsError 11 11 from ows_server.lib.security_util import SecuritySession 12 from ndg.security.common.SessionMgr import SessionMgrClient, SessionNotFound,\ 13 SessionCertTimeError, SessionExpired, InvalidSession, \ 14 AttributeRequestDenied 15 16 def HandleSecurity(*args): 17 return SecurityHandler(*args)() 12 13 try: 14 from ndg.security.common.SessionMgr import SessionMgrClient, SessionNotFound,\ 15 SessionCertTimeError, SessionExpired, InvalidSession, \ 16 AttributeRequestDenied 17 18 def HandleSecurity(*args): 19 return SecurityHandler(*args)() 20 except: 21 def HandleSecurity(*args): 22 return 0,'Access Control System Not Installed' 18 23 19 24 class URLCannotBeOpened(Exception): -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/stubB.py
r3102 r3631 9 9 10 10 from Utilities import * 11 from BeautifulSoup import BeautifulSoup11 from ndgUtils.BeautifulSoup import BeautifulSoup 12 12 from AccessControl import AccessControl 13 13 from geoUtilities import Bounding 14 14 from People import * 15 from ndgObject import ndgObject 15 from ndgUtils import ndgObject 16 from ows_server.models import Utilities 16 17 17 18 #from DeploymentHandling import * … … 79 80 self.parameters=helper.getText(elem,'dgGranuleSummary/dgParameterSummary/ParameterName',multiple=1) 80 81 82 class SelectedItem: 83 ''' A simple object representing key info on selected items ''' 84 def __init__(self,entryID,title,kmlURL,wmcURL): 85 self.entryID = entryID 86 self.title = title 87 self.kmlURL = kmlURL 88 self.wmcURL = wmcURL 89 self.kmlList = Utilities.recreateListFromUnicode(kmlURL) 90 self.wmcList = Utilities.recreateListFromUnicode(wmcURL) 81 91 82 92 class ObservationStation: … … 301 311 import unittest 302 312 import os.path 303 from ndg Retrieve import ndgRetrieve313 from ndgUtils import ndgRetrieve, xmlHandler2 304 314 305 315 … … 317 327 status,xml=ndgRetrieve(uri,self.c) 318 328 self.assertEqual(status,1) 329 xml=xmlHandler2.xmlHandler(xml,string=1) 319 330 return xml 320 331 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/public/js/VisMapBox.js
r2996 r3631 112 112 113 113 114 /*115 updateVisLayer: function() {116 this.control.agetWmsUri(this, this.updateVisLayer_cb);117 },118 updateVisLayer_cb: function(response) {119 var url = response.responseText;120 if (this.visLayer) {121 this.map.removeLayer(this.visLayer);122 }123 this.visLayer = new OpenLayers.Layer.WMS("Vis layer",124 document.location+url,125 {format: 'image/png',126 version: '1.3.0', CRS: 'CRS:84'127 });128 this.visLayer.setZIndex(300);129 this.map.addLayer(this.visLayer);130 131 this.loadLegend();132 },133 134 clearSubsel: function() {135 this.subselControl.deactivateSubsel();136 this.updateSelectionForm();137 },138 139 loadLegend: function() {140 function setLegend(response) {141 $('legend').innerHTML = response.responseText;142 var desc = document.createElement('p');143 desc.innerHTML = this.control.getStateDescription();144 $('legend').appendChild(desc);145 }146 147 var url = this.visLayer.getFullRequestString({148 REQUEST: 'GetLegend',149 FORMAT: 'text/html',150 CMAP: this.cmapName151 });152 OpenLayers.loadURL(url, '', this, setLegend);153 },154 155 makeFigure: function() {156 var clim = this.visLayer;157 var caption = 'IPCC Data Distribution Centre: www.ipcc-data.org\n' + this.control.getStateDescription();158 var form = $(this.control.formDiv).getElementsByTagName('form')[0];159 var typeInput = form.fig_type;160 for (var i=0; i<typeInput.length; i++) {161 if (typeInput[i].checked) {162 var figtype = typeInput[i].value;163 break;164 }165 }166 167 var url = clim.getFullRequestString({168 REQUEST: 'GetFigure',169 BBOX: this.subselControl.getActiveBounds().toBBOX(),170 CAPTION: caption,171 TYPE: figtype,172 FORMAT: form.fig_format.value173 });174 if (form.fig_format.value == 'application/postscript') {175 location.href = url;176 }177 else {178 window.open(url, 'figure_'+this.figureCounter, 'toolbars=no,location=no,directories=no,menubar=no');179 this.figureCounter++;180 }181 },182 */183 114 updateSelectionForm: function() { 184 115 var b = this.subselControl.getActiveBounds(); -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/public/js/ndgJavascript.js
r2688 r3631 75 75 } 76 76 77 // Set all checkboxes in a table to be the same state as the checkbox passed in 78 function selectAll(abox, tableID) 79 { 80 var table = document.getElementById(tableID); 81 var cboxes = table.getElementsByTagName('input'); 82 var l = cboxes.length; 83 84 for (var i = 0; i < l; i++) 85 { 86 var n = cboxes[i]; 87 if ('checkbox' == n.type && n != abox) 88 { 89 n.checked = abox.checked; 90 } 91 } 92 } 93 -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/advanced.kid
r3093 r3631 4 4 <replace py:replace="pagehead()"/> 5 5 6 <script src=" /js/OpenLayers.js"/>7 <script src=" /js/openlayers-x.js"/>8 <script src=" /js/OLMapBox.js"/>6 <script src="$g.server/js/OpenLayers.js"/> 7 <script src="$g.server/js/openlayers-x.js"/> 8 <script src="$g.server/js/OLMapBox.js"/> 9 9 <script type="text/javascript"> 10 10 var app = null; … … 18 18 <div id="entirepage"> 19 19 <div py:replace="header1(0)"/> 20 <!--! The if on the call to the left panel needs to be here for subtle css reasons21 <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>-->22 20 <div py:replace="PageTabs('Search')"/> 23 21 <div class="outer"> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/content.kid
r2882 r3631 8 8 <div py:replace="PageTabs(c.tab)"/> 9 9 <div py:replace="searchOneLine()"/> 10 <!--! The if on the call to the left panel needs to be here for subtle css reasons11 <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>12 <?python13 id="contents"14 if "ndgSec" in session: id="contentsRight"15 ?>16 <div id="${id}">-->17 10 <div id="contents"> 18 11 ${XML(c.xml)} -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/csml.kid
r2882 r3631 6 6 <div id="entirepage"> 7 7 <div py:replace="header()"/> 8 <!--! The if on the call to the left panel needs to be here for subtle css reasons -->9 <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>10 8 <?python 11 9 id="contents" -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/dif.kid
r3102 r3631 7 7 <div id="entirepage"> 8 8 <div py:replace="header()"/> 9 <div py:replace="PageTabs('D isplay')"/>9 <div py:replace="PageTabs('Details')"/> 10 10 <div py:replace="searchOneLine()"/> 11 <!--! The if on the call to the left panel needs to be here for subtle css reasons12 <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>13 <?python14 id="contents"15 if "ndgSec" in session: id="contentsRight"16 ?>17 <div id="${id}">-->18 11 <div id="contents"> 19 12 <div class="metadata"> … … 29 22 <div py:if="c.doc.sensors!=[]" py:replace="Keywords('Sensors',c.doc.sensors)"/> 30 23 <div py:if="c.doc.sources!=[]" py:replace="Keywords('Sources',c.doc.sources)"/> 24 <div py:if="c.doc.projects!=[]" py:replace="Keywords('Projects',c.doc.projects)"/> 31 25 32 26 <div py:replace="Centre(c.doc.centre)"/> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/error.kid
r3092 r3631 7 7 <div py:replace="header()"/> 8 8 <div py:replace="searchOneLine()"/> 9 <!--! The if on the call to the left panel needs to be here for subtle css reasons -->10 <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>11 9 <?python 12 10 id="contents" -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/meta.kid
r3102 r3631 34 34 <table cellspacing="0" cellpadding="3" width=" 100%" border="0"><tbody> 35 35 <tr><td class="linehead" colspan="3"><span class="headingO">Links and Services</span></td></tr> 36 <!-- s=renderService(self.config) 37 <tr py:for="item in c.doc.services"><td>$s.get(item)<td><tr> 38 --> 36 <tr py:for="s in c.doc.services"> 37 <?python 38 t=s.contentType 39 isWMC = False 40 if 'WEB MAP CONTEXT' in t: 41 isWMC = True 42 if t=='': 43 t='R' 44 if 'GET DATA' in t: 45 t='GET DATA' 46 try: 47 icon={'GET DATA':g.icons_A, 48 'VIEW EXTENDED METADATA':g.icons_B, 49 'DISCOVERY':g.icons_D, 50 'R':g.icons_R}[t] 51 except: 52 icon=g.icons_R 53 ?> 54 <td width="20%" py:if="isWMC"> 55 <span py:replace="linkimage(g.server + '/viewItems?ENDPOINT=' + s.description,icon,s.description)" py:strip="True"/> 56 </td> 57 <td width="20%" py:if="not isWMC"> 58 <span py:replace="linkimage(s.url,icon,s.description)" py:strip="True"/> 59 </td> 60 <td>${s.description}</td> 61 </tr> 39 62 <tr py:if="c.doc.ndgObject is not None"> 40 63 <td width="20%"><span py:replace="linkimage(c.doc.ndgObject.xmlURL,g.icons_xml,'[XML]')"/></td> … … 49 72 (Original <span py:replace="linkimage(c.doc.ndgObject.printableURL+'&outputSchema=original',g.icons_prn,'[HTML]')"/>) 50 73 </span></td></tr> 51 <span py:if="c.doc.ndgObject.gettable==1"> 52 <tr><td></td><td>(Original records are the raw material harvested from data providers)</td></tr> 53 <tr><td><span py:replace="linkimage(c.doc.ndgObject.BURL,g.icons_B,'[NDG-BROWSE]')"/> 54 </td><td> NERC DataGrid Browse Metadata Record (should provide more information)</td></tr> 55 </span> 74 <tr py:if="c.doc.ndgObject.gettable==1"><td></td><td>(Original records are the raw material harvested from data providers)</td></tr> 56 75 </tbody></table> 57 76 </div> <!-- ServiceList --> … … 122 141 t=s.contentType 123 142 if t=='': t='R' 143 if 'GET DATA' in t: t='GET DATA' 124 144 try: 125 icon={' NDG_A_SERVICE':g.icons_A,126 ' NDG_B_SERVICE':g.icons_B,145 icon={'GET DATA':g.icons_A, 146 'VIEW EXTENDED METADATA':g.icons_B, 127 147 'DISCOVERY':g.icons_D, 128 148 'R':g.icons_R}[t] … … 151 171 if len(d.timeCoverage)==1: 152 172 tc=d.timeCoverage[0] 153 #tc=[(i or '') for i in tc]154 173 elif len(d.timeCoverage)==0: 155 174 tc=['','',''] … … 174 193 <span py:replace="serviceIcons([d.binding])"/> 175 194 <span py:replace="serviceIcons(d.services)"/> 176 </td><td>${tc[0]}</td><td>${tc[1]}</td><td> 177 <div py:replace="Spatial(d.bbox,0)"/> 195 </td> 196 <td>${tc[0]}</td> 197 <td>${tc[1]}</td> 198 <td> 199 <div py:replace="Spatial(d.bbox,0)"/> 200 </td> 201 <!-- check if the DIF has already been selected --> 202 <?python 203 selected=False 204 select_td_id='select_td_id_%s'%d.entryID 205 if 'selection' in session: 206 for item in session['selection']: 207 if item.entryID == d.entryID: 208 selected=True 209 ?> 210 211 <td id="$select_td_id" align="center"> 212 <span py:if="selected"> 213 ${XML(h.link_to_remote("Unselect", 214 dict(update=select_td_id, 215 url=h.url_for(controller="selectedItems", 216 action="unSelectItem", 217 entryid=d.entryID, 218 divid=select_td_id))))} 219 220 </span> 221 <span class="selectme" py:if="not selected"> 222 ${XML(h.link_to_remote("Select", 223 dict(update=select_td_id, 224 url=h.url_for(controller="selectedItems", 225 action="addSelectedItem", 226 entryid=d.entryID, 227 kmlurl=d.kmlURL, 228 wmcurl=d.wmcURL, 229 title=d.name, 230 divid=select_td_id))))} 231 </span> 178 232 </td> 179 233 </tr> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/ndgPage.kid
r3119 r3631 9 9 function is needed to avoid escaping the < character --> 10 10 ${XML(h.javascript_include_tag(builtins=True))} 11 <script type="text/javascript" src=" /js/toggleDiv.js"/>11 <script type="text/javascript" src="$g.server/js/toggleDiv.js"/> 12 12 13 <link media="all, screen" href="/layout/ndg2.css" type="text/css" rel="stylesheet"/> 13 <link media="all, screen" href="$g.server/layout/ndg2.css" type="text/css" rel="stylesheet"/> 14 <link rel="icon" type="image/ico" href="$g.server/layout/favicon.jpg" /> 14 15 15 16 </head> … … 52 53 <span py:replace="helpIcon('ns_help')"/> 53 54 </form> 54 </td>--><td align="right">55 </td>--><td py:if="not g.standalone" align="right"> 55 56 <span py:if="'ndgSec' in session" id="loginBar"> 56 57 <span py:replace="logOut()"/></span> … … 82 83 </span></li> 83 84 </span> 84 <!--<li py:for="i in enumerate()" class="${status[i[0]]}">85 <span class="pagetab">${i[1]}</span>86 </li>-->87 <!-- <li class="${status[i[0]]}">88 <span class="pagetab"> ${i[1]}</span>89 </li>90 <li> $i </li>91 </span>-->92 85 </ul> 93 86 </div> … … 97 90 <py if="c.UpdatePageTabs" py:replace="PageTabs(c.current)"/> 98 91 99 <!-- History and Shopping Cart follow -->100 101 <div py:def="leftpanel()" id="Left">102 <div py:if="session['panelView']=='History'">103 <div class="tabhdr">104 <ul>105 <li class="current"> <span class="tabhdri">History</span></li>106 <li class="hidden"><span class="tabhdri">${XML(h.link_to_remote("Selected",dict(update="Left", url=h.url_for(controller="tabs", action="update",value="Selection"))))}</span></li>107 </ul>108 </div>109 <div class="tabcontent">110 <p> Dataset History </p>111 <ul py:if="'history' in session">112 <li py:for="item in session['history']">113 ${XML(h.link_to(item[0],item[1]))}</li>114 </ul>115 </div>116 </div>117 <div py:if="session['panelView']=='Selection'">118 <div class="tabhdr">119 <ul>120 <li class="hidden"><span class="tabhdri">${XML(h.link_to_remote("History",dict(update="Left", url=h.url_for(controller="tabs", action="update",value="History"))))}</span></li>121 <li class="current"><span class="tabhdri">Selection</span></li>122 </ul>123 </div>124 <div class="tabcontent">125 <p> Selected Datasets </p>126 <ul py:if="'selection' in session">127 <li py:for="item in session['selection']">128 ${XML(h.link_to(item[1],item[0]))}</li>129 </ul>130 ${XML(h.link_to_remote("Clear",dict(update="Left", url=h.url_for(controller="tabs", action="clear",value="Selection"))))}131 </div>132 </div>133 </div>134 135 92 <!-- Page Footer follows --> 136 137 93 <div py:def="footer()" id="Footer"> 138 94 <center><table><tbody> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/renderDiscoverySet.py
r2672 r3631 1 1 from ows_server.models.DiscoveryState import DiscoveryState 2 from ows_server.models.ndgSearch import ndgSearch3 2 from ows_server.models.DIF import DIF 4 3 from htmlUtilities import * -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/renderService.py
r2673 r3631 49 49 def testOdditity(self): 50 50 '''Tests a specific record for misbehaviour''' 51 from ndg Retrieveimport ndgRetrieve51 from ndgUtils import ndgRetrieve 52 52 from DIF import DIF 53 from ndg Objectimport ndgObject53 from ndgUtils import ndgObject 54 54 testURI='grid.bodc.nerc.ac.uk:DIF:EDMED1048008' 55 55 testURI='ndg.noc.soton.ac.uk__DIF__NOCSDAT162' … … 60 60 obj=ndgObject(testURI) 61 61 obj.setConfig(con) 62 r=xmlHandler2.xmlHandler(r,string=1) 62 63 d=DIF(r,ndgObj=obj) 63 64 for s in d.services: -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/results.kid
r3088 r3631 7 7 <div id="entirepage"> 8 8 <div py:replace="header()"/> 9 <!--<?python10 tlist=['Search Page','Results','Selections','WMS','WCS']11 status=['hidden','current','hidden','hidden','hidden']12 ?>13 <div py:replace="PageTabs(tlist,status)"/>-->14 9 <div py:replace="PageTabs('Results')"/> 15 10 <div py:replace="searchOneLine()"/> 16 <!--! The if on the call to the left panel needs to be here for subtle css reasons -->17 <!-- <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>-->18 <?python19 id="contents"20 if "ndgSec" in session: id="contentsRight"21 ?>22 11 <div id="results"> 23 12 <div id="context"> … … 50 39 <table> 51 40 <thead><tr><th rowspan="2">Dataset description</th><th colspan="2">Temporal coverage</th> 52 <th rowspan="2">Spatial coverage</th></tr> 53 <tr><th> Start date </th><th> End date </th></tr></thead> 41 <th rowspan="2">Spatial coverage</th> 42 <th rowspan="2" width="60px"/> 43 </tr> 44 <tr><th> Start date </th> 45 <th> End date </th> 46 </tr> 47 </thead> 54 48 <tbody> 55 49 <span py:for="i,d in enumerate(c.difs)" py:replace="result(i,d)"/> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/semantic.kid
r3073 r3631 15 15 </span>. 16 16 </span> 17 <span py:if="not c.semAvailable">No alternatives available .</span>17 <span py:if="not c.semAvailable">No alternatives available$c.semError</span> 18 18 </div> 19 19 </body> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/short_results.kid
r2976 r3631 10 10 <div id="entirepage"> 11 11 <div py:replace="header()"/> 12 <!--<?python13 tlist=['Search Page','Results','Selections','WMS','WCS']14 status=['hidden','current','hidden','hidden','hidden']15 ?>16 12 <div py:replace="PageTabs(tlist,status)"/>--> 17 13 <div py:replace="PageTabs('Results')"/> 18 14 <div py:replace="searchOneLine(targets=c.searchTarget)"/> 19 <!--! The if on the call to the left panel needs to be here for subtle css reasons -->20 <!-- <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>-->21 <?python22 id="contents"23 if "ndgSec" in session: id="contentsRight"24 ?>25 15 <div id="results"> 26 16 <div id="context"> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/stubB.kid
r3102 r3631 7 7 <body> 8 8 <div id="entirepage"> ${XML(c.tbinfo)} <div py:replace="header()"/> 9 <div py:replace="PageTabs('D isplay')"/>9 <div py:replace="PageTabs('Details')"/> 10 10 <div py:replace="searchOneLine(targets='Browse')"/> 11 <!--! The if on the call to the left panel needs to be here for subtle css reasons12 <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>13 <?python id="contents"14 if "ndgSec" in session: id="contentsRight"15 ?>16 <div id="${id}">-->17 18 11 <div id="contents"> 19 12 <div class="metadata"> … … 91 84 Selected 92 85 </span> 93 < span class="selectme" py:if="showSelect and not selected">86 <!--span class="selectme" py:if="showSelect and not selected"> 94 87 ${XML(h.link_to_remote("Select",dict(update="PageTabs", 95 88 url=h.url_for(controller="tabs", … … 106 99 <td><div py:replace="ShortCoverage(granule)"/></td> 107 100 </tr> 108 </tbody >101 </tbody--> 109 102 </table> 110 103 </div> -
TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/visualise.kid
r2996 r3631 190 190 <replace py:replace="pagehead()" /> 191 191 192 <link type="text/css" rel="stylesheet" href=" /layout/tabber.css"/>193 <script src=" /js/OpenLayers.js"/>194 <script src=" /js/openlayers-x.js"/>195 <script src=" /js/VisMapBox.js"/>192 <link type="text/css" rel="stylesheet" href="$g.server/layout/tabber.css"/> 193 <script src="$g.server/js/OpenLayers.js"/> 194 <script src="$g.server/js/openlayers-x.js"/> 195 <script src="$g.server/js/VisMapBox.js"/> 196 196 <!--! granuleMetadata sets tabberOptions so include it first --> 197 197 <replace py:replace="granuleMetadata(c.selections)"/> 198 <script src=" /js/tabber.js"/>198 <script src="$g.server/js/tabber.js"/> 199 199 200 200 </head>
Note: See TracChangeset
for help on using the changeset viewer.