Changeset 3092


Ignore:
Timestamp:
03/12/07 12:37:22 (12 years ago)
Author:
lawrence
Message:

Mainly modifications to support multiple bounding
boxes and crap content ...

Location:
TI05-delivery/ows_framework/trunk/ows_server/ows_server
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/DIF.py

    r2680 r3092  
    113113 
    114114        #load up information about spatial bounding box  
    115         self.bbox=Bounding(self.tree,entity='DIF',getter=helper.getText) 
     115        self.bbox=Bounding(self.tree,helper,entity='DIF') 
    116116         
    117117        #load up information about temporal extent 
     
    122122        status=helper.getText(self.tree,'Data_Set_Progress') 
    123123        if e1<>'': 
    124             self.timeCoverage=TimeCoverage((start,e1,status)) 
    125         else: 
    126             self.timeCoverage=TimeCoverage((start,e2,status)) 
     124            self.timeCoverage=[TimeCoverage((start,e1,status))] 
     125        else: 
     126            self.timeCoverage=[TimeCoverage((start,e2,status))] 
    127127         
    128128        #load up those silly paleo keywords 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ETxmlView.py

    r2615 r3092  
    1717 
    1818class subAI: 
    19     ''' This is Alan Iwi's substitute and replace orphan <> code ''' 
     19    ''' This is Alan Iwi's substitute and replace orphan <> and & code ''' 
    2020    def __init__(self): 
    2121        self.r1=re.compile('<([^>]*(<|$))') 
    2222        self.r2=re.compile('((^|>)[^<]*)>') 
     23        self.r3=re.compile('&(?!amp;)') 
    2324    def sub(self,s): 
    2425        old='' 
     26        s=self.r3.sub(r'&amp;',s) 
     27        s=s.replace(';amp',';') 
    2528        while s != old: 
    2629            old=s 
     
    3639        instantiatin ''' 
    3740        self.encoding=encoding 
     41        self.cleanup=subAI() 
    3842        if root is None:  
    3943            self.xmlns='' 
    4044            return 
    4145        ns=['xmlns','{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] 
     46         
    4247        for i in ns:  
    4348            if i in root.keys(): 
     
    5762        ''' Actually we only support tag finding in this ''' 
    5863        tags=xpathExpression.split('/') 
    59         new='' 
    60         for t in tags: new+=self.xmlns+t+'/' 
    61         new=new[0:-1] 
    62         return new 
     64        new=['%s%s'%(self.xmlns,i) for i in tags] 
     65        return '/'.join(new) 
    6366    def getText(self,elem,xpathExpression,multiple=0): 
    6467        ''' Get a text object sensibly ''' 
     
    7174        else: 
    7275                r=[elem.find(self.__distributens(xpathExpression)),] 
    73         try:  # if element is None, this should fail ... 
    74                 rr=[] 
    75                 for i in r: 
    76                     t=i.text  
    77                     if t is not None:  
    78                         #rr.append(t.decode(self.encoding)) 
    79                         rr.append(t) 
    80                     else: rr.append('') 
    81         except: 
    82                 rr=['',] 
     76        rr=[] 
     77        for i in r: 
     78            if i is not None:  
     79                rr.append(self.cleanup.sub(i.text or '')) 
     80            else: rr.append('')  
    8381        if multiple:  
    8482                return rr 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/geoUtilities.py

    r3073 r3092  
    2222    ''' Separated out because this is NDG specific really  
    2323    NB needs to support multiple bounding boxes properly and doesn't ... ''' 
    24     def __init__(self,elem,entity='stubB',getter=wrapGetText): 
    25         '''Parse a data entity and load a bounding box ''' 
    26         match={'stubB': 
    27                  {'North':'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitNorth', 
    28                   'South':'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitSouth', 
    29                   'West':'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitWest', 
    30                   'East':'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitEast'}, 
     24    def __init__(self,elem,helper,entity='moles'): 
     25        '''Parse a data entity and load a boundimatch={'moles': 
     26                 {'North':'*//dgSpatialCoverage/BoundingBox/LimitNorth', 
     27                  'South':'*//dgSpatialCoverage/BoundingBox/LimitSouth', 
     28                  'West':'*//dgSpatialCoverage/BoundingBox/LimitWest', 
     29                  'East':'*//dgSpatialCoverage/BoundingBox/LimitEast'}, 
    3130                'DIF': 
    3231                 {'North':'Spatial_Coverage/Northernmost_Latitude', 
     
    3433                  'West':'Spatial_Coverage/Westernmost_Longitude', 
    3534                  'East':'Spatial_Coverage/Easternmost_Longitude'} 
    36                 } 
    37         #try: 
    38         North=getter(elem,match[entity]['North']) 
    39         South=getter(elem,match[entity]['South']) 
    40         West=getter(elem,match[entity]['West']) 
    41         East=getter(elem,match[entity]['East']) 
     35                }ng box ''' 
     36        #don't think this will work for multiple bounding boxes in a DIF ... yet  
     37        parent={'moles':'*//dgSpatialCoverage/BoundingBox', 
     38                'DIF':'Spatial_Coverage'} 
     39        #N,W,E,S 
     40        ebox={'moles':['LimitNorth','LimitWest','LimitEast','LimitSouth'], 
     41              'DIF':['Northernmost_Latitude','Westernmost_Longitude', 
     42                     'Easternmost_Longitude','Southernmost_Latitude']} 
     43        coverages=helper.findall(elem,parent[entity]) 
    4244        self.boxes=[] 
    4345        self.nboxes=0 
    44          
    45         self.set([North,West,East,South]) 
     46        for coverage in coverages: 
     47            self.set([helper.getText(coverage,i) for i in ebox[entity]]) 
    4648         
    4749    def set(self,box): 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgRetrieve.py

    r3073 r3092  
    8383    try: 
    8484        x=xmlHandler2.xmlHandler(r,string=1) 
    85         
    8685        return 1,x 
    8786    except Exception,e: 
     
    142141        if status: raise ValueError(' NDG-B0 [%s] should not exist [%s]'%(doc,xml) ) 
    143142         
    144          
    145143    def testXMLdif(self): 
    146144        ''' Make sure we can encode and decode at least one DIF properly ''' 
     
    181179        print v.getRelated('rain') 
    182180         
    183          
    184          
    185          
    186181if __name__=="__main__": 
    187182 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/stubB.py

    r3087 r3092  
    1414from People import * 
    1515from ndgObject import ndgObject 
     16 
    1617#from DeploymentHandling import * 
    1718try: #python 2.5 
     
    7475            self.uri=idconvert(helper,elem,config,idelem='dataModelID') 
    7576            self.entryID=self.uri.uri 
    76  
     77            self.bbox=Bounding(self.elem,helper,entity='moles') 
     78            self.timeCoverage=temporal(self.elem,helper) 
     79            self.parameters=helper.getText(elem,'dgGranuleSummary/dgParameterSummary/ParameterName',multiple=1) 
     80            
     81             
    7782class ObservationStation: 
    7883    def __init__(self,h,e): 
    7984        self.e=e   
    80         self.hdg='Obsevation Station' 
     85        self.hdg='Observation Station' 
    8186        if e is None: return 
    8287class DataProductionTool: 
     
    113118    return result 
    114119             
     120def temporal(elem,helper): 
     121    ''' Parse for time coverage attributes ''' 
     122    timeElems=helper.findall(elem,'*//dgTemporalCoverage') 
     123    tc=[] 
     124    for e in timeElems: 
     125        t=e.find('DateRange') 
     126        if t is not None: 
     127            c=[helper.getText(t,'DateRangeStart'),] 
     128            c.append(helper.getText(t,'DateRangeEnd')) 
     129        else: 
     130            c=[helper.getText(e,'DateSingle'),''] 
     131        c.append(helper.getText(elem,'*/dgDatasetStatus/dgDatasetClosure')) 
     132        tc.append(c) 
     133    return tc 
     134             
     135def parseParameters(plist,helper): 
     136    ''' Takes a list of ET Parameter Summary elements, and parses them into a  
     137    sensible pythonic structure. In particular, given: 
     138    <dgParameterSummary>  
     139        <IsOutput>true</IsOutput> 
     140        <dgStdParameterMeasured>  
     141            <dgValidTerm>BAROCLINIC V_VELOCITY (OCEAN) CM/S</dgValidTerm> 
     142            <dgValidTermID>  
     143                <ParentListID>COAPEC_500YrRun_wholerun_decadal_ocean</ParentListID> 
     144                <TermID>null</TermID> 
     145            </dgValidTermID> 
     146        </dgStdParameterMeasured> 
     147        <ParameterName>BAROCLINIC V_VELOCITY (OCEAN) CM/S</ParameterName> 
     148    </dgParameterSummary> 
     149    we take the parameter name and the parentlistID and use them to build up a  
     150    parameter dictionary ''' 
     151    ptypes={} 
     152    for p in plist: 
     153        ptype=helper.getText(p,'dgStdParameterMeasured/dgValidTermID/ParentListID') 
     154        if ptype not in ptypes: ptypes[ptype]=[] 
     155        ptypes[ptype].append(helper.getText(p,'ParameterName')) 
     156    gcmd='http://vocab.ndg.nerc.ac.uk/term/P111' 
     157    if gcmd in ptypes:  
     158        dif=collapse2(ptypes[gcmd],split='/') 
     159        del ptypes[gcmd] 
     160    return dif,ptypes 
     161             
    115162class DataEntity: 
    116163    def __init__(self,helper,element): 
     
    126173        self.getGranules() 
    127174        #bounding box, handled as a class because this is going to be difficult ... 
    128         self.bbox=Bounding(self.elem,entity='stubB') 
    129         self.timeCoverage=self.temporal() 
    130         print 'BOUNDING',self.bbox,self.timeCoverage 
     175        self.bbox=Bounding(self.elem,helper,entity='moles') 
     176        self.timeCoverage=temporal(self.elem,self.helper) 
    131177        #parameters 
    132         plist=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1) 
    133         self.parameters=collapse2(plist,split='/') 
     178        pelem=self.helper.findall(self.elem,'dgDataSummary/dgParameterSummary') 
     179        self.parameters,self.extraParameters=parseParameters(pelem,self.helper) 
    134180        self.hdg='Data Entity' 
    135                
    136          
     181         
    137182    def getGranules(self): 
    138183        ''' Load up the granule content within the entity ''' 
     
    146191            if name=='': name='Granule %s'%i 
    147192            self.granules.append(dataGranule(self.helper,item,self.config,name=name)) 
    148                  
    149     def temporal(self): 
    150         '''Instantiate the timeCoverage attribute by parsing for temporal coverage ''' 
    151         t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange') 
    152         if t is not None: 
    153             c=[self.helper.getText(t,'DateRangeStart'),] 
    154             c.append(self.helper.getText(t,'DateRangeEnd')) 
    155         else: 
    156             c=[self.helper.getText(self.elem, 
    157                     'dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateSingle'),''] 
    158         c.append(self.helper.getText(self.elem,'dgDataSummary/dgDatasetStatus/dgDatasetClosure')) 
    159         return c 
    160193 
    161194class dgMetadataDescription: 
     
    268301    import unittest 
    269302    import os.path 
    270      
    271     de='examples/badc.nerc.ac.uk__NDG-B1__dataent_chablis.xml' 
    272     dpt='examples/badc.nerc.ac.uk__NDG-B1__dpt_11634276941110630.xml' 
     303    from ndgRetrieve import ndgRetrieve 
     304         
    273305     
    274306    class TestCase(unittest.TestCase): 
     
    276308            def testDE(self): 
    277309                ''' Test rendering a DataEntity stubB ''' 
    278                 fname=de 
    279                 self.doit(fname) 
    280                  
    281             def testDPT(self): 
    282                 ''' Test rendering a Data Production Tool stubB ''' 
    283                 fname=dpt 
    284                 self.doit(fname) 
    285                  
    286                  
    287             def doit(self,fname): 
    288                 xml=open(fname,'r').read() 
    289                 config=myConfig('ndgDiscovery.config') 
    290                 layoutdir=config.get('layout','layoutdir') 
    291                 x=stubB(xml,config) 
    292                 y='''<?xml version="1.0" encoding="UTF-8"?> 
    293                     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
    294                     <html xmlsns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    295                             <head> 
    296                                     <META http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/> 
    297                                     <title>stubB</title> 
    298                                     <LINK media="all, screen" href="%s/layout/ndg.css" type="text/css" rel="stylesheet"/> 
    299                             </head> '''%layoutdir+x.toHTML(config) 
    300                 ff=fname+'-output.html' 
    301                 f=file(ff,'w') 
    302                 f.write(y) 
    303                  
    304      
     310                doc='badc.nerc.ac.uk__NDG-B1__dataent_COAPEC' 
     311                xml=self.getit(doc)      
     312                self.doit(xml.tree) 
     313                 
     314            def getit(self,doc): 
     315                self.c=myConfig('../../ndgDiscovery.config') 
     316                uri=ndgObject(doc) 
     317                status,xml=ndgRetrieve(uri,self.c) 
     318                self.assertEqual(status,1) 
     319                return xml 
     320           
     321            def doit(self,xml): 
     322                layoutdir=self.c.get('layout','layoutdir') 
     323                x=stubB(xml,self.c) 
     324                 
     325          
    305326    unittest.main() 
    306327             
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/xmlHandler2.py

    r2976 r3092  
    1515import StringIO, re 
    1616XMLHDR='<?xml version="1.0"' 
     17from ETxmlView import subAI 
    1718 
    1819class xmlHandler: 
     
    2021    def __init__(self,xml,string=0): 
    2122        ''' Open an xml file (or string) and 
    22            - if necessary correct nasty characters and/or orphans before passing to ET 
     23           - Correct nasty characters and/or orphans before passing to ET 
    2324           - load up an element-tree 
    2425           - collect a namespace map ''' 
    2526         
    26         self.r1=None   # we only use the regex if we need them 
     27        self.cleanup=subAI() 
    2728 
    2829        if string: 
     
    3334            self.xmls=file(xmlf,'r').read() 
    3435         
     36        #this ought to be relatively efficient 
     37        self.xmls=self.cleanup.sub(self.xmls) 
     38         
    3539        # Unfortunately we never know whether the incoming xml content is 
    3640        # unicode or a string ... 
    37  
    3841        encoding='utf-8' 
    3942        try: 
     
    4952        self.__getns() 
    5053         
    51         try: 
    52             self.tree=ET.XML(self.xmls) 
    53         except SyntaxError: 
    54             self.xmls=self.__fixXML(self.xmls) 
    55             self.tree=ET.XML(self.xmls) 
    56  
     54         
     55        self.tree=ET.XML(self.xmls) 
    5756        self.__updatens() 
    5857     
     
    9796        def span(x,c): return '<span class="%s">%s</span>'%(c,x) 
    9897        def div(x,c): return '<div class="%s">%s</div>'%(c,x) 
    99         def fix(x):  
    100             if x is None: return '' 
    101             return x 
     98        def fix(x): return (x or '') 
    10299        def et2html(elem):     
    103100            strAttrib='' 
     
    118115        if self.root:h='%s%s %s="%s" %s="%s"%s'%( 
    119116            lt,'?xml',span('version','xmlAttrTyp'),'1.0',span('encoding','xmlAttrTyp'),'utf-8',gt) 
    120         ss=self.__fixXML(ss) 
    121117        if self.realns=={}:  
    122118            r=h+ss 
     
    179175        return h 
    180176      
    181     def __fixXML(self,s): 
    182         #first those nasty ampersands 
    183         s=re.sub(r'&(?!\w+;)', '&amp;', s) 
    184         #and now orphan > < signs 
    185         if self.r1 is None: 
    186             self.r1=re.compile('<([^>]*(<|$))') 
    187             self.r2=re.compile('((^|>)[^<]*)>') 
    188         old='' 
    189         while s != old: 
    190             old=s 
    191             s=self.r1.sub(r'&lt;\1',s) 
    192             s=self.r2.sub(r'\1&gt;',s) 
    193         return s 
    194          
    195177    def _distributens(self,xpathExpression): 
    196178        ''' Actually we only support tag finding in this ''' 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/error.kid

    r2882 r3092  
    1515        <div id="${id}"> 
    1616            <div class="error"> 
    17             ${XML(c.xml)} 
     17            $c.xml 
    1818            </div> 
    1919            <pre py:if="c.doc is not None"> 
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/meta.kid

    r3086 r3092  
    1010                <tr><td class="rowhead">$item</td></tr> 
    1111                <?python 
    12                 #need to make sure keyword with spaces are not split inappropriately 
    13                 keywords=[] 
    14                 for word in params[item]: 
    15                     keywords.append(word.replace(' ','&nbsp;')) 
    16                 keywords=',  '.join(keywords) 
     12                #should make sure keyword with spaces are not split inappropriately 
     13                keywords='; '.join([k.replace(' ','&nbsp;') for k in params[item]]) 
    1714                ?> 
    1815                <tr py:if="params[item]!=[]"><td>${XML(keywords)}</td></tr> 
     
    5754        </tbody></table>  
    5855        <span py:if="bbox.nboxes!=1"><p py:if="h==1" class="cellhead">Spatial Coverage</p> 
    59         <p> Record includes $bbox.nboxes spatial bounding box records </p></span> 
     56            <p py:if="bbox.nboxes>1"> $bbox.nboxes different areas.</p> 
     57            <p py:if="bbox.nboxes==0"> No spatial coverage information available.</p> 
     58        </span> 
    6059    </div> 
    6160     
     
    6564            <tr><td><div py:replace="Spatial(bbox,1)"/></td> 
    6665                <td><table><tr><td colspan="2" class="cellhead"> Temporal coverage</td></tr> 
    67                            <tr><td> Start Date: ${timcov[0]}</td><td>End Date: ${timcov[1]}</td></tr> 
    68                            <tr><td colspan="2"> Status:${timcov[2]}</td></tr></table> 
     66                           <span py:if="len(timcov)==1"> 
     67                                <tr><td> Start Date: ${timcov[0][0]}</td><td>End Date: ${timcov[0][1]}</td></tr> 
     68                                <tr><td colspan="2"> Status:${timcov[0][2]}</td></tr> 
     69                           </span> 
     70                           <tr py:if="len(timcov)==0"><td colspan="2">No temporal information available.</td></tr> 
     71                           <tr py:if="len(timcov)>1"><td colspan="2">${len(timcov)} different periods of data available.</td></tr> 
     72                    </table> 
    6973                </td></tr> 
    7074        </tbody></table> 
     75    </div> 
     76     
     77    <div py:def="ShortCoverage(e)"> 
     78        <span py:if="len(e.timeCoverage)==1">From ${e.timeCoverage[0][0]} to ${e.timeCoverage[0][1]} 
     79        </span><span py:if="e.bbox.nboxes==1"> 
     80         for latitude ${e.bbox.boxes[0][3]} to ${e.bbox.boxes[0][0]}N and longitude ${e.bbox.boxes[0][1]} to ${e.bbox.boxes[0][2]}E 
     81        </span> 
    7182    </div> 
    7283     
  • TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/stubB.kid

    r3073 r3092  
    4747                     
    4848                    <div py:replace="ParameterList(c.doc.parameters)"/> 
     49                    <div py:replace="ParameterList(c.doc.extraParameters)"/> 
     50                     
    4951                    <div py:if="c.doc.stubBtype=='dgDataEntity'" py:replace="Coverage(c.doc.bbox,c.doc.timeCoverage)"/> 
    5052                    <div id="gran_help" class="hidden" > 
     
    6062                            <tbody> 
    6163                                <tr> 
    62                                     <td class="linehead" colspan="3"> 
     64                                    <td class="linehead" colspan="4"> 
    6365                                        <span class="heading0"> Granules </span><span py:replace="helpIcon('gran_help')"/> 
    6466                                    </td> 
     
    6971                                    <td>Access Control</td> 
    7072                                    <td>Granule</td> 
     73                                    <td>Coverage</td> 
    7174                                </tr> 
    7275                                <tr py:for="granule in c.doc.granules"> 
     
    97100                                        <a href="$g.server/view/$granule.entryID">$granule.name</a> 
    98101                                    </td> 
     102                                    <td><div py:replace="ShortCoverage(granule)"/></td> 
    99103                                </tr> 
    100104                            </tbody> 
Note: See TracChangeset for help on using the changeset viewer.