diff options
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r-- | ishtar_common/data_importer.py | 127 |
1 files changed, 108 insertions, 19 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 0a63656ab..972d286ed 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -64,6 +64,19 @@ class ImportFormater(object): self.comment = comment self.force_new = force_new + def reinit_db_target(self, db_targets): + if not self.formater: + return + elif type(self.formater) not in (list, tuple): + self.formater.db_target = db_targets[0] + else: + for idx, formater in enumerate(self.formater): + formater.db_target = db_targets[idx] + formater.init_db_target() + + def init_db_target(self): + pass + def __unicode__(self): return self.field_name @@ -112,6 +125,9 @@ class Formater(object): import_instance=None): return + def init_db_target(self): + pass + class ChoiceChecker(object): def report_new(self, comment): @@ -243,17 +259,21 @@ class StrChoiceFormater(Formater, ChoiceChecker): if model and v: v = model.objects.get(pk=v) self.equiv_dict[value] = v - if self.db_target: - for target_key in self.db_target.keys.filter(is_set=True).all(): - value = target_key.value - if not self.strict: - value = slugify(value) - if value in self.equiv_dict: - continue - v = target_key.key - if model and v: - v = model.objects.get(pk=v) - self.equiv_dict[value] = v + self.init_db_target() + + def init_db_target(self): + if not self.db_target: + return + for target_key in self.db_target.keys.filter(is_set=True).all(): + value = target_key.value + if not self.strict: + value = slugify(value) + if value in self.equiv_dict: + continue + v = target_key.key + if self.model and v: + v = self.model.objects.get(pk=v) + self.equiv_dict[value] = v def prepare(self, value): return unicode(value).strip() @@ -275,6 +295,26 @@ class StrChoiceFormater(Formater, ChoiceChecker): def check(self, values, output=None, comment='', choose_default=False, import_instance=None): + from ishtar_common.models import TargetKey + if self.db_target: + q = {'target': self.db_target, + 'associated_import': import_instance, + 'is_set': True + } + for v in self.equiv_dict: + q['key'] = v + value = self.equiv_dict[v] + if hasattr(value, 'txt_idx'): + value = value.txt_idx + elif hasattr(value, 'pk'): + value = value.pk + q['value'] = value + with transaction.commit_on_success(): + try: + t, created = TargetKey.objects.get_or_create(**q) + except IntegrityError: + pass + if (not output or output == 'silent') and not choose_default: return if self.many_split: @@ -454,15 +494,19 @@ class StrToBoolean(Formater, ChoiceChecker): self.strict = strict self.db_target = db_target self.missings = set() - if self.db_target: - for target_key in self.db_target.keys.filter(is_set=True).all(): - key = self.prepare(target_key.key) - if key in self.dct: - continue - v = target_key.format() - self.dct[key] = v + self.init_db_target() self.new_keys = {} + def init_db_target(self): + if not self.db_target: + return + for target_key in self.db_target.keys.filter(is_set=True).all(): + key = self.prepare(target_key.key) + if key in self.dct: + continue + v = target_key.format() + self.dct[key] = v + def prepare(self, value): value = unicode(value).strip() if not self.strict: @@ -631,7 +675,8 @@ class Importer(object): models.ImportTarget.objects.get_or_create( column=column, target=target, formater_type=formater_model, force_new=getattr(formater, 'force_new', False), - regexp_filter=regexp_filter) + regexp_filter=regexp_filter, + comment=line.comment) return True def __init__(self, skip_lines=0, reference_header=None, @@ -654,6 +699,7 @@ class Importer(object): self.line_format = copy.copy(self.LINE_FORMAT) self.import_instance = import_instance self.archive = None + self.DB_TARGETS = {} if import_instance and import_instance.imported_images: self.archive = import_instance.imported_images self._defaults = self.DEFAULTS.copy() @@ -699,6 +745,18 @@ class Importer(object): vals[idx_col].append(val) for idx, formater in enumerate(self.line_format): if formater and idx < len(vals): + + if self.DB_TARGETS: + field_names = formater.field_name + if type(field_names) not in (list, tuple): + field_names = [field_names] + db_targets = [] + for field_name in field_names: + db_targets.append( + self.DB_TARGETS["{}-{}".format( + idx + 1, field_name)]) + formater.reinit_db_target(db_targets) + formater.init(vals[idx], output, choose_default=choose_default, import_instance=self.import_instance) @@ -707,6 +765,30 @@ class Importer(object): self.initialize(table, self.output, choose_default=choose_default) self._importation(table) + def _associate_db_target_to_formaters(self): + if not self.import_instance: + return + self.DB_TARGETS = {} + from ishtar_common.models import ImporterColumn, ImportTarget + for idx, line in enumerate(self.line_format): + idx += 1 + if not line: + continue + col = ImporterColumn.objects.get( + importer_type=self.import_instance.importer_type, + col_number=idx) + formater = line.formater + targets = line.field_name + if type(formater) not in (list, tuple): + formater = [formater] + targets = [targets] + for target in targets: + tg = target + if type(target) == list and type(target[0]) == list: + tg = target[0] + self.DB_TARGETS["{}-{}".format(idx, tg)] = \ + ImportTarget.objects.get(column=col, target=tg) + @classmethod def _field_name_to_data_dict( cls, field_name, value, data, force_value=False, concat=False, @@ -942,6 +1024,13 @@ class Importer(object): if many_values: values = re.split(func.many_split, values[0]) formated_values = [] + + if self.DB_TARGETS: + field_name = formater.field_name + if type(field_name) in (list, tuple): + field_name = field_name[idx_v] + func.reinit_db_target( + self.DB_TARGETS["{}-{}".format(idx_col, field_name)]) for idx, v in enumerate(values): value = None try: |