diff options
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r-- | ishtar_common/data_importer.py | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 09ef64c26..b669995e3 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -21,6 +21,7 @@ import copy import csv import datetime import io +import os import logging import re import sys @@ -222,6 +223,7 @@ class YearFormater(Formater): except (ValueError, AssertionError): raise ValueError(_(u"\"%(value)s\" is not a valid date") % { 'value': value}) + return value class YearNoFuturFormater(Formater): @@ -235,6 +237,7 @@ class YearNoFuturFormater(Formater): except (ValueError, AssertionError): raise ValueError(_(u"\"%(value)s\" is not a valid date") % { 'value': value}) + return value class IntegerFormater(Formater): @@ -498,6 +501,8 @@ class FileFormater(Formater): f.write(z.read()) f = open(filename, 'r') my_file = File(f) + # manualy set the file size because of an issue with TempFile + my_file.size = os.stat(filename).st_size return my_file except KeyError: raise ValueError(_(u"\"%(value)s\" is not a valid path for the " @@ -1159,7 +1164,7 @@ class Importer(object): concat_str=concat_str[idx]) c_row.append(u" ; ".join([v for v in c_values])) - def get_field(self, cls, attribute, data, m2ms, c_path): + def get_field(self, cls, attribute, data, m2ms, c_path, new_created): field_object, model, direct, m2m = \ cls._meta.get_field_by_name(attribute) if m2m: @@ -1224,9 +1229,19 @@ class Importer(object): for k in v.keys(): if k not in field_names: continue - self.get_field(model, k, v, m2m_m2ms, c_c_path) + self.get_field(model, k, v, m2m_m2ms, c_c_path, + new_created) if '__force_new' in v: created = v.pop('__force_new') + key = u";".join([u"{}-{}".format(k, v[k]) + for k in sorted(v.keys())]) + # only one forced creation + if attribute in new_created \ + and key in new_created[attribute]: + continue + if attribute not in new_created: + new_created[attribute] = [] + new_created[attribute].append(key) has_values = bool([1 for k in v if v[k]]) if has_values: v = model.objects.create(**v) @@ -1234,8 +1249,24 @@ class Importer(object): continue else: v['defaults'] = v.get('defaults', {}) + extra_fields = {} + # "File" type is a temp object and can be different + # for the same filename - it must be treated + # separatly + for field in model._meta.fields: + k = field.name + # attr_class est un attribut de FileField + if hasattr(field, 'attr_class') and k in v: + extra_fields[k] = v.pop(k) v, created = model.objects.get_or_create( **v) + changed = False + for k in extra_fields.keys(): + if extra_fields[k]: + changed = True + setattr(v, k, extra_fields[k]) + if changed: + v.save() for att, objs in m2m_m2ms: if type(objs) not in (list, tuple): objs = [objs] @@ -1268,6 +1299,7 @@ class Importer(object): c_path = path[:] # get all related fields + new_created = {} for attribute in list(data.keys()): c_c_path = c_path[:] if not attribute: @@ -1276,7 +1308,8 @@ class Importer(object): if not data[attribute]: continue if attribute != '__force_new': - self.get_field(cls, attribute, data, m2ms, c_c_path) + self.get_field(cls, attribute, data, m2ms, c_c_path, + new_created) # filter uncessary default values create_dict = copy.deepcopy(data) |