From 530aea324494dff1014b178b05f4a8679601fa24 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sat, 1 Feb 2025 18:17:58 +0100 Subject: [PATCH] contrib: factor common media path manipulations out --- jdav_web/contrib/media.py | 29 +++++++++++++++++++++++++++++ jdav_web/ludwigsburgalpin/admin.py | 13 +++---------- jdav_web/members/pdf.py | 23 ++++------------------- 3 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 jdav_web/contrib/media.py diff --git a/jdav_web/contrib/media.py b/jdav_web/contrib/media.py new file mode 100644 index 0000000..4ff27c9 --- /dev/null +++ b/jdav_web/contrib/media.py @@ -0,0 +1,29 @@ +import os +from django.conf import settings +from django.http import HttpResponse +from wsgiref.util import FileWrapper + + +def media_path(fp): + return os.path.join(os.path.join(settings.MEDIA_ROOT, "memberlists"), fp) + + +def media_dir(): + return os.path.join(settings.MEDIA_ROOT, "memberlists") + + +def serve_media(filename, content_type): + """ + Serve the media file with the given `filename` as an HTTP response. + """ + with open(media_path(filename), 'rb') as f: + response = HttpResponse(FileWrapper(f)) + response['Content-Type'] = content_type + response['Content-Disposition'] = 'attachment; filename='+filename + + return response + + +def ensure_media_dir(): + if not os.path.exists(media_dir()): + os.makedirs(media_dir()) diff --git a/jdav_web/ludwigsburgalpin/admin.py b/jdav_web/ludwigsburgalpin/admin.py index 61b72da..7f1e480 100644 --- a/jdav_web/ludwigsburgalpin/admin.py +++ b/jdav_web/ludwigsburgalpin/admin.py @@ -5,6 +5,7 @@ from wsgiref.util import FileWrapper from django.http import HttpResponse from django.conf import settings from .models import Termin +from contrib.media import media_path, serve_media, ensure_media_dir import xlsxwriter @@ -16,6 +17,7 @@ class TerminAdmin(admin.ModelAdmin): actions = ['make_overview'] def make_overview(self, request, queryset): + ensure_media_dir() filename = 'termine.xlsx' workbook = xlsxwriter.Workbook(media_path(filename)) bold = workbook.add_format({'bold': True}) @@ -64,17 +66,8 @@ class TerminAdmin(admin.ModelAdmin): worksheet.write(row+2, 19, termin.phone) worksheet.write(row+2, 20, termin.email) workbook.close() - with open(media_path(filename), 'rb') as xls: - response = HttpResponse(FileWrapper(xls)) - response['Content-Type'] = 'application/xlsx' - response['Content-Disposition'] = 'attachment; filename='+filename - - return response + return serve_media(filename, 'application/xlsx') make_overview.short_description = "Termine in Excel Liste überführen" # Register your models here. admin.site.register(Termin, TerminAdmin) - - -def media_path(fp): - return os.path.join(os.path.join(settings.MEDIA_ROOT, "memberlists"), fp) diff --git a/jdav_web/members/pdf.py b/jdav_web/members/pdf.py index 739226d..ff43d94 100644 --- a/jdav_web/members/pdf.py +++ b/jdav_web/members/pdf.py @@ -11,6 +11,7 @@ from django.template.loader import get_template from django.conf import settings from django.http import HttpResponse, HttpResponseRedirect from wsgiref.util import FileWrapper +from contrib.media import media_path, media_dir, serve_media, ensure_media_dir from PIL import Image @@ -23,22 +24,8 @@ def find_template(template_name): raise template.TemplateDoesNotExist(f"Could not find template: {template_name}") -def media_path(fp): - return os.path.join(os.path.join(settings.MEDIA_ROOT, "memberlists"), fp) - - -def media_dir(): - return os.path.join(settings.MEDIA_ROOT, "memberlists") - - def serve_pdf(filename_pdf): - # provide the user with the resulting pdf file - with open(media_path(filename_pdf), 'rb') as pdf: - response = HttpResponse(FileWrapper(pdf))#, content='application/pdf') - response['Content-Type'] = 'application/pdf' - response['Content-Disposition'] = 'attachment; filename='+filename_pdf - - return response + return serve_media(filename_pdf, 'application/pdf') def render_tex(name, template_path, context, save_only=False): @@ -52,8 +39,7 @@ def render_tex(name, template_path, context, save_only=False): tmpl = get_template(template_path) res = tmpl.render(dict(context, creation_date=datetime.today().strftime('%d.%m.%Y'))) - if not os.path.exists(media_dir()): - os.makedirs(media_dir()) + ensure_media_dir() with open(media_path(filename_tex), 'w', encoding='utf-8') as f: f.write(res) @@ -88,8 +74,7 @@ def fill_pdf_form(name, template_path, fields, attachments=[], save_only=False): path = find_template(template_path) - if not os.path.exists(media_dir()): - os.makedirs(media_dir()) + ensure_media_dir() reader = PdfReader(path) writer = PdfWriter()