summaryrefslogtreecommitdiff
path: root/ishtar_common/views.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2025-06-17 18:06:46 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-06-17 18:06:46 +0200
commitfc0e811f9f5042fe72b91db4548142f5f2d4e1df (patch)
tree30adfd1fabc9b9aec7003b71d723a800606b0dfa /ishtar_common/views.py
parentfb1046c52552461a2d8dd9db5f73747eb3da51e6 (diff)
downloadIshtar-fc0e811f9f5042fe72b91db4548142f5f2d4e1df.tar.bz2
Ishtar-fc0e811f9f5042fe72b91db4548142f5f2d4e1df.zip
✨ Media exporter: export action
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r--ishtar_common/views.py54
1 files changed, 44 insertions, 10 deletions
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 4510177f9..95cc37990 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -25,6 +25,7 @@ import json
import logging
import os
import re
+import tempfile
import unicodedata
import urllib.parse
@@ -40,7 +41,7 @@ from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from django.contrib.auth import views as auth_view
from django.contrib.contenttypes.models import ContentType
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.core.cache import cache
from django.db.models import Q
from django.template import loader
@@ -1641,15 +1642,48 @@ class GenerateLabelView(GenerateView):
raise Http404()
return objects
-"""
-# TODO v4: suppression
-class GlobalVarEdit(IshtarMixin, AdminLoginRequiredMixin, ModelFormSetView):
- template_name = "ishtar/formset.html"
- model = models.GlobalVar
- factory_kwargs = {"extra": 1, "can_delete": True}
- page_name = _("Global variables")
- fields = ["slug", "value", "description"]
-"""
+
+class ExportMediaView(IshtarMixin, LoginRequiredMixin, View):
+ def get_exporter(self, slug, request):
+ try:
+ exporter = models.MediaExporter.objects.get(
+ slug=slug, available=True
+ )
+ except models.DocumentTemplate.DoesNotExist:
+ raise Http404()
+ if not exporter.is_available(request):
+ raise PermissionDenied()
+ return exporter
+
+ def get_item(self, request, model):
+ item_pk = self.kwargs.get("item_pk")
+ try:
+ obj = model.objects.get(pk=item_pk)
+ if not obj.can_view(request):
+ raise PermissionDenied()
+ except model.DoesNotExist:
+ raise Http404()
+ return obj
+
+ def get(self, request, *args, **kwargs):
+ slug = kwargs.get("exporter")
+ exporter = self.get_exporter(slug, request)
+ app, __, model_name = exporter.associated_model.klass.split(".")
+ model = apps.get_model(app, model_name)
+ obj = self.get_item(request, model)
+ if not obj:
+ return HttpResponse(content_type="text/plain")
+ with tempfile.TemporaryDirectory() as tmpdir:
+ export = exporter.export(obj, tmpdir=tmpdir)
+ if not export:
+ return HttpResponse(content_type="text/plain")
+ with open(export, "rb") as f:
+ content_type = "application/zip"
+ response = HttpResponse(f.read(), content_type=content_type)
+ response["Content-Disposition"] = "attachment; filename={}".format(
+ export.split(os.sep)[-1]
+ )
+ return response
class BaseImportView(IshtarMixin, LoginRequiredMixin):