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]: | 
