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

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

Fix to support related deployments in non
data entities ...

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                if self.abbreviation=='': self.abbreviation=self.name[0:min(5,len(self.name))]
126               
127                elem=self.tree.find('dgDataEntity')
128                if elem is not None:
129                        DataEntity.__init__(self,elem)
130                        self.type='dgDataEntity'
131                        self.others=('activity','observationstation','dataproductiontool')
132                       
133                elem=self.tree.find('dgActivity')
134                if elem is not None:
135                        self.type='dgActivity'
136                        self.others=('dgDataEntity','observationstation','dataproductiontool')
137                        related='/RelatedDeployment'
138                       
139                elem=self.tree.find('dgDataProductionTool')
140                if elem is not None:
141                        self.type='dgDataProductionTool'
142                        self.others=('dgDataEntity','observationstation','activity')
143                        related=''
144               
145                elem=self.tree.find('dgObservationStation')
146                if elem is not None:
147                        related='/ObsStnDeployment'
148                        self.type='dgObservationStation'
149                        self.others=('dgDataEntity','dataproductiontool','activity')
150
151                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText')
152               
153
154                # now go get all the related links
155                self.related=[]
156               
157                deployment=['empty',[]]  #something should eventually go in the empty slot ...
158                for item in self.others:
159                    #multiple types of "related deployment definitions"
160                    subitems=self.tree.findall(self.type+'/*/'+item)
161                    if subitems != []:
162                        aa=[]
163                        for subitem in subitems:
164                            name=wrapGetText(subitem,'name')
165                            entryID=idconvert(subitem.find('dgMetadataID'))
166                            binding=ServiceBinding(name,entryID=entryID,serviceFile=serviceFile)
167                            aa.append(binding)
168                        deployment[1].append([self.labels[item],aa])
169                self.related.append(deployment)
170       
171        def toHTML(self,config):
172            if self.tree is not None:
173                renderer=renderEntity(config)
174                return renderer.render(self)
175            else:
176                return '<p>No Valid Stub-B</p>'
177       
178if __name__=="__main__":
179       
180        xml=open("../../exampleB/methyl.example.xml",'r').read()
181        x=stubB(xml,serviceFile='serviceMap.config')
182        y='''<?xml version="1.0" encoding="UTF-8"?>
183                <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
184                <html xmlsns="http://www.w3.org/1999/xhtml" xml:lang="en">
185                        <head>
186                                <META http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/>
187                                <title>stubB</title>
188                                <LINK media="all, screen" href="../layout/style.css" type="text/css" rel="stylesheet"/>
189                        </head> '''+x.toHTML(myConfig('browse.config'))
190        f=file('output.html','w')
191        f.write(y)
Note: See TracBrowser for help on using the repository browser.