optimize file path
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user