summaryrefslogtreecommitdiff
path: root/archaeological_files/admin.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2026-02-18 15:48:09 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2026-02-19 12:15:58 +0100
commit976248379d5866d8d46f9ec7974d3766f5b8c209 (patch)
tree2da0a01164f6a47c571082b9464b6d8dc59ff96c /archaeological_files/admin.py
parent420f00dec6d2459d62855e3a891c49f58aadf01f (diff)
downloadIshtar-976248379d5866d8d46f9ec7974d3766f5b8c209.tar.bz2
Ishtar-976248379d5866d8d46f9ec7974d3766f5b8c209.zip
✨ admin - price agreement: export all prices in a readable LO Calc document
Diffstat (limited to 'archaeological_files/admin.py')
-rw-r--r--archaeological_files/admin.py41
1 files changed, 39 insertions, 2 deletions
diff --git a/archaeological_files/admin.py b/archaeological_files/admin.py
index 3313c6b02..d7b0a763a 100644
--- a/archaeological_files/admin.py
+++ b/archaeological_files/admin.py
@@ -17,9 +17,14 @@
# See the file COPYING for details.
+from io import BytesIO
+import os
+import tempfile
+
from django import forms
from django.conf import settings
-from django.http import HttpResponseRedirect
+from django.contrib import messages
+from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import re_path, reverse
from django.utils.translation import gettext_lazy as _
@@ -255,13 +260,45 @@ class CopyPriceAgreementAdmin(GeneralTypeAdmin):
)
+def export_prices(modeladmin, request, queryset):
+ if len(queryset) != 1:
+ error = str(_("Select only one price agreement."))
+ modeladmin.message_user(request, error, level=messages.WARNING)
+ return
+ price_agreement = queryset[0]
+ with tempfile.TemporaryDirectory(prefix="ishtar-prices") as tmpdir:
+ pa_doc = price_agreement.generate_summary_document(tmpdir)
+ if not pa_doc:
+ modeladmin.message_user(
+ request,
+ str(_("Document not generated: is the LibreOffice daemon configured and running?")),
+ level=messages.ERROR
+ )
+ return
+
+ in_memory = BytesIO()
+ with open(pa_doc, "rb") as fle:
+ in_memory.write(fle.read())
+ filename = pa_doc.split(os.sep)[-1].replace(" ", "_")
+ response = HttpResponse(
+ content_type="application/vnd.oasis.opendocument.spreadsheet"
+ )
+ response["Content-Disposition"] = f"attachment; filename={filename}"
+ in_memory.seek(0)
+ response.write(in_memory.read())
+ return response
+
+
+export_prices.short_description = _("Export prices")
+
+
class PriceAgreementAdmin(CopyPriceAgreementAdmin):
list_filter = ("available",)
extra_list_display = [
"start_date",
"end_date",
]
- actions = []
+ actions = [export_prices]
model = models.PriceAgreement