diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-01-30 13:08:34 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2025-02-19 14:45:56 +0100 |
commit | 042b8f956369c115536dfe7e33d9c0461dafe539 (patch) | |
tree | 90f8577c5e52047be00f5aeb2f31d010f0d65fb2 /ishtar_common/models_imports.py | |
parent | bfae6a086ff5d35c794a5c5c0380bf2332661452 (diff) | |
download | Ishtar-042b8f956369c115536dfe7e33d9c0461dafe539.tar.bz2 Ishtar-042b8f956369c115536dfe7e33d9c0461dafe539.zip |
✨ admin: better management of Import - Item keys, import/export, links all user/imports
Diffstat (limited to 'ishtar_common/models_imports.py')
-rw-r--r-- | ishtar_common/models_imports.py | 138 |
1 files changed, 99 insertions, 39 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index a33b599c7..5bd230d6b 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -964,7 +964,7 @@ class TargetKeyGroup(models.Model): class TargetKey(models.Model): """ User's link between import source and ishtar database. - Also temporary used for GeneralType to point missing link before adding + Used for GeneralType to point missing link before adding them in ItemKey table. A targetkey connection can be create to be applied to one particular import (associated_import), one particular user (associated_user), @@ -975,17 +975,17 @@ class TargetKey(models.Model): target = models.ForeignKey( ImportTarget, related_name="keys", on_delete=models.CASCADE ) - key = models.TextField(_("Key")) + key = models.TextField(_("Key"), blank=True, default="") value = models.TextField(_("Value"), blank=True, null=True) is_set = models.BooleanField(_("Is set"), default=False) associated_import = models.ForeignKey( - "Import", blank=True, null=True, on_delete=models.SET_NULL + "Import", blank=True, null=True, on_delete=models.CASCADE ) associated_user = models.ForeignKey( - "IshtarUser", blank=True, null=True, on_delete=models.SET_NULL + "IshtarUser", blank=True, null=True, on_delete=models.CASCADE ) associated_group = models.ForeignKey( - TargetKeyGroup, blank=True, null=True, on_delete=models.SET_NULL + TargetKeyGroup, blank=True, null=True, on_delete=models.CASCADE ) class Meta: @@ -995,8 +995,8 @@ class TargetKey(models.Model): "associated_user", "associated_import", ) - verbose_name = _("Importer - Target key") - verbose_name_plural = _("Importer - Targets keys") + verbose_name = _("Import - Target key") + verbose_name_plural = _("Import - Targets keys") ordering = ("target", "key") ADMIN_SECTION = _("Imports") @@ -1022,34 +1022,36 @@ class TargetKey(models.Model): return return self.value - def save(self, *args, **kwargs): - obj = super(TargetKey, self).save(*args, **kwargs) + def create_itemkey(self, force_importer_type=False, force_all=False): if not self.value: - return obj + return v = None associated_model = self.target.associated_model - if associated_model and hasattr(self.target.associated_model, "add_key"): - # pk is given + if not associated_model or not hasattr(self.target.associated_model, "add_key"): + return + # pk is given + try: + v = self.target.associated_model.objects.get(pk=str(int(self.value))) + except (ValueError, self.target.associated_model.DoesNotExist): + # try with txt_idx try: - v = self.target.associated_model.objects.get(pk=str(int(self.value))) - except (ValueError, self.target.associated_model.DoesNotExist): - # try with txt_idx - try: - v = self.target.associated_model.objects.get( - txt_idx=str(self.value) - ) - except self.target.associated_model.DoesNotExist: - pass - if v: - keys = {} - if self.associated_group: - keys["group"] = self.associated_group - if self.associated_user: - keys["user"] = self.associated_user - else: - keys["importer"] = self.associated_import - v.add_key(self.key, **keys) - return obj + v = self.target.associated_model.objects.get( + txt_idx=str(self.value) + ) + except self.target.associated_model.DoesNotExist: + return + if force_all: + keys = {} + elif force_importer_type: + keys = {"importer_type": self.associated_import.importer_type} + else: + keys = {"ishtar_import": self.associated_import} + if self.associated_user: + keys["user"] = self.associated_user + elif self.associated_group: + keys["group"] = self.associated_group + v.add_key(self.key, **keys) + return TARGET_MODELS = [ @@ -2919,28 +2921,86 @@ class ImportColumnValue(models.Model): class ItemKey(models.Model): + """ + Importers: links Key -> Item + """ key = models.TextField(_("Key")) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) - object_id = models.PositiveIntegerField() + object_id = models.PositiveIntegerField(verbose_name=_("Value ID")) content_object = GenericForeignKey("content_type", "object_id") - importer = models.ForeignKey( + importer_type = models.ForeignKey( + ImporterType, + null=True, + blank=True, + verbose_name=_("Importer type"), + on_delete=models.CASCADE, + ) + ishtar_import = models.ForeignKey( Import, null=True, blank=True, - help_text=_("Specific key to an import"), - on_delete=models.SET_NULL, + verbose_name=_("Import"), + on_delete=models.CASCADE, ) user = models.ForeignKey( - "IshtarUser", blank=True, null=True, on_delete=models.SET_NULL + "IshtarUser", blank=True, null=True, on_delete=models.SET_NULL, + verbose_name=_("User") ) group = models.ForeignKey( - TargetKeyGroup, blank=True, null=True, on_delete=models.SET_NULL + TargetKeyGroup, blank=True, null=True, on_delete=models.SET_NULL, + verbose_name=_("Group") ) class Meta: - verbose_name = _("Import - Item key") - verbose_name_plural = _("Import - Item keys") + verbose_name = _("Importer - Item key") + verbose_name_plural = _("Importer - Item keys") ADMIN_SECTION = _("Imports") def __str__(self): return self.key + + @property + def content_slug(self): + item = self.content_object + if hasattr(item, "txt_idx"): + key = "txt_idx" + elif hasattr(item, "slug"): + key = "slug" + else: + key = "pk" + return getattr(item, key) + + def content_type_model(self): + return self.content_type.model + content_type_model.short_description = _("Content type model") + + def linked_to_all(self): + return not self.importer_type and not self.user and not self.group \ + and not self.ishtar_import + + linked_to_all.boolean = True + linked_to_all.short_description = _("Linked to all") + + def linked_to_importer_type(self): + return bool(self.importer_type) + + linked_to_importer_type.boolean = True + linked_to_importer_type.short_description = _("Linked to importer") + + def linked_to_importer(self): + return bool(self.ishtar_import) + + linked_to_importer.boolean = True + linked_to_importer.short_description = _("Linked to import") + + def linked_to_user(self): + return bool(self.user) + + linked_to_user.boolean = True + linked_to_user.short_description = _("Linked to user") + + def linked_to_group(self): + return bool(self.group) + + linked_to_group.boolean = True + linked_to_group.short_description = _("Linked to group") |