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

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

Further modifications to python discovery gui, and the entities
which support it ...

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