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

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

Minor bug fixes to various browse code bits and bobs ...

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