Changeset 8460 for mauRepo


Ignore:
Timestamp:
10/07/12 15:15:27 (7 years ago)
Author:
mnagni
Message:

Complete - # 22489: CEDA Observation Collection - phenomenonTime
 http://team.ceda.ac.uk/trac/ceda/ticket/22489
Complete - # 22518: The description is broken
 http://team.ceda.ac.uk/trac/ceda/ticket/22518
Complete - # 22488: CEDA Observation Collection - Geographical Extent
 http://team.ceda.ac.uk/trac/ceda/ticket/22488

Now the Moles3EPB explicitly call the "synchronise" method in the SQLAlchemy mapped classes to assure the persistence of the data
Uses the CedaMolesModel? v 0.1.5 which correct a major problem in synchronise the instances with database

Location:
mauRepo/MolesManager/trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • mauRepo/MolesManager/trunk/resources/requirements.txt

    r8445 r8460  
    1111# --extra-index-url http://ciprod1.cems.rl.ac.uk/pip 
    1212# to your pip install  
    13 ceda-moles-model==0.1.4 
     13ceda-moles-model==0.1.5 
  • mauRepo/MolesManager/trunk/src/MolesManager/moles3epb.py

    r8445 r8460  
    121121            @return an updated, session independent, object instance reflecting the new persisted object  
    122122        """ 
    123         self._session.add(instance) 
    124         self._session.commit()      
    125          
     123        EPB.persistInstance(instance, self._session)         
     124 
     125    def _mergeOrAddInSession(self, ceda_object): 
     126        try: 
     127            return self._session.merge(ceda_object)    
     128        except: 
     129            self._session.add(ceda_object) 
     130            return ceda_object   
    126131       
    127132    def updateCedaObject(self, ceda_object, cols_to_update): 
     
    133138            @return: the given instance with the updated attributes. 
    134139        """ 
    135         coll = None 
    136         try: 
    137             if ceda_object in self._session: 
    138                 coll = self._session.merge(ceda_object) 
    139             else: 
    140                 self._session.add(ceda_object) 
    141                 coll = ceda_object    
    142         except Exception as e: 
    143             print e 
     140        coll = self._mergeOrAddInSession(ceda_object) 
    144141        if coll != None:         
    145142            for k,v in cols_to_update.items(): 
    146                 if hasattr(coll, k): 
    147                     val = None 
    148                     try: 
    149                         val = self._session.merge(v) 
    150                     except Exception: 
    151                         val = v 
     143                if hasattr(coll, k):                     
    152144                    coll_k = getattr(coll, k)                         
    153145                    if type(coll_k) == list or type(coll_k) == InstrumentedList: 
    154146                        tmp_coll = [] 
    155                         if type(val) == list or type(val) == InstrumentedList: 
    156                             tmp_coll.extend(val) 
     147                        if type(v) == list or type(v) == InstrumentedList: 
     148                            tmp_coll.extend(v) 
    157149                        else: 
    158                             tmp_coll.append(val) 
     150                            tmp_coll.append(v) 
    159151                        for item in tmp_coll: 
    160                             if item not in coll_k: 
    161                                 coll_k.append(item) 
     152                            el = self._mergeOrAddInSession(item) 
     153                            if el not in coll_k: 
     154                                coll_k.append(el) 
    162155                    else: 
    163                         setattr(coll, k, val) 
     156                        el = self._mergeOrAddInSession(v) 
     157                        setattr(coll, k, el) 
    164158        synchAttributes(coll)                                              
    165159        self._controlledCommit() 
    166         return coll                                       
     160        #return coll                                       
    167161 
    168162    def getUnifyObservationCollectionGEAsBBox(self, collection): 
  • mauRepo/MolesManager/trunk/src/libs/epb.py

    r8445 r8460  
    3434from sqlalchemy.sql.expression import text 
    3535from MolesManager.forms.date import methodsWithDecorator 
     36from sqlalchemy.orm.util import identity_key 
    3637 
    3738class EPB(object): 
     
    158159 
    159160    @classmethod 
     161    def persistInstance(cls, instance, session): 
     162        """ 
     163            Adds a new migration object. 
     164            @param migrationObj: the migration object to add 
     165            @param session: an sqlalchemy Session object. If None (default) the method creates 
     166            @return an updated, session independant, object instance reflecting the new persisted object  
     167        """         
     168        session.add(instance) 
     169        session.commit() 
     170        id_key = identity_key(instance=instance) 
     171        instance = EPB.search(id_key[0], id_key[1], session) 
     172        #instance = ret 
     173 
     174    @classmethod 
    160175    def executeNative(self, sqlNative, session): 
    161176        return session.execute(text(sqlNative))      
  • mauRepo/MolesManager/trunk/src/libs/migration/MigrationEPB.py

    r8433 r8460  
    3232    def close(self): 
    3333        return self._session.close() 
     34             
     35    def persistInstance(self, instance): 
     36        """ 
     37            Adds a new migration object. 
     38            @param migrationObj: the migration object to add 
     39            @param session: an SQLAlchemy Session object. If None (default) the method creates 
     40            @return an updated, session independent, object instance reflecting the new persisted object  
     41        """       
     42        EPB.persistInstance(instance, self._session) 
     43        #return ret 
    3444 
    3545    def getAllDeploymentsMigrationByDataEntitySortedByDate(self, dataEntity, deploymentNames): 
  • mauRepo/MolesManager/trunk/src/libs/migration/processor/commons.py

    r8445 r8460  
    959959            tm_position = createTM_Position(date8601 = createDate(isoDateStringToTimeDate(doc_phenomenon_time))) 
    960960            pt = createTM_Instant(tm_position) 
    961     return pt 
     961        return pt 
    962962 
    963963def fromPhenomenonTimeToString(phenomenonTime): 
     
    988988    return str(datetime.date(int(idate.year), int(idate.month), int(idate.day))) 
    989989 
    990 def fromGeographicBoundingBoxToString(geographicBoundingBox): 
    991     if geographicBoundingBox is None: 
     990def fromGeographicBoundingBoxToString(gbb): 
     991    if gbb is None: 
    992992        return None 
    993     return ('%f %f,%f %f') % (geographicBoundingBox.eastBoundLongitude, geographicBoundingBox.northBoundLatitude, \ 
    994                               geographicBoundingBox.westBoundLongitude, geographicBoundingBox.southBoundLatitude) 
     993    return '{0} {1},{2} {3}'.format(gbb.eastBoundLongitude, gbb.northBoundLatitude, gbb.westBoundLongitude, gbb.southBoundLatitude) 
    995994     
    996995def compareGeographicBoundingBoxes(gb1, gb2): 
  • mauRepo/MolesManager/trunk/src/libs/migration/processor/dataEntity.py

    r8445 r8460  
    9999        pt = fromDateStringToPhenomenonTime(dateString) 
    100100         
    101         if ceda_observationCollection.phenomenonTime is not None \ 
     101        if pt is not None and ceda_observationCollection.phenomenonTime is not None \ 
    102102            and (len(ceda_observationCollection.phenomenonTime) == 0 \ 
    103103                 or (len(ceda_observationCollection.phenomenonTime) == 1 and \ 
     
    211211        try: 
    212212            DataEntityProcessor.log.info("Processing deployment: %s" % (migrationObjectDescription(deploymentMigration))) 
    213             ceda_observation = deProcessor.process()     
     213            obs_ex_report, ceda_observation = deProcessor.process() 
     214            self._report.extend(obs_ex_report) 
    214215            try:                             
    215216                self._processDOI(deploymentMigration, ceda_observation, deProcessor, single_deployment) 
     
    225226    def process(self): 
    226227        obsColl = None 
    227         exs = [] 
    228228        DataEntityProcessor.log.info("Processing dataEntity: %s" % (migrationObjectDescription(self._dataEntityMigration))) 
    229229        try : 
     
    252252        for deploymentMigration in deploymentMigrations: 
    253253            try: 
    254                 ceda_observation = self._processDeploymentMigration(deploymentMigration, howManydm == 1) 
     254                ceda_observation = self._processDeploymentMigration(deploymentMigration, howManydm == 1)                 
    255255                #Is a first time process? 
    256256                if not self.epbRepo.moles3EPB.observationCollectionHasObservation(getattr(obsColl, 'id'), getattr(ceda_observation, 'id')): 
  • mauRepo/MolesManager/trunk/src/libs/migration/processor/deployment.py

    r8445 r8460  
    5252    createMD_Keywords, hasMOBeenProcessed, createMO_Individual,\ 
    5353    fromDateStringToPhenomenonTime, fromPhenomenonTimeToString,\ 
    54     comparePhenomenonTimes 
     54    comparePhenomenonTimes, compareGeographicBoundingBoxes 
    5555from libs.epb import EPB 
    5656from libs.migration.processor.deployment_data import DeploymentDataProcessor 
    5757from libs.migration.exception.exceptions import NoDataLineage,\ 
    58     NoAssociatedAuthor, NoAssociatedDeployments 
     58    NoAssociatedAuthor, NoAssociatedDeployments,\ 
     59    NoGeographicalExtensionException 
    5960from libs.migration.authors import authors 
    6061from logging import StreamHandler 
     
    103104        self._deploymentHasSameHash = hasMOSameHash(self._deploymentMigration) 
    104105        self._deploymentHasBeenProcessed = hasMOBeenProcessed(self._deploymentMigration) 
     106        self._report = [] 
    105107 
    106108    def _addResponsiblePartyInfo(self, oldResponsiblePartyInfos, newResponsiblePartyInfo): 
     
    412414            return   
    413415         
    414         ge = extractGeographicExtentInMigrationDocument(self._deploymentMigration) 
    415         if not ge: 
     416        ge = extractGeographicExtentInMigrationDocument(self._deploymentMigration)         
     417        if ge is None: 
    416418            ge = extractGeographicExtentInMigrationDocument(self._dataEntityMigration) 
    417             if ge: 
    418                 geographicExtent = createEX_GeographicBoundingBox(ge['east'], ge['north'], ge['west'], ge['south']) 
    419                 if self._deploymentHasBeenProcessed: 
    420                     DeploymentProcessor.log.warn('The _assignGeographicExtent update is skipped because not implemented') 
    421                 observation.geographicExtent.append(geographicExtent) 
    422             else: 
    423                 print "No Geographic Extent" 
    424             return           
    425         #Still have to update observation.geographicExtent 
     419         
     420        if ge is None: 
     421            self._report.append(NoGeographicalExtensionException(self._deploymentMigration)) 
     422            self._report.append(NoGeographicalExtensionException(self._dataEntityMigration)) 
     423         
     424        geographicExtent = createEX_GeographicBoundingBox(ge['east'], ge['north'], ge['west'], ge['south']) 
     425 
     426        if len(observation.geographicExtent) == 0 or \ 
     427            (len(observation.geographicExtent) > 0 and \ 
     428             not compareGeographicBoundingBoxes(geographicExtent, \ 
     429                observation.geographicExtent[0])): 
     430            self.epbRepo.moles3EPB.updateCedaObject(observation, {'geographicExtent': geographicExtent})              
    426431             
    427432    def _assignCreationDate(self, observation): 
     
    642647         
    643648    def process(self): 
     649        self._report = [] 
    644650        ceda_observation = None 
    645651        #Moles3 object exists...  
     
    648654        else: 
    649655            #... does not exist so create it 
    650             ceda_observation =  ceda_observation = CEDA_Observation() 
     656            ceda_observation = CEDA_Observation() 
    651657     
    652658        self._execute(ceda_observation)     
    653         return ceda_observation 
     659        return self._report, ceda_observation 
  • mauRepo/MolesManager/trunk/src/libs/migration/tests/migrationprocess.py

    r8433 r8460  
    4545from MolesManager.settings import EVENTS_DB 
    4646from libs.migration.client import EPBRepo, generateMigrationReport 
    47 from django.core.mail import send_mail 
    4847 
    4948class LoadResourceTest(TestCase): 
     
    8887         
    8988        #Has 3 DOI 
    90         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_chobs.atom') 
     89        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_chobs.atom') 
    9190         
    9291        #IASI 
    93         self.processDataEntity(DO_NEODC, DS_pUBLISHED, 'dataent_12417810458627666.atom') 
    94         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_VIRTEM.atom') 
    95         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_12162569915925921.atom') 
     92        #self.processDataEntity(DO_NEODC, DS_pUBLISHED, 'dataent_12417810458627666.atom') 
     93        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_VIRTEM.atom') 
     94        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_12162569915925921.atom') 
    9695               
    9796        #ECMWF 
    98         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-ERA.atom') 
    99         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-OP.atom') 
    100         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_12458543158227759.atom')                 
    101         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-E40.atom') 
    102         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-TRJ.atom') 
     97        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-ERA.atom') 
     98        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-OP.atom') 
     99        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_12458543158227759.atom')                 
     100        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-E40.atom') 
     101        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-TRJ.atom') 
    103102         
    104103         
     
    106105        self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_ECMWF-TRJ.atom') 
    107106        self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_UGAMPO3.atom') 
    108         self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_12282368470627062.atom')                         
     107        #self.processDataEntity(DO_BADC, DS_pUBLISHED, 'dataent_12282368470627062.atom')                         
    109108         
    110109        #self.processDataEntity()               
Note: See TracChangeset for help on using the changeset viewer.