diff options
| author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-02-09 23:16:25 +0100 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-02-15 18:46:16 +0100 | 
| commit | 7d69b2b90a7c831477a2b1668bb9b7346120aaca (patch) | |
| tree | 4f6466f8f11ef8e56b5030ea9576fe037500b47a /ishtar_common/data_importer.py | |
| parent | dc6eed246c7c71b3c63a9e7b83a44d9a601ae9f8 (diff) | |
| download | Ishtar-7d69b2b90a7c831477a2b1668bb9b7346120aaca.tar.bz2 Ishtar-7d69b2b90a7c831477a2b1668bb9b7346120aaca.zip | |
Item keys are now related to the current importer (refs #3451)
Diffstat (limited to 'ishtar_common/data_importer.py')
| -rw-r--r-- | ishtar_common/data_importer.py | 31 | 
1 files changed, 23 insertions, 8 deletions
| diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 0b6662e1c..fbf19def2 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -32,6 +32,7 @@ from django.contrib.auth.models import User  from django.db.models.fields import FieldDoesNotExist  from django.core.files import File  from django.db import IntegrityError, DatabaseError, transaction +from django.db.models import Q  from django.template.defaultfilters import slugify  from django.utils.translation import ugettext_lazy as _ @@ -148,13 +149,15 @@ class ChoiceChecker(object):  class UnicodeFormater(Formater):      def __init__(self, max_length=None, clean=False, re_filter=None, -                 notnull=False, prefix=u'', db_target=None): +                 notnull=False, prefix=u'', db_target=None, +                 import_instance=None):          self.max_length = max_length          self.db_target = db_target          self.clean = clean          self.re_filter = re_filter          self.notnull = notnull          self.prefix = prefix +        self.import_instance = import_instance      def format(self, value):          try: @@ -255,7 +258,8 @@ class IntegerFormater(Formater):  class StrChoiceFormater(Formater, ChoiceChecker):      def __init__(self, choices, strict=False, equiv_dict={}, model=None, -                 cli=False, many_split='', db_target=None): +                 cli=False, many_split='', db_target=None, +                 import_instance=None):          self.choices = list(choices)          self.strict = strict          self.equiv_dict = copy.deepcopy(equiv_dict) @@ -267,6 +271,7 @@ class StrChoiceFormater(Formater, ChoiceChecker):          self.new_keys = {}          self.match_table = {}          self.many_split = many_split +        self.import_instance = None          for key, value in self.choices:              value = unicode(value)              if not self.strict: @@ -281,7 +286,11 @@ class StrChoiceFormater(Formater, ChoiceChecker):      def init_db_target(self):          if not self.db_target:              return -        for target_key in self.db_target.keys.filter(is_set=True).all(): +        q = self.db_target.keys.filter(is_set=True) +        if self.import_instance: +            q = q.filter(Q(associated_import=self.import_instance) | +                         Q(associated_import__isnull=True)) +        for target_key in q.all():              key = target_key.key              if not self.strict:                  key = slugify(key) @@ -429,7 +438,7 @@ class StrChoiceFormater(Formater, ChoiceChecker):  class TypeFormater(StrChoiceFormater):      def __init__(self, model, cli=False, defaults={}, many_split=False, -                 db_target=None): +                 db_target=None, import_instance=None):          self.create = True          self.strict = False          self.model = model @@ -440,9 +449,10 @@ class TypeFormater(StrChoiceFormater):          self.equiv_dict, self.choices = {}, []          self.match_table = {}          self.new_keys = {} +        self.import_instance = import_instance          for item in model.objects.all():              self.choices.append((item.pk, unicode(item))) -            for key in item.get_keys(): +            for key in item.get_keys(importer_id=import_instance.pk):                  self.equiv_dict[key] = item      def prepare(self, value): @@ -465,11 +475,13 @@ class TypeFormater(StrChoiceFormater):  class DateFormater(Formater): -    def __init__(self, date_formats=["%d/%m/%Y"], db_target=None): +    def __init__(self, date_formats=["%d/%m/%Y"], db_target=None, +                 import_instance=None):          self.date_formats = date_formats          if type(date_formats) not in (list, tuple):              self.date_formats = [self.date_formats]          self.db_target = db_target +        self.import_instance = import_instance      def format(self, value):          value = value.strip() @@ -511,7 +523,8 @@ class FileFormater(Formater):  class StrToBoolean(Formater, ChoiceChecker): -    def __init__(self, choices={}, cli=False, strict=False, db_target=None): +    def __init__(self, choices={}, cli=False, strict=False, db_target=None, +                 import_instance=None):          self.dct = copy.copy(choices)          self.cli = cli          self.strict = strict @@ -520,6 +533,7 @@ class StrToBoolean(Formater, ChoiceChecker):          self.init_db_target()          self.match_table = {}          self.new_keys = {} +        self.import_instance = import_instance      def init_db_target(self):          if not self.db_target: @@ -827,7 +841,7 @@ class Importer(object):                  vals[idx_col].append(val)          for idx, formater in enumerate(self.line_format):              if formater and idx < len(vals): - +                formater.import_instance = self.import_instance                  if self.DB_TARGETS:                      field_names = formater.field_name                      if type(field_names) not in (list, tuple): @@ -1143,6 +1157,7 @@ class Importer(object):                  self.concat_str[field_name] = concat_str              if self.DB_TARGETS: +                formater.import_instance = self.import_instance                  formater.reinit_db_target(                      self.DB_TARGETS["{}-{}".format(idx_col + 1, field_name)],                      idx_v) | 
