Changeset 4314 for exist


Ignore:
Timestamp:
09/10/08 09:36:23 (11 years ago)
Author:
cbyrom
Message:

Add new utility methods for adding/removing/retrieving online reference data
+ improve compare methods on atom subtype objects + extend test suite to test
new methods.

Location:
exist/trunk/python/ndgUtils/models
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • exist/trunk/python/ndgUtils/models/Atom.py

    r4301 r4314  
    9595        if Person objects are in an array already - i.e. if person in personArray... 
    9696        ''' 
     97        if not person1: 
     98            return -1 
     99         
    97100        if self is person1: 
    98101            return 0 
     
    138141            return self.href + " | " + self.title + " | " + self.rel 
    139142        return "" 
    140  
     143     
     144    def isChildAtom(self): 
     145        ''' 
     146        Determines whether the link refers to another atom - e.g. a link to 
     147        a data granule 
     148        @return True, if so; False otherwise 
     149        ''' 
     150        if self.rel.endswith(VTD.GRANULE_TERM) or \ 
     151            self.rel.endswith(VTD.DEPLOYMENT_TERM) or \ 
     152            self.rel.endswith(VTD.ACTIVITY_TERM) or \ 
     153            self.rel.endswith(VTD.DPT_TERM) or \ 
     154            self.rel.endswith(VTD.OBS_TERM): 
     155            return True 
     156         
     157        return False 
    141158     
    142159    def __cmp__(self, link1): 
     
    145162        if Link objects are in an array already - i.e. if link in linkArray... 
    146163        ''' 
     164        if not link1: 
     165            return -1 
     166         
    147167        if self is link1: 
    148168            return 0 
     
    176196        link.attrib["label"] = self.label 
    177197        return link 
     198     
     199    def hasValue(self): 
     200        if self.scheme or self.label or self.term: 
     201            return True 
     202        return False 
    178203 
    179204 
     
    186211    # labels for use with the templates to set/extract specific inputs 
    187212    ONLINE_REF_LABEL = "online_ref" 
     213    PARAMETER_LABEL = "parameter" 
    188214    ATOM_REF_LABEL = "atom_ref" 
    189215    DELIMITER = "---" 
     
    284310 
    285311 
    286     def addUniqueRelatedlinks(self, links): 
     312    def addOnlineReferences(self, links): 
     313        ''' 
     314        Add online reference data associated with the atom 
     315        - NB, care needs to be taken here since this data is stored in the atom 
     316        link elements and these are also used for the various atom associations 
     317        @param links: a Link or array of Links to add to the relatedLinks attribute  
     318        ''' 
     319        logging.debug("Adding online references") 
     320        if not links: 
     321            return 
     322         
     323        if type(links) is not list: 
     324            links = [links] 
     325         
     326        # firstly clear out any online refs data from the existing related links 
     327        newLinks = [] 
     328        for link in self.relatedLinks: 
     329            if link.isChildAtom(): 
     330                newLinks.append(link) 
     331         
     332        newLinks.extend(links) 
     333        self.relatedLinks = newLinks 
     334        logging.debug("Online references added") 
     335 
     336 
     337 
     338    def addUniqueRelatedLinks(self, links): 
    287339        ''' 
    288340        Add links to relatedLinks array - if they are not already included 
     
    293345            return 
    294346         
    295         if type(links) is str: 
     347        if type(links) is not list: 
    296348            links = [links] 
    297349         
    298350        for link in links: 
     351            if type(link) is not Link: 
     352                logging.warning("Link is not of 'Link' object type (type='%s') - skipping" %type(link)) 
     353                continue 
    299354            if link not in self.relatedLinks: 
    300355                logging.debug("- adding unique link") 
     
    302357        logging.debug("Finished adding links") 
    303358         
     359 
     360    def removeRelatedLinks(self, linksToDelete): 
     361        ''' 
     362        Remove any links in the input list from the atom's related links list 
     363        @param linksToDelete: array of Link objects to remove from atom 
     364        ''' 
     365        logging.debug("Removing related links from atom") 
     366        if not linksToDelete: 
     367            return 
     368         
     369        if type(linksToDelete) is not list: 
     370            linksToDelete = [linksToDelete] 
     371         
     372        updatedLinks = [] 
     373        for link in self.relatedLinks: 
     374            if type(link) is not Link: 
     375                logging.warning("Link is not of 'Link' object type (type='%s') - skipping" %type(link)) 
     376                continue 
     377            if link in linksToDelete: 
     378                logging.debug("- found link to remove") 
     379            else: 
     380                updatedLinks.append(link) 
     381 
     382        self.relatedLinks = updatedLinks 
     383        logging.debug("Links removed") 
    304384         
    305385 
     
    510590        # add parameters data 
    511591        for param in self.parameters: 
    512             root.append(param.toXML()) 
     592            if param.hasValue(): 
     593                root.append(param.toXML()) 
    513594 
    514595        # add the type and subtype data  
     
    916997        matchingLinks = [] 
    917998        for link in self.relatedLinks: 
    918             if link and link.rel and link.rel.lower().endswith(termID.lower()): 
     999            # firstly, handle special case where we only want the online ref type links 
     1000            # returned 
     1001            if termID == self.ONLINE_REF_LABEL: 
     1002                if not link.isChildAtom(): 
     1003                    logging.debug("- found link with matching term type") 
     1004                    matchingLinks.append(link) 
     1005                 
     1006            elif link and link.rel and link.rel.lower().endswith(termID.lower()): 
    9191007                logging.debug("- found link with matching term type") 
    9201008                matchingLinks.append(link) 
    921  
     1009                 
    9221010        logging.debug("Returning matched links") 
    9231011        return matchingLinks 
     1012     
     1013     
     1014    def validate(self): 
     1015        ''' 
     1016        Check the various values of the various atom attributes; if an error with any of 
     1017        these is found, raise a ValueError 
     1018        @raise ValueError: if any atom attributes have a problem  
     1019        ''' 
     1020        logging.info("Validating the atom data model") 
     1021         
     1022        logging.info("Atom model validated successfully") 
  • exist/trunk/python/ndgUtils/models/MolesEntity.py

    r4240 r4314  
    4646 
    4747    def __cmp__(self, link): 
    48         logging.debug("Comparing link objects") 
     48        if not link: 
     49            return -1 
     50         
    4951        if isinstance(link, DeploymentLink): 
    5052            if link.url == self.url and \ 
    5153                link.vocabUrl == self.vocabUrl and \ 
    5254                link.title == self.title: 
    53                 logging.debug("- links are equal") 
    5455                return 0 
    5556 
    56         logging.debug("- links are not equal") 
    5757        return 1 
    5858     
  • exist/trunk/python/ndgUtils/models/testatom.py

    r4219 r4314  
    55Tessella 
    66''' 
    7 import unittest 
    8 from ndgUtils.models import Atom 
     7import unittest, copy 
     8from ndgUtils.models.Atom import Atom, Link 
    99from ndgUtils.vocabtermdata import VocabTermData as VTD 
    1010from utilities import getTripleData 
     
    3232    id = 'tag:localhost:5000,2008-09-17:/view/badc.nerc.ac.uk__ATOM__' + datasetID 
    3333     
    34     atomName = '/db/moles_support/granuleAtom/' + datasetID + '_granule.atom' 
     34    atomName = 'http://localhost:5000/view/badc.nerc.ac.uk__ATOM__' + datasetID 
    3535     
    3636    name = 'famous_control_month.atom' 
     
    9191        ''' 
    9292        print "Setting up..." 
    93         self.atom = Atom.Atom(VTD.GRANULE_TERM, vocabTermData = self.VTD) 
     93        self.atom = Atom(VTD.GRANULE_TERM, vocabTermData = self.VTD) 
     94        self.link = Link() 
     95        self.link.title = 'fred' 
     96        self.link.href = 'www.fred.com' 
     97        self.link.rel = 'related' 
     98 
    9499         
    95100         
     
    177182                  'title': self.title 
    178183                  } 
    179         a = Atom.Atom(**inputs) 
     184        a = Atom(**inputs) 
    180185        self.assertEqual(self.title, a.title) 
    181186        self.assertEqual(VTD.ACTIVITY_TERM, a.atomTypeID) 
    182187        self.assertEqual(VTD.TERM_DATA[VTD.ACTIVITY_TERM].title, a.atomTypeName) 
    183188 
     189    def testaddUniqueRelatedLinks(self): 
     190        self.atom.fromString(self.xmlString) 
     191        linkNo = len(self.atom.relatedLinks) 
     192        self.atom.addUniqueRelatedLinks(self.link) 
     193        self.assertEqual(linkNo + 1, len(self.atom.relatedLinks)) 
     194        self.assertTrue(self.link in self.atom.relatedLinks) 
     195 
     196    def testAddMultipeDifferentRelatedLinks(self): 
     197        self.atom.fromString(self.xmlString) 
     198        linkNo = len(self.atom.relatedLinks) 
     199        self.atom.addUniqueRelatedLinks(self.link) 
     200        self.assertEqual(linkNo + 1, len(self.atom.relatedLinks)) 
     201        link2 = copy.deepcopy(self.link) 
     202        link2.title = "blabby" 
     203        self.atom.addUniqueRelatedLinks(link2) 
     204        self.assertEqual(linkNo + 2, len(self.atom.relatedLinks)) 
     205        self.atom.addUniqueRelatedLinks(link2) 
     206        self.assertEqual(linkNo + 2, len(self.atom.relatedLinks)) 
     207 
     208    def testAddMultipeDifferentRelatedLinksSimultaneously(self): 
     209        self.atom.fromString(self.xmlString) 
     210        linkNo = len(self.atom.relatedLinks) 
     211        link2 = copy.deepcopy(self.link) 
     212        link2.title = "blabby" 
     213        links = [self.link, link2] 
     214        self.atom.addUniqueRelatedLinks(links) 
     215        self.assertEqual(linkNo + 2, len(self.atom.relatedLinks)) 
     216        self.assertTrue(self.link in self.atom.relatedLinks) 
     217        self.assertTrue(link2 in self.atom.relatedLinks) 
     218 
     219        self.atom.addUniqueRelatedLinks(link2) 
     220        self.assertEqual(linkNo + 2, len(self.atom.relatedLinks)) 
     221         
     222 
     223    def testAddMultipleUniqueRelatedLinks(self): 
     224        self.atom.fromString(self.xmlString) 
     225        linkNo = len(self.atom.relatedLinks) 
     226        self.atom.addUniqueRelatedLinks(self.link) 
     227        self.assertEqual(linkNo + 1, len(self.atom.relatedLinks)) 
     228        self.atom.addUniqueRelatedLinks(self.link) 
     229        self.assertEqual(linkNo + 1, len(self.atom.relatedLinks)) 
     230        self.atom.addUniqueRelatedLinks(self.link) 
     231        self.assertEqual(linkNo + 1, len(self.atom.relatedLinks)) 
     232 
     233    def testRemoveRelatedLinks(self): 
     234        self.atom.fromString(self.xmlString) 
     235        linkNo = len(self.atom.relatedLinks) 
     236        self.atom.addUniqueRelatedLinks(self.link) 
     237        self.assertEqual(linkNo + 1, len(self.atom.relatedLinks)) 
     238        self.assertTrue(self.link in self.atom.relatedLinks) 
     239        self.atom.removeRelatedLinks(self.link) 
     240        self.assertEqual(linkNo, len(self.atom.relatedLinks)) 
     241        self.assertFalse(self.link in self.atom.relatedLinks) 
     242 
     243    def testRemoveMultipleRelatedLinks(self): 
     244        self.atom.fromString(self.xmlString) 
     245        linkNo = len(self.atom.relatedLinks) 
     246        link2 = copy.deepcopy(self.link) 
     247        link2.title = "blabby" 
     248        links = [self.link, link2] 
     249 
     250        self.atom.addUniqueRelatedLinks(links) 
     251        self.assertEqual(linkNo + 2, len(self.atom.relatedLinks)) 
     252        self.assertTrue(self.link in self.atom.relatedLinks) 
     253        self.assertTrue(link2 in self.atom.relatedLinks) 
     254 
     255        self.atom.removeRelatedLinks(links) 
     256        self.assertEqual(linkNo, len(self.atom.relatedLinks)) 
     257        self.assertFalse(self.link in self.atom.relatedLinks) 
     258        self.assertFalse(link2 in self.atom.relatedLinks) 
     259         
     260         
    184261 
    185262if __name__ == '__main__': 
Note: See TracChangeset for help on using the changeset viewer.