Ignore:
Timestamp:
05/01/07 14:46:31 (13 years ago)
Author:
lawrence
Message:

Refactoring discovery wsgi for cleaner service binding. (Done, but
there will be implications for wsgi browse which may now be broken,
but I can't test it til the database is updated).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI07-MOLES/trunk/PythonCode/wsgi/DIF.py

    r1955 r1958  
    66from geoUtilities import * 
    77from People import * 
    8 from ServiceBinding import ServiceBinding 
    98from AccessControl import AccessControl 
     9from ETxmlView import loadET, nsdumb 
    1010from renderEntity import renderEntity 
    11 from ETxmlView import loadET, nsdumb 
    1211 
     12class DIFService: 
     13    ''' A DIF only knows about a related URL ''' 
     14    def __init__(self,c,u,d): 
     15        ''' Take a related url tuple (content_type,url,description) and store it, using 
     16        an ndgModifier if necessary ''' 
     17        self.contentType,self.url,self.description=c,u,d 
     18    def __str__(self): 
     19        return '<a href="%s" title="%s">%s</a>'%self.contentType,self.url,self.description 
     20     
    1321class DIF: 
    1422    ''' Supports the NASA GCMD DIF format for python operations, 
    1523    note ... not a complete implementation, currently minimum to 
    1624    show a reasonable piece of content ''' 
    17     def __init__(self,xml,config,et=0): 
     25    def __init__(self,xml,et=0,debug=0,url=None): 
     26         
    1827        '''Initialise a python dif instance based on an xml document (expected 
    1928        to be an input string if et=0, otherwise an ElementTree instance) ''' 
    20         self.metadataType='DIF' 
    21         self.debug=1 
    22         self.config=config 
     29         
    2330        if et: 
    24             self.tree=xml 
    25             self.xml=ET.tostring(xml) 
     31            try: 
     32                self.tree=xml 
     33                self.xml=ET.tostring(xml) 
     34            except: 
     35                raise TypeError,'DIF input is not a valid ElementTree instance' 
    2636        else: 
    2737            try: 
    2838                self.tree=loadET(xml) 
    2939                self.xml=xml 
    30             except: 
    31                 # for some reason we can't parse the document ... 
    32                 self.tree=None 
    33                 self.xml=None 
    34              
    35         if self.tree is None: return None 
     40            except: # for some reason we can't parse the document, and it's worth knowing why 
     41                if isinstance(xml,str): 
     42                    l=min(len(xml),300)-1 
     43                    if l!=len(xml):xml=xml[0:l]+'\n...' 
     44                    raise ValueError,'DIF input cannot be parsed into an ElementTree instance:\n%s'%xml 
     45                else: 
     46                    raise TypeError,'DIF input of type [%s] needs to be a string!'%type(xml) 
     47         
     48        self.debug=debug 
     49         
     50        # now try and interpret it  
     51         
    3652        helper=nsdumb(self.tree) 
    37         self.type='DIF' 
    38         if helper.strip(self.tree.tag)!=self.type: self.tree=helper.find(self.tree,self.type) 
    39         if self.tree is None: raise TypeError, self.xml 
     53        self.metadataType='DIF' 
     54        if helper.strip(self.tree.tag)!=self.metadataType:  
     55            self.tree=helper.find(self.tree,self.metadataType) 
     56            if self.tree is None:  
     57                raise ValueError, 'DIF input does not include a DIF element:\n%s'%self.xml 
    4058         
    4159        self.entryID=helper.getText(self.tree,'Entry_ID') 
     
    4361        self.name=helper.getText(self.tree,'Entry_Title') 
    4462        self.abbreviation=self.name[0:min(5,len(self.name))] 
    45         self.binding=ServiceBinding(config,n=self.abbreviation, 
    46                     entryID=self.entryID) 
     63         
     64        # The binding is an external piece of information which says how discovery 
     65        # information for this DIF instance (or it's latest version) can be recovered  
     66        # from the Internet (of course, it may simply recover itself ...) 
     67         
     68        if url is not None: 
     69            self.binding=DIFService('DISCOVERY',url,'The discovery record for this dataset') 
     70        else: 
     71            self.binding=None 
     72                     
    4773        #Note that entity.constraints.html is about access control on the metadata, 
    4874        #and so we don't populate this here ... 
     
    76102        self.creators=[] 
    77103        # use author here because a full dif entry for creator wont necessarily exist in citation ... 
    78         self.getAuthors(helper) 
     104        self.authors=DIFAuthors(self.tree,helper) 
    79105        self.date=dateParse(helper.getText(self.tree,'Data_Set_Citation/Dataset_Release_Date'),'YYYY') 
    80106        if self.date=='': self.date='XXXX' 
     
    87113        self.services=[] 
    88114        for item in helper.findall(self.tree,'Related_URL'): 
    89             n=ServiceBinding(config,self.name) 
    90             self.services.append(n.fromRelated(item,self.entryID,helper=helper)) 
     115            self.services.append( 
     116                DIFService( 
     117                 helper.getText(item,'URL_Content_type'), 
     118                 helper.getText(item,'URL'), 
     119                 helper.getText(item,'Description') )) 
    91120          
    92121        if self.debug: 
     
    96125             
    97126             
    98     def toHTML(self): 
     127    def toHTML(self,config): 
     128 
    99129        if self.tree is not None: 
    100             renderer=renderEntity(self.config) 
     130            renderer=renderEntity(config) 
    101131            return renderer.render(self) 
    102132        else: 
    103133            return '<p>No Valid DIF</p>' 
    104134 
    105     def getAuthors(self,helper): 
    106         ''' Attempt to get dataset authorship information from a DIF ''' 
    107         # first try for an author entry in a citation 
    108         self.authors=helper.getText(self.tree,'Data_Set_Citation/Dataset_Creator') 
    109         if self.authors!='': return 
    110         # ok, now let's look for investigator(s) in the personnel section 
    111         a='' 
    112         people=helper.findall(self.tree,'Personnel') 
    113         for p in people: 
    114             role=helper.getText(p,'Role') 
    115             if role=='Investigator': 
    116                 a+='%s %s,'%(helper.getText(p,'First_Name'),helper.getText(p,'Last_Name')) 
    117         if a!='':a=a[0:-1] 
    118         self.authors=a 
    119         print a 
    120         return 
    121          
    122135 
    123136import unittest 
     
    134147        f=file(self.inputFile,'r') 
    135148        xml=f.read() 
    136         config=myConfig(self.configFile) 
    137         self.dif=DIF(xml,config) 
    138          
     149        self.dif=DIF(xml) 
     150        self.config=myConfig(self.configFile) 
    139151 
    140     def testEntryID(self): 
    141         ''' Testing the DIF object can be loaded an entry ID extracted ''' 
     152    def testEntries(self): 
     153        ''' Testing the DIF object can be loaded and some key entries extracted ''' 
    142154        print 'Entry ID [%s]'%self.dif.entryID 
     155        print 'Author [%s]'%self.dif.authors 
    143156         
    144157    def testrenderDIF(self): 
    145158        ''' Testing the conversion to html ''' 
    146159        print self.dif.timeCoverage 
    147         html=self.dif.toHTML() 
     160        html=self.dif.toHTML(self.config) 
    148161        g=file('difOutput.html','w') 
    149162        g.write(html) 
Note: See TracChangeset for help on using the changeset viewer.