CSV Dateien versioniert einspielen

Dieser Artikel beschreibt, wie ein Updateprozess über eine im Namen der CSV-Datei befindlichen Versionsnummer durchgeführt wird. Die verschiedenen Versionen der CSV-Dateien werden durch einen Unterstrich und einer Versionsnummer gekennzeichnet (z.B. _1, _2, 3 usw.) und befinden sich alle in dem im Quellcode angegebenen cities-Ordner des Moduls dlt_germany_cities. Eine CSV-Dateien der Version 1 sieht z.B folgendermaßen aus:

  • dlt.germany.city_1.csv (Im Dateinamen darf nur ein _ vorhanden sein)

Nachfolgend wird zunächst eine Funktion _eq_load_citys beschrieben, welche alle Dateien des Ordners "cities" auflistet. Anschließend wird durch Trennung (durch Nutzung der split()-Funktion) die Versionsnummer des Dateinamen der CSV-Datei gefiltert und anschließend mit der Version verglichen, welche in den Systemparameter des Open ERP Systems Odoo hinterlegt ist (Zeile: 98). Die Version in den Systemparametern des Open Source ERP Systems Odoo wird immer dann gesetzt, wenn eine neue Version eingespielt wird und entspricht der letzten eingespielten Version.

Variablenübersicht:  

  • diff: entspricht der Versionsnummer der verschiedenen CSV-Datei, welche sich im cities-Ordner befinden
  • version: entspricht der momentanen Version, welche zuletzt in das Open Source ERP System Odoo in die Systemparameter eingefügt wurde.                         
    def _eq_load_citys(self, cr, uid):
        config_param_obj = self.pool.get('ir.config_parameter')
        germany_city_obj = self.pool.get('dlt.germany.city')
        dir = os.path.dirname(__file__)
        path = dir + '/cities'
        objects = os.listdir(path)
        objects.sort()
        
        for objectname in objects:
            version = config_param_obj.get_param(cr, uid, 'cities.csv.version', "0")
            diffunderscore = objectname.split('_')[1]
            diff = diffunderscore.split('.')[0]
            if version:
                if int(diff) > int(version):
                   self._create_data(cr, uid, diff, objectname, config_param_obj, germany_city_obj)    
            else:
               self._create_data(cr, uid, diff, objectname, config_param_obj, germany_city_obj)

 

Die Funktion _create_data wird entweder aufgerufen, wenn die neu-eingespielte Version größer ist als die momentan im Open Source ERP System Odoo vorhandene Version oder wenn keine Version vorhanden ist ( Erstinstallation).

Durch die Übergabe der Variable diff wird in Zeile 57 ein String zusammengefügt, welcher nur diejenigen Versionen der CSV-Dateien einfügt, welche noch nicht vorhanden sind. Anschließend werden die noch nicht eingespielten CSV-Dateien eingefügt.

    def _create_data(self, cr, uid, diff, objectname, config_param_obj, germany_city_obj):
        config_param_obj.set_param(cr, uid, 'cities.csv.version', diff)
        ir_model_data_object = self.pool.get('ir.model.data')
        
        dir = os.path.dirname(__file__)
        path = dir + '/cities/'
        mypath = path + objectname 
        objects = os.listdir(path)
        objects.sort()
        for objectname in objects:
            reader_data = open(path + 'dlt.germany.city_' + diff +'.csv')
            reader = csv.reader(reader_data,delimiter=',')
            next(reader)
            for row in reader:
                model_data_id = ir_model_data_object.search(cr, uid, [('name', '=', row[0]), ('model', '=', 'dlt.germany.city' )])
                if model_data_id:
                    # Datensatz überarbeiten 
                    model_id = ir_model_data_object.browse(cr, uid,model_data_id)
                    country_data_id = ir_model_data_object.search(cr, uid, [('name', '=', row[4])])
                    state_data_id = ir_model_data_object.search(cr, uid, [('name', '=', row[3])])
                    country_data = ir_model_data_object.browse(cr,uid, country_data_id)
                    state_data = ir_model_data_object.browse(cr,uid, state_data_id)
                    self.write(cr, uid, model_id.res_id, {'zip' : row[1], 'long_name' : row[2], 'state_id': state_data.res_id, 'country_id': country_data.res_id})
                   
                else:
                    # Datensatz erstellen
                    country_data_id = ir_model_data_object.search(cr, uid, [('name', '=', row[4])])
                    state_data_id = ir_model_data_object.search(cr, uid, [('name', '=', row[3])])
                    country_data = ir_model_data_object.browse(cr,uid, country_data_id)
                    state_data = ir_model_data_object.browse(cr,uid, state_data_id)    
                    create_id = self.create(cr, uid, {'zip' : row[1], 'long_name' : row[2] 
                                              ,'country_id': country_data.res_id, 'state_id': state_data.res_id
                                              })
                    ir_model_data_object.create(cr, uid, {'name' : row[0], 'model' : 'dlt.germany.city', 'res_id' : create_id})
                print 'ID:', row[0]     
          
        return True

Modulname: dlt_germany_cities

Modulversion: 1.0.4

Author: inetplus (modified by Equitania Software GmBH) // siehe oben beschriebene Änderungen