optimize file path

This commit is contained in:
2026-01-06 17:57:57 +01:00
parent 2558c81860
commit 3bd36fe8dc

View File

@@ -1,82 +1,83 @@
import io import io
from pathlib import Path
from django.contrib.staticfiles import finders
from django.core.files import File from django.core.files import File
from django.utils import timezone from django.utils import timezone
from pypdf import PdfReader, PdfWriter from pypdf import PdfReader, PdfWriter
from pypdf.constants import FieldDictionaryAttributes as FA # noqa: N814 from pypdf.constants import FieldDictionaryAttributes as FA # noqa: N814
from .models import Bill, Wiref from .models import Bill, Wiref
def generate_pdf(wiref): def generate_pdf(wiref):
if wiref is None or wiref.status != Wiref.Status.OPENED: if wiref is None or wiref.status != Wiref.Status.OPENED:
return False return False
bills = Bill.objects.filter(wiref=wiref).order_by("date") bills = Bill.objects.filter(wiref=wiref).order_by("date")
# Get data for pdf # Get data for pdf
data = {} data = {}
data_invoice = {} # Own dict for fixing text to multiline data_invoice = {} # Own dict for fixing text to multiline
for count, elem in enumerate(bills): for count, elem in enumerate(bills):
data.update( data.update(
{ {
f"DatumRow{count + 1}": str(elem.date.strftime("%d.%m.%Y")), f"DatumRow{count + 1}": str(elem.date.strftime("%d.%m.%Y")),
f"VerwendungszweckRow{count + 1}": elem.purpose, f"VerwendungszweckRow{count + 1}": elem.purpose,
# Replace decimal separator from '.' to ',' # Replace decimal separator from '.' to ','
f"BetragRow{count + 1}": str(elem.amount).replace(".", ","), f"BetragRow{count + 1}": str(elem.amount).replace(".", ","),
}, },
) )
data_invoice.update( data_invoice.update(
{ {
f"RechnungsaustellerinRow{count + 1}": elem.invoice, f"RechnungsaustellerinRow{count + 1}": elem.invoice,
}, },
) )
# Get budget year # Get budget year
today = timezone.now().date() today = timezone.now().date()
if today.month < 7: if today.month < 7:
budget_year = f"{today.year - 1}-{today.year}" budget_year = f"{today.year - 1}-{today.year}"
else: else:
budget_year = f"{today.year}-{today.year + 1}" budget_year = f"{today.year}-{today.year + 1}"
# Get total of all bills of wiref form # Get total of all bills of wiref form
total = 0 total = 0
for elem in bills: for elem in bills:
total += elem.amount total += elem.amount
data.update( data.update(
{ {
"Rechnungsnummer": str(wiref.wiref_id), "Rechnungsnummer": str(wiref.wiref_id),
"Budgetjahr": budget_year, "Budgetjahr": budget_year,
# Replace decimal separator from '.' to ',' # Replace decimal separator from '.' to ','
"Summe": str(total).replace(".", ","), "Summe": str(total).replace(".", ","),
}, },
) )
# Write data in pdf # Write data in pdf
pdf_path = Path(Path(__file__).parent) / "static/wiref/Vorlage.pdf" pdf_path_str = finders.find("wiref/Vorlage.pdf")
reader = PdfReader(pdf_path) reader = PdfReader(pdf_path_str)
writer = PdfWriter() writer = PdfWriter()
writer.append(reader) writer.append(reader)
writer.update_page_form_field_values( writer.update_page_form_field_values(
writer.pages[0], writer.pages[0],
data, data,
) )
# Add invoices and fix text to multiline # Add invoices and fix text to multiline
writer.update_page_form_field_values( writer.update_page_form_field_values(
writer.pages[0], writer.pages[0],
data_invoice, data_invoice,
flags=FA.FfBits.Multiline, flags=FA.FfBits.Multiline,
) )
with io.BytesIO() as bytes_stream: with io.BytesIO() as bytes_stream:
writer.write(bytes_stream) writer.write(bytes_stream)
bytes_stream.seek(0)
# Save pdf in wiref
wiref_name = f"Abrechnungsformular-{wiref.wiref_id}.pdf" # Save pdf in wiref
wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name)) wiref_name = f"Abrechnungsformular-{wiref.wiref_id}.pdf"
wiref.file_field.save(wiref_name, File(bytes_stream, wiref_name))
return True
return True