summaryrefslogtreecommitdiff
path: root/ishtar_common/models_imports.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models_imports.py')
-rw-r--r--ishtar_common/models_imports.py107
1 files changed, 107 insertions, 0 deletions
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index 55bbd1906..3d4bf632b 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -140,6 +140,9 @@ class ImporterModel(models.Model):
def natural_key(self):
return (self.klass,)
+ def get_class(self):
+ return import_class(self.klass)
+
IMPORT_TYPES = (
("tab", _("Table")),
@@ -3005,3 +3008,107 @@ class ItemKey(models.Model):
linked_to_group.boolean = True
linked_to_group.short_description = _("Linked to group")
+
+
+MEDIA_EXPORT_TYPES = (
+ ("I", _("Images")),
+ ("F", _("Associated files")),
+ ("A", _("All")),
+)
+
+
+class MediaExporter(models.Model):
+ """
+ Settings to export all media attached to an item
+ """
+
+ name = models.CharField(_("Name"), max_length=200)
+ slug = models.SlugField(_("Slug"), unique=True, max_length=100)
+ available = models.BooleanField(_("Available"), default=True)
+ profile_types = models.ManyToManyField(
+ "ProfileType",
+ verbose_name=_("Profile types"), blank=True,
+ help_text=_("Limit to user with theses profiles")
+ )
+ users = models.ManyToManyField(
+ "IshtarUser", verbose_name=_("Users"), blank=True,
+ help_text=_("Limit to theses users")
+ )
+ associated_model = models.ForeignKey(
+ ImporterModel,
+ verbose_name=_("Associated model"),
+ on_delete=models.CASCADE,
+ related_name="media_exporters",
+ )
+ files_to_export = models.CharField(_("Files to export"), max_length=1,
+ choices=MEDIA_EXPORT_TYPES, default="I")
+ cascade = models.BooleanField(
+ _("Cascade export"),
+ default=False,
+ help_text=_("Export media of all attached items. For instance, for a context "
+ "record, get all media attached to the attached finds."))
+ query = models.TextField(
+ _("Filter query"), blank=True, null=False, default="",
+ help_text=_(
+ "Use 'text' query used in Ishtar search input. Can be left empty "
+ "to export all."
+ )
+ )
+ naming = models.TextField(
+ _("Naming"), blank=True, null=False, default="",
+ help_text=_(
+ "Can use jinja template logic to have conditionnal naming. If left empty, "
+ "each media will be named with incremented numbers."
+ )
+ )
+
+ class Meta:
+ verbose_name = _("Media exporter")
+ verbose_name_plural = _("Media exporters")
+ ordering = ("name",)
+ ADMIN_SECTION = _("Documents")
+
+ def __str__(self):
+ return f"{self.associated_model} - {self.name}"
+
+ @classmethod
+ def get_available_query(cls, ishtar_user_id):
+ q = Q(users=None, profile_types=None)
+ q |= Q(users__pk=ishtar_user_id)
+ q |= Q(
+ profile_types__user_profiles__person__ishtaruser__pk=ishtar_user_id
+ )
+ return cls.objects.filter(q)
+
+ @classmethod
+ def get_available(cls, model, request):
+ if not request or not request.user or not hasattr(request.user, "ishtaruser")\
+ or not request.user.ishtaruser:
+ return []
+ model_klass = f"{model.__module__}.{model.__name__}"
+ model_klasses = [model_klass]
+ # manage compatibility with alternate notation for finds and treatments
+ if "models_finds" in model_klass:
+ model_klasses.append(model_klass.replace("models_finds", "models"))
+ elif "models_treatments" in model_klass:
+ model_klasses.append(model_klass.replace("models_treatments", "models"))
+ return list(
+ cls.get_available_query(request.user.ishtaruser.pk).filter(
+ associated_model__klass__in=model_klasses
+ ).order_by("name").all()
+ )
+
+ def is_available(self, request):
+ if not request or not request.user or not hasattr(request.user, "ishtaruser")\
+ or not request.user.ishtaruser or not self.available:
+ return False
+ # no limitation
+ if not self.profile_types.count() and not self.users.count():
+ return True
+ user_id = request.user.ishtaruser.pk
+ if self.users.filter(pk=user_id).exists():
+ return True
+ if self.profile_types.filter(
+ user_profiles__person__ishtaruser__pk=user_id).exists():
+ return True
+ return False