summaryrefslogtreecommitdiff
path: root/ishtar_common/models_imports.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-05-02 13:04:40 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-05-02 13:04:40 +0200
commitf6f20e5745a0c6eb3f07b4e0b33454c87c48f6e6 (patch)
treeaae1f9f35364a05c463932dde074583b37194a2c /ishtar_common/models_imports.py
parent2fcd1ef9e0b6659df24d3171ca04d5bc803e9d8e (diff)
downloadIshtar-f6f20e5745a0c6eb3f07b4e0b33454c87c48f6e6.tar.bz2
Ishtar-f6f20e5745a0c6eb3f07b4e0b33454c87c48f6e6.zip
Data importer: add value formaters based on Python format() string
Diffstat (limited to 'ishtar_common/models_imports.py')
-rw-r--r--ishtar_common/models_imports.py49
1 files changed, 43 insertions, 6 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index 9c98f5ea8..5cb72bd18 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -30,7 +30,7 @@ import zipfile
from django.conf import settings
from django.contrib.gis.db import models
-from django.core.exceptions import SuspiciousOperation
+from django.core.exceptions import SuspiciousOperation, ValidationError
from django.core.files.base import ContentFile
from django.core.validators import validate_comma_separated_integer_list
from django.db.models.base import ModelBase
@@ -39,6 +39,8 @@ from django.template.defaultfilters import slugify
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _, pgettext_lazy
+from ishtar_common.model_managers import SlugModelManager
+
from ishtar_common.utils import create_slug, \
get_all_related_m2m_objects_with_model, put_session_message, \
put_session_var, get_session_var, num2col, max_size_help
@@ -193,6 +195,9 @@ class ImporterType(models.Model):
if column.regexp_pre_filter:
formater_kwargs['regexp'] = re.compile(
column.regexp_pre_filter.regexp)
+ if column.value_format:
+ formater_kwargs['value_format'] = \
+ column.value_format.format_string
formater_kwargs['concat_str'] = concat_str
formater_kwargs['duplicate_fields'] = [
(field.field_name, field.force_new, field.concat,
@@ -379,6 +384,9 @@ class ImporterColumn(models.Model):
regexp_pre_filter = models.ForeignKey(
"Regexp", blank=True, null=True, on_delete=models.SET_NULL,
)
+ value_format = models.ForeignKey(
+ "ValueFormater", blank=True, null=True, on_delete=models.SET_NULL,
+ )
required = models.BooleanField(_(u"Required"), default=False)
export_field_name = models.CharField(
_(u"Export field name"), blank=True, null=True, max_length=200,
@@ -451,8 +459,7 @@ class NamedManager(models.Manager):
class Regexp(models.Model):
name = models.CharField(_(u"Name"), max_length=100, unique=True)
- description = models.CharField(_(u"Description"), blank=True, null=True,
- max_length=500)
+ description = models.TextField(_(u"Description"), blank=True, null=True)
regexp = models.CharField(_(u"Regular expression"), max_length=500)
objects = NamedManager()
@@ -467,6 +474,39 @@ class Regexp(models.Model):
return (self.name, )
+class ValueFormater(models.Model):
+ name = models.CharField(_(u"Name"), max_length=100, unique=True)
+ slug = models.SlugField(_(u"Slug"), unique=True, max_length=100)
+ description = models.TextField(_(u"Description"), blank=True, null=True)
+ format_string = models.CharField(
+ _(u"Format string"), max_length=100,
+ help_text=_(u"A string used to format a value using the Python "
+ u"\"format()\" method. The site https://pyformat.info/ "
+ u"provide good examples of usage. Only one \"{}\" entry "
+ u"is managed. The input is assumed to be a string.")
+ )
+ objects = SlugModelManager()
+
+ class Meta:
+ verbose_name = _(u"Importer - Value format")
+ verbose_name_plural = _(u"Importer - Value formats")
+
+ def __unicode__(self):
+ return self.name
+
+ def clean(self):
+ try:
+ self.format_string.format("sample value")
+ except ValueError:
+ raise ValidationError(
+ {'format_string': _("The string provided generate an error. "
+ "Fix it.")}
+ )
+
+ def natural_key(self):
+ return (self.slug, )
+
+
class ImportTargetManager(models.Manager):
def get_by_natural_key(self, importer_type, col_number, target):
return self.get(column__importer_type__slug=importer_type,
@@ -480,9 +520,6 @@ class ImportTarget(models.Model):
"""
column = models.ForeignKey(ImporterColumn, related_name='targets')
target = models.CharField(u"Target", max_length=500)
- regexp_filter = models.ForeignKey(
- "Regexp", blank=True, null=True, on_delete=models.SET_NULL,
- )
formater_type = models.ForeignKey("FormaterType")
force_new = models.BooleanField(_(u"Force creation of new items"),
default=False)