From 37a23f20320eea2d6b85fa9bb326846aea68d7ed Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 11 Sep 2023 15:16:06 +0200 Subject: ✨ Pre-import form: modify models - admin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ishtar_common/models_imports.py | 71 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 4 deletions(-) (limited to 'ishtar_common/models_imports.py') diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 3fbd7653d..454bed7e8 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -195,6 +195,9 @@ class ImporterType(models.Model): "1 key.") ) available = models.BooleanField(_("Available"), default=True) + pre_import_message = models.TextField( + _("Pre-import form message"), blank=True, default="", max_length=500 + ) objects = SlugModelManager() SERIALIZATION_EXCLUDE = ["users"] @@ -630,7 +633,10 @@ class ImporterColumn(models.Model): importer_type = models.ForeignKey( ImporterType, related_name="columns", on_delete=models.CASCADE ) - col_number = models.IntegerField(_("Column number"), default=1) + col_number = models.SmallIntegerField( + _("Column number"), default=1, + help_text=_("Column number in the table. Put 0 or negative number for pre-importer field.") + ) description = models.TextField(_("Description"), blank=True, null=True) regexp_pre_filter = models.ForeignKey( "Regexp", @@ -1080,6 +1086,21 @@ DATE_FORMATS = ( IMPORTER_TYPES_CHOICES = {"TypeFormater": TARGET_MODELS, "DateFormater": DATE_FORMATS} +FORMATER_WIDGETS_DCT = { + "IntegerFormater": ("IntegerField", None), + "FloatFormater": ("FloatField", None), + "UnicodeFormater": ("CharField", None), + "DateFormater": ("DateField", None), + "TypeFormater": ("ChoiceField", None), + "YearFormater": ("IntegerField", None), + "StrToBoolean": ("BooleanField", None), + "FileFormater": ("FileField", None), + "InseeFormater": ("IntegerField", None), + "UpperFormater": ("CharField", None), + "LowerFormater": ("CharField", None), + "UnknowType": ("CharField", None), +} + class FormaterTypeManager(models.Manager): def get_by_natural_key(self, formater_type, options, many_split): @@ -1090,7 +1111,7 @@ class FormaterTypeManager(models.Manager): class FormaterType(models.Model): formater_type = models.CharField( - "Formater type", max_length=20, choices=IMPORTER_TYPES + _("Formater type"), max_length=20, choices=IMPORTER_TYPES ) options = models.CharField(_("Options"), max_length=500, blank=True, null=True) many_split = models.CharField( @@ -1327,6 +1348,10 @@ class ImportGroup(BaseImport): def __str__(self): return f"{self.name} ({self.importer_type.name})" + @property + def has_pre_import_form(self) -> bool: + return False + @property def import_id(self): return f"group-{self.id}" @@ -1547,6 +1572,11 @@ class Import(BaseImport): def __str__(self): return "{} | {}".format(self.name or "-", self.importer_type) + def is_available(self, ishtar_user) -> bool: + if ishtar_user.is_superuser or self.user == ishtar_user: + return True + return False + @property def import_id(self): return str(self.id) @@ -1569,6 +1599,21 @@ class Import(BaseImport): errors.append(row) return errors + @property + def has_pre_import_form(self) -> bool: + """ + Check if a pre-import form is available + """ + return bool(self.importer_type.columns.filter(col_number__lte=0).count()) + + @property + def pre_import_form_is_valid(self) -> bool: + for column in self.importer_type.columns.filter(col_number__lte=0, required=True): + q = ImportColumnValue.objects.filter(column=column, import_item=self) + if not q.count() or q.all()[0].value == "": + return False + return True + def get_number_of_lines(self): if self.number_of_line: return self.number_of_line @@ -2186,6 +2231,24 @@ def pre_delete_import(sender, **kwargs): pre_delete.connect(pre_delete_import, sender=Import) +class ImportColumnValue(models.Model): + """ + Value in a column for pre-import columns + """ + column = models.ForeignKey(ImporterColumn, on_delete=models.CASCADE) + import_item = models.ForeignKey(Import, on_delete=models.CASCADE) + value = models.TextField(default="", blank=True) + + class Meta: + verbose_name = _("Import - Pre-import value") + verbose_name_plural = _("Import - Pre-import values") + unique_together = ("column", "import_item") + ADMIN_SECTION = _("Imports") + + def __str__(self): + return f"{self.import_item} - {self.column} - {self.value}" + + class ItemKey(models.Model): key = models.TextField(_("Key")) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) @@ -2206,8 +2269,8 @@ class ItemKey(models.Model): ) class Meta: - verbose_name = _("Importer - Item key") - verbose_name_plural = _("Imports - Item keys") + verbose_name = _("Import - Item key") + verbose_name_plural = _("Import - Item keys") ADMIN_SECTION = _("Imports") def __str__(self): -- cgit v1.2.3