source: TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/stubB.py @ 1175

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/StubB/XSLT/browse/portal/cgi/browse/stubB.py@1175
Revision 1175, 6.4 KB checked in by lawrence, 14 years ago (diff)

Sundry problems fixed with respect to namespaces etc

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