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

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

A large number of small modifications to browse
dealing with a range of bugs ...

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