diff options
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r-- | ishtar_common/data_importer.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index e69a81339..10573ff06 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -319,6 +319,25 @@ class StrChoiceFormater(Formater, ChoiceChecker): self.new_keys[value] = unicode(self.equiv_dict[value]) else: self.equiv_dict[value] = None + if self.equiv_dict[value] and self.db_target: + from ishtar_common.models import TargetKey + q = {'target': self.db_target, 'key': value, + 'associated_import': import_instance, + } + query = TargetKey.objects.filter(**q) + if query.count(): + target = query.all()[0] + target.value = self.equiv_dict[value] + target.is_set = True + target.save() + else: + with transaction.commit_on_success(): + q['value'] = self.equiv_dict[value] + q['is_set'] = True + try: + TargetKey.objects.create(**q) + except IntegrityError: + pass if output == 'db' and self.db_target: from ishtar_common.models import TargetKey for missing in self.missings: @@ -517,6 +536,8 @@ def get_object_from_path(obj, path): class Importer(object): + SLUG = '' + NAME = '' DESC = "" LINE_FORMAT = [] OBJECT_CLS = None @@ -539,6 +560,70 @@ class Importer(object): 'regex_not_match': _(u"The regexp doesn't match.") } + def __create_models(self): + from ishtar_common import models + q = models.ImporterType.objects.filter(slug=self.SLUG) + if not self.SLUG or q.count(): + return + name = self.NAME if self.NAME else self.SLUG + importer = models.ImporterType.objects.create( + slug=self.SLUG, name=name, description=self.DESC, + associated_model=self.OBJECT_CLS) + for default in self.DEFAULTS: + values = self.DEFAULTS[default] + imp_default = models.ImporterDefault.objects.create( + importer_type=importer, + target=default.join('__')) + parent_model = imp_default.associated_model + for key in values: + value = values[key] + if hasattr(value, 'txt_idx') and value.txt_idx: + value = value.txt_idx + elif hasattr(value, 'pk') and value.pk: + value = value.pk + models.ImporterDefaultValues.objects.create( + default_target=imp_default, + target=key, + value=value) + for idx, line in enumerate(self.line_format): + idx += 1 + if not line: + continue + column = models.ImporterColumn.objects.create( + importer_type=importer, col_number=idx) + targets = line.field_name + if type(targets) not in (list, tuple): + targets = [targets] + formaters = line.formaters + if type(formaters) not in (list, tuple): + formaters = [formaters] + for idx, target in enumerate(targets): + formater = formaters[idx] + formater_name = formater.__name__ + if formater_name not in models.IMPORTER_TYPES_DCT: + formater_name = 'UnknowType' + options = '' + if formater_name == 'TypeFormater': + options = formater.model.__module__ + '.' + \ + formater.model.__name__ + elif formater_name == 'UnicodeFormater': + options = unicode(formater.max_length) + elif formater_name == 'DateFormater': + options = self.date_formats[0] + formater_model, created = \ + models.FormaterType.objects.get_or_create( + formater_type=formater_name, options=options, + many_split=formater.many_split) + regexp_filter = None + if formater.regexp: + regexp_filter, created = \ + models.Regexp.objects.get_or_create( + regexp=formater.regex, + defaults={'name': "Default name"}) + models.ImportTarget.objects.get_or_create( + column=column, target=target, formater_type=formater_model, + force_new=formater.force_new, regexp_filter=regexp_filter) + def __init__(self, skip_lines=0, reference_header=None, check_col_num=False, test=False, history_modifier=None, output='silent', import_instance=None): @@ -1035,6 +1120,9 @@ class Importer(object): try: try: dct = create_dict.copy() + for key in dct: + if callable(dct[key]): + dct[key] = dct[key]() if '__force_new' in dct: created = dct.pop('__force_new') if not [k for k in dct if dct[k] is not None]: |