From a277b375264d9ef56044d7a2bd2f883d163b1a1a Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 5 Jan 2025 18:42:58 +0100 Subject: [PATCH] Refactor invoice handling to remove unused formset and improve metadata extraction from PDF files Fix #46 --- nummi/transaction/forms.py | 4 ---- nummi/transaction/models.py | 32 ++++++++++++++++++-------------- nummi/transaction/views.py | 5 +---- 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/nummi/transaction/forms.py b/nummi/transaction/forms.py index 8eec37a..6498581 100644 --- a/nummi/transaction/forms.py +++ b/nummi/transaction/forms.py @@ -3,7 +3,6 @@ import json from account.forms import AccountSelect from category.forms import CategorySelect from django import forms -from django.forms import formset_factory from django.utils.translation import gettext_lazy as _ from main.forms import DatalistInput, NummiFileInput, NummiForm from statement.forms import StatementSelect @@ -146,9 +145,6 @@ class MultipleInvoicesForm(forms.Form): invoices = MultipleFileField() -InvoicesFormSet = formset_factory(MultipleInvoicesForm) - - class DateInput(forms.DateInput): input_type = "date" diff --git a/nummi/transaction/models.py b/nummi/transaction/models.py index f50e4fa..06f90d9 100644 --- a/nummi/transaction/models.py +++ b/nummi/transaction/models.py @@ -108,23 +108,27 @@ class Invoice(NummiModel): if _prever.file and _prever.file != self.file: Path(_prever.file.path).unlink(missing_ok=True) - reader = PdfReader(self.file) + if self.file: + reader = PdfReader(self.file) - self.metadata = " ".join( - ( - m - for m in ( - reader.metadata.title, - reader.metadata.author, - reader.metadata.subject, + if reader.metadata: + self.metadata = " ".join( + ( + m.replace("\x00", "").strip() + for m in ( + reader.metadata.title, + reader.metadata.author, + reader.metadata.subject, + ) + if m + ) ) - if m - ) - ) - _tags = pdf_outline_to_str(reader.outline) - _tags += " ".join((page.extract_text() for page in reader.pages)) - self.tags = " ".join((tag for tag in _tags.split() if len(tag) >= 3)) + _tags = pdf_outline_to_str(reader.outline) + _tags += " ".join( + (page.extract_text().replace("\x00", "") for page in reader.pages) + ) + self.tags = " ".join((tag for tag in _tags.split() if len(tag) >= 3)) super().save(*args, **kwargs) diff --git a/nummi/transaction/views.py b/nummi/transaction/views.py index 85a086c..de81a69 100644 --- a/nummi/transaction/views.py +++ b/nummi/transaction/views.py @@ -70,7 +70,6 @@ class MultipleInvoiceCreateView(FormView): self.request.user.transaction_set, pk=self.kwargs["transaction"] ) - invoices = [] for file in form.cleaned_data["invoices"]: invoice = Invoice( transaction=transaction, @@ -80,6 +79,7 @@ class MultipleInvoiceCreateView(FormView): ) try: invoice.full_clean() + invoice.save() except ValidationError as err: for msg in err.messages: messages.error( @@ -91,10 +91,7 @@ class MultipleInvoiceCreateView(FormView): err=msg, ), ) - else: - invoices.append(invoice) - Invoice.objects.bulk_create(invoices) return super().form_valid(form) def get_success_url(self):