Changeset 3092 for TI05-delivery/ows_framework/trunk
- Timestamp:
- 03/12/07 12:37:22 (12 years ago)
- 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 113 113 114 114 #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') 116 116 117 117 #load up information about temporal extent … … 122 122 status=helper.getText(self.tree,'Data_Set_Progress') 123 123 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))] 127 127 128 128 #load up those silly paleo keywords -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ETxmlView.py
r2615 r3092 17 17 18 18 class subAI: 19 ''' This is Alan Iwi's substitute and replace orphan <> code '''19 ''' This is Alan Iwi's substitute and replace orphan <> and & code ''' 20 20 def __init__(self): 21 21 self.r1=re.compile('<([^>]*(<|$))') 22 22 self.r2=re.compile('((^|>)[^<]*)>') 23 self.r3=re.compile('&(?!amp;)') 23 24 def sub(self,s): 24 25 old='' 26 s=self.r3.sub(r'&',s) 27 s=s.replace(';amp',';') 25 28 while s != old: 26 29 old=s … … 36 39 instantiatin ''' 37 40 self.encoding=encoding 41 self.cleanup=subAI() 38 42 if root is None: 39 43 self.xmlns='' 40 44 return 41 45 ns=['xmlns','{http://www.w3.org/2001/XMLSchema-instance}schemaLocation'] 46 42 47 for i in ns: 43 48 if i in root.keys(): … … 57 62 ''' Actually we only support tag finding in this ''' 58 63 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) 63 66 def getText(self,elem,xpathExpression,multiple=0): 64 67 ''' Get a text object sensibly ''' … … 71 74 else: 72 75 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('') 83 81 if multiple: 84 82 return rr -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/geoUtilities.py
r3073 r3092 22 22 ''' Separated out because this is NDG specific really 23 23 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'}, 31 30 'DIF': 32 31 {'North':'Spatial_Coverage/Northernmost_Latitude', … … 34 33 'West':'Spatial_Coverage/Westernmost_Longitude', 35 34 '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]) 42 44 self.boxes=[] 43 45 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]]) 46 48 47 49 def set(self,box): -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/ndgRetrieve.py
r3073 r3092 83 83 try: 84 84 x=xmlHandler2.xmlHandler(r,string=1) 85 86 85 return 1,x 87 86 except Exception,e: … … 142 141 if status: raise ValueError(' NDG-B0 [%s] should not exist [%s]'%(doc,xml) ) 143 142 144 145 143 def testXMLdif(self): 146 144 ''' Make sure we can encode and decode at least one DIF properly ''' … … 181 179 print v.getRelated('rain') 182 180 183 184 185 186 181 if __name__=="__main__": 187 182 -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/stubB.py
r3087 r3092 14 14 from People import * 15 15 from ndgObject import ndgObject 16 16 17 #from DeploymentHandling import * 17 18 try: #python 2.5 … … 74 75 self.uri=idconvert(helper,elem,config,idelem='dataModelID') 75 76 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 77 82 class ObservationStation: 78 83 def __init__(self,h,e): 79 84 self.e=e 80 self.hdg='Obse vation Station'85 self.hdg='Observation Station' 81 86 if e is None: return 82 87 class DataProductionTool: … … 113 118 return result 114 119 120 def 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 135 def 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 115 162 class DataEntity: 116 163 def __init__(self,helper,element): … … 126 173 self.getGranules() 127 174 #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) 131 177 #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) 134 180 self.hdg='Data Entity' 135 136 181 137 182 def getGranules(self): 138 183 ''' Load up the granule content within the entity ''' … … 146 191 if name=='': name='Granule %s'%i 147 192 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 c160 193 161 194 class dgMetadataDescription: … … 268 301 import unittest 269 302 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 273 305 274 306 class TestCase(unittest.TestCase): … … 276 308 def testDE(self): 277 309 ''' 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 305 326 unittest.main() 306 327 -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/models/xmlHandler2.py
r2976 r3092 15 15 import StringIO, re 16 16 XMLHDR='<?xml version="1.0"' 17 from ETxmlView import subAI 17 18 18 19 class xmlHandler: … … 20 21 def __init__(self,xml,string=0): 21 22 ''' Open an xml file (or string) and 22 - if necessary correct nasty characters and/or orphans before passing to ET23 - Correct nasty characters and/or orphans before passing to ET 23 24 - load up an element-tree 24 25 - collect a namespace map ''' 25 26 26 self. r1=None # we only use the regex if we need them27 self.cleanup=subAI() 27 28 28 29 if string: … … 33 34 self.xmls=file(xmlf,'r').read() 34 35 36 #this ought to be relatively efficient 37 self.xmls=self.cleanup.sub(self.xmls) 38 35 39 # Unfortunately we never know whether the incoming xml content is 36 40 # unicode or a string ... 37 38 41 encoding='utf-8' 39 42 try: … … 49 52 self.__getns() 50 53 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) 57 56 self.__updatens() 58 57 … … 97 96 def span(x,c): return '<span class="%s">%s</span>'%(c,x) 98 97 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 '') 102 99 def et2html(elem): 103 100 strAttrib='' … … 118 115 if self.root:h='%s%s %s="%s" %s="%s"%s'%( 119 116 lt,'?xml',span('version','xmlAttrTyp'),'1.0',span('encoding','xmlAttrTyp'),'utf-8',gt) 120 ss=self.__fixXML(ss)121 117 if self.realns=={}: 122 118 r=h+ss … … 179 175 return h 180 176 181 def __fixXML(self,s):182 #first those nasty ampersands183 s=re.sub(r'&(?!\w+;)', '&', s)184 #and now orphan > < signs185 if self.r1 is None:186 self.r1=re.compile('<([^>]*(<|$))')187 self.r2=re.compile('((^|>)[^<]*)>')188 old=''189 while s != old:190 old=s191 s=self.r1.sub(r'<\1',s)192 s=self.r2.sub(r'\1>',s)193 return s194 195 177 def _distributens(self,xpathExpression): 196 178 ''' Actually we only support tag finding in this ''' -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/error.kid
r2882 r3092 15 15 <div id="${id}"> 16 16 <div class="error"> 17 $ {XML(c.xml)}17 $c.xml 18 18 </div> 19 19 <pre py:if="c.doc is not None"> -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/meta.kid
r3086 r3092 10 10 <tr><td class="rowhead">$item</td></tr> 11 11 <?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(' ',' ')) 16 keywords=', '.join(keywords) 12 #should make sure keyword with spaces are not split inappropriately 13 keywords='; '.join([k.replace(' ',' ') for k in params[item]]) 17 14 ?> 18 15 <tr py:if="params[item]!=[]"><td>${XML(keywords)}</td></tr> … … 57 54 </tbody></table> 58 55 <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> 60 59 </div> 61 60 … … 65 64 <tr><td><div py:replace="Spatial(bbox,1)"/></td> 66 65 <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> 69 73 </td></tr> 70 74 </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> 71 82 </div> 72 83 -
TI05-delivery/ows_framework/trunk/ows_server/ows_server/templates/stubB.kid
r3073 r3092 47 47 48 48 <div py:replace="ParameterList(c.doc.parameters)"/> 49 <div py:replace="ParameterList(c.doc.extraParameters)"/> 50 49 51 <div py:if="c.doc.stubBtype=='dgDataEntity'" py:replace="Coverage(c.doc.bbox,c.doc.timeCoverage)"/> 50 52 <div id="gran_help" class="hidden" > … … 60 62 <tbody> 61 63 <tr> 62 <td class="linehead" colspan=" 3">64 <td class="linehead" colspan="4"> 63 65 <span class="heading0"> Granules </span><span py:replace="helpIcon('gran_help')"/> 64 66 </td> … … 69 71 <td>Access Control</td> 70 72 <td>Granule</td> 73 <td>Coverage</td> 71 74 </tr> 72 75 <tr py:for="granule in c.doc.granules"> … … 97 100 <a href="$g.server/view/$granule.entryID">$granule.name</a> 98 101 </td> 102 <td><div py:replace="ShortCoverage(granule)"/></td> 99 103 </tr> 100 104 </tbody>
Note: See TracChangeset
for help on using the changeset viewer.