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 ...

RevLine 
[800]1#!/usr/bin/env python
[804]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#
[800]7import ElementTree as ET
[842]8from renderEntity import renderEntity
[845]9from Utilities import *
[911]10from ServiceBinding import *
[935]11from secure import AccessControl
[938]12from geoUtilities import Bounding
13from People import *
14
[845]15class dataGranule:
[842]16        ''' Provides support for data granule structures '''
[1158]17        def __init__(self,elem,serviceFile,name=''):
[845]18                self.elem=elem
19                self.constraints=AccessControl(elem.find('accessControlPolicy'))
[1158]20                self.binding=ServiceBinding(n=name,nativeID=elem.find('dataModelID'),
21                                            serviceFile=serviceFile)
[911]22                self.Aurl=self.binding.url
[976]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
[842]41       
[804]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
[938]47                self.curator=dgContact(self.elem.find('dgDataRoles/dgDataCurator'),ctype='organisation')
[804]48                #possibly multiple creators
[807]49                self.creators=[dgContact(i) for i in self.elem.findall('dgDataRoles/dgDataCreator')]
[804]50                host,service = '','' # dummy for now
51                #possibly multiple granules
[845]52                self.getGranules()
[804]53                #bounding box, handled as a class because this is going to be difficult ...
[938]54                self.bbox=Bounding(self.elem,entity='stubB')
[804]55                self.temporal()
56                #parameters
[807]57                self.parameters=wrapGetText(self.elem,'dgDataSummary/dgParameterSummary/ParameterName',multiple=1)
[804]58               
[842]59        def getGranules(self):
60                ''' Load up the granule content within the entity '''
[845]61                granList=self.elem.findall('dgDataGranule')
[842]62                self.granules=[]
[1152]63                i=0
[842]64                for item in granList:
[1152]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
[1158]70                        self.granules.append(dataGranule(item,name=name,serviceFile=self.serviceFile))
[842]71               
[804]72        def temporal(self):
73                '''Instantiate the timeCoverage attribute by parsing for temporal coverage '''
[807]74                t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateRange')
[804]75                if t is not None:
76                        try:
[949]77                                self.timeCoverage=(float(i.text) for i in t)
[804]78                        except:
[949]79                                self.timeCoverage=('',)
80                               
[804]81                else:
[807]82                        t=self.elem.find('dgDataSummary/dgDataCoverage/dgTemporalCoverage/DateSingle')
[804]83                        try:
[949]84                                self.timeCoverage=(t.text,)
[804]85                        except:
[949]86                                self.timeCoverage=('',)
[804]87
[845]88
[949]89
[976]90class stubB(DataEntity,Deployment,ObservationStation,DataProductionTool,Activity):
[842]91       
[800]92        ''' Holds the stub-b document and provides methods which get and manipulate it '''
[842]93       
[1158]94        def __init__(self,xml,ServiceBinding=ServiceBinding,serviceFile='cgi/serviceMap.config'):
[842]95               
96                '''Instantiate by parsing an xml document passed in as a string '''
97               
[815]98                self.metadataType='stubB'
[1158]99                self.serviceFile=serviceFile
100               
[815]101                self.labels={'activity':'Activity ','observationstation':'Observation Station ',
102                                        'dataproductiontool':'Data Production Tool ','dgDataEntity':'Data Entity '}
[842]103               
[800]104                try:
[842]105                        self.xml=xml
106                        self.tree=ET.fromstring(self.xml)
[825]107                        self.name=wrapGetText(self.tree,'name')
[800]108                except:
109                        self.xml=None
110                        self.tree=None
[825]111                        self.name='Not Found'
[842]112                        return
[1158]113                self.binding=ServiceBinding(n=wrapGetText(self.tree,'abbreviation'),
114                                nativeID=self.tree.find('dgMetadataID'),serviceFile=serviceFile)
115                self.Burl=self.binding.url
116                             
[911]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               
[935]120                self.constraints=AccessControl(self.tree.find('dgMetadataSecurity'))
[911]121                self.abbreviation=wrapGetText(self.tree,'abbreviation')
[845]122               
[804]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')
[911]128                       
[824]129                elem=self.tree.find('dgActivity')
130                if elem is not None:
131                        self.type='dgActivity'
132                        self.others=('dgDataEntity','observationstation','dataproductiontool')
[911]133                       
[824]134                elem=self.tree.find('dgDataProductionTool')
135                if elem is not None:
136                        self.type='dgDataProductionTool'
137                        self.others=('dgDataEntity','observationstation','activity')
[911]138               
[824]139                elem=self.tree.find('dgObservationStation')
140                if elem is not None:
141                        self.type='dgObservationStation'
142                        self.others=('dgDataEntity','dataproductiontool','activity')
[828]143
[804]144                self.abstract=wrapGetText(self.tree,'dgMetadataDescription/abstract/abstractText')
145               
[1158]146
[804]147                # now go get all the related links
[911]148                self.related=[]
[807]149                for related in self.tree.findall(self.type+'/RelatedDeployment'):
[815]150                        deployment=['empty',[]]  #something should eventually go in the empty slot ...
[804]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')
[1158]157                                                binding=ServiceBinding(name,nativeID=subitem.find('dgMetadataID'),uri='stubB',serviceFile=serviceFile)
[1152]158                                                aa.append(binding)
[815]159                                        deployment[1].append([self.labels[item],aa])
160                        self.related.append(deployment)
[800]161       
[1158]162        def toHTML(self,config):
163            if self.tree is not None:
164                renderer=renderEntity(config)
165                return renderer.render(self)
166            else:
[1171]167                return '<p>No Valid Stub-B</p>'
[800]168       
169if __name__=="__main__":
[842]170       
171        xml=open("../../exampleB/methyl.example.xml",'r').read()
[1158]172        x=stubB(xml,serviceFile='serviceMap.config')
[886]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"/>
[1158]180                        </head> '''+x.toHTML(myConfig('browse.config'))
[935]181        f=file('output.html','w')
182        f.write(y)
Note: See TracBrowser for help on using the repository browser.