source: TI07-MOLES/trunk/PythonCode/wsgi/stubB.py @ 2371

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/wsgi/stubB.py@2371
Revision 2371, 7.5 KB checked in by lawrence, 13 years ago (diff)

Interim check in browse update ... (browse still not working properly)

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# BNL April 2006
6#
7from renderEntity import renderEntity
8from Utilities import *
9from AccessControl import AccessControl
10from geoUtilities import Bounding
11from People import *
12from ndgObject import ndgObject
13from xmlHandler import xmlHandler
14try: #python 2.5
15    from xml.etree import ElementTree as ET
16except ImportError:
17    try:
18        # if you've installed it yourself it comes this way
19        import ElementTree as ET
20    except ImportError:
21        # if you've egged it this is the way it comes
22        from elementtree import ElementTree as ET
23
24def idconvert(helper,elem,config=None):
25    ''' Given an elementTree element for a dgMetadataID, create
26    a standard ndg URI, and produce an ndgObject '''
27    id=helper.find(elem,'dgMetadataID')
28    entryID='%s__%s__%s'%(helper.getText(id,'repositoryIdentifier'),
29                            helper.getText(id,'schemeIdentifier'),
30                            helper.getText(id,'localIdentifier'))
31    uri=ndgObject(entryID,config)
32    return uri
33
34class dataGranule:
35        ''' Provides support for data granule structures '''
36        def __init__(self,helper,elem,config,name=''):
37            self.elem=elem
38            self.constraints=AccessControl(helper.find(elem,'accessControlPolicy'))
39            self.name=name
40            self.uri=idconvert(helper,elem,config)
41            self.entryID=self.uri.uri
42
43class ObservationStation:
44    def __init__(self,e):
45        self.e=e
46        if e is None: return
47class DataProductionTool:
48    def __init__(self,e):
49        self.e=e
50        if e is None: return
51class Activity:
52    def __init__(self,e):
53        self.e=e
54        if e is None: return
55class Deployment:
56    def __init__(self,e):
57        self.e=e
58        if e is None: return
59       
60class DataEntity:
61    def __init__(self,helper,element):
62        ''' Attempt to instantiate this stubB as a data entity'''
63        self.elem=element
64        self.helper=helper
65        #just one curator
66        self.curator=dgContact(self.elem.find('dgDataRoles/dgDataCurator'),ctype='organisation')
67        #possibly multiple creators
68        self.creators=[dgContact(i) for i in self.elem.findall('dgDataRoles/dgDataCreator')]
69        host,service = '','' # dummy for now
70        #possibly multiple granules
71        self.getGranules()
72        #bounding box, handled as a class because this is going to be difficult ...
73        self.bbox=Bounding(self.elem,entity='stubB')
74        self.temporal()
75        #parameters
76        self.parameters=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1)
77       
78    def getGranules(self):
79        ''' Load up the granule content within the entity '''
80        granList=self.elem.findall('dgDataGranule')
81        self.granules=[]
82        i=0
83        for item in granList:
84            i+=1
85            #following needs to be refactored when granule definition includes a proper name ...
86            name=wrapGetText(item,'name')
87            if name=='': name='Granule %s'%i
88            self.granules.append(dataGranule(self.helper,item,self.config,name=name))
89               
90    def temporal(self):
91        '''Instantiate the timeCoverage attribute by parsing for temporal coverage '''
92        t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange')
93        if t is not None:
94           try:
95                self.timeCoverage=(float(i.text) for i in t)
96           except:
97                self.timeCoverage=('',)
98                               
99        else:
100           t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateSingle')
101           try:
102                self.timeCoverage=(t.text,)
103           except:
104                self.timeCoverage=('',)
105
106
107
108class stubB(DataEntity,Deployment,ObservationStation,DataProductionTool,Activity):
109       
110        ''' Holds the stub-b document and provides methods which get and manipulate it '''
111       
112        def __init__(self,xml,config):
113               
114                '''Instantiate by parsing an xml document passed in as a string '''
115               
116                self.metadataType='stubB'
117                self.services=[]
118                self.config=config
119               
120                self.labels={'activity':'Activity ','observationstation':'Observation Station ',
121                                        'dataproductiontool':'Data Production Tool ','dataEntity':'Data Entity ','dataentity':'Data Entity'}
122                try:
123                        self.xml=xml
124                        self.xh=xmlHandler(xml,string=1)
125                        self.tree=self.xh.tree
126                        helper=nsdumb(self.tree)
127                        self.name=helper.getText(self.tree,'name')
128                except Exception,e:
129                        raise ValueError('Error instantiating stubB [%s]'%e)
130               
131
132                self.ndgObject=idconvert(helper,self.tree,self.config)
133                self.entryID=self.ndgObject.uri             
134                #Note that the root of the ElementTree instance is dgMetadataRecord
135                #so we don't need (or want) that in our xpath expressions.
136               
137                self.constraints=AccessControl(helper.find(self.tree,'dgMetadataSecurity'))
138                self.abbreviation=helper.getText(self.tree,'abbreviation')
139                if self.abbreviation=='': self.abbreviation=self.name[0:min(15,len(self.name))]
140                print 'Loading',self.entryID
141                elem=self.tree.find('dgDataEntity')
142                if elem is not None:
143                        DataEntity.__init__(self,helper,elem)
144                        self.type='dgDataEntity'
145                        self.others=('activity','observationstation','dataproductiontool')
146                        related='/RelatedDeployment'
147                elem=self.tree.find('dgActivity')
148                if elem is not None:
149                        self.type='dgActivity'
150                        #nb activity stub-b seems to have dataentity instead of dataEntity
151                        self.others=('dataentity','dataEntity','observationstation','dataproductiontool')
152                        related='/ActivityDeployment'
153                       
154                elem=self.tree.find('dgDataProductionTool')
155                if elem is not None:
156                        self.type='dgDataProductionTool'
157                        self.others=('dataEntity','observationstation','activity')
158                        related='DPTDeployment'
159               
160                elem=self.tree.find('dgObservationStation')
161                if elem is not None:
162                        related='/ObsStnDeployment'
163                        self.type='dgObservationStation'
164                        self.others=('dataEntity','dataproductiontool','activity')
165
166                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText')
167                print self.abstract
168                # now go get all the related links
169                self.related=[]
170               
171                deployment=['empty',[]]  #something should eventually go in the empty slot ...
172                for item in self.others:
173                    #multiple types of "related deployment definitions"
174                    subitems=self.tree.findall(self.type+'/*/'+item)
175                    if subitems != []:
176                        aa=[]
177                        for subitem in subitems:
178                            name=wrapGetText(subitem,'name')
179                            uri=idconvert(helper,subitem,self.config)
180                            aa.append(uri)
181                        deployment[1].append([self.labels[item],aa])
182                self.related.append(deployment)
183                print 'Loaded:',self.entryID
184        def toHTML(self,config):
185            if self.tree is not None:
186                renderer=renderEntity(config)
187                return renderer.render(self)
188            else:
189                return '<p>No Valid Stub-B</p>'
190       
191if __name__=="__main__":
192       
193        #xml=open("../../exampleB/methyl.example.xml",'r').read()
194        xml=open('COAPC_ObsStn.xml','r').read()
195        x=stubB(xml,serviceFile='serviceMap.config')
196        y='''<?xml version="1.0" encoding="UTF-8"?>
197                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
198                <html xmlsns="http://www.w3.org/1999/xhtml" xml:lang="en">
199                        <head>
200                                <META http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/>
201                                <title>stubB</title>
202                                <LINK media="all, screen" href="../layout/style.css" type="text/css" rel="stylesheet"/>
203                        </head> '''+x.toHTML(myConfig('browse.config'))
204        f=file('output.html','w')
205        f.write(y)
Note: See TracBrowser for help on using the repository browser.