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
Related articles