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

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

More browse/discovery rendering modifications, utilising
Kev's new DIF returning routine ...

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,nativeID=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               
101                self.labels={'activity':'Activity ','observationstation':'Observation Station ',
102                                        'dataproductiontool':'Data Production Tool ','dgDataEntity':'Data Entity '}
103               
104                try:
105                        self.xml=xml
106                        self.tree=ET.fromstring(self.xml)
107                        self.name=wrapGetText(self.tree,'name')
108                except:
109                        self.xml=None
110                        self.tree=None
111                        self.name='Not Found'
112                        return
113                self.binding=ServiceBinding(n=wrapGetText(self.tree,'abbreviation'),
114                                nativeID=self.tree.find('dgMetadataID'),serviceFile=serviceFile)
115                self.Burl=self.binding.url
116                             
117                #Note that the root of the ElementTree instance is dgMetadataRecord
118                #so we don't need (or want) that in our xpath expressions.
119               
120                self.constraints=AccessControl(self.tree.find('dgMetadataSecurity'))
121                self.abbreviation=wrapGetText(self.tree,'abbreviation')
122               
123                elem=self.tree.find('dgDataEntity')
124                if elem is not None:
125                        DataEntity.__init__(self,elem)
126                        self.type='dgDataEntity'
127                        self.others=('activity','observationstation','dataproductiontool')
128                       
129                elem=self.tree.find('dgActivity')
130                if elem is not None:
131                        self.type='dgActivity'
132                        self.others=('dgDataEntity','observationstation','dataproductiontool')
133                       
134                elem=self.tree.find('dgDataProductionTool')
135                if elem is not None:
136                        self.type='dgDataProductionTool'
137                        self.others=('dgDataEntity','observationstation','activity')
138               
139                elem=self.tree.find('dgObservationStation')
140                if elem is not None:
141                        self.type='dgObservationStation'
142                        self.others=('dgDataEntity','dataproductiontool','activity')
143
144                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText')
145               
146
147                # now go get all the related links
148                self.related=[]
149                for related in self.tree.findall(self.type+'/RelatedDeployment'):
150                        deployment=['empty',[]]  #something should eventually go in the empty slot ...
151                        for item in self.others:
152                                subitems=related.findall(item)
153                                if subitems != []:
154                                        aa=[]
155                                        for subitem in subitems:
156                                                name=wrapGetText(subitem,'name')
157                                                binding=ServiceBinding(name,nativeID=subitem.find('dgMetadataID'),uri='stubB',serviceFile=serviceFile)
158                                                aa.append(binding)
159                                        deployment[1].append([self.labels[item],aa])
160                        self.related.append(deployment)
161       
162        def toHTML(self,config):
163            if self.tree is not None:
164                renderer=renderEntity(config)
165                return renderer.render(self)
166            else:
167                return '<p>No Valid Stub-B</p>'
168       
169if __name__=="__main__":
170       
171        xml=open("../../exampleB/methyl.example.xml",'r').read()
172        x=stubB(xml,serviceFile='serviceMap.config')
173        y='''<?xml version="1.0" encoding="UTF-8"?>
174                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
175                <html xmlsns="http://www.w3.org/1999/xhtml" xml:lang="en">
176                        <head>
177                                <META http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/>
178                                <title>stubB</title>
179                                <LINK media="all, screen" href="../layout/style.css" type="text/css" rel="stylesheet"/>
180                        </head> '''+x.toHTML(myConfig('browse.config'))
181        f=file('output.html','w')
182        f.write(y)
Note: See TracBrowser for help on using the repository browser.