Refactor invoice handling to remove unused formset and improve metadata extraction from PDF files

Fix #46
This commit is contained in:
Edgar P. Burkhart 2025-01-05 18:42:58 +01:00
parent 7194039706
commit a277b37526
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
3 changed files with 19 additions and 22 deletions

View file

@ -3,7 +3,6 @@ import json
from account.forms import AccountSelect from account.forms import AccountSelect
from category.forms import CategorySelect from category.forms import CategorySelect
from django import forms from django import forms
from django.forms import formset_factory
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from main.forms import DatalistInput, NummiFileInput, NummiForm from main.forms import DatalistInput, NummiFileInput, NummiForm
from statement.forms import StatementSelect from statement.forms import StatementSelect
@ -146,9 +145,6 @@ class MultipleInvoicesForm(forms.Form):
invoices = MultipleFileField() invoices = MultipleFileField()
InvoicesFormSet = formset_factory(MultipleInvoicesForm)
class DateInput(forms.DateInput): class DateInput(forms.DateInput):
input_type = "date" input_type = "date"

View file

@ -108,23 +108,27 @@ class Invoice(NummiModel):
if _prever.file and _prever.file != self.file: if _prever.file and _prever.file != self.file:
Path(_prever.file.path).unlink(missing_ok=True) Path(_prever.file.path).unlink(missing_ok=True)
reader = PdfReader(self.file) if self.file:
reader = PdfReader(self.file)
self.metadata = " ".join( if reader.metadata:
( self.metadata = " ".join(
m (
for m in ( m.replace("\x00", "").strip()
reader.metadata.title, for m in (
reader.metadata.author, reader.metadata.title,
reader.metadata.subject, reader.metadata.author,
reader.metadata.subject,
)
if m
)
) )
if m
)
)
_tags = pdf_outline_to_str(reader.outline) _tags = pdf_outline_to_str(reader.outline)
_tags += " ".join((page.extract_text() for page in reader.pages)) _tags += " ".join(
self.tags = " ".join((tag for tag in _tags.split() if len(tag) >= 3)) (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) super().save(*args, **kwargs)

View file

@ -70,7 +70,6 @@ class MultipleInvoiceCreateView(FormView):
self.request.user.transaction_set, pk=self.kwargs["transaction"] self.request.user.transaction_set, pk=self.kwargs["transaction"]
) )
invoices = []
for file in form.cleaned_data["invoices"]: for file in form.cleaned_data["invoices"]:
invoice = Invoice( invoice = Invoice(
transaction=transaction, transaction=transaction,
@ -80,6 +79,7 @@ class MultipleInvoiceCreateView(FormView):
) )
try: try:
invoice.full_clean() invoice.full_clean()
invoice.save()
except ValidationError as err: except ValidationError as err:
for msg in err.messages: for msg in err.messages:
messages.error( messages.error(
@ -91,10 +91,7 @@ class MultipleInvoiceCreateView(FormView):
err=msg, err=msg,
), ),
) )
else:
invoices.append(invoice)
Invoice.objects.bulk_create(invoices)
return super().form_valid(form) return super().form_valid(form)
def get_success_url(self): def get_success_url(self):