diff options
| 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 |
| commit | 976248379d5866d8d46f9ec7974d3766f5b8c209 (patch) | |
| tree | 2da0a01164f6a47c571082b9464b6d8dc59ff96c /archaeological_files/admin.py | |
| parent | 420f00dec6d2459d62855e3a891c49f58aadf01f (diff) | |
| download | Ishtar-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.py | 41 |
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 |
