source: TI07-MOLES/trunk/PythonCode/wsgi/stubB.py @ 1925

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI07-MOLES/trunk/PythonCode/wsgi/stubB.py@1925
Revision 1925, 6.9 KB checked in by lawrence, 13 years ago (diff)

Further modifications to wsgi discovery and browse. Discovery now links
to the Dublin Core discovery elements, and some browse functions are
beginning to emerge, but it's still rather broken (and insecure).

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#
7from xml.etree import ElementTree as ET
8from renderEntity import renderEntity
9from Utilities import *
10from ServiceBinding import *
11from AccessControl import AccessControl
12from geoUtilities import Bounding
13from People import *
14
15class dataGranule:
16        ''' Provides support for data granule structures '''
17        def __init__(self,elem,config,name=''):
18                self.elem=elem
19                self.constraints=AccessControl(elem.find('accessControlPolicy'))
20                self.binding=ServiceBinding(config,n=name,entryID=idconvert(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                i=0
63                for item in granList:
64                        i+=1
65                        #following needs to be refactored when granule definition includes
66                        #a proper name ...
67                        name=wrapGetText(item,'name')
68                        if name=='': name='Granule %s'%i
69                        self.granules.append(dataGranule(item,self.config,name=name))
70               
71        def temporal(self):
72                '''Instantiate the timeCoverage attribute by parsing for temporal coverage '''
73                t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange')
74                if t is not None:
75                        try:
76                                self.timeCoverage=(float(i.text) for i in t)
77                        except:
78                                self.timeCoverage=('',)
79                               
80                else:
81                        t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateSingle')
82                        try:
83                                self.timeCoverage=(t.text,)
84                        except:
85                                self.timeCoverage=('',)
86
87
88
89class stubB(DataEntity,Deployment,ObservationStation,DataProductionTool,Activity):
90       
91        ''' Holds the stub-b document and provides methods which get and manipulate it '''
92       
93        def __init__(self,xml,config):
94               
95                '''Instantiate by parsing an xml document passed in as a string '''
96               
97                self.metadataType='stubB'
98                self.services=[]
99                self.config=config
100               
101                self.labels={'activity':'Activity ','observationstation':'Observation Station ',
102                                        'dataproductiontool':'Data Production Tool ','dataEntity':'Data Entity ','dataentity':'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                id=self.tree.find('dgMetadataID')
114                self.entryID=idconvert(id)
115                self.binding=ServiceBinding(config,n=wrapGetText(self.tree,'abbreviation'),
116                                entryID=self.entryID)
117                self.Burl=self.binding.url
118                             
119                #Note that the root of the ElementTree instance is dgMetadataRecord
120                #so we don't need (or want) that in our xpath expressions.
121               
122                self.constraints=AccessControl(self.tree.find('dgMetadataSecurity'))
123                self.abbreviation=wrapGetText(self.tree,'abbreviation')
124                if self.abbreviation=='': self.abbreviation=self.name[0:min(15,len(self.name))]
125               
126                elem=self.tree.find('dgDataEntity')
127                if elem is not None:
128                        DataEntity.__init__(self,elem)
129                        self.type='dgDataEntity'
130                        self.others=('activity','observationstation','dataproductiontool')
131                        related='/RelatedDeployment'
132                elem=self.tree.find('dgActivity')
133                if elem is not None:
134                        self.type='dgActivity'
135                        #nb activity stub-b seems to have dataentity instead of dataEntity
136                        self.others=('dataentity','dataEntity','observationstation','dataproductiontool')
137                        related='/ActivityDeployment'
138                       
139                elem=self.tree.find('dgDataProductionTool')
140                if elem is not None:
141                        self.type='dgDataProductionTool'
142                        self.others=('dataEntity','observationstation','activity')
143                        related='DPTDeployment'
144               
145                elem=self.tree.find('dgObservationStation')
146                if elem is not None:
147                        related='/ObsStnDeployment'
148                        self.type='dgObservationStation'
149                        self.others=('dataEntity','dataproductiontool','activity')
150
151                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText')
152               
153                # now go get all the related links
154                self.related=[]
155               
156                deployment=['empty',[]]  #something should eventually go in the empty slot ...
157                for item in self.others:
158                    #multiple types of "related deployment definitions"
159                    subitems=self.tree.findall(self.type+'/*/'+item)
160                    if subitems != []:
161                        aa=[]
162                        for subitem in subitems:
163                            name=wrapGetText(subitem,'name')
164                            entryID=idconvert(subitem.find('dgMetadataID'))
165                            binding=ServiceBinding(name,entryID=entryID,serviceFile=serviceFile)
166                            aa.append(binding)
167                        deployment[1].append([self.labels[item],aa])
168                self.related.append(deployment)
169       
170        def toHTML(self,config):
171            if self.tree is not None:
172                renderer=renderEntity(config)
173                return renderer.render(self)
174            else:
175                return '<p>No Valid Stub-B</p>'
176       
177if __name__=="__main__":
178       
179        #xml=open("../../exampleB/methyl.example.xml",'r').read()
180        xml=open('COAPC_ObsStn.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.