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

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

Pretty sure this will have broken the browse,
but can't check at the moment. This is the first
commit that has live links to the security code.

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
12       
13class Name:
14        ''' Handles the name type '''
15        def __init__(self,element):
16                if element is None:
17                        self.name=''
18                        return
19                if wrapGetText(element,'nameOrder')=='L2R':
20                        o=('title','initials','familyName')
21                else:
22                        o=('title','familyName','personalName')
23                self.name=''
24                for i in o: self.name+=' '+ wrapGetText(element,i)
25        def __str__(self):
26                return self.name
27       
28class dgContact:
29        '''A simple summary of contact information for an organisation or a person '''
30        #want to contract organisations and people into one simple type here ...
31        #This is moles 1.2.3 ... hopefully we can improve this ...
32        def __init__(self,element,ctype='org'):
33                ''' Instantiate a MOLES person element '''
34                self.elem=element
35                if self.elem is None: return
36                self.data={}
37                self.data['name']=Name(self.elem.find('dgRoleHolder/dgPerson/name'))
38                if ctype=='org':
39                        base='dgRoleHolder/dgOrganisation/'
40                else:
41                        base='dgRoleHolder/dgPerson/'
42                self.data['org']=wrapGetText(self.elem,base+'name')
43                self.data['email']=wrapGetText(self.elem,base+'contactDetails/eMail')
44                self.data['phone']=wrapGetText(self.elem,'contactDetails/telephone')
45                self.data['url']=wrapGetText(self.elem,'contactDetails/URI')
46        def toHTML(self):
47                ''' Convert to simple HTML '''
48                labels={'name':'','org':'Organisation: ','email':'Email: ','phone':'Phone: '}
49                html='<p>'
50                for item in ('name','org','email','phone'):
51                        if str(item) !='': html+='%s%s%s'%(labels[item],self.data[item],'<br/>')
52                html+='</p>'
53                return html
54               
55class Bounding:
56        ''' Separated out because this may change with versions '''
57        def __init__(self,elem):
58                '''Parse a data entity and load a bounding box '''
59                North=wrapGetText(elem,
60                        'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitNorth')
61                South=wrapGetText(elem,
62                        'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitSouth')
63                West=wrapGetText(elem,
64                        'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitWest')
65                East=wrapGetText(elem,
66                        'dgDataSummary/dgDataCoverage/dgSpatialCoverage/BoundingBox/LimitEast')
67                try:
68                        self.box=[float(i) for i in [North, South,West, East]]
69                except:
70                        self.box=None
71        def toHTML(self):
72                if self.box is not None:
73                        html='''<p>
74                                Limit North: %s <br/>
75                                Limit South: %s <br/>
76                                Limit West: %s <br/>
77                                Limit East: %s <br/>   
78                                </p>'''%self.box
79                else:
80                        html='No bounding box available'
81                return html     
82               
83               
84class dataGranule:
85        ''' Provides support for data granule structures '''
86        def __init__(self,elem):
87                self.elem=elem
88                self.constraints=AccessControl(elem.find('accessControlPolicy'))
89                self.binding=ServiceBinding('A',elem.find('dataModelID'))
90                self.Aurl=self.binding.url
91       
92class DataEntity:
93        def __init__(self,element):
94                ''' Attempt to instantiate this stubB as a data entity'''
95                self.elem=element
96                #just one curator
97                self.curator=dgContact(self.elem.find('dgDataRoles/dgDataCurator'),ctype='org')
98                #possibly multiple creators
99                self.creators=[dgContact(i) for i in self.elem.findall('dgDataRoles/dgDataCreator')]
100                host,service = '','' # dummy for now
101                #possibly multiple granules
102                self.getGranules()
103                #bounding box, handled as a class because this is going to be difficult ...
104                self.bbox=Bounding(self.elem)
105                self.temporal()
106                #parameters
107                self.parameters=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1)
108               
109        def getGranules(self):
110                ''' Load up the granule content within the entity '''
111                granList=self.elem.findall('dgDataGranule')
112                self.granules=[]
113                for item in granList:
114                        self.granules.append(dataGranule(item))
115               
116        def temporal(self):
117                '''Instantiate the timeCoverage attribute by parsing for temporal coverage '''
118                t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange')
119                if t is not None:
120                        try:
121                                self.timeCoverage=[float(i.text) for i in t]
122                        except:
123                                self.timeCoverage='No time information'
124                else:
125                        t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateSingle')
126                        try:
127                                self.timeCoverage=t.text
128                        except:
129                                self.timeCoverage='No time information'
130
131
132class stubB(DataEntity):
133       
134        ''' Holds the stub-b document and provides methods which get and manipulate it '''
135       
136        def __init__(self,xml,makeHTML=None, ServiceBinding=ServiceBinding):
137               
138                '''Instantiate by parsing an xml document passed in as a string '''
139               
140                self.makeHTML=makeHTML
141                self.metadataType='stubB'
142                self.labels={'activity':'Activity ','observationstation':'Observation Station ',
143                                        'dataproductiontool':'Data Production Tool ','dgDataEntity':'Data Entity '}
144               
145                try:
146                        self.xml=xml
147                        self.tree=ET.fromstring(self.xml)
148                        self.name=wrapGetText(self.tree,'name')
149                except:
150                        self.xml=None
151                        self.tree=None
152                        self.name='Not Found'
153                        return
154               
155                #Note that the root of the ElementTree instance is dgMetadataRecord
156                #so we don't need (or want) that in our xpath expressions.
157               
158                self.constraints=AccessControl(self.tree.find('dgMetadataSecurity'))
159                self.abbreviation=wrapGetText(self.tree,'abbreviation')
160               
161                elem=self.tree.find('dgDataEntity')
162                if elem is not None:
163                        DataEntity.__init__(self,elem)
164                        self.type='dgDataEntity'
165                        self.others=('activity','observationstation','dataproductiontool')
166                       
167                elem=self.tree.find('dgActivity')
168                if elem is not None:
169                        self.type='dgActivity'
170                        self.others=('dgDataEntity','observationstation','dataproductiontool')
171                       
172                elem=self.tree.find('dgDataProductionTool')
173                if elem is not None:
174                        self.type='dgDataProductionTool'
175                        self.others=('dgDataEntity','observationstation','activity')
176               
177                elem=self.tree.find('dgObservationStation')
178                if elem is not None:
179                        self.type='dgObservationStation'
180                        self.others=('dgDataEntity','dataproductiontool','activity')
181
182                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText')
183               
184                self.binding=ServiceBinding('B',self.tree.find('dgMetadataID'))
185                self.Burl=self.binding.url
186               
187                # now go get all the related links
188                self.related=[]
189                for related in self.tree.findall(self.type+'/RelatedDeployment'):
190                        deployment=['empty',[]]  #something should eventually go in the empty slot ...
191                        for item in self.others:
192                                subitems=related.findall(item)
193                                if subitems != []:
194                                        aa=[]
195                                        for subitem in subitems:
196                                                name=wrapGetText(subitem,'name')
197                                                binding=ServiceBinding('B',subitem.find('dgMetadataID'))
198                                                aa.append([name,binding.url])
199                                        deployment[1].append([self.labels[item],aa])
200                        self.related.append(deployment)
201       
202        def toHTML(self):
203                if self.tree is not None:
204                        return self.makeHTML(self)
205                else:
206                        return 'No Valid Stub-B'
207       
208if __name__=="__main__":
209       
210        xml=open("../../exampleB/methyl.example.xml",'r').read()
211        x=stubB(xml,makeHTML=renderEntity)
212        y='''<?xml version="1.0" encoding="UTF-8"?>
213                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
214                <html xmlsns="http://www.w3.org/1999/xhtml" xml:lang="en">
215                        <head>
216                                <META http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/>
217                                <title>stubB</title>
218                                <LINK media="all, screen" href="../layout/style.css" type="text/css" rel="stylesheet"/>
219                        </head> '''+x.toHTML()
220        f=file('output.html','w')
221        f.write(y)
Note: See TracBrowser for help on using the repository browser.