Changeset 5209


Ignore:
Timestamp:
21/04/09 14:58:27 (10 years ago)
Author:
cbyrom
Message:

Add new workflow, when an atom title changes, to ensure that any
references to that atom, from other atoms, are updated appropriately

  • NB, references are done via link objects and these include the atom

title.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • MILK/trunk/milk_server/milk_server/controllers/atom_editor/editatom.py

    r5193 r5209  
    1717from ndg.common.src.lib.atomvalidator import ValidationError 
    1818import ndg.common.src.clients.xmldb.abstractxmldbatomclient as ac 
     19import ndg.common.src.clients.xmldb.eXist.dbconstants as dc 
    1920from ndg.common.src.models.MolesEntity import MolesEntity as ME 
    20 from ndg.common.src.lib.utilities import escapeSpecialCharacters 
    2121from ndg.common.src.models.vocabtermdata import VocabTermData as VTD 
    2222from ndg.common.src.lib.granulite import granulite 
     
    223223                        self.inputs.get('subtype')) 
    224224                c.atom.subtypeID = c.atom.subtype.split('/')[-1] 
    225              
     225                 
    226226            if self.inputs.get('publication_state'): 
    227227                newState = AtomState.getAtomState(self.inputs['publication_state']) 
     
    605605        else: 
    606606            createdAtom = eXist.createAtom(atom) 
     607             
     608        # update references to the atom, if its title has changed 
     609        if atom.oldTitle != atom.title: 
     610            self.__updateAtomReferences(atom, eXist) 
     611             
    607612        logging.info("Changes successfully saved to eXist") 
    608613        return createdAtom 
    609614 
     615 
     616    def __updateAtomReferences(self, atom, eXist): 
     617        ''' 
     618        If an atom title changes, update any references to it elsewhere - since 
     619        this title is used in the link 'title' attribute 
     620        @param atom: Atom whose references need to be updated 
     621        @param eXist: AtomClient for eXist DB 
     622        ''' 
     623        logging.info("- updating references to atom with changed title") 
     624        atoms = [] 
     625        if atom.atomTypeID == VTD.GRANULE_TERM or \ 
     626            (atom.atomTypeID == VTD.ACTIVITY_TERM and \ 
     627            atom.subtypeID == VTD.DEPLOYMENT_TERM): 
     628            logging.debug("- retrieving references in data entities") 
     629            atom.lookupAssociatedData(VTD.DE_TERM, eXist, 
     630                                      lookupIndirectReferences = True) 
     631            for de in atom.dataEntities: 
     632                doc = eXist.buildAndRunQuery('atom',  
     633                                             dc.ATOM_COLLECTION_PATH,  
     634                                             "",  
     635                                             de.rel) 
     636                atoms.append(Atom(xmlString=str(doc[0]))) 
     637 
     638        elif atom.atomTypeID == VTD.DE_TERM: 
     639            # DEs are never referenced by other atoms - just keep this check 
     640            # to make an easier catch all 'else' for the deployments data 
     641            logging.debug("Atom is a data entity - so has no references elsewhere to update") 
     642        else: 
     643            logging.debug("- retrieving references in deployments") 
     644            atom.lookupAssociatedData(VTD.DEPLOYMENT_TERM, eXist, 
     645                                      lookupIndirectReferences = True) 
     646 
     647            for dep in atom.deployments: 
     648                doc = eXist.buildAndRunQuery('atom',  
     649                                             dc.ATOM_COLLECTION_PATH,  
     650                                             dep.providerID,  
     651                                             dep.id) 
     652                atoms.append(Atom(xmlString=str(doc[0]))) 
     653 
     654        logging.debug("- references retrieved - now updating") 
     655        for refAtom in atoms: 
     656            for rel in refAtom.relatedLinks: 
     657                if rel.title == atom.oldTitle: 
     658                    rel.title = atom.title 
     659         
     660            eXist.createAtom(refAtom) 
     661        logging.info("- references updated") 
     662         
    610663     
    611664    def create(self, saveData = None, **inputs): 
Note: See TracChangeset for help on using the changeset viewer.