Changeset 2654


Ignore:
Timestamp:
27/06/07 16:10:01 (12 years ago)
Author:
lawrence
Message:

More complete browse support (and interim support for NumSim)
witin the ows stack.

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server
Files:
10 added
10 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/config/ndgDiscovery.config

    r2646 r2654  
    8484icon_title: Links to a METADATA BROWSE view of this dataset 
    8585service_name: B 
    86 instance: http://SERVICEHOST/retrieve?repository=EXISTHOST&format=SCHEMA&type=html&uri= 
     86instance: http://SERVICEHOST/view/URI 
    8787 
    8888[NDG_EXIST] 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/controllers/retrieve.py

    r2647 r2654  
    11 
    22from ows_server.lib.base import * 
    3 from ows_server.models import ndgObject,  ndgRetrieve 
     3from ows_server.models import ndgObject,  ndgRetrieve, Utilities 
    44from paste.request import parse_querystring 
    55from ows_server.models import stubB  
     
    5454            securityTokens=session['ndgSec'] 
    5555        else: securityTokens=None 
     56 
    5657        status,x=ndgRetrieve.ndgRetrieve( 
    5758                self.uri,self.cf,logger=self.logger,requestor=self.requestor,format=self.format, 
    5859                securityTokens=securityTokens) 
    5960        c.title='Viewing [%s]'%self.uri 
     61        c.icons_xml=self.cf.get('layout','Xicon') 
     62        c.icons_prn=self.cf.get('layout','printer') 
    6063         
    6164        if status: 
    6265            #(the return object x is an xmlHandler object) 
     66            print self.uri.schema 
    6367            if self.uri.schema=='NDG-B1': 
    6468                r='stubB' 
    6569                c.doc=stubB.stubB(x.tree,self.cf) 
    66                 c.tbinfo=self.__mytb() 
     70                c.tbinfo=self.__mytb(c.doc.name) 
    6771                name=c.doc.abbreviation 
    6872            elif self.uri.schema=='NDG-A0': 
     
    7074            elif self.uri.schema=='DIF': 
    7175                r='dif' 
     76            elif self.uri.schema=='NumSim': 
     77                r='numsim' 
     78                c.xmlh=x 
     79                c.tbinfo=self.__mytb('') 
     80                name=x.getText('NS_Model/NS_Name') 
    7281            else: 
    7382                c.xml=x.tohtml() 
     
    128137         
    129138 
    130     def __mytb(self): 
     139    def __mytb(self,name): 
    131140        ''' Get the trackback info for this page  
    132141        (can't do it in Kid because it doesn't do substutions in comments) ''' 
     
    141150            trackback:ping="%s" /> 
    142151        </rdf:RDF> 
    143         -->'''%(self.uri,g.server+h.url_for(),c.doc.name,g.server+h.url_for(controller="trackback")) 
     152        -->'''%(self.uri,g.server+h.url_for(),name,g.server+h.url_for(controller="trackback")) 
    144153        return s 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgObject.py

    r2615 r2654  
    7070                self.gettable=1 
    7171                self.URL=self.discoveryURL 
    72             elif self.schema in ['NDG-B0','NDG-B1']: 
     72            elif self.schema in ['NDG-B0','NDG-B1','NumSim']: 
    7373                # One day we'll use a service binding to get this 
    7474                # This is a mapping from the ndg repository id to an actual repository id 
     
    7676                blank=self.config.get('NDG_B_SERVICE','instance') 
    7777                servicehost=self.config.get('NDG_B_SERVICE',self.repository,'unknown') 
    78                 existhost=self.config.get('NDG_EXIST',self.repository,self.repository) 
    7978                url=blank.replace('SERVICEHOST',servicehost) 
    80                 url=url.replace('EXISTHOST',existhost) 
    81                 self.URL=url.replace('SCHEMA',self.schema)+self.uri 
    82                 self.xmlURL=self.URL.replace('html','xml') 
    83                 self.printableURL=self.URL.replace('html','print') 
     79                url=url.replace('URI',self.uri) 
     80                self.URL=url 
     81                self.xmlURL=url+'?format=raw' 
     82                self.printableURL=url+'?format=xml' 
    8483                if servicehost!='unknown': self.gettable=0 
    8584            else: 
     
    8887                self.discoveryURL,self.baseURL,self.xmlURL,self.printableURL=None,None,None,None 
    8988                 
    90         #now, we'll build a stub-B url as well, in cae that comes in handy  
    91         if self.gettable<>-1: 
    92             if self.schema<>'NDG-B1': 
    93                 defhost=self.config.get('DEFAULT','server') 
    94                 uri=self.uri.replace(self.schema,'NDG-B1') 
    95                 self.BURL='%s/browse?uri=%s&type=html'%( 
    96                         self.config.get('NDG_BROWSE_HOSTS',self.repository,defhost),uri) 
    97             else: self.BURL=self.URL 
     89        #now, we'll build a stub-B url as well, in case that comes in handy  
     90        if self.schema!='NumSim' and self.gettable<>-1: 
     91            self.BURL=self.URL.replace(self.schema,'NDG-B1') 
    9892        else: 
    9993            self.BURL=None 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgObject.py~

    r2615 r2654  
    7676                blank=self.config.get('NDG_B_SERVICE','instance') 
    7777                servicehost=self.config.get('NDG_B_SERVICE',self.repository,'unknown') 
    78                 existhost=self.config.get('NDG_EXIST',self.repository,self.repository) 
    7978                url=blank.replace('SERVICEHOST',servicehost) 
    80                 url=url.replace('EXISTHOST',existhost) 
    81                 self.URL=url.replace('SCHEMA',self.schema)+self.uri 
    82                 self.xmlURL=self.URL.replace('html','xml') 
    83                 self.printableURL=self.URL.replace('html','print') 
     79                url=url.replace('URI',self.uri) 
     80                self.URL=url 
     81                self.xmlURL=url+'?format=raw' 
     82                self.printableURL=url+'?format=xml' 
    8483                if servicehost!='unknown': self.gettable=0 
    8584            else: 
     
    8887                self.discoveryURL,self.baseURL,self.xmlURL,self.printableURL=None,None,None,None 
    8988                 
    90         #now, we'll build a stub-B url as well, in cae that comes in handy  
     89        #now, we'll build a stub-B url as well, in case that comes in handy  
    9190        if self.gettable<>-1: 
    92             if self.schema<>'NDG-B1': 
    93                 defhost=self.config.get('DEFAULT','server') 
    94                 uri=self.uri.replace(self.schema,'NDG-B1') 
    95                 self.BURL='%s/browse?uri=%s&type=html'%( 
    96                         self.config.get('NDG_BROWSE_HOSTS',self.repository,defhost),uri) 
    97             else: self.BURL=self.URL 
     91            self.BURL=self.URL.replace(self.schema,'NDG-B1') 
    9892        else: 
    9993            self.BURL=None 
     
    10599        else: 
    106100            pass 
    107           
     101         
     102         
     103    def __str__(self): 
     104        return self.uri 
    108105 
    109106import unittest 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgRetrieve.py

    r2643 r2654  
    3131        r=server 
    3232        ws=ndgSearch.ndgSearch() 
    33     elif uri.schema[0:5]=='NDG-B': 
    34         status,ws=getws(config,uri) 
    35         if not status: return status,ws 
     33    elif uri.schema[0:5]=='NDG-B' or uri.schema=='NumSim': 
     34        if not debug:  
     35            status,ws=getws(config,uri) 
     36            if not status: return status,ws 
    3637    elif uri.schema=='NDG-A0': 
    3738        status,ws=getws(config,uri) 
     
    4041        if uri.schema=='NDG-A0': 
    4142            target='/db/ndg_A_metadata' 
     43        elif uri.schema=='NumSim': 
     44            target='/db/NumSim' 
    4245        else: 
    4346            target='/db/ndg_B_metadata' 
     
    4548        #do the actual search: 
    4649        time1=time.time() 
    47         r=ws.get(uri.repository,uri.schema,uri.localID,format=format,targetCollection=target) 
     50        print uri.uri 
     51        if debug: 
     52            if uri.uri in ['badc.nerc.ac.uk__NDG-B1__dataent_COAPEC', 
     53                           'badc.nerc.ac.uk__NumSim__HiGEM_6.1_CodeBase', 
     54                           'badc.nerc.ac.uk__NumSim__HiGEM_6.1_Control']: 
     55                f=str('ows_server/examples/%s.xml'%uri.uri) 
     56                r=file(f,'r').read() 
     57            else: 
     58                r=ws.get(uri.repository,uri.schema,uri.localID,format=format,targetCollection=target) 
    4859        time2=time.time()-time1 
    4960        logString='Document retrieve [%s] for [%s] took [%ss]'%(uri,requestor,time2) 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/stubB.py

    r2647 r2654  
    1313from People import * 
    1414from ndgObject import ndgObject 
    15 from DeploymentHandling import * 
     15#from DeploymentHandling import * 
    1616try: #python 2.5 
    1717    from xml.etree import ElementTree as ET 
     
    2323        # if you've egged it this is the way it comes 
    2424        from elementtree import ElementTree as ET 
     25 
     26 
     27def collapse2(keywords,split='>'): 
     28    ''' Take the last element of a DIF parameter tree entry, and put them in a dictionary 
     29    under the DIF category ''' 
     30    d={} 
     31    for item in keywords: 
     32        line=item.split(split) 
     33        category=line[0] 
     34        if category not in d: d[category]=[] 
     35        while line<>[]: 
     36            c=line.pop() 
     37            if c<>'':  
     38                if c<>category: 
     39                    d[category].append(c) 
     40                line=[] 
     41    return d 
     42 
    2543 
    2644def idconvert(helper,elem,config=None,idelem='dgMetadataID'): 
     
    6987        if e is None: return 
    7088        
    71          
     89def Deployments(elem,helper,config): 
     90    ''' This is the late June 2007 version ''' 
     91    if elem is None: return None 
     92    types={'dptList':'dataproductiontool','activityList':'activity','obsStnList':'observationstation','deList':''} 
     93    names={'dptList':'Data Production Tools','activityList':'Activities','obsStnList':'Observation Stations','deList':'Data Entities'} 
     94    result={} 
     95    for alist in types: 
     96        blist=helper.find(elem,alist) 
     97        collection=[] 
     98        if blist is not None: 
     99            for object in blist: 
     100                uri=idconvert(helper,object,config=config) 
     101                name=helper.getText(object,'name') 
     102                shortName=helper.getText(object,'abbreviation') 
     103                collection.append((uri,name,shortName)) 
     104            result[names[alist]]=collection 
     105    return result 
     106             
    72107class DataEntity: 
    73108    def __init__(self,helper,element): 
     
    86121        self.temporal() 
    87122        #parameters 
    88         self.parameters=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1) 
     123        plist=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1) 
     124        self.parameters=collapse2(plist,split='/') 
     125        print self.parameters 
    89126         
    90127    def getGranules(self): 
     
    131168 
    132169 
    133 class stubB(DataEntity,Deployment,ObservationStation,DataProductionTool,Activity): 
     170class stubB(DataEntity,ObservationStation,DataProductionTool,Activity): 
    134171         
    135172        ''' Holds the stub-b document and provides methods which get and manipulate it ''' 
     
    172209                elif elem.tag=='dgDataEntity': 
    173210                        DataEntity.__init__(self,helper,elem) 
    174                         self.type='dgDataEntity' 
    175                         self.others=('activity','observationstation','dataproductiontool') 
    176                         related='RelatedDeployment' 
    177211                elif elem.tag=='dgActivity': 
    178                         self.type='dgActivity' 
    179                         #nb activity stub-b seems to have dataentity instead of dataEntity 
    180                         self.others=('dataentity','dataEntity','observationstation','dataproductiontool') 
    181                         related='ActivityDeployment' 
     212                        pass 
    182213                elif elem.tag=='dgDataProductionTool': 
    183                         self.type='dgDataProductionTool' 
    184                         self.others=('dataEntity','observationstation','activity') 
    185                         related='DPTDeployment' 
     214                        pass 
    186215                elif elem.tag=='dgObservationStation': 
    187                         related='ObsStnDeployment' 
    188                         self.type='dgObservationStation' 
    189                         self.others=('dataEntity','dataproductiontool','activity') 
     216                        pass 
    190217 
    191218                self.description=dgMetadataDescription(helper,helper.find(self.tree,'dgMetadataDescription')) 
     
    194221               
    195222                # now go get all the related links 
    196                 #old stub-B: 
    197                 #self.related=[] 
    198                 #for d in helper.findall(elem,related): 
    199                 #    self.related.append(Deployment(helper,d,self.others,self.config)) 
    200                 #stripped-B: 
    201                 #self.related=Deployments(helper,helper.findall(elem,related)) 
    202                 self.related=Deployments(helper,elem.tag,self.config) 
    203                 print elem.tag 
    204                 for e in helper.findall(elem,related): 
    205                     print e.tag 
    206                     self.related.add(e) 
     223                 
     224                self.related=Deployments(helper.find(elem,'DeploymentSummary'),helper,self.config) 
     225 
    207226 
    208227if __name__=="__main__": 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/xmlHandler2.py

    r2643 r2654  
    6767            if n[0]=='xmlns': 
    6868                self.realns[n[1][1:-1]]='default' 
    69                 self.defns=self.realns[n[1][1:-1]] 
     69                self.defns=n[1][1:-1]#self.realns[n[1][1:-1]] 
    7070            elif n[0][0:6]=='xmlns:': 
    7171                self.realns[n[1][1:-1]]=n[0][6:] 
     
    180180        return s 
    181181         
    182     def __distributens(self,xpathExpression): 
     182    def _distributens(self,xpathExpression): 
    183183        ''' Actually we only support tag finding in this ''' 
    184184        tags=xpathExpression.split('/') 
     
    186186        for t in tags:  
    187187            if t[1]<>'{':  
    188                 new+=self.defns+t+'/' 
     188                new+='{%s}%s/'%(self.defns,t) 
    189189            else: 
    190190                new+=t+'/' 
     
    192192        return new 
    193193         
    194     def getText(self,elem,xpathExpression,multiple=0): 
     194    def getText(self,xpathExpression,multiple=0): 
    195195        ''' Get a text object sensibly, given ET API for xml doesn't handle  
    196196        namespaces gracefully ''' 
    197         if elem is None:  
    198             if multiple: 
    199                 return ['',] 
    200             else: return ''  
     197        elem=self.tree  
    201198        if multiple: 
    202                 r=elem.findall(self.__distributens(xpathExpression)) 
     199                r=elem.findall(self._distributens(xpathExpression)) 
    203200        else: 
    204                 r=[elem.find(self.__distributens(xpathExpression)),] 
     201                r=[elem.find(self._distributens(xpathExpression)),] 
    205202        try:  # if element is None, this should fail ... 
    206203                rr=[] 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/public/layout/ndg2.css

    r2647 r2654  
    22 
    33/* Entire Page Contents */ 
    4 #container { width: 90%; margin:10px auto; line-height:110%;} 
     4#entirepage { width: 98%; margin:10px auto; font-size:medium; line-height:110%;} 
    55 
    66/* Top Banner Div */ 
     
    1414.tabhdr ul {margin:0; padding:0; list-style:none;} 
    1515.tabhdr a:link {display:block; text-decoration:none; color:black; float:left; width:5em;} 
    16 li.current {float:left; margin:0; padding:2px 10px; background-color:wheat;} 
     16li.current {float:left; margin:0; padding:2px 10px; background-color:#f0f0f0; border-top: 1px solid #3c78b5; border-right: 1px solid #3c78b5; border-left: 1px solid #3c78b5;} 
    1717li.hidden {float:left; margin:0; padding:2px 10px; 
    18     border-left:1px solid wheat; border-right:1px solid wheat; border-top:1px solid wheat; } 
    19 .tabcontent {padding:2px 10px; background: wheat; clear:both;} 
     18    border-left:1px solid #3c78b5; border-right:1px solid #3c78b5; border-top:1px solid #3c78b5; } 
     19.tabcontent {padding:2px 10px; background: #f0f0f0; clear:both; border:1px solid #3c78b5;} 
    2020.tabcontent ul {list-style:none; font-size:50%; margin-left:0; padding-left:0; } 
    2121/* Main Content */ 
     
    3333 
    3434/* This is the "metadata" css */ 
    35 DIV.metadata {PADDING-LEFT: 20px;} 
    36 .metadata #title {FONT-WEIGHT:bold; FONT-SIZE:140%; FONT-STYLE:italic; } 
     35.metadata {PADDING-LEFT: 20px; font-size:80%;} 
    3736.metadata #keywords {COLOR: Blue; FONT-SIZE:120%; FONT-WEIGHT:bold;} 
    3837.metaentry {COLOR: Black} 
    39 .metadata #abstract {MARGIN-LEFT: 50px; MARGIN-RIGHT:50px; MARGIN-TOP:10px; MARGIN-BOTTOM:10px; font-style:italic; font-size:100%; border:thin solid black; padding: 8px} 
     38 
     39/* We don't want borders on linked images */ 
     40a img {border: none;} 
     41 
     42/* StubB */ 
     43.headingblock{background-color: #f0f0f0;border: 1px solid #3c78b5; margin:0px 40px 20px 30px; padding-top:5px;} 
     44 
     45.heading { 
     46    font-size: 140%; 
     47    font-weight: bold; 
     48    color: #003366; 
     49    padding: 4px; 
     50    text-align:center; 
     51    } 
     52/* top right bottom left */ 
     53.metadata #abstract {MARGIN: 5px 20px 10px 20px; font-size:100%;  padding: 8px 8px 8px 8px; text-align:justify;}  
     54.metadata table {padding-top:10px;} 
     55 
     56.linehead { 
     57    font-size: 120%; 
     58    line-height: normal; 
     59    font-weight: bold; 
     60    background-color: #f0f0f0; 
     61    color: #003366; 
     62    border-bottom: 1px solid #3c78b5; 
     63    padding: 2px 2px 2px 2px; 
     64    margin: 0px 0px 4px 0px; 
     65} 
     66.rowhead { 
     67    font-size: 100%; 
     68    font-weight: bold; 
     69    border-bottom: 1px solid #3c78b5; 
     70    } 
     71.cellhead { font-size: 100%; font-weight: bold;}  
     72 
     73 
     74/* NumSim */ 
     75 
     76 
     77.Model {margin: 5px 5px 5px 20px; border: 1px solid #3c78b5; clear:both;} 
    4078 
    4179/* And now the footer */ 
    4280 
    43 #Footer  { color: #999999; background-color: #f4f4f4; margin-bottom: 25px; padding-top: 3px; padding-right: 10px; padding-left: 10px; clear: both; border-top: 2px solid wheat; margin-top:10px;} 
     81#Footer  { color: #999999; background-color: #f4f4f4; margin-bottom: 25px; padding-top: 3px; padding-right: 10px; padding-left: 10px; clear: both; border-top: 2px solid wheat; margin-top:10px; font-size:80%;} 
    4482 
    4583/* Footer not yet checked */ 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/ndgPage.kid

    r2647 r2654  
    8383        </tbody></table></center> 
    8484    </div> 
     85     
     86    <!-- Utility Functions follow --> 
     87     
     88    <!-- hyperlinked image --> 
     89    <span py:def="linkimage(linkref,imageref,alttext)"> 
     90        <a href="$linkref"><image src="$imageref" alt="$alttext" title="$alttext"/></a> 
     91    </span> 
     92     
     93    
     94     
    8595</html> 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/stubB.kid

    r2647 r2654  
    1313        ?>  
    1414        <div id="${id}"> 
    15              
    16             <p>Stub-B viewing not fully implemented</p><hr/> 
     15            
    1716            <div class="metadata"> 
    18                 <div id="title">$c.doc.name</div> 
    19                 <div id="abstract">$c.doc.abstract</div> 
     17                <div class="headingblock"> 
     18                    <div id="title" class="heading">$c.doc.name</div> 
     19                    <div id="abstract">$c.doc.abstract</div> 
     20                </div> 
    2021                <p py:if="c.doc.citation!=''">Citation<br/><span class="citation">$c.doc.citation</span></p> 
    2122                <div py:if="c.doc.description.descriptionType in ['','text/plain']"> 
     
    3031                    </ul></p> 
    3132                </div> 
     33                 
     34                <div class="ParameterList"> 
     35                    <table cellspacing="0" cellpadding="3" border="0" width="100%"><tbody> 
     36                        <tr><td class="linehead"><span class="heading0"> Parameters</span></td></tr> 
     37                        <span py:for="item in c.doc.parameters"> 
     38                            <tr><td class="rowhead">$item</td></tr> 
     39                            <?python 
     40                            #need to make sure keyword with spaces are not split inappropriately 
     41                            keywords=[] 
     42                            for word in c.doc.parameters[item]: 
     43                                keywords.append(word.replace(' ','&nbsp;')) 
     44                            keywords='; '.join(keywords) 
     45                            ?> 
     46                            <tr py:if="c.doc.parameters[item]!=[]"><td>$keywords</td></tr> 
     47                        </span> 
     48                    </tbody></table> 
     49                </div> 
     50                 
    3251                <div py:if="c.doc.granules!=[]" id="Granules"> 
    33                     <h4> Granules </h4> 
    34                     <table><tbody> 
     52                    <table cellspacing="0" cellpadding="3" border="0" width="100%"><tbody> 
     53                        <tr><td class="linehead" colspan="3"><span class="heading0"> Granules </span></td></tr> 
    3554                        <tr><td>Select</td><td>Access Control</td><td>Granule</td></tr> 
    3655                        <tr py:for="granule in c.doc.granules"> 
     
    4160                        </tr> 
    4261                    </tbody></table> 
    43                 </div> 
     62                </div> <!-- of granules --> 
    4463                 
     64                <div id="DeploymentList" py:if="c.doc.related is not None"> 
     65                    <table cellspacing="0" cellpadding="3" border="0" width="100%" class="related"><tbody> 
     66                        <tr><td class="linehead" colspan="2"><span class="headingO">Related Entities</span></td></tr> 
     67                        <tr py:for="alist in c.doc.related" py:if="alist !=[]"> 
     68                            <td class="cellhead">$alist</td> 
     69                            <td> <span py:for="deployment in c.doc.related[alist]"> 
     70                                    <a href="${deployment[0].BURL}">${deployment[2]}</a>&nbsp;&nbsp;</span></td> 
     71                        </tr> 
     72                    </tbody></table> 
     73                </div> <!-- DeploymentList --> 
     74                 
     75                 
     76                <div id="ServiceList"> 
     77                    <table cellspacing="0" cellpadding="3" width=" 100%" border="0"><tbody> 
     78                      <tr><td class="linehead" colspan="3"><span class="headingO">Links and Services</span></td></tr> 
     79                      <!-- s=renderService(self.config)  
     80                      <tr py:for="item in c.doc.services"><td>$s.get(item)<td><tr> 
     81                      --> 
     82                      <tr py:if="c.doc.ndgObject is not None"> 
     83                        <td width="20%"><span py:replace="linkimage(c.doc.ndgObject.xmlURL,c.icons_xml,'[XML]')"/></td> 
     84                        <td>Downloadable XML version of this record</td> 
     85                      </tr> 
     86                      <tr py:if="c.doc.ndgObject is not None"> 
     87                        <td width="20%"><span py:replace="linkimage(c.doc.ndgObject.printableURL,c.icons_prn,'[HTML]')"/></td> 
     88                        <td>Viewable XML version of this record</td> 
     89                      </tr> 
     90                    </tbody></table> 
     91                </div> <!-- ServiceList --> 
     92       
     93                <center> 
     94                <p>Not all information in this record may be rendered in this view. Please see the XML version for complete 
     95                content </p></center> 
     96       
    4597            </div> <!-- Metadata Div Ends --> 
    4698        
Note: See TracChangeset for help on using the changeset viewer.