Ignore:
Timestamp:
17/03/08 15:21:06 (12 years ago)
Author:
spascoe
Message:

Merging Calum's ows_server work into the refactor branch

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  
    6161selectI:        %(layout)stick.png 
    6262Xicon:          %(icondir)sxml.png 
     63plot:           %(icondir)splot.png 
    6364printer:        %(icondir)sprinter.png 
    6465helpIcon:       %(icondir)shelp.png 
     
    7576[NDG_A_SERVICE] 
    7677badc.nerc.ac.uk: http://glue.badc.rl.ac.uk/cgi-bin/dxui 
    77 icon: %(icondir)sdata_aservice.png 
     78icon: %(icondir)splot.png 
     79#%(icondir)sdata_aservice.png 
    7880icon_alt: A Service 
    7981service_name: A 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/config/environment.py

    r2916 r3631  
    11import os 
    22 
    3 import pylons.config 
    43import webhelpers 
    54 
     5from pylons import config 
     6 
     7import ows_server.lib.app_globals as app_globals 
     8import ows_server.lib.helpers 
    69from ows_server.config.routing import make_map 
    710 
    811def load_environment(global_conf={}, app_conf={}): 
    9     map = make_map(global_conf, app_conf) 
    1012    # Setup our paths 
    1113    root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
    12     paths = {'root_path': root_path, 
     14    paths = {'root': root_path, 
    1315             'controllers': os.path.join(root_path, 'controllers'), 
    1416             'templates': [os.path.join(root_path, path) for path in \ 
     
    1618             'static_files': os.path.join(root_path, 'public') 
    1719             } 
     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() 
    1828     
    1929    # The following template options are passed to your template engines 
    20     tmpl_options = {} 
     30    tmpl_options = config['buffet.template_options'] 
    2131    tmpl_options['myghty.log_errors'] = True 
    2232    tmpl_options['myghty.escapes'] = dict(l=webhelpers.auto_link, s=webhelpers.simple_format) 
    2333     
    2434    # 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  
    66from paste.deploy.converters import asbool 
    77 
     8from pylons import config 
    89from pylons.error import error_template 
    910from pylons.middleware import ErrorHandler, ErrorDocuments, StaticJavascripts, error_mapper 
    10 import pylons.wsgiapp 
     11from pylons.wsgiapp import PylonsApp 
    1112 
    1213from ows_server.config.environment import load_environment 
    13 import ows_server.lib.helpers 
    14 import ows_server.lib.app_globals as app_globals 
    1514 
    1615from ows_server.config.ndgMiddleware import ndgMiddleware 
     
    3433 
    3534    # 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) 
    3936         
    4037    # 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() 
    4339    g = app.globals 
    4440    app = ConfigMiddleware(app, conf) 
     
    6258     
    6359        # 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']) 
    6561     
    6662        # Display error documents for 401, 403, 404 status codes (if debug is disabled also 
     
    7167    app = RegistryManager(app) 
    7268     
    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] 
    7474    javascripts_app = StaticJavascripts() 
    75     app = Cascade([static_app, javascripts_app, app]) 
     75    app = Cascade(static_app +[javascripts_app, app]) 
    7676    return app 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/config/ndgMiddleware.py

    r3120 r3631  
    1919       
    2020        self.globals=g 
     21        self.globals.htdocs=cf.get('DEFAULT','htdocs',None) 
    2122        self.globals.localLink=cf.get('layout','localLink',None) 
    2223        self.globals.localImage=cf.get('layout','localImage',None) 
     
    3233        self.globals.pageLogo="bodcHdr" 
    3334        self.globals.icons_xml=cf.get('layout','Xicon') 
     35        self.globals.icons_plot=cf.get('layout','plot') 
    3436        self.globals.icons_prn=cf.get('layout','printer') 
    3537        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  
    55from routes import Mapper 
    66 
    7 def make_map(global_conf={}, app_conf={}): 
     7def make_map(): 
    88    root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
    99 
     
    3434     
    3535    # following is the shell for the rest of the ndg  
    36     map.connect('',controller='discovery')   #remote this when we have something on the main page 
     36     
    3737    map.connect('login', controller='login') 
    3838    map.connect('getCredentials', controller='login', action='getCredentials') 
     
    4444    map.connect('correct/:uri', controller='retrieve', action='correct') 
    4545    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') 
    4853    map.connect('visualise', controller='visualise', action='index') 
    4954 
     
    5156    #map.connect('csml/:uri', controller='csml_api') 
    5257    # Below is the way it worked before with added 
    53     # "csml" path component 
    54     map.connect('csml/:file.:format', controller='csml_api', action='index', 
    55                 format='html') 
    56     map.connect('csml/:file/:(feature).:format', action='getFeature', 
    57                 controller='csml_api', format='html') 
    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') 
    5964 
    6065    map.connect('trackback/:uri', controller='trackback') 
    6166    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') 
    6567    map.connect('visualise/:dataset/:view',controller='visualise',action='tabChange') 
    6668    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') 
    6871    return map 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/csml_api.py

    r2674 r3631  
    2121         
    2222        if format == 'html': 
    23             return render_response('csml_describe') 
     23            return render('csml_describe') 
    2424        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())) 
    2627     
    2728    def getFeature(self, file, feature, format): 
     
    3031        if format == 'html': 
    3132            c.feature_obj = f 
    32             return render_response('csml_describe_feature') 
     33            return render('csml_describe_feature') 
    3334        else: 
    3435            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)) 
    3638 
    3739    def subsetToGridSeries(self, file, feature): 
     
    5557 
    5658        # 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)) 
    5861        r.headers['Content-disposition'] = 'attachment; filename=bundle.zip' 
    5962 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/csml_wcs1_0_0.py

    r3090 r3631  
    189189            if not rstatus:  
    190190                c.xml='<div class="error">%s</div>'%c.dataset 
    191                 resp=render_response('error') 
     191                resp=render('error') 
    192192                return resp 
    193193     
    194194            if type(c.dataset) is str: 
    195195                #If not a csml datset is some message from exist such as 'access denied' 
    196                 return Response(c.dataset) 
     196                return response(c.dataset) 
    197197            return self._renderCapabilities('wcs1_0_0_Capabilities') 
    198198        except Exception, e: 
    199199            if isinstance(e, OWS_E.OwsError): 
    200200               c.ex=e.report                 
    201                r=render_response('ogc_se', format='xml') 
     201               r=render('ogc_se', format='xml') 
    202202               r.headers['content-type'] = 'text/xml' 
    203203               return r 
    204204            elif isinstance(e, ValueError): 
    205205                c.xml='<div class="error">%s</div>'%e 
    206                 return render_response('error') 
     206                return render('error') 
    207207            else: 
    208208                raise OWS_E.NoApplicableCode(e) 
     
    230230                self.covDescs=self._buildCoverageDescriptions() 
    231231            c.covDescs=self.covDescs 
    232             r=render_response('wcs1_0_0_DescribeCoverageResponse', format='xml') 
     232            r=render('wcs1_0_0_DescribeCoverageResponse', format='xml') 
    233233            r.headers['content-type'] = 'text/xml' 
    234234            return r 
     
    236236            if isinstance(e, OWS_E.OwsError): 
    237237                c.ex=e.report                 
    238                 r=render_response('ogc_se', format='xml') 
     238                r=render('ogc_se', format='xml') 
    239239                r.headers['content-type'] = 'application/vnd.ogc.se_xml' 
    240240                return r 
    241241            elif isinstance(e, ValueError): 
    242242                c.xml='<div class="error">%s</div>'%e 
    243                 return render_response('error') 
     243                return render('error') 
    244244            else: 
    245245               raise OWS_E.NoApplicableCode(e) 
     
    265265            if not rstatus:  
    266266                c.xml='<div class="error">%s</div>'%dataset 
    267                 resp=render_response('error') 
     267                resp=render('error') 
    268268                return resp 
    269269            feature = dataset.getFeature(identifier) 
     
    310310            axisNames=feature.getAxisLabels() 
    311311     
    312               # Extract via CSML.subsetToGridSeries() 
     312                # Extract via CSML.subsetToGridSeries() 
    313313            if store: 
    314314                #need to farm off to WPS 
     
    335335                    #STORE=true, STATUS = false: Return Coverage XML document with link to file. 
    336336                    #use the temp file name (minus extension) as an ID 
    337  
     337     
    338338                    try: 
    339339                        hostname=request.environ['paste.config']['app_conf']['proxyname'] 
     
    341341                        hostname=hostname=request.environ['HTTP_HOST']                     
    342342                    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') 
    344344                    r.headers['content-type'] = 'text/xml' 
    345345                    #write ndgSec to text file and store with coverage file: 
     
    361361                else: 
    362362                    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 
    374368        except Exception, e: 
    375369            if isinstance(e, OWS_E.OwsError): 
    376370                c.ex=e.report                 
    377                 r=render_response('ogc_se', format='xml') 
     371                r=render('ogc_se', format='xml') 
    378372                #r.headers['content-type'] = 'text/xml' 
    379373                r.headers['content-type'] = 'application/vnd.ogc.se_xml' 
     
    381375            elif isinstance(e, ValueError): 
    382376                c.xml='<div class="error">%s</div>'%e 
    383                 return render_response('error') 
     377                return render('error') 
    384378            else: 
    385379               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  
    186186            if not rstatus:  
    187187                c.xml='<div class="error">%s</div>'%c.dataset 
    188                 resp=render_response('error') 
     188                resp=render('error') 
    189189                return resp 
    190190     
    191191            if type(c.dataset) is str: 
    192192                #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 
    194195            return self._renderCapabilities('ows/wcs_capabilities') 
    195196        except Exception, e: 
     
    198199            elif isinstance(e, ValueError): 
    199200                c.xml='<div class="error">%s</div>'%e 
    200                 return render_response('error') 
     201                return render('error') 
    201202            else: 
    202203                raise OWS_E.NoApplicableCode(e) 
     
    223224                self.covDescs=self._buildCoverageDescriptions() 
    224225            c.covDescs=self.covDescs 
    225             r=render_response('wcs_DescribeCoverageResponse', format='xml') 
     226            r=render('wcs_DescribeCoverageResponse', format='xml') 
    226227            r.headers['content-type'] = 'text/xml' 
    227228            return r 
     
    231232            elif isinstance(e, ValueError): 
    232233                c.xml='<div class="error">%s</div>'%e 
    233                 return render_response('error') 
     234                return render('error') 
    234235            else: 
    235236                raise OWS_E.NoApplicableCode(e) 
     
    251252            if not rstatus:  
    252253                c.xml='<div class="error">%s</div>'%dataset 
    253                 resp=render_response('error') 
     254                resp=render('error') 
    254255                return resp 
    255256            feature = dataset.getFeature(identifier) 
     
    320321                    hostname=g.server   
    321322                    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') 
    323324                    r.headers['content-type'] = 'text/xml' 
    324325                    #write ndgSec to text file and store with coverage file: 
     
    337338                netcdfFile=open(filename, 'r') 
    338339                c.hyperlink="cid:coverage.nc" 
    339                 xmlfile=render_response('wcs_getCoverageResponse', format='xml') 
     340                xmlfile=render('wcs_getCoverageResponse', format='xml') 
    340341                xmlfile.headers['content-type'] = 'text/xml' 
    341342                multipart=self._createMultipartMime(xmlfile, netcdfFile)         
    342343                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 
    350348        except Exception, e: 
    351349            if isinstance(e, OWS_E.OwsError): 
     
    353351            elif isinstance(e, ValueError): 
    354352                c.xml='<div class="error">%s</div>'%e 
    355                 return render_response('error') 
     353                return render('error') 
    356354            else: 
    357355               raise OWS_E.NoApplicableCode(e) 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/csml_wms.py

    r2989 r3631  
    1515import ows_server.lib.validators as V 
    1616from ows_server.lib.ndgInterface import interface 
    17  
    18 try: #python 2.5 
    19     from xml.etree import ElementTree as ET 
    20 except ImportError: 
    21     try: 
    22         # if you've installed it yourself it comes this way 
    23         import ElementTree as ET 
    24     except ImportError: 
    25         # if you've egged it this is the way it comes 
    26         from elementtree import ElementTree as ET 
    27  
    2817from ows_common import exceptions as OWS_E 
    2918from ows_common.wms import * 
     
    122111        if not rstatus: 
    123112            c.xml='<div class="error">%s</div>' % dataset 
    124             resp = render_response('error') 
    125             return resp 
     113            return render('error') 
    126114 
    127115        return self._renderCapabilities('ows/wms_capabilities') 
     
    204192        if not rstatus: 
    205193            c.xml='<div class="error">%s</div>' % dataset 
    206             resp = render_response('error') 
    207             return resp 
     194            return render('error') 
    208195             
    209196        # Retrieve feature from the layers parameter 
     
    218205        img.save(buf, 'PNG') 
    219206 
    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  
    33from ows_server.lib.Date import * 
    44from 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 
     5from ndgUtils import ndgSearch as NS 
     6from ndgUtils import DocumentRetrieve as DR 
     7from ndgUtils.DocumentRetrieve import ndgVocabPOX as VS 
     8from ndgUtils import ndgObject 
    89from ows_server.models.DIF import DIF 
    9 from ows_server.templates.renderDiscoverySet import renderDiscoverySet 
    1010from ows_server.models.DiscoveryState import DiscoveryState,constraints 
    11 from ows_server.models.ndgObject import ndgObject 
    12 from ows_server.models.Utilities import myConfig 
    1311from ows_server.lib.mailer import mailHandler 
    14 from ows_server.models.xmlHandler2 import xmlHandler 
     12from ndgUtils.xmlHandler2 import xmlHandler 
    1513debug=0 
    16  
    1714 
    1815class DiscoveryController(BaseController): 
     
    2522        self.inputs=dict(parse_querystring(request.environ)) 
    2623        self.message='' 
     24                
    2725     
    2826    def index(self): 
     
    5856        if self.message!='': 
    5957            c.xml='Simple %s:'%self.message  
    60             return render_response('content') 
     58            return render('content') 
    6159         
    6260         
     
    9290                if self.message!='':  
    9391                    c.xml=self.message 
    94                     return render_response('content') 
     92                    return render('content') 
    9593                     
    9694             
     
    113111                if self.message!='':  
    114112                    c.xml=self.message 
    115                     return render_response('content') 
     113                    return render('content') 
    116114         
    117115        if 'constrained' in self.inputs:  
     
    134132         
    135133        if self.inputs['searchTarget']=='Discovery': 
    136             ws=NS.ndgSearch(logger=logger) 
     134            ws=NS(logger=logger) 
    137135        elif self.inputs['searchTarget'] in ['Browse','NumSim']: 
    138136            ws=DR(self.exist[0],pwfile=self.exist[1]) 
     
    142140        else: 
    143141            c.xml='Unknown searchTarget %s'%self.inputs['searchTarget'] 
    144             return render_response('error') 
     142            return render('error') 
    145143             
    146144        documents=ws.search(searchString,start=start,howmany=howmany,target=textTarget, 
     
    150148            for i in ws.error:m+='<p>%s</p>'%i 
    151149            c.xml=m 
    152             return render_response('content') 
     150            return render('content') 
    153151         
    154152        #build constraints info for report 
     
    165163        if hits==0:  
    166164            c.xml='<p>No records found [%s]</p>'%c.state.constraints 
    167             return render_response('content') 
     165            return render('content') 
    168166      
    169167        try: 
     
    183181            if results==[]: 
    184182                c.xml='<p> No results for "%s"!</p>'%searchString 
    185                 return render_response('content') 
     183                return render('content') 
    186184            elif difs==[]: 
    187185                c.xml='<p>No usable results for "%s"!</p>'%searchString 
    188                 return render_response('content') 
     186                return render('content') 
    189187            else: 
    190188                if errors<>[]: 
     
    204202                        c.xml+='<p> Actually, not even an internal error has been logged. <br/>' 
    205203                        c.xml+='Internal sending of mail failed with error [%s]</p>'%message 
    206                     return render_response('content') 
     204                    return render('content') 
    207205                 
    208206                 
     
    211209                session['results']=h.current_url() 
    212210                session.save() 
     211                 
     212                # set up the displayed tabs 
    213213                if len(c.pageTabs)==1:  
    214214                    c.pageTabs.append(('Results',session['results'])) 
     215                    c.pageTabs.append(('Selections', 
     216                                       h.url_for(controller='selectedItems', 
     217                                                 action='index'))) 
    215218                elif c.pageTabs[1][0]!='Results': 
    216219                        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') 
    218230                 
    219231        except ValueError,e: 
     
    222234            else: 
    223235                c.xml='<p> Error retrieving documents for %s hits is [%s]</p>'%(hits,e) 
    224                 return render_response('content') 
     236                return render('content') 
    225237        except Exception,e: 
    226238                c.xml='Unknown error %s,%s'%(str(Exception),e) 
    227                 return render_response('error')                        
     239                return render('error')                        
    228240         
    229241    def __advancedPrompt(self,searchConstraints=None): 
     
    257269                c.source=searchConstraints['scope'] 
    258270            c.geoSearchType=(searchConstraints['geoSearchType'] or 'overlaps') 
    259                  
    260         return render_response('advanced') 
     271        return render('advanced') 
    261272         
    262273    def __checkbox(self,bbox): 
     
    300311        vs=VS(proxyServer=self.cf.get('DEFAULT','proxyServer')) 
    301312        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']) 
    321338        else: 
    322339            broader,narrower,synonyms=[],[],[] 
    323340            c.semAvailable=0 
    324          
    325         return render_response('semantic',fragment=True) 
     341            c.semError='.' 
     342         
     343        return render('semantic',fragment=True) 
    326344     
    327345    def moreSearch(self,ws): 
     
    333351            r.link={'Browse':n.BURL,'NumSim':n.URL}[c.searchTarget] 
    334352         
    335         return render_response('short_results') 
     353        return render('short_results') 
    336354             
    337355 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/error.py

    r2476 r3631  
    2121            'message': request.params.get('message', ''), 
    2222        } 
    23         return Response(page) 
     23        return response.write(page) 
    2424 
    2525    def img(self, id): 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/fetch.py

    r2930 r3631  
    4141            mType=self._getMimeType(file) 
    4242                       
    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) 
    5145        else: 
    5246            #return access denied message 
    5347            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  
    5252        if 'ndgSec' not in session:  
    5353            log.debug('No security session details found - offering login...') 
    54             return render_response('login') 
     54            return render('login') 
    5555         
    5656        # Session is set in this domain - check it  
     
    7171                      "getSessionStatus call: %s" % e) 
    7272            SecuritySession.delete() 
    73             return Response(render('content'), code=400) 
     73            response.status_code = 400 
     74            return render('content') 
    7475         
    7576        # Check session status 
     
    8384            log.error("Session Manager getSessionStatus returned: %s" % e) 
    8485            SecuritySession.delete() 
    85             return Response(render('login'), code=401) 
     86            response.status_code = 400 
     87            return render('login') 
    8688    
    8789        if bSessOK: 
     
    9496                      "from cookie and re-displaying login...") 
    9597            SecuritySession.delete() 
    96             return render_response('login') 
     98            return render('login') 
    9799 
    98100 
     
    119121                  'the error to your site administrator' 
    120122            log.error("Login: initialising SessionMgrClient: %s" % e) 
    121             return Response(render('content'), code=400) 
     123            response.status_code = 400 
     124            return render('content') 
    122125         
    123126        # Connect to Session Manager 
     
    130133                    "pass-phrase and try again." 
    131134            log.error("Session Manager connect returned: %s" % e) 
    132             return Response(render('login'), code=401) 
     135            response.status_code = 401 
     136            return render('login') 
    133137         
    134138        # Cache user attributes in Session Manager 
     
    141145            log.info("Session expired getting Attribute Certificate: %s" % e) 
    142146            c.xml = "Session has expired, please re-login" 
    143             return Response(render('login'), code=401) 
     147            response.status_code = 401 
     148            return render('login') 
    144149             
    145150        except AttributeRequestDenied, e: 
     
    147152            c.xml = "No authorisation roles are available for your " + \ 
    148153                    "account.  Please check with your site administrator." 
    149             return Response(render('login'), code=401) 
     154            response.status_code = 401 
     155            return render('login') 
    150156             
    151157        except Exception, e: 
     
    153159            c.xml = "An internal error occured.  Please report this to " + \ 
    154160                    "your site administrator." 
    155             return Response(render('login'), code=400) 
     161            response.status_code = 400 
     162            return render('login') 
    156163 
    157164        log.debug('Completing login...') 
     
    163170                           roles=attCert.roles, 
    164171                           sid=sessID) 
    165         session['panelView']='History' 
    166172        session.save() 
    167173 
     
    192198        c.providers=dict([(k, v['loginURI']) for k, v in hosts.items()]) 
    193199         
    194         if 'panelView' in session: del session['panelView'] 
    195200        session.save() 
    196201         
    197         return render_response('wayf') 
     202        return render('wayf') 
    198203         
    199204         
     
    256261credentials refused: there is a problem with the SSL certificate of this site. 
    257262  Please report this to your site administrator.""" % returnToHostname 
    258                     return Response(render('login'), code=400) 
     263                    response.status_code = 400 
     264                    return render('login') 
    259265            finally:     
    260266                testConnection.close() 
     
    264270        else: 
    265271            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  
    100100            except Exception, e: 
    101101                log.error("logout - decoding return URL: %s" % e)  
    102                 return render_response('content') 
     102                return render('content') 
    103103             
    104104            # and now go back to whence we had come 
    105105            h.redirect_to(b64decReturnTo) 
    106106        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  
    11 
    22from ows_server.lib.base import * 
    3 from ows_server.models import ndgObject,  Utilities 
     3from ows_server.models import Utilities 
     4from ndgUtils import ndgObject 
    45from paste.request import parse_querystring 
    56from ows_server.models import stubB,DIF 
     
    78from ows_server.lib.ndgInterface import interface  
    89from xml.parsers.expat import ExpatError 
    9 #from ows_server.models import ndgRetrieve 
    1010 
    1111class RetrieveController(BaseController): 
     
    1717        ''' Common setup stuff for all the actions on this controller ''' 
    1818        try: 
    19             self.uri=ndgObject.ndgObject(uri) 
     19            self.uri=ndgObject(uri) 
    2020        except ValueError,e: 
    2121            return e 
     
    2626        if logger: self.logger=logger 
    2727        self.inputs=dict(parse_querystring(request.environ)) 
     28 
     29 
    2830        # NB: we could have two types of query string argument: 
    2931        #   format= (raw,html) and 
     
    3537 
    3638        # 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', [])] 
    3840                               
    3941 
     
    4547        if status: 
    4648            c.xml='<p>%s</p>'%status 
    47             return Response(render('error'),code=400) 
     49            response.status_code = 400 
     50            return render('error') 
    4851         
    4952        status,x=interface.GetXML(uri,outputSchema=self.outputSchema) 
     
    5154            #(the return object x is an xmlHandler object) 
    5255            c.xml=x.xmls 
    53             return Response(c.xml,'application/xml') 
     56            response.headers['Content-Type'] = 'application/xml' 
     57            response.write(c.xml) 
    5458        else: 
    5559            e=404 
    5660            if x.startswith('<p> Access'): e=401 
    57             return Response(render('error'),code=e) 
     61            response.status_code = e 
     62            return render('error') 
    5863         
    5964    def view(self,uri): 
     
    6469        if status: 
    6570            c.xml='<p>%s</p>'%status  
    66             return Response(render('error'),code=400) 
     71            response.status_code = 400 
     72            return render('error') 
     73 
    6774        status,x=interface.GetXML(uri,outputSchema=self.outputSchema) 
    6875        c.title='Viewing [%s]'%self.uri 
     
    8491                    c.xml=x.tohtml() 
    8592                    r='content' 
    86                     c.tab='Display' 
     93                    c.tab='Details' 
    8794                elif viewFormat=='DIF': 
    8895                    r='dif' 
     
    104111                    c.xml=x.tohtml() 
    105112                    r='content' 
    106                     c.tab='Display' 
     113                    c.tab='Details' 
    107114                elif self.format=='raw': 
    108115                    c.xml=x.xmls 
    109                     return Response(c.xml,'application/xml') 
     116                    response.headers['Content-Type'] = 'application/xml' 
     117                    return response.write(c.xml) 
    110118             
    111119            needed=0 
    112120            if 'lastViewed' not in session: needed=1 
    113121            session['lastViewed']=h.current_url() 
    114             if needed: c.pageTabs.append(('Display',session['lastViewed'])) 
     122            if needed: c.pageTabs.append(('Details',session['lastViewed'])) 
    115123             
    116             if 'ndgSec' in session: 
    117                 #we can update the history 
    118                 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() 
    127124            session.save() 
    128125            code=200 
     
    131128                code=401 
    132129            else: code=400 
    133             c.xml='<div class="error">%s</div>'%x 
     130            c.xml='%s'%x 
    134131            r='error' 
    135132            print c.xml 
    136133             
    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 
    139139            #we have crap content ... 
    140             try: 
    141                 resp=render(r) 
    142             except ExpatError,e: 
     140            if isinstance(e, ExpatError): 
    143141                c.xml='<p> XML content is not well formed </p>' 
    144142                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: 
    153144                c.xml='<p> Unexpected error [%s] viewing [%s] </p>'%(str(e),uri) 
    154145                c.doc='' 
    155                 code=400 
    156                 resp=Response(render('error'),code=code) 
    157         return resp 
     146            response.status_code = 400 
     147            return render('error') 
    158148     
    159149    def askCorrect(self,uri): 
     
    161151        status=self.__setup(uri) 
    162152        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) 
    165155 
    166156     
     
    169159        status=self.__setup(uri) 
    170160        if 'ndgSec' not in session: 
    171             return Response('Not Logged In') 
     161            return response.write('Not Logged In') 
    172162        body='Metadata Change Request for %s'%uri 
    173163        payload='<Change><uri>%s</uri><from>%s</from><Contents>%s</Contents></Change>'%( 
     
    181171        else: 
    182172            c.xml=message 
    183         return render_response('content') 
     173        return render('content') 
    184174         
    185175 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/controllers/status.py

    r2650 r3631  
    2929        c.polluri='http://'+request.environ['HTTP_HOST']+'/'+csmlfile + '/status/' + jobID 
    3030        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  
    4949                c.message='Unable to forward trackback to designated recipient [%s]'%message 
    5050         
    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  
    1818            if not rstatus:  
    1919                c.xml='<div class="error">%s</div>'%dataset 
    20                 return render_response('error') 
     20                return render('error') 
    2121            c.selections[uri]=dataset 
    2222            c.names[uri]=name 
     
    2828            return 0 
    2929        
    30         # Need two fundamental variables: the granules which have been selected 
    31         # for *possible* visualisation, and the (up to two) which have been 
     30        # Need two fundamental variables: the granules which has been selected 
     31        # for *possible* visualisation, and the granules (up to two) which have been 
    3232        # selected for *actual* visualisation: 
    3333        # session['selection'] holds the uris assocated with the first 
     
    6565        c.visible='Granules' 
    6666        self.__plotops() 
    67         return render_response('visualise') 
     67        return render('visualise') 
    6868         
    6969    def tabChange(self,dataset,view): 
     
    8787        c.fullpage=0  
    8888        self.__plotops() 
    89         return render_response('visualise',fragment=True) 
     89        return render('visualise',fragment=True) 
    9090         
    9191    def featureChange(self,view): 
     
    120120        c.fullpage=0 
    121121        self.__plotops() 
    122         return render_response('visualise',fragment=True) 
     122        return render('visualise',fragment=True) 
    123123         
    124124    def tabcontent(self): 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/app_globals.py

    r2616 r3631  
     1from pylons import config 
     2 
    13class Globals(object): 
     4    def __init__(self): 
     5        pass 
    26 
    3     def __init__(self, global_conf, app_conf, **extra): 
    4         """ 
    5         Globals acts as a container for objects available throughout 
    6         the life of the application. 
    7  
    8         One instance of Globals is created by Pylons during 
    9         application initialization and is available during requests 
    10         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 the 
    15             configuration file. 
    16              
    17         ``app_conf`` 
    18             The same ``kw`` dictionary used throughout 
    19             ``config/middleware.py`` namely, the variables from the 
    20             section in the config file for your application. 
    21              
    22         ``extra`` 
    23             The configuration returned from ``load_config`` in  
    24             ``config/middleware.py`` which may be of use in the setup of 
    25             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 exits  
    36         here. 
    37         """ 
    38         pass 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/base.py

    r3184 r3631  
    22from urlparse import urlsplit, urlunsplit 
    33from base64 import urlsafe_b64encode 
    4 from pylons import Response, c, g, cache, request, session 
     4from pylons import c, g, cache, request, session, response 
    55from pylons.controllers import WSGIController 
    66from pylons.decorators import jsonify, validate 
    7 from pylons.templating import render, render_response 
    8 from pylons.helpers import abort, redirect_to, etag_cache 
     7from pylons.templating import render 
     8from pylons.controllers.util import abort, redirect_to, etag_cache 
    99from pylons.i18n import N_, _, ungettext 
    1010from paste.request import construct_url 
    11  
    1211import ows_server.models as model 
    1312import ows_server.lib.helpers as h 
    1413from ows_server.lib.security_util import setSecuritySession, LoginServiceQuery 
    1514from ows_common import exceptions as OWS_E 
     15from ows_common.operations_metadata import OperationsMetadata, Operation, RequestMethod 
     16from ows_common.get_capabilities import ServiceMetadata 
     17import ows_common.xml 
     18 
     19 
     20try: 
     21    from xml.etree import ElementTree as ET 
     22except ImportError: 
     23    from elementtree import ElementTree as ET 
    1624 
    1725import logging 
    1826logger = logging.getLogger(__name__) 
    1927 
    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 
     29EXCEPTION_TYPE = request.environ['ndgConfig'].get('OWS_SERVER', 'exception_type', 'ogc').lower() 
    2430 
    2531class BaseController(WSGIController): 
     
    6167            setSecuritySession() 
    6268             
    63             if 'panelView' not in session: 
    64                 session['panelView']='History' 
    6569            session.save() 
    6670             
     
    8185         
    8286        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'])) 
    8593         
    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'))) 
    9095 
     96#            c.pageTabs.append(('Visualise',h.url_for(controller='visualise', action='index'))) 
     97#            c.pageTabs.append(('Download','Blah')) 
     98         
    9199        return WSGIController.__call__(self, environ, start_response) 
    92100     
     101class 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 
    93194 
    94195# 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  
    88@author: Stephen Pascoe 
    99""" 
    10 from pylons import Response, c, g, cache, request, session 
     10from pylons import c, g, cache, request, session, response 
    1111import csml, cdms 
    1212import os, string 
    1313import zipfile 
    1414import tempfile 
    15 from ows_server.models import ndgObject,ndgRetrieve 
     15from ndgUtils import ndgObject,ndgRetrieve,xmlHandler2 
    1616 
    1717def get_csml_doc(fileoruri): 
     
    4646                securityTokens=session['ndgSec'] 
    4747            else: securityTokens=None 
    48             status,x=ndgRetrieve.ndgRetrieve( 
     48            status,x=ndgRetrieve( 
    4949                    uriN,cf,requestor=requestor, 
    5050                    securityTokens=securityTokens) 
    51             d=csml.parser.Dataset() 
    52             if type(x) is str: 
     51             
     52            if not status: 
    5353                #then its an access denied message or similar: 
    5454                return x 
     55 
     56            # otherwise, convert to an XML doc and continue 
     57            x=xmlHandler2.xmlHandler(x,string=1) 
     58            d=csml.parser.Dataset() 
    5559            d.parseElemTree(x.tree)                    
     60         
    5661        return d 
    5762 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/helpers.py

    r2476 r3631  
    55""" 
    66from webhelpers import * 
    7 from pylons.helpers import log 
     7from pylons.controllers.util import log 
    88from pylons.i18n import get_lang, set_lang 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/lib/ndgInterface.py

    r3018 r3631  
    1010import os, tempfile 
    1111import cdms, csml 
    12 from ows_server.models import ndgRetrieve, ndgObject 
     12from ndgUtils import ndgRetrieve, ndgObject, xmlHandler2 
    1313from pylons import request,session 
    1414import logging 
     
    106106         
    107107        try: 
    108             ndgO=ndgObject.ndgObject(uri) 
     108            ndgO=ndgObject(uri) 
    109109            localFile=0 
    110110        except ValueError: 
     
    118118            cleared=None 
    119119         
    120         if outputSchema!='': 
     120        if outputSchema: 
    121121            #bypass the cache ... 
    122             status,xmlh=ndgRetrieve.ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema) 
     122            status,xmlh=ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema) 
    123123        else: 
    124124            try: 
     
    131131                    status,xmlH=self.__getLocal(uri) 
    132132                else:     
    133                     status,xmlh=ndgRetrieve.ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema) 
     133                    status,xmlh=ndgRetrieve(ndgO,request.environ['ndgConfig'],logger,outputSchema) 
    134134                if status: self.XMLHCache[uri]=xmlh 
    135135             
    136136        if not status: return status,xmlh 
    137137         
    138         if not status: return status,xmlh 
     138        # convert doc to an XML tree 
     139        xmlh=xmlHandler2.xmlHandler(xmlh,string=1) 
     140         
    139141        # valid values of the return objects SHOULD BE  
    140142        #   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  
    66from People2 import * 
    77from AccessControl import AccessControl 
    8 from ETxmlView import loadET, nsdumb 
     8from ndgUtils.ETxmlView import loadET, nsdumb 
    99from ServiceBinding import DIFService 
    10 from ndgObject import ndgObject 
     10from ndgUtils.ndgObject import ndgObject 
    1111from stubB import collapse2 
     12import urllib 
     13 
    1214try: #python 2.5 
    1315    from xml.etree import ElementTree as ET 
     
    122124            self.sources=shortLong(self.sources,s,l) 
    123125 
     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 
    124132        #load up information about spatial bounding box  
    125133        self.bbox=Bounding(self.tree,helper,entity='DIF') 
     
    163171        #services 
    164172        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 = [] 
    166178        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')) 
    167181            self.services.append( 
    168182                DIFService( 
    169                  helper.getText(item,'URL_Content_Type'), 
    170                  helper.getText(item,'URL'), 
     183                 contentType, 
     184                 serviceURL, 
    171185                 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                 
    173197        if self.ndgObject is None: 
    174198            self.binding=None 
     
    178202                #explicitly do late binding on NDG-B URL  
    179203                #... 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=0 
    183                 if Bobject.gettable!=-1: 
    184                     for s in self.services: 
    185                         if s.contentType=='NDG_B_SERVICE':  
    186                             s.url=Bobject.URL 
    187                             bdone=1 
    188                     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')) 
    190214            else: self.binding=None 
    191215        if self.debug: 
     
    209233    def setUp(self): 
    210234        ''' Load example config and DIF files for testing ''' 
    211         from xmlHandler2 import xmlHandler 
     235        from ndgUtils.xmlHandler2 import xmlHandler 
    212236        x=xmlHandler(self.inputFile2) 
    213237        self.dif=DIF(x.tree,et=1) 
     
    227251    def testDifficult(self): 
    228252        ''' Grab a test example from the internet and load it ''' 
    229         from ndgRetrieve import ndgRetrieve 
     253        from ndgUtils import ndgRetrieve, xmlHandler2 
    230254        #testURI='grid.bodc.nerc.ac.uk__DIF__EDMED1048008' 
    231255        testURI='neodc.nerc.ac.uk__DIF__NEODC_NEXTMAP' 
    232256        uri=ndgObject(testURI,config=self.config) 
    233         status,xml=ndgRetrieve(uri,self.config) 
     257        status,xml=ndgRetrieve(uri,self.config) 
    234258        self.assertEqual(status,1) 
     259        xml=xmlHandler2.xmlHandler(xml,string=1) 
    235260        d=DIF(xml.tree,et=1) 
    236261        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  
    7171import unittest 
    7272from xmlHandler import xmlHandler 
    73 from ETxmlView import nsdumb 
     73from ndgUtils.ETxmlView import nsdumb 
    7474from Utilities import myConfig 
    7575class TestCase(unittest.TestCase): 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/People.py

    r2643 r3631  
    11from Utilities import wrapGetText 
    2 from ETxmlView import nsdumb 
     2from ndgUtils.ETxmlView import nsdumb 
    33from htmlUtilities import * 
    44 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/People2.py

    r2975 r3631  
    11from Utilities import wrapGetText 
    2 from ETxmlView import nsdumb 
     2from ndgUtils.ETxmlView import nsdumb 
    33from htmlUtilities import * 
    44from xmlHandler import xmlHandler 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/ServiceBinding.py

    r2672 r3631  
    1414 
    1515from htmlUtilities import hyperlink,image 
    16 from ETxmlView import nsdumb,et2text 
     16from ndgUtils.ETxmlView import nsdumb,et2text 
    1717 
    1818class DIFService: 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/Utilities.py

    r2755 r3631  
    99        # if you've egged it this is the way it comes 
    1010        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  
     11from ndgUtils.ETxmlView import * 
     12 
     13import ConfigParser, os, re, urllib, logging 
    1814 
    1915class myConfig: 
     
    171167     
    172168 
     169def 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 
     194def isTabRequired(pageTabs, string): 
     195    for tab in pageTabs: 
     196        if tab[0] == string: 
     197            return False 
     198     
     199    return True 
     200         
    173201 
    174202         
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/ndgSecurity.py

    r3018 r3631  
    1010from ows_common.exception_report import OwsError 
    1111from 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 
     13try:  
     14    from ndg.security.common.SessionMgr import SessionMgrClient, SessionNotFound,\ 
     15        SessionCertTimeError, SessionExpired, InvalidSession, \ 
     16        AttributeRequestDenied 
     17     
     18    def HandleSecurity(*args): 
     19        return SecurityHandler(*args)() 
     20except: 
     21    def HandleSecurity(*args): 
     22        return 0,'Access Control System Not Installed' 
    1823 
    1924class URLCannotBeOpened(Exception): 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/models/stubB.py

    r3102 r3631  
    99 
    1010from Utilities import * 
    11 from BeautifulSoup import BeautifulSoup 
     11from ndgUtils.BeautifulSoup import BeautifulSoup 
    1212from AccessControl import AccessControl 
    1313from geoUtilities import Bounding 
    1414from People import * 
    15 from ndgObject import ndgObject 
     15from ndgUtils import ndgObject 
     16from ows_server.models import Utilities 
    1617 
    1718#from DeploymentHandling import * 
     
    7980            self.parameters=helper.getText(elem,'dgGranuleSummary/dgParameterSummary/ParameterName',multiple=1) 
    8081            
     82class 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) 
    8191             
    8292class ObservationStation: 
     
    301311    import unittest 
    302312    import os.path 
    303     from ndgRetrieve import ndgRetrieve 
     313    from ndgUtils import ndgRetrieve, xmlHandler2 
    304314         
    305315     
     
    317327                status,xml=ndgRetrieve(uri,self.c) 
    318328                self.assertEqual(status,1) 
     329                xml=xmlHandler2.xmlHandler(xml,string=1) 
    319330                return xml 
    320331           
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/public/js/VisMapBox.js

    r2996 r3631  
    112112         
    113113 
    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.cmapName 
    151         }); 
    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.value 
    173                            }); 
    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   */   
    183114    updateSelectionForm: function() { 
    184115        var b = this.subselControl.getActiveBounds(); 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/public/js/ndgJavascript.js

    r2688 r3631  
    7575} 
    7676  
     77// Set all checkboxes in a table to be the same state as the checkbox passed in  
     78function 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  
    44      <replace py:replace="pagehead()"/> 
    55 
    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"/> 
    99      <script type="text/javascript"> 
    1010        var app = null; 
     
    1818    <div id="entirepage"> 
    1919        <div py:replace="header1(0)"/> 
    20         <!--! The if on the call to the left panel needs to be here for subtle css reasons 
    21         <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/>--> 
    2220        <div py:replace="PageTabs('Search')"/> 
    2321        <div class="outer"> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/content.kid

    r2882 r3631  
    88        <div py:replace="PageTabs(c.tab)"/> 
    99        <div py:replace="searchOneLine()"/> 
    10         <!--! The if on the call to the left panel needs to be here for subtle css reasons  
    11         <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/> 
    12         <?python 
    13         id="contents" 
    14         if "ndgSec" in session: id="contentsRight" 
    15         ?>  
    16         <div id="${id}">--> 
    1710        <div id="contents"> 
    1811            ${XML(c.xml)} 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/csml.kid

    r2882 r3631  
    66    <div id="entirepage"> 
    77        <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"/> 
    108        <?python 
    119        id="contents" 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/dif.kid

    r3102 r3631  
    77    <div id="entirepage"> 
    88        <div py:replace="header()"/> 
    9         <div py:replace="PageTabs('Display')"/> 
     9        <div py:replace="PageTabs('Details')"/> 
    1010        <div py:replace="searchOneLine()"/> 
    11         <!--! The if on the call to the left panel needs to be here for subtle css reasons  
    12         <div py:if="'ndgSec' in session" py:replace="leftpanel()" id="Left"/> 
    13         <?python 
    14         id="contents" 
    15         if "ndgSec" in session: id="contentsRight" 
    16         ?>  
    17         <div id="${id}">--> 
    1811        <div id="contents"> 
    1912            <div class="metadata"> 
     
    2922                <div py:if="c.doc.sensors!=[]" py:replace="Keywords('Sensors',c.doc.sensors)"/> 
    3023                <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)"/> 
    3125                 
    3226                <div py:replace="Centre(c.doc.centre)"/> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/error.kid

    r3092 r3631  
    77        <div py:replace="header()"/> 
    88        <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"/> 
    119        <?python 
    1210        id="contents" 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/meta.kid

    r3102 r3631  
    3434        <table cellspacing="0" cellpadding="3" width=" 100%" border="0"><tbody> 
    3535            <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> 
    3962            <tr py:if="c.doc.ndgObject is not None"> 
    4063            <td width="20%"><span py:replace="linkimage(c.doc.ndgObject.xmlURL,g.icons_xml,'[XML]')"/></td> 
     
    4972            (Original <span py:replace="linkimage(c.doc.ndgObject.printableURL+'&amp;outputSchema=original',g.icons_prn,'[HTML]')"/>) 
    5073            </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> 
    5675        </tbody></table> 
    5776    </div> <!-- ServiceList --> 
     
    122141            t=s.contentType 
    123142            if t=='': t='R' 
     143            if 'GET DATA' in t: t='GET DATA' 
    124144            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, 
    127147                    'DISCOVERY':g.icons_D, 
    128148                    'R':g.icons_R}[t] 
     
    151171        if len(d.timeCoverage)==1: 
    152172            tc=d.timeCoverage[0] 
    153             #tc=[(i or '') for i in tc] 
    154173        elif len(d.timeCoverage)==0: 
    155174            tc=['','',''] 
     
    174193                <span py:replace="serviceIcons([d.binding])"/> 
    175194                <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> 
    178232            </td> 
    179233        </tr> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/ndgPage.kid

    r3119 r3631  
    99        function is needed to avoid escaping the < character --> 
    1010        ${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"/> 
    1212 
    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" /> 
    1415 
    1516    </head> 
     
    5253            <span py:replace="helpIcon('ns_help')"/> 
    5354         </form> 
    54          </td>--><td align="right"> 
     55         </td>--><td py:if="not g.standalone" align="right"> 
    5556            <span py:if="'ndgSec' in session" id="loginBar"> 
    5657            <span py:replace="logOut()"/></span> 
     
    8283                    </span></li>  
    8384                 </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>--> 
    9285            </ul> 
    9386        </div> 
     
    9790    <py if="c.UpdatePageTabs" py:replace="PageTabs(c.current)"/> 
    9891 
    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      
    13592    <!-- Page Footer follows --> 
    136  
    13793    <div py:def="footer()" id="Footer"> 
    13894        <center><table><tbody> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/renderDiscoverySet.py

    r2672 r3631  
    11from ows_server.models.DiscoveryState import DiscoveryState 
    2 from ows_server.models.ndgSearch import ndgSearch 
    32from ows_server.models.DIF import DIF 
    43from htmlUtilities import * 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/renderService.py

    r2673 r3631  
    4949        def testOdditity(self): 
    5050            '''Tests a specific record for misbehaviour''' 
    51             from ndgRetrieve import ndgRetrieve 
     51            from ndgUtils import ndgRetrieve 
    5252            from DIF import DIF 
    53             from ndgObject import ndgObject 
     53            from ndgUtils import ndgObject 
    5454            testURI='grid.bodc.nerc.ac.uk:DIF:EDMED1048008' 
    5555            testURI='ndg.noc.soton.ac.uk__DIF__NOCSDAT162' 
     
    6060            obj=ndgObject(testURI) 
    6161            obj.setConfig(con) 
     62            r=xmlHandler2.xmlHandler(r,string=1) 
    6263            d=DIF(r,ndgObj=obj) 
    6364            for s in d.services: 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/results.kid

    r3088 r3631  
    77    <div id="entirepage"> 
    88        <div py:replace="header()"/> 
    9         <!--<?python 
    10             tlist=['Search Page','Results','Selections','WMS','WCS'] 
    11             status=['hidden','current','hidden','hidden','hidden'] 
    12         ?> 
    13         <div py:replace="PageTabs(tlist,status)"/>--> 
    149        <div py:replace="PageTabs('Results')"/> 
    1510        <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         <?python 
    19         id="contents" 
    20         if "ndgSec" in session: id="contentsRight" 
    21         ?>  
    2211        <div id="results"> 
    2312            <div id="context"> 
     
    5039                <table> 
    5140                    <thead><tr><th rowspan="2">Dataset description</th><th colspan="2">Temporal&nbsp;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> 
    5448                    <tbody> 
    5549                        <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  
    1515                </span>. 
    1616            </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> 
    1818        </div> 
    1919    </body> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/short_results.kid

    r2976 r3631  
    1010    <div id="entirepage"> 
    1111        <div py:replace="header()"/> 
    12         <!--<?python 
    13             tlist=['Search Page','Results','Selections','WMS','WCS'] 
    14             status=['hidden','current','hidden','hidden','hidden'] 
    15         ?> 
    1612        <div py:replace="PageTabs(tlist,status)"/>--> 
    1713        <div py:replace="PageTabs('Results')"/> 
    1814        <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         <?python 
    22         id="contents" 
    23         if "ndgSec" in session: id="contentsRight" 
    24         ?>  
    2515        <div id="results"> 
    2616            <div id="context"> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/stubB.kid

    r3102 r3631  
    77    <body> 
    88        <div id="entirepage"> ${XML(c.tbinfo)} <div py:replace="header()"/> 
    9             <div py:replace="PageTabs('Display')"/> 
     9            <div py:replace="PageTabs('Details')"/> 
    1010            <div py:replace="searchOneLine(targets='Browse')"/> 
    11             <!--! The if on the call to the left panel needs to be here for subtle css reasons  
    12             <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  
    1811            <div id="contents"> 
    1912                <div class="metadata"> 
     
    9184                                          Selected 
    9285                                        </span> 
    93                                         <span class="selectme" py:if="showSelect and not selected"> 
     86                                        <!--span class="selectme" py:if="showSelect and not selected"> 
    9487                                            ${XML(h.link_to_remote("Select",dict(update="PageTabs", 
    9588                                            url=h.url_for(controller="tabs", 
     
    10699                                    <td><div py:replace="ShortCoverage(granule)"/></td> 
    107100                                </tr> 
    108                             </tbody> 
     101                            </tbody--> 
    109102                        </table> 
    110103                    </div> 
  • TI05-delivery/ows_framework/branches/ows_framework-refactor/ows_server/ows_server/templates/visualise.kid

    r2996 r3631  
    190190      <replace py:replace="pagehead()" /> 
    191191 
    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"/> 
    196196      <!--! granuleMetadata sets tabberOptions so include it first --> 
    197197      <replace py:replace="granuleMetadata(c.selections)"/> 
    198       <script src="/js/tabber.js"/> 
     198      <script src="$g.server/js/tabber.js"/> 
    199199 
    200200    </head> 
Note: See TracChangeset for help on using the changeset viewer.