summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@proxience.com>2015-01-26 13:57:43 +0100
committerÉtienne Loks <etienne.loks@proxience.com>2015-01-26 13:57:43 +0100
commit248505a3a2a0343153b698aecfb358f2b29b766d (patch)
tree88d1959cc1d096bd6d318623850b24310865eab8
parentb13324f20479de7603ed5daa9e3d989fc9bd4bd5 (diff)
downloadIshtar-248505a3a2a0343153b698aecfb358f2b29b766d.tar.bz2
Ishtar-248505a3a2a0343153b698aecfb358f2b29b766d.zip
Importer: manage many values in one field
-rw-r--r--archaeological_operations/data_importer.py19
-rw-r--r--archaeological_operations/models.py4
-rw-r--r--ishtar_common/data_importer.py72
3 files changed, 64 insertions, 31 deletions
diff --git a/archaeological_operations/data_importer.py b/archaeological_operations/data_importer.py
index 4402c8b17..e02b53df0 100644
--- a/archaeological_operations/data_importer.py
+++ b/archaeological_operations/data_importer.py
@@ -148,22 +148,31 @@ RE_ORGA = re.compile("([^,]*)")
class OperationImporterBibracte(Importer):
+ DEFAULTS = {
+ ('in_charge',):{
+ 'organization_type':OrganizationType.objects.get(
+ txt_idx="operator")},
+ }
LINE_FORMAT = [
# CODE OPE
- ImportFormater('operation_code',
- IntegerFormater(),),
+ ImportFormater('operation_code', IntegerFormater(),),
# REGION
None,
# TYPE operation
- ImportFormater('operation_type',
- TypeFormater(models.OperationType),),
-
+ ImportFormater('operation_type', TypeFormater(models.OperationType),),
# NOM
+ ImportFormater('common_name', UnicodeFormater(120),),
# OPERATEUR
+ ImportFormater('operator__name', UnicodeFormater(120),),
# resp. lien IMPORT avec personne
+ ImportFormater('in_charge__raw_name', UnicodeFormater(300),),
# début
+ ImportFormater('start_date', DateFormater('%Y/%m/%d'),),
# fin
+ ImportFormater('excavation_end_date', DateFormater('%Y/%m/%d'),),
# Chronos
+ ImportFormater('periods', TypeFormater(models.Period, many=True),
+ many=True),
]
OBJECT_CLS = models.Operation
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index 00c2dd523..21ae4e15a 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -157,12 +157,12 @@ class Operation(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,
'start_date', 'excavation_end_date']
if FILES_AVAILABLE:
TABLE_COLS.insert(4, 'associated_file_short_label')
- start_date = models.DateField(_(u"Start date"), null=True, blank=True)
creation_date = models.DateField(_(u"Creation date"),
default=datetime.date.today)
+ end_date = models.DateField(_(u"Closing date"), null=True, blank=True)
+ start_date = models.DateField(_(u"Start date"), null=True, blank=True)
excavation_end_date = models.DateField(_(u"Excavation end date"), null=True,
blank=True)
- end_date = models.DateField(_(u"Closing date"), null=True, blank=True)
report_delivery_date = models.DateField(_(u"Report delivery date"),
null=True, blank=True)
scientist = models.ForeignKey(Person, blank=True, null=True,
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py
index 6848c3130..0ce61ba01 100644
--- a/ishtar_common/data_importer.py
+++ b/ishtar_common/data_importer.py
@@ -179,7 +179,7 @@ class IntegerFormater(Formater):
class StrChoiceFormater(Formater):
def __init__(self, choices, strict=False, equiv_dict={}, model=None,
- cli=False):
+ cli=False, many_split=''):
self.choices = list(choices)
self.strict = strict
self.equiv_dict = copy.deepcopy(equiv_dict)
@@ -187,6 +187,7 @@ class StrChoiceFormater(Formater):
self.model = model
self.create = False
self.missings = set()
+ self.many_split = many_split
for key, value in self.choices:
value = unicode(value)
if not self.strict:
@@ -213,6 +214,12 @@ class StrChoiceFormater(Formater):
+ u"\n"
idx += 1
msgstr += unicode(_(u"%d. None of the above - skip")) % idx + u"\n"
+ if self.many_split:
+ new_values = []
+ r = re.compile(func.many_split)
+ for value in values:
+ new_values += r.split(value)
+ values = new_values
for value in values:
base_value = copy(value)
value = self.prepare(value)
@@ -255,9 +262,10 @@ class StrChoiceFormater(Formater):
return self.equiv_dict[value]
class TypeFormater(StrChoiceFormater):
- def __init__(self, model, cli=False, defaults={}):
+ def __init__(self, model, cli=False, defaults={}, many_split=False):
self.model = model
self.defaults = defaults
+ self.many_split = many_split
self.equiv_dict, self.choices = {}, []
for item in model.objects.all():
self.choices.append((item.pk, unicode(item)))
@@ -634,32 +642,44 @@ class Importer(object):
func = func[idx_v]
if not callable(func) and type(func) in (unicode, str):
func = getattr(self, func)
- value = None
- try:
- if formater.regexp_formater_args:
- args = []
- for idx in formater.regexp_formater_args[idx_v]:
- args.append(val_group[idx])
- value = func.format(*args)
- else:
- value = func.format(v)
- except ValueError, e:
- if formater.required:
- self.c_errors = True
- self.errors.append((idx_line+1, idx_col+1, e.message))
- c_values.append(None)
- return
+ values = [v]
+ many_values = getattr(func, 'many_split', None)
+ if many_values:
+ values = re.compile(func.many_split).split(values)
+
+ formated_values = []
+ for idx, v in enumerate(values):
+ value = None
+ try:
+ if formater.regexp_formater_args:
+ args = []
+ for idx in formater.regexp_formater_args[idx_v]:
+ args.append(val_group[idx])
+ value = func.format(*args)
+ else:
+ value = func.format(v)
+ except ValueError, e:
+ if formater.required:
+ self.c_errors = True
+ self.errors.append((idx_line+1, idx_col+1, e.message))
+ c_values.append(None)
+ return
+ formated_values.append(value)
if self.message:
self.messages.append(self.message)
+
+ value = formated_values
+ if not many_values:
+ value = formated_values[0]
+
c_values.append(value)
- if value == None:
- if formater.required:
- self.c_errors = True
- self.errors.append((idx_line+1, idx_col+1,
- self.ERRORS['value_required']))
+ if value == None and formater.required:
+ self.c_errors = True
+ self.errors.append((idx_line+1, idx_col+1,
+ self.ERRORS['value_required']))
return
field_name = formater.field_name
@@ -677,7 +697,7 @@ class Importer(object):
else:
for field_name in field_names:
self._field_name_to_data_dict(field_name,
- value, data, formater.force_value)
+ value, data, formater.force_value)
if formater.reverse_for_test:
c_row.append(formater.reverse_for_test(**c_values))
else:
@@ -921,7 +941,11 @@ class Importer(object):
created = False
obj = cls.objects.filter(**create_dict).all()[0]
for attr, value in m2ms:
- getattr(obj, attr).add(value)
+ values = [value]
+ if type(value) in (list, tuple):
+ values = value
+ for v in values:
+ getattr(obj, attr).add(v)
except IntegrityError:
raise ImporterError("Erreur d'import %s, contexte : %s" \
% (unicode(cls), unicode(data)))