diff options
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 |
commit | fc0e811f9f5042fe72b91db4548142f5f2d4e1df (patch) | |
tree | 30adfd1fabc9b9aec7003b71d723a800606b0dfa /ishtar_common/views.py | |
parent | fb1046c52552461a2d8dd9db5f73747eb3da51e6 (diff) | |
download | Ishtar-fc0e811f9f5042fe72b91db4548142f5f2d4e1df.tar.bz2 Ishtar-fc0e811f9f5042fe72b91db4548142f5f2d4e1df.zip |
✨ Media exporter: export action
Diffstat (limited to 'ishtar_common/views.py')
-rw-r--r-- | ishtar_common/views.py | 54 |
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): |