Changeset 4236 for exist


Ignore:
Timestamp:
25/09/08 15:26:46 (11 years ago)
Author:
cbyrom
Message:

Improve the creation of new atom entries in eXist - generating unique
IDs, and checking these, where necessary + fix update date updates +
add methods to the vocab data class to retrieve lists of data categories
+ subtypes - for use in the UI dropdowns.

Location:
exist/trunk/python/ndgUtils
Files:
4 edited

Legend:

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

    r4229 r4236  
    179179 
    180180        # last update date 
    181         self.updateDate = None 
     181        self.updatedDate = None 
    182182 
    183183        # assume atom in working state by default - this is used to define what collection 
     
    195195 
    196196        # if inputs passed in as dict, add these now 
    197         self.__dict__.update(inputs) 
     197        if inputs: 
     198            self.__dict__.update(inputs) 
     199             
     200            if inputs.get('providerID'): 
     201                self.ME.providerID = inputs.get('providerID') 
     202 
    198203 
    199204        if self.atomTypeID: 
     
    222227        collectionPath += self.ME.providerID + "/" 
    223228        return collectionPath 
    224  
    225  
    226  
    227     def getValidSubTypes(self): 
    228         ''' 
    229         Get list of subtypes that are valid wrt this atom type 
    230         ''' 
    231         logging.debug("Lookup up subtypes for type, '%s'" %self.atomTypeID) 
    232         subTypes = self.VTD.SUBTYPE_TERMS.get(self.atomTypeID) or [] 
    233         types = [] 
    234         for st in subTypes: 
    235             types.append(self.VTD.TERM_DATA[st]) 
    236         logging.debug("Found subtypes: %s" %subTypes) 
    237         return types 
    238          
    239229             
    240230 
     
    408398 
    409399        updated = ET.SubElement(root, "updated") 
    410         if not self.updateDate: 
    411             self.updateDate = currentDate 
    412         updated.text = self.updateDate 
     400        if not self.updatedDate: 
     401            self.updatedDate = currentDate 
     402        updated.text = self.updatedDate 
    413403 
    414404        published = ET.SubElement(root, "published") 
     
    544534            logging.debug("Adding published date") 
    545535            self.publishedDate = publishedDate 
     536                 
     537        updatedDate = tree.findtext('updated') 
     538        if updatedDate: 
     539            logging.debug("Adding updated date") 
     540            self.updatedDate = updatedDate 
    546541             
    547542        logging.info("Completed data ingest") 
     
    604599        ''' 
    605600        self.atomName = datasetID + ".atom" 
    606         self.atomBrowseURL = VTD.BROWSE_ROOT_URL + \ 
    607             self.ME.providerID + "__ATOM__" + datasetID 
     601        self.ndgURI = self.ME.providerID + "__ATOM__" + datasetID  
     602        self.atomBrowseURL = VTD.BROWSE_ROOT_URL + self.ndgURI 
    608603 
    609604 
     
    639634        self.datasetID = self.atomBrowseURL.split("__ATOM__")[-1] 
    640635        self.atomName = self.datasetID + ".atom" 
     636        self.ndgURI = self.atomBrowseURL.split(VTD.BROWSE_ROOT_URL)[1] 
    641637         
    642638        # now remove this value and the associated moles doc link 
  • exist/trunk/python/ndgUtils/models/MolesEntity.py

    r4217 r4236  
    109109    # URL which points to the browse service - NB ensure this is properly defined 
    110110    BROWSE_URL = "http://ndg.badc.rl.ac.uk:8080/view" 
    111  
    112111     
    113112    def __init__(self): 
  • exist/trunk/python/ndgUtils/models/existdbclient.py

    r4229 r4236  
    99from ndgUtils.eXistConnector import eXistConnector as ec 
    1010from ndgUtils.ndgXqueries import ndgXqueries 
     11import uuid 
    1112 
    1213try: 
     
    281282        Create an atom in the eXist DB 
    282283        @param atom: atom object to create in the DB 
     284        @return atom: atom object saved in eXist 
    283285        ''' 
    284286        logging.info("Creating atom in eXist") 
    285         eXistCollection = self.getAtomFileCollectionPath(atom.atomID) 
     287         
     288        # if the atom has no dataset ID, generate and add one 
     289        # NB, this should only be the case when the atom is being created 
     290        # via the web interface 
     291        isNew = False 
     292        if not atom.datasetID: 
     293            isNew = True 
     294            atom.setDatasetID(atom.atomTypeID + '_' + str(uuid.uuid1())) 
     295             
     296        eXistCollection = self.getAtomFileCollectionPath(atom.datasetID) 
    286297         
    287298        # if collection not found, assume we're dealing with a new atom; get its 
     
    289300        if not eXistCollection: 
    290301            eXistCollection = atom.getDefaultCollectionPath() 
     302        elif isNew: 
     303            # in this situation we're trying to create an atom with the same 
     304            # name via the web interface - this can't be allowed - so retry to 
     305            # generate a new ID 
     306            atom.datasetID = None 
     307            self.createAtomInExist(atom) 
     308            return 
    291309        # create backup of atom if it already exists 
    292310        else: 
    293311            self.backupEXistFile(eXistCollection, atom.atomName) 
    294312             
     313            # also change updated date to current time 
     314            atom.updatedDate = datetime.datetime.today().strftime("%Y-%m-%dT%H:%M:%SZ") 
     315             
    295316        self.createEXistFile(atom.toPrettyXML(), eXistCollection, atom.atomName) 
    296317             
    297318        logging.info("Atom created in eXist") 
     319        return atom 
  • exist/trunk/python/ndgUtils/vocabtermdata.py

    r4219 r4236  
    3636    FILE_BROWSER_TERM = 'FileBrowser'    
    3737    CSML_TERM = 'CSML' 
     38     
    3839    ACTIVITY_TERM = 'ACTIVITY' 
    3940    DPT_TERM = 'DPT' 
     
    8889    COMPUTER_TERM = "dgComputer" 
    8990 
     91    # provider types 
     92    BADC_TERM = 'badc.nerc.ac.uk' 
     93    NEODC_TERM = 'neodc.nerc.ac.uk' 
     94     
    9095    TERM_DATA = { 
    9196                 URI_TERM:VocabTermItem('http://vocab.ndg.nerc.ac.uk/term/N041', '3', title = 'Data Home Page'), 
     97                 BADC_TERM:VocabTermItem('NOT YET SET UP', BADC_TERM, title = 'British Atomspheric Data Centre'), 
     98                 NEODC_TERM:VocabTermItem('NOT YET SET UP', NEODC_TERM, title = 'NERC Earth Observation Data Centre'), 
    9299                 LOGO_TERM:VocabTermItem('LOGO', 'LOGO', title = 'Logo'), 
    93100                 NUM_SIM_TERM:VocabTermItem('http://vocab.ndg.nerc.ac.uk/term/N041', '7', title = 'NumSim description'), 
     
    149156                 } 
    150157 
    151  
     158    ATOM_TYPES = [ACTIVITY_TERM, DE_TERM, DPT_TERM, GRANULE_TERM, OBS_TERM] 
     159 
     160    PROVIDER_TYPES = [BADC_TERM, NEODC_TERM] 
     161 
     162    ATOM_CATEGORY = "atom" 
     163    PROVIDER_CATEGORY = "provider" 
    152164     
    153165    # A dictionary to group the various valid subtypes of atoms - grouped by their 
     
    185197                     } 
    186198              
    187  
    188  
    189      
    190199     
    191200    ONE_HOUR = 3600.0 
     
    224233        logging.error(errorMessage) 
    225234        raise ValueError(errorMessage) 
     235 
     236 
     237    def getValidTypes(self, category): 
     238        ''' 
     239        Return a list of the valid types available for a particular data category 
     240        @param category: type of term info to look up - e.g. atoms or providers  
     241        - this should be specified using the ..._CATEGORY instance variables 
     242        defined above 
     243        @return list of VocabTermInfo objects for the specified category 
     244        ''' 
     245        logging.debug("Lookup up list of valid %s types" %category) 
     246        catList = [] 
     247        if category == self.ATOM_CATEGORY: 
     248            catList = self.ATOM_TYPES 
     249        elif category == self.PROVIDER_CATEGORY: 
     250            catList = self.PROVIDER_TYPES 
     251        else: 
     252            errorMessage = "Unrecognised data category, '%s'" %category 
     253            logging.info(errorMessage) 
     254            raise ValueError(errorMessage) 
     255             
     256        types = [] 
     257        for st in catList: 
     258            types.append(self.TERM_DATA[st]) 
     259        return types 
     260 
     261 
     262    def getValidSubTypes(self, atomType): 
     263        ''' 
     264        Get list of subtypes that are valid wrt a specified atom type 
     265        @param atomType: term ID for the atom type whose subtypes need to  
     266        be looked up 
     267        @return: list of valid subtypes 
     268        ''' 
     269        logging.debug("Lookup up subtypes for atom type, '%s'" %atomType) 
     270        subTypes = self.SUBTYPE_TERMS.get(atomType) or [] 
     271        types = [] 
     272        for st in subTypes: 
     273            item = self.TERM_DATA[st] 
     274            # tidy up the title slightly, if need be 
     275            if item.title and item.title.startswith('dg'): 
     276                item.title = item.title[2:] 
     277                # and fix any camelcase - putting into words 
     278                item.title = re.sub('([A-Z])', r" \1", item.title).strip() 
     279            types.append(item) 
     280        logging.debug("Found subtypes: %s" %subTypes) 
     281        return types 
    226282 
    227283         
Note: See TracChangeset for help on using the changeset viewer.