source: TI05-delivery/ows_framework/trunk/ows_server/ows_server/lib/ndg/stubB.py @ 2643

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI05-delivery/ows_framework/trunk/ows_server/ows_server/lib/ndg/stubB.py@2643
Revision 2643, 9.4 KB checked in by lawrence, 12 years ago (diff)

Starting to put stubB handling into ows/browse.
Starting to add trackback support.

Line 
1#!/usr/bin/env python
2#
3# This python code (will) handle all forms of stub-B and provide HTML
4# methods to the extent required by the NDG browse functionality.
5# NB, It would be cleaner to use Dom's way of doing things but we'd
6# need a schema for that ...
7# BNL April 2006
8#
9from renderEntity import renderEntity
10from Utilities import *
11from AccessControl import AccessControl
12from geoUtilities import Bounding
13from People import *
14from ndgObject import ndgObject
15from xmlHandler import xmlHandler
16from DeploymentHandling import *
17try: #python 2.5
18    from xml.etree import ElementTree as ET
19except ImportError:
20    try:
21        # if you've installed it yourself it comes this way
22        import ElementTree as ET
23    except ImportError:
24        # if you've egged it this is the way it comes
25        from elementtree import ElementTree as ET
26
27def idconvert(helper,elem,config=None):
28    ''' Given an elementTree element for a dgMetadataID, create
29    a standard ndg URI, and produce an ndgObject '''
30    id=helper.find(elem,'dgMetadataID')
31    entryID='%s__%s__%s'%(helper.getText(id,'repositoryIdentifier'),
32                            helper.getText(id,'schemeIdentifier'),
33                            helper.getText(id,'localIdentifier'))
34    uri=ndgObject(entryID,config)
35    return uri
36
37class ndgLink:
38    ''' This is a holder for an ndgObject which has a name (and possibly abbreviation) '''
39    def __init__(self,name,abbrev,ndgO,label='',image=None):
40        self.ndgObject=ndgO
41        self.name=name
42        self.abbrev=abbrev
43        self.image=image
44        self.label=label
45        self.URL=ndgO.BURL
46    def toHTML(self):
47        ### needs to be finished
48        return self.ndgObject.URL
49
50class dataGranule:
51        ''' Provides support for data granule structures '''
52        def __init__(self,helper,elem,config,name=''):
53            self.elem=elem
54            self.constraints=AccessControl(helper.find(elem,'accessControlPolicy'))
55            self.name=name
56            self.uri=idconvert(helper,elem,config)
57            self.entryID=self.uri.uri
58
59class ObservationStation:
60    def __init__(self,e):
61        self.e=e
62        if e is None: return
63class DataProductionTool:
64    def __init__(self,e):
65        self.e=e
66        if e is None: return
67class Activity:
68    def __init__(self,e):
69        self.e=e
70        if e is None: return
71       
72       
73class DataEntity:
74    def __init__(self,helper,element):
75        ''' Attempt to instantiate this stubB as a data entity'''
76        self.elem=element
77        self.helper=helper
78        #just one curator
79        self.curator=dgContact(self.elem.find('dgDataRoles/dgDataCurator'),ctype='organisation')
80        #possibly multiple creators
81        self.creators=[dgContact(i) for i in self.elem.findall('dgDataRoles/dgDataCreator')]
82        host,service = '','' # dummy for now
83        #possibly multiple granules
84        self.getGranules()
85        #bounding box, handled as a class because this is going to be difficult ...
86        self.bbox=Bounding(self.elem,entity='stubB')
87        self.temporal()
88        #parameters
89        self.parameters=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1)
90       
91    def getGranules(self):
92        ''' Load up the granule content within the entity '''
93        granList=self.elem.findall('dgDataGranule')
94        self.granules=[]
95        i=0
96        for item in granList:
97            i+=1
98            #following needs to be refactored when granule definition includes a proper name ...
99            name=wrapGetText(item,'name')
100            if name=='': name='Granule %s'%i
101            self.granules.append(dataGranule(self.helper,item,self.config,name=name))
102               
103    def temporal(self):
104        '''Instantiate the timeCoverage attribute by parsing for temporal coverage '''
105        t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange')
106        if t is not None:
107           try:
108                self.timeCoverage=(float(i.text) for i in t)
109           except:
110                self.timeCoverage=('',)
111                               
112        else:
113           t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateSingle')
114           try:
115                self.timeCoverage=(t.text,)
116           except:
117                self.timeCoverage=('',)
118
119class dgMetadataDescription:
120   
121    def __init__(self,helper,elem):
122        ''' Initialise a Metadata Description '''
123        n=idconvert(helper,elem)
124        self.uri=n.uri
125        self.abstract=helper.getText(elem,'abstract/abstractText')
126        self.description=helper.getText(elem,'descriptionSection/dgDescriptionText')
127        self.descriptionType=helper.getText(elem,'descriptionSection/contentType')
128        online=helper.findall(elem,'descriptionSection/descriptionOnlineReference/dgSimpleLink')
129        self.onlineRefs=[]
130        for o in online:
131            self.onlineRefs.append((helper.getText(o,'name'),helper.getText(o,'URI')))
132
133
134class stubB(DataEntity,Deployment,ObservationStation,DataProductionTool,Activity):
135       
136        ''' Holds the stub-b document and provides methods which get and manipulate it '''
137       
138        def __init__(self,xmlHandlerInstance,config):
139               
140                '''Instantiate with an xmlHandler instance and config file '''
141               
142                self.metadataType='NDG-B1'
143                self.services=[]
144                self.config=config
145                self.citation=''
146                self.personnel=[] # for DIF compatiability for the moment.
147               
148                try:
149                        self.xml=xml
150                        self.xh=xmlHandler(xml,string=1)
151                        self.tree=self.xh.tree
152                        helper=nsdumb(self.tree)
153                        self.name=helper.getText(self.tree,'name')
154                except Exception,e:
155                        raise ValueError('Error instantiating stubB [%s]'%e)
156
157                self.ndgObject=idconvert(helper,self.tree,self.config)
158                self.entryID=self.ndgObject.uri
159               
160                #Note that the root of the ElementTree instance is dgMetadataRecord
161                #so we don't need (or want) that in our xpath expressions.
162               
163                self.constraints=AccessControl(helper.find(self.tree,'dgMetadataSecurity'))
164                self.abbreviation=helper.getText(self.tree,'abbreviation')
165                if self.abbreviation=='': self.abbreviation=self.name[0:min(15,len(self.name))]
166               
167                for i in ('dgDataEntity','dgActivity','dgDataProductionTool','dgObservationStation'):
168                    elem=helper.find(self.tree,i)
169                    if elem is not None: break
170                if elem is None:
171                    f=file('tmp.xml','w')
172                    f.write(self.xml)
173                    f.close()
174                    raise ValueError('StubB record does not contain an Activity, DE, DPT, ObsStn')
175                elif elem.tag=='dgDataEntity':
176                        DataEntity.__init__(self,helper,elem)
177                        self.type='dgDataEntity'
178                        self.others=('activity','observationstation','dataproductiontool')
179                        related='RelatedDeployment'
180                elif elem.tag=='dgActivity':
181                        self.type='dgActivity'
182                        #nb activity stub-b seems to have dataentity instead of dataEntity
183                        self.others=('dataentity','dataEntity','observationstation','dataproductiontool')
184                        related='ActivityDeployment'
185                elif elem.tag=='dgDataProductionTool':
186                        self.type='dgDataProductionTool'
187                        self.others=('dataEntity','observationstation','activity')
188                        related='DPTDeployment'
189                elif elem.tag=='dgObservationStation':
190                        related='ObsStnDeployment'
191                        self.type='dgObservationStation'
192                        self.others=('dataEntity','dataproductiontool','activity')
193
194                self.description=dgMetadataDescription(helper,helper.find(self.tree,'dgMetadataDescription'))
195                self.abstract=self.description.abstract
196                self.stubBtype=elem.tag
197             
198                # now go get all the related links
199                #old stub-B:
200                #self.related=[]
201                #for d in helper.findall(elem,related):
202                #    self.related.append(Deployment(helper,d,self.others,self.config))
203                #stripped-B:
204                #self.related=Deployments(helper,helper.findall(elem,related))
205                self.related=Deployments(helper,elem.tag,self.config)
206                print elem.tag
207                for e in helper.findall(elem,related):
208                    print e.tag
209                    self.related.add(e)
210
211        def toHTML(self,config):
212            if self.tree is not None:
213                renderer=renderEntity(config)
214                return renderer.render(self)
215            else:
216                return '<p>No Valid Stub-B</p>'
217           
218import unittest
219import os.path
220
221de='examples/badc.nerc.ac.uk__NDG-B1__dataent_chablis.xml'
222dpt='examples/badc.nerc.ac.uk__NDG-B1__dpt_11634276941110630.xml'
223
224class TestCase(unittest.TestCase):
225
226        def testDE(self):
227            ''' Test rendering a DataEntity stubB '''
228            fname=de
229            self.doit(fname)
230           
231        def testDPT(self):
232            ''' Test rendering a Data Production Tool stubB '''
233            fname=dpt
234            self.doit(fname)
235           
236           
237        def doit(self,fname):
238            xml=open(fname,'r').read()
239            config=myConfig('ndgDiscovery.config')
240            layoutdir=config.get('layout','layoutdir')
241            x=stubB(xml,config)
242            y='''<?xml version="1.0" encoding="UTF-8"?>
243                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
244                <html xmlsns="http://www.w3.org/1999/xhtml" xml:lang="en">
245                        <head>
246                                <META http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/>
247                                <title>stubB</title>
248                                <LINK media="all, screen" href="%s/layout/ndg.css" type="text/css" rel="stylesheet"/>
249                        </head> '''%layoutdir+x.toHTML(config)
250            ff=fname+'-output.html'
251            f=file(ff,'w')
252            f.write(y)
253           
254if __name__=="__main__":
255    unittest.main()
256           
257           
Note: See TracBrowser for help on using the repository browser.