From f78a3c0c56509eb07e05c6d4930a016ab98dd8bc Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 2 May 2019 13:04:40 +0200 Subject: Data importer: add value formaters based on Python format() string --- ishtar_common/models_imports.py | 49 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 6 deletions(-) (limited to 'ishtar_common/models_imports.py') 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) -- cgit v1.2.3