Changeset 7286 for TI01-discovery-Ingest


Ignore:
Timestamp:
05/08/10 17:08:03 (9 years ago)
Author:
sdonegan
Message:

Updates for NERC v4.3.0 MEDIN style ingest with new arg for process id for use with dpws with logging to database

Location:
TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/DeleteRecord.py

    r7186 r7286  
    111111            record = RecordToDelete(recordFilename,None) 
    112112            logging.info("Getting discoveryId from database for  %s" %recordFilename)      
    113             dao = PostgresDAO(record, None, None, None, self.pgc)               
     113            dao = PostgresDAO(record, None, None, self.pgc)               
    114114            self.createRecordObject(record,dao,recordFilename) 
    115115             
     
    118118            record = RecordToDelete(None,discoveryID) 
    119119            logging.info("Getting discoveryId from database for  %s" %discoveryID)      
    120             dao = PostgresDAO(record, None, None, None, self.pgc)               
     120            dao = PostgresDAO(record, None, None, self.pgc)               
    121121            self.createRecordObject(record,dao,recordFilename) 
    122122         
     
    125125         
    126126            #delete original record 
    127             try:             
     127            try: 
     128                import pdb 
     129                pdb.set_trace()          
    128130                dao.deleteOriginalRecord() 
    129                 dao._deleteSpatioTemporalData() 
     131                #dao._deleteSpatioTemporalData() 
    130132                 
    131133                #check item deleted (note need to reinitialise the record object!) 
    132                 dao = PostgresDAO(record, self.pgc) 
     134                dao = PostgresDAO(record,  None, None, self.pgc) 
    133135                record = RecordToDelete(recordFilename,None) 
    134136                self.createRecordObject(record,dao,recordFilename) 
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/ExtractISO.py

    r7186 r7286  
    6060        'publicationDate':'dataset_metadata_publication_date', 
    6161        'authors_text':'authors','parameters_text':'parameters', 
    62         'dataFormats_text':'data_formats','dataFormats_ts_vector':'data_formats_tsvector'} 
     62        'dataFormats_text':'data_formats','dataFormats_ts_vector':'data_formats_tsvector', \ 
     63        'resourceLocatorBool':'resource_locator','inspireThemes_text':'inspire_themes','inspireThemes_tsvector':'inspire_themes_ts_vector', \ 
     64        'verticalExtent_text':'vertical_extent','verticalExtent_tsvector':'vertical_extent_ts_vector' 
     65        } 
    6366                 
    6467                 
     
    8689        'dataset_metadata_publication_date':'timestamp', 
    8790        'authors':'text','parameters':'text', 
    88         'data_formats':'text','data_formats_tsvector':'tsvector'} 
     91        'data_formats':'text','data_formats_tsvector':'tsvector', \ 
     92        'resource_locator':'boolean','inspire_themes':'text','inspire_themes_ts_vector':'tsvector', \ 
     93        'vertical_extent':'text','vertical_extent_ts_vector':'tsvector' 
     94        } 
    8995         
    9096                 
     
    151157                self.originalFormat = self.getElementVal(self.isoModel.originalFormat()) 
    152158                 
    153                 self.dataFormats = self.getElementVal(self.isoModel.dataFormats()) 
     159                 
     160                try: 
     161                        self.dataFormats = self.getElementVal(self.isoModel.dataFormats()) 
     162                except: 
     163                        self.dataFormats = 'None' 
    154164                                 
    155165                if self.dataFormats != 'None': 
     
    250260                        self.topicCategory_text = None 
    251261                        self.topicCategory_tsvector = None 
     262                         
     263                #updated for NERC API v4.3.0 
     264                 
     265                #resource locator 
     266                try: 
     267                        self.resourceLocator = self.getElementVal(self.isoModel.resourceLocator()) 
     268                        self.resourceLocator_text = self.lineage 
     269                        self.resourceLocator_tsvector = self.lineage 
     270                except: 
     271                        self.resourceLocator = None 
     272                        self.resourceLocator_text = None 
     273                        self.resourceLocator_tsvector = None 
     274                         
     275                #resourceLocator in the db is a boolean field - it either has a data resource or it doesnt 
     276                 
     277                if self.resourceLocator is None or self.resourceLocator =='': 
     278                        self.resourceLocatorBool = False 
     279                else: 
     280                        self.resourceLocatorBool = True 
     281                 
     282                #INSPIRE themes (sub class of keywords)  
     283                 
     284                try:     
     285                        self.inspireThemes = self.getElementVal(self.isoModel.INSPIREthemes())   
     286                        self.inspireThemesList = self.listify(self.inspireThemes) 
     287                except: 
     288                        self.inspireThemes = None 
     289                 
     290                if self.inspireThemes == 'None' or self.inspireThemes is None: 
     291                        logging.warn("No INSPIRE themes info for record!") 
     292                        self.inspireThemes_text = ''  
     293                        self.inspireThemes_tsvector = '' 
     294                else:            
     295                        self.inspireThemesOb = IsoIngestListUtilities(self.inspireThemes,True)                    
     296                        self.inspireThemes_text = self.inspireThemesOb.getDelimitedStringFromList(self.inspireThemesOb.listVals) 
     297                        self.inspireThemes_tsvector = self.inspireThemes_text 
     298                 
     299                #vertical extent (sub class of keywords)                 
     300                 
     301                try: 
     302                        self.verticalExtent = self.getElementVal(self.isoModel.verticalExtentKeyword())  
     303                        self.verticalExtentList = self.listify(self.verticalExtent) 
     304                except: 
     305                        self.verticalExtent = None 
     306                 
     307                if self.verticalExtent == 'None' or self.verticalExtent is None: 
     308                        logging.warn("No Vertical Extent keywords info for record!") 
     309                        self.verticalExtent_text = '' 
     310                        self.verticalExtent_tsvector = '' 
     311                else:            
     312                        self.verticalExtentOb = IsoIngestListUtilities(self.verticalExtent,True)                          
     313                        self.verticalExtent_text = self.verticalExtentOb.getDelimitedStringFromList(self.verticalExtentOb.listVals) 
     314                        self.verticalExtent_tsvector = self.verticalExtent_text 
     315                                                 
    252316                         
    253317                ''' 
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/PostgresDAO.py

    r7186 r7286  
    163163                 
    164164                logging.info("Attempting to update: " + isoData) 
     165                 
     166                 
     167                 
    165168                                         
    166169                columnValue = getattr(self.isoDataModel,isoData) 
    167170                columnName = dbColumns[isoData] 
     171                 
     172                 
    168173                 
    169174                if columnValue is not None: 
     
    187192         
    188193        logging.info("Updating " + columnName + " for record: " + original_document_filename) 
    189          
     194                         
     195        #if columnName == 'resource_locator': 
     196        #               import pdb 
     197        #               pdb.set_trace()          
    190198         
    191199        #get the matching dictionary of postgres datatypes defined in the iso model 
     
    219227                          
    220228                        else: 
    221                                 newColVal = columnValue[0][0] 
     229                                #get rid of any special characters 
     230                                newColVal = self._record.escapeSpecialCharacters(columnValue[0][0]) 
    222231                                 
    223232                else: 
    224233                        logging.info("Value type for %s has already been converted to a simple string" %columnName ) 
     234           
    225235                        #remaining type to deal with is the value has already been converted to a simple string (i.e. authors, data centre name) 
    226                         newColVal = columnValue 
    227                  
    228                  
    229                          
     236                        newColVal = self._record.escapeSpecialCharacters(columnValue) 
     237                 
     238        elif postgresDataType == 'boolean': 
     239                logging.info("Data type is Boolean!") 
     240                newColVal = columnValue 
     241                         
    230242        else: 
    231243                logging.info("Data type not text or vector!") 
     
    235247                elif len(columnValue[0]) > 1: 
    236248                        logging.warn("NOTE: " + columnName + " is attempting to add multiple values - just take first for now!") 
    237                         newColVal = columnValue[0][0] 
     249                        newColVal = self._record.escapeSpecialCharacters(columnValue[0][0]) 
    238250                else: 
    239                         newColVal = columnValue[0][0] 
     251                        newColVal = self._record.escapeSpecialCharacters(columnValue[0][0]) 
    240252                 
    241253                #TODO: at some stage add some checking of timestamps etc 
    242254                 
    243         #get rid of any special characters 
    244         newColVal = self._record.escapeSpecialCharacters(newColVal) 
     255         
    245256         
    246257        #build the sql query 
     
    249260                sqlCmd = "update original_document set " + columnName + " = to_tsvector('english','" + newColVal + "') where original_document_filename = '" + original_document_filename + "';" 
    250261         
     262        elif postgresDataType == 'boolean': 
     263                sqlCmd = "update original_document set  %s = %s where original_document_filename = '%s';" %(columnName,newColVal,original_document_filename) 
     264                 
    251265        else: 
    252266                sqlCmd = "update original_document set " + columnName + " = '" + newColVal + "' where original_document_filename = '" + original_document_filename + "';" 
     
    260274                sqlCmd = sqlCmd.replace("None", "null") 
    261275                 
     276                #sort out escape chars from previous catches (i.e. parameters) 
     277                sqlCmd = sqlCmd.replace("\\'","\'")              
     278                 
    262279                self.pgc.runSQLCommand(sqlCmd) 
    263280                 
     
    293310            # data, rather than updating it, to keep things simple 
    294311            logging.info("Clearing out existing data for record - to allow clean update") 
    295              
     312            self._deleteSpatioTemporalData() 
    296313            self._insertSpatioTemporalData() 
    297314            result = True 
     
    322339        results_orig = self.pgc.runSQLCommand(sql_orig) 
    323340         
     341        #we MUST make sure we compare the original format - any xquery conversions will produce differences even if like for like 
     342        if self._record.docType == 'DIF_9.4': 
     343                 
     344                #make sure we escape any special characters.... 
     345                origXMLToCompare = self._record.escapeSpecialCharacters(self._record.difXML) 
     346        else:            
     347                origXMLToCompare = self._record.escapeSpecialCharacters(self._record.isoXML) 
     348         
    324349        #get the original_document from the transformed docs table         
    325350        sql_transf = "SELECT transformed_document_id FROM transformed_document where original_document_id = " + str(self._record.db_id) +  \ 
    326                 " AND transformed_document = '" + self._record.originalFormat + "';" 
    327                  
     351                " AND transformed_document = '" + origXMLToCompare + "';" 
     352         
     353        #import pdb 
     354        #pdb.set_trace() 
    328355        results_transf = self.pgc.runSQLCommand(sql_transf)         
    329356         
     
    359386        delete entries from there 
    360387        ''' 
    361         logging.info("Deleting existing spatiotemporal data for record") 
    362         sqlCmd = "DELETE FROM SPATIAL_TEMPORAL_DATA WHERE original_document_id = " + \ 
    363             str(self._record.db_id) + ";"       
    364  
    365         self.pgc.runSQLCommand(sqlCmd) 
    366         logging.info("Spatiotemporal data deleted successfully") 
     388        logging.info("Deleting existing spatial data for record") 
     389         
     390        try: 
     391                sqlCmd = "DELETE FROM spatial_data WHERE original_document_id = " + str(self._record.db_id) + ";" 
     392                 
     393                self.pgc.runSQLCommand(sqlCmd) 
     394                 
     395                logging.info("Spatial data for %s deleted ok" %self._record.db_id) 
     396             
     397        except: 
     398                logging.error("Could not delete spatial record %s" %self._record.db_id) 
     399         
     400         
     401        logging.info("Deleting existing temporal data for record") 
     402         
     403        try: 
     404                sqlCmd = "DELETE FROM temporal_data WHERE original_document_id = " + str(self._record.db_id) + ";" 
     405                 
     406                self.pgc.runSQLCommand(sqlCmd) 
     407                 
     408                logging.info("temporal data for %s deleted ok" %self._record.db_id) 
     409             
     410        except: 
     411                logging.error("Could not delete temporal record %s" %self._record.db_id) 
     412         
     413        logging.info("Spatio - temporal data deleted successfully") 
    367414         
    368415 
     
    526573            return 
    527574         
    528         for docType, doc in self._record.getAllDocs(self.discovery_dir): 
    529                  
    530             #if docType is original input xml then put that in rather than some lossy transformed guff. 
    531             if docType == self._record.docType: 
    532                 doc = self._record.originalXMLdoc 
    533              
    534                                  
     575        #for docType, doc in self._record.getAllDocs(self.discovery_dir):         
     576        metadataDocs = self._record.getAllDocs(self.discovery_dir)         
     577                 
     578        for docType in metadataDocs.keys(): 
     579                                 
     580            logging.info("Inserting metadata of type %s" %docType) 
     581                                                 
    535582            sqlCmd = "INSERT INTO TRANSFORMED_DOCUMENT (transformed_document_id, " \ 
    536583                "original_document_id, transformed_format, " \ 
    537584                "transformed_document, create_date, scn) VALUES (" \ 
    538585                "DEFAULT, '" + str(self._record.db_id) + "', '" + \ 
    539                 docType + "', '" + doc + "', current_timestamp, 1);" 
     586                docType + "', '" + metadataDocs[docType] + "', current_timestamp, 1);" 
    540587             
    541588             
     
    555602            return 
    556603         
    557         for docType, doc in self._record.getAllDocs(self.discovery_dir): 
    558              
    559             #if docType is original input xml then put that in rather than some lossy transformed guff. 
    560             if docType == self._record.docType: 
    561                 doc = self._record.originalXMLdoc              
    562              
    563             sqlCmd = "UPDATE TRANSFORMED_DOCUMENT SET transformed_document = '" + doc + \ 
    564                 "', update_date = current_timestamp WHERE original_document_id = " + \ 
    565                 str(self._record.db_id) + " AND transformed_format = '" + docType + "';" 
     604        #for docType, doc in self._record.getAllDocs(self.discovery_dir): 
     605        metadataDocs = self._record.getAllDocs(self.discovery_dir) 
    566606                 
    567              
    568             self.pgc.runSQLCommand(sqlCmd) 
     607        for docType in metadataDocs.keys(): 
     608                 
     609                logging.info("Updating metadata of type %s" %docType) 
     610                 
     611                sqlCmd = "UPDATE TRANSFORMED_DOCUMENT SET transformed_document = '" +  metadataDocs[docType] + "', update_date = current_timestamp WHERE original_document_id = " + str(self._record.db_id) + " AND transformed_format = '" + docType + "';" 
     612                 
     613                self.pgc.runSQLCommand(sqlCmd) 
    569614     
    570615        logging.info("Transformed records updated in DB") 
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/PostgresRecord.py

    r7186 r7286  
    3333    #def __init__(self, filename, ndg_dataprovider, datacentre_groups, datacentre_namespace, discovery_id, xq, docType): 
    3434    def __init__(self, filename, ndg_dataprovider, datacentre_groups, datacentre_namespace, isoDataModel, xq, docType 
    35                                 , xqExceptions , xqueryConversions, saxonJarFile, xqueryDocTypes, originalXML, currentMedinStandard, stubIso = None): 
     35                                , xqExceptions , xqueryConversions, saxonJarFile, xqueryDocTypes, originalXML, currentMedinStandard, stubIso = None, difXML = None, isoXML = None): 
    3636                  
    3737                  
     
    8585         
    8686        self._molesFormat = None    # initialise this, so we can guarantee a value - to avoid using getattr 
    87         self._allDocs = []  # array to store all the transformed docs - for easy retrieval by the DAO 
     87        self._allDocs = {}  # array to store all the transformed docs - for easy retrieval by the DAO 
    8888 
    8989        # get the dir of the file - needed by the xquery to use as the target collection 
     
    9595        #self.originalFormat = self.isoDataModel.originalFormat[0][0] 
    9696        self.originalFormat = file(self.filename).read() 
     97         
     98        #explicitly pull out original dif file content if original format was dif, & iso if ISO 
     99        self.difXML = difXML 
     100        self.isoXML = isoXML 
    97101         
    98102        # escape any apostrophes  
     
    217221        self.discovery_dir = transformationDir 
    218222         
    219                 
     223               
    220224        for docType in self._xqueryConversions: 
    221225                 
    222                 self._allDocs.append([self._xqueryDocTypes[docType], self.escapeSpecialCharacters(self.getDocumentFormat(docType))]) 
     226                #self._allDocs.append([self._xqueryDocTypes[docType], self.escapeSpecialCharacters(self.getDocumentFormat(docType))]) 
     227                self._allDocs[self._xqueryDocTypes[docType]] = self.escapeSpecialCharacters(self.getDocumentFormat(docType)) 
    223228                 
    224229        #remember, if a non ISO input format we need to add the stubISO intermediate format too. 
    225230        #(if original format was ISO, this is covered by the self.originalXMLdoc overrider in the insertMetadata method in PostgresDAO.) 
    226231         
     232         
    227233        if self.docType == 'DIF_9.4': 
    228234                logging.info("Transient ISO intermediate format detected; adding to transformed docs!") 
    229235                 
    230236                #we must cast this stubISO as the MEDIN format ISO so can be selected ("provide MEDIN format output from non-MEDIN input") 
    231                 self._allDocs.append([self.currentMedinStandard,self.stubISO]) 
     237                self._allDocs[self.currentMedinStandard] = self.stubISO 
     238                 
     239                #must also make sure we use the original dif and use that in here too.. 
     240                self._allDocs[self.docType] = self.difXML 
    232241                 
    233242        else: 
     
    235244                #if not DIF, put original format ISO in here 
    236245                #TODO - put in version with redirected URLs?? 
    237                 self._allDocs.append([self.docType,self.originalFormat]) 
    238         
     246                #self._allDocs.append([self.docType,self.originalFormat]) 
     247                self._allDocs[self.docType] = self.originalFormat 
     248                 
     249         
    239250        return self._allDocs 
    240251         
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/abstractdocumentingester.py

    r7186 r7286  
    6565                # set up any keywords on the object 
    6666                # NB, be careful to keep the instance variables the same name as the keywords! (not also feed keywords also in here) 
    67                 checkConfInArgs = False 
     67                checkConfInArgs = False          
     68                checkProcID = False 
    6869                for arg in args: 
    6970                         
    70                         keywordArgs=['ingestFromDate','interval','individualFile','interval','ingestFromDate','eXistDBHostname','eXistPortNo','dataCentrePoll','ingestConfigFile']                                               
     71                        keywordArgs=['ingestFromDate','individualFile','interval','ingestFromDate',\ 
     72                                                'eXistDBHostname','eXistPortNo','dataCentrePoll','ingestConfigFile', \ 
     73                                                'ingestProcessID'] 
     74                                                 
    7175                         
    7276                        bits = arg.split('=') 
    7377                        if len(bits) == 2: 
    74                                 if bits[0] == keywordArgs[0]: 
     78                                if bits[0] == keywordArgs[3]: 
    7579                                        self.setIngestFromDate(bits[1]) 
    76                                 elif bits[0] == keywordArgs[1]: 
     80                                elif bits[0] == keywordArgs[2]: 
    7781                                        self.setPollInterval(bits[1]) 
    78                                 elif bits[0] == keywordArgs[8]: 
     82                                elif bits[0] == keywordArgs[7]: 
    7983                                        print " - Running with specified config file!" 
    8084                                        self.setOaiConfigFile(bits[1]) 
    8185                                        checkConfInArgs = True 
    82                                 elif bits[0] == keywordArgs[2]: 
     86                                elif bits[0] == keywordArgs[1]: 
    8387                                        print " - Running in single file ingestion mode!" 
    8488                                        self.setIndFileToIngest(bits[1]) 
     89                                elif bits[0] == keywordArgs[8]: 
     90                                        print " - WARNING: will log results of this ingestion process into the specified logging database! (NOTE: will also take location of metadata from database as this option intended for DPWS!!)" 
     91                                        self.setIngestLogID(bits[1]) 
     92                                        checkProcID = True                               
    8593                                elif bits[0] not in keywordArgs: 
    8694                                        print "\nWARNING: invalid keyword supplied (%s)! \n"%bits[0] 
     
    92100                        print "\nWARNING: You must now include the ingestConfigFile arguement for successful operation" 
    93101                        sys.exit(2) 
     102                 
     103                 
    94104                 
    95105                print self.lineSeparator 
     
    194204                         
    195205                        if self.isoDataModel.validDoc is True:                   
    196                                                                                  
     206                                 
    197207                                 
    198208                                #record whats attempting to be ingested  
    199209                                record = PostgresRecord(filename, self._NDG_dataProvider,self._datacentre_groups, self._datacentre_namespace, 
    200210                                                                self.isoDataModel,self._xq, self._datacentre_format, self._xqueryConversionsExceptions,  
    201                                                                 self._xqueryConversions,self._saxonJarFile, self._xqueryDocTypes, self.originalXMLdoc, self._currentMedinStandard, stubIso = self.isoXML)                        
     211                                                                self._xqueryConversions,self._saxonJarFile, self._xqueryDocTypes, self.originalXMLdoc, self._currentMedinStandard, stubIso = self.isoXML, difXML = self.difXML, isoXML = self.isoXML)                    
    202212                                 
    203213                                # Now create the data access object to interface to the DB                       
     
    309319                        elif words[0] == 'NDG_redirect_URL': 
    310320                                processingConfig['NDG_redirect_URL'] = words[1] 
     321                                 
     322                        elif words[0] == 'ingestLoggingConfig': 
     323                                processingConfig['ingestLoggingConfig'] = words[1] 
    311324                                 
    312325                        elif words[0] == 'ingestConfig': 
     
    475488                 
    476489                self.inputFileOrigFinal = {} 
    477                 self.badXMLfileList = {} 
     490                self.badXMLfileList = {}                 
     491                self.difXML = None 
    478492                 
    479493                logging.info(self.lineSeparator) 
    480494                logging.info("Renaming files:") 
     495                 
     496                if self.ingestProcessID is not None: 
     497                        self._getPostgresDBConnectionLogging() 
     498                 
     499                        #if process id has been supplied, then update the logging db with a "start_ingest" 
     500                        sqlStatusCmd = "select update_ingest_status (%s, 'run_ingest');" %self.ingestProcessID 
     501                        self.pgc_IngestLog.runSQLCommand(sqlStatusCmd) 
    481502                 
    482503                for filename in os.listdir(originals_dir): 
     
    525546                                #generate the ISO object from the converted ISO here now.. 
    526547                                try: 
    527                                                                                                  
     548                                         
     549                                        #temp assignment so failure mode supported 
     550                                        new_filename_short = original_filename 
     551                                                                         
    528552                                        isoDataModel = ExtractISO(tempStubISOfile,self._isoClass[self._datacentre_format]) 
    529553                                 
     
    537561                                                        logging.info("Extracting original input file into variable for input into original format in transformed docs table") 
    538562                                                        self.originalXMLdoc = file(original_filename).read() 
     563                                                        self.difXML = self.originalXMLdoc 
    539564                                         
    540565                                                except: 
    541566                                                        logging.warn("Could not extract original file to local variable!") 
    542                                  
    543                                  
     567                                                         
     568                                                 
    544569                                                #Back to main stream of ISO ingest 
    545570                                                if self._NDG_dataProvider: 
     
    676701                self.pgc = pgc(configFile = self._databaseConfigurationFile) 
    677702                logging.info("Postgres DB connection now set up") 
     703                 
     704                 
     705         
     706        def _getPostgresDBConnectionLogging(self): 
     707                ''' 
     708                Get the default postgres DB connection - by reading in data from the db config file 
     709                ''' 
     710                 
     711                logging.debug("Setting up connection to postgres DB") 
     712                #self.pgc = pgc(configFile = '/usr/local/ndg-oai-info-editor/ingest.config')  
     713                 
     714                 
     715                self.pgc_IngestLog = pgc(configFile = self.ingestLoggingDatabaseConfigurationFile) 
     716                logging.info("Postgres DB connection now set up") 
    678717 
    679718 
     
    748787                #create list to to hold files ingest failed on. 
    749788                self.updateFailList = [] 
    750                 self.deletedFailList = []                                
     789                self.deletedFailList = [] 
     790                self.problemMessageList = {}                     
    751791                 
    752792                for filename in filenames: 
     
    762802                                if self.ingestProblemMessage != '': 
    763803                                        ingestProbMsg = ingestProbMsg + self.ingestProblemMessage 
     804                                         
     805                                        self.problemMessageList[filename] = self.ingestProblemMessage 
    764806                                         
    765807                                #remove this filename from the list of files for this DC already in list (whats left over is to be deleted)  
     
    791833                 
    792834                #Update log file details op on ingest to s atring which is THEN wrtten to a file, so as can return and email for info editor 
     835                self.thisIngestDate = str(datetime.datetime.now()) 
     836                 
    793837                message = "Ingest report for data centre: " + datacentre + "\n" 
    794                 message = message + "Ingest date: " + str(datetime.datetime.now()) + "\n" 
     838                message = message + "Ingest date: " + self.thisIngestDate + "\n" 
    795839                message = message + "Original metadata directory: " + self._harvest_home + "\n\n" 
    796840                message = message + "TOTAL_NUMBER_OF_FILES " + str(numfilesproc+badXmlFiles) + "\n" 
     
    814858                                message = message + "BAD_XML_FILE " + badXmlFile +"\n" 
    815859                 
    816                          
     860                                                 
     861                #log processing results to ingestLogging table if required to            
     862                if self.ingestProcessID is not None: 
     863                        logging.info("Updating ingest logging database") 
     864                                                 
     865                        sqlLoggingCmd = "select add_ingest_stats('%s','%s','%s','%s','%s','%s','%s','%s','%s');"%(self.ingestProcessID,self.thisIngestDate,numfilesproc+badXmlFiles,numfilesproc,badXmlFiles,self._no_files_ingested,self._no_files_changed,self._no_files_deleted,self._no_problem_files) 
     866                                         
     867                        #update ingestLogging                    
     868                        self.pgc_IngestLog.runSQLCommand(sqlLoggingCmd) 
     869                         
     870                        #now update problem file log if there are problem files 
     871                        if self._no_problem_files > 0: 
     872                                logging.info("There are %s problem files - recording these in stats logging db" %self._no_problem_files) 
     873                                 
     874                                for badFile in self.problemMessageList.keys(): 
     875                                         
     876                                        sqlProbFileCmd = "select add_problem_file('%s','%s','%s');"%(self.ingestProcessID,badFile,self.problemMessageList[badFile]) 
     877                                                                         
     878                                        #update ingestLogging                    
     879                                        self.pgc_IngestLog.runSQLCommand(sqlProbFileCmd) 
     880                                         
     881                        #if process id has been supplied, then update the logging db with a "start_ingest" 
     882                        sqlStatusCmd = "select update_ingest_status (%s, 'end_ingest');" %self.ingestProcessID 
     883                        self.pgc_IngestLog.runSQLCommand(sqlStatusCmd) 
    817884                         
    818885                #update with content from the problem messages recorded 
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/difConvertedto_ISO19139.py

    r7186 r7286  
    5757                return dataCentreName 
    5858         
     59         
     60        def dataOriginator(self): 
     61                ''' 
     62                Method to extract and return info on the Data Originator 
     63                 
     64                MEDIN element 22.1 p35.  For this will return a list of organisation names 
     65                 
     66                Mandatory - must have minimum of Organisation Name or Person Name. 
     67                ''' 
     68                 
     69                #originator = (self.dataOriginator.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString'}}) 
     70                 
     71                #revised 07/06/10 SJD - Needs to pick out values where CI_RoleCode = originator (not sure why its not already doing this..) 
     72                # also may not have Organisation name, so look uo 
     73                originator = (self.dataOriginator.__name__,{1:{ 
     74                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty', 
     75                                                                                                        'elValXpath':'gmd:organisationName/gco:CharacterString', 
     76                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode', 
     77                                                                                                        'depVal':'originator'}}, 
     78                                                                                                        {2:{ 
     79                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty', 
     80                                                                                                        'elValXpath':'gmd:individualName/gco:CharacterString', 
     81                                                                                                        'depValXpath':'gmd:role/gmd:CI_RoleCode', 
     82                                                                                                        'depVal':'originator'}}) 
     83                 
     84                return originator 
     85         
    5986                 
    6087         
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/medin_2_3_ISO19139.py

    r7186 r7286  
    260260         
    261261         
     262        def INSPIREthemes(self): 
     263                 
     264                ''' 
     265                Updated for NERC API v4.3.0 - type of keyword so extract using dependant value type of tuple 
     266                 
     267                ''' 
     268                 
     269                themes = (self.INSPIREthemes.__name__,{1:{ 
     270                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_Keywords', 
     271                                                                                                        'elValXpath':'gmd:keyword/gco:CharacterString', 
     272                                                                                                        'depValXpath':'gmd:thesaurusName/gmd:CI_Citation/gmd:title/gco:CharacterString', 
     273                                                                                                        'depVal':'GEMET - INSPIRE themes, version 1.0'}}) 
     274                 
     275                return themes 
     276         
     277         
     278        def resourceLocator(self): 
     279                 
     280                ''' 
     281                Updated for NERC API v4.3.0 - returns url of actual data location if available 
     282                ''' 
     283                 
     284                resource = (self.resourceLocator.__name__,{1:{'xpath':'gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL'}}) 
     285                                                                                         
     286                                         
     287                return resource 
     288         
     289         
     290        def verticalExtentKeyword(self): 
     291                 
     292                ''' 
     293                Updated for NERC API v4.3.0 - returns info on vertical extent 
     294                ''' 
     295                 
     296                 
     297                extent = (self.verticalExtentKeyword.__name__,{1:{ 
     298                                                                                                        'baseXpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription/gmd:geographicIdentifier/gmd:MD_Identifier', 
     299                                                                                                        'elValXpath':'gmd:code/gco:CharacterString', 
     300                                                                                                        'depValXpath':'gmd:authority/gmd:CI_Citation/gmd:title/gco:CharacterString', 
     301                                                                                                        'depVal':'SeaDataNet vertical extent keywords'}}) 
     302                 
     303                 
     304                #debug xpath - all extents 
     305                #extent = (self.verticalExtentKeyword.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:extent/gmd:EX_Extent/gmd:geographicElement/gmd:EX_GeographicDescription/gmd:geographicIdentifier/gmd:MD_Identifier/gmd:code/gco:CharacterString'}}) 
     306                 
     307                return extent 
     308         
     309         
    262310        def urlsToChange(self): 
    263311                ''' 
  • TI01-discovery-Ingest/trunk/v4.3.0/ingestAutomation-upgrade/OAIBatch/oai_document_ingester.py

    r7186 r7286  
    99# annoyingly, an import (CSML file, I think) sets the logging config during imports - so set this 
    1010# here to get there first - since you can only set the config once 
    11 logging.basicConfig(level=logging.DEBUG, 
     11logging.basicConfig(level=logging.WARN, 
    1212                    format='%(asctime)s %(filename)s:%(lineno)d %(levelname)s %(message)s') 
    1313from time import strftime 
     
    2323        ''' 
    2424         
    25         indFileToIngest="" 
     25        indFileToIngest=""       
     26        ingestProcessID = None 
     27        overrideMetadataFolder = None 
     28        uniqueProviderID = None 
    2629 
    2730        def processDataCentre(self, dataCentre, harvestDir = None, dataFormat = None, configFileName = None): 
     
    5558                else: 
    5659                        self.processingDict = self.getProcessingConfig(configFileName) 
    57                          
     60                 
    5861                 
    5962                self._code_dir = self.processingDict['code_directory'] 
    6063                self._base_dir = self.processingDict['base_directory']           
    6164                self._databaseConfigurationFile = self.processingDict['ingestConfig'] 
     65                self.ingestLoggingDatabaseConfigurationFile = self.processingDict['ingestLoggingConfig'] 
    6266                redirectUrls = self.processingDict['changeURLs'] 
    6367                self._ndgRedirectURL = self.processingDict['NDG_redirect_URL'] 
     
    96100                        self._datacentre_format = dataFormat 
    97101 
     102                 
     103                logging.info("Setting up logging connection database") 
     104                 
     105                tempDPWSmetadataFolder = None                            
     106                                 
     107                if self.ingestProcessID is not None: 
     108                        self._getPostgresDBConnectionLogging() 
     109                 
     110                        #if process id has been supplied, then update the logging db with a "start_ingest" 
     111                        sqlStatusCmd = "select update_ingest_status (%s, 'start_ingest');" %self.ingestProcessID 
     112                        self.pgc_IngestLog.runSQLCommand(sqlStatusCmd) 
     113                         
     114                        #now must get temporary metadata folder for DPWS 
     115                        sqlFolderCmd = "select get_metadata_dir(%s);" %self.ingestProcessID 
     116                        tempDPWSmetadataFolder = self.pgc_IngestLog.runSQLCommand(sqlFolderCmd)[0][0] 
     117                         
     118                        if tempDPWSmetadataFolder is not None: 
     119                                logging.info("Temporary metadata folder to be used by DPWS ingest is %s " %tempDPWSmetadataFolder) 
     120                                self._harvest_home = tempDPWSmetadataFolder 
     121                        else: 
     122                                #if this still set to none then there's an error! 
     123                                logging.error("Could not extract temporary metadata folder location for process %s" %self.ingestProcessID) 
     124                                sqlStatusCmd = "select update_ingest_status (%s, 'end_ingest');" %self.ingestProcessID 
     125                                sys.exit(2) 
     126 
     127                 
     128                 
    98129                #if a dif format we need to convert to the stub iso profile so can extract all the info for ingest from that 
    99130                if self._datacentre_format in self.processingDict['xqueryStubIsoGen'].keys():                    
     
    136167                # Process the resulting files and put the data into the postgres DB 
    137168                # - firstly set up a db connection to use 
    138                 self._getPostgresDBConnection()          
     169                self._getPostgresDBConnection() 
     170                 
     171                                                                 
    139172                 
    140173                #accepted formats defined in oai_processing config file - should also match formats published on API getFormat list 
     
    189222 
    190223 
     224                 
     225 
     226 
    191227                #import pdb 
    192228                #pdb.set_trace() 
     
    200236                self.indFileToIngest = indFileToIngest 
    201237                 
     238         
     239        def setIngestLogID(self, processID): 
     240                ''' 
     241                Method to set individual file to ingest if "individualFile" is invoked 
     242                ''' 
     243                self.ingestProcessID = processID 
     244                 
     245        def setProviderIDLogging(self, providerID): 
     246                ''' 
     247                Method to set individual file to ingest if "individualFile" is invoked 
     248                ''' 
     249                self.uniqueProviderID = providerID 
     250                 
     251        def setOverrideMetadataFolder(self, tempFolder): 
     252                ''' 
     253                Method to set individual file to ingest if "individualFile" is invoked 
     254                ''' 
     255                self.overrideMetadataFolder = tempFolder 
     256                 
    202257                 
    203258        def setOaiConfigFile(self, configFilePath): 
     
    209264                        self.oaiEditorConfig = configFilePath 
    210265                        logging.info("Using configuration file at: " + configFilePath) 
     266                else:                                            
     267                        self.oaiEditorConfig = './oai_document_ingester.config' 
     268                        logging.info("No external configuration file has been set so using default file: %s" %self.oaiEditorConfig) 
    211269                 
    212270 
Note: See TracChangeset for help on using the changeset viewer.