summaryrefslogtreecommitdiff
path: root/ishtar_common/data_importer.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r--ishtar_common/data_importer.py88
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]: