diff --git a/nummi/main/utils.py b/nummi/main/utils.py
index 2a8bb28..d041dba 100644
--- a/nummi/main/utils.py
+++ b/nummi/main/utils.py
@@ -7,3 +7,12 @@ def get_icons():
data = json.loads(request.urlopen(url).read())
return [i.removesuffix("-line") for i in data.keys() if i.endswith("-line")]
+
+
+def pdf_outline_to_str(outline):
+ return " ".join(
+ (
+ dest.title if not isinstance(dest, list) else pdf_outline_to_str(dest)
+ for dest in outline
+ )
+ )
diff --git a/nummi/search/templates/search/search_results.html b/nummi/search/templates/search/search_results.html
index d19a974..197a668 100644
--- a/nummi/search/templates/search/search_results.html
+++ b/nummi/search/templates/search/search_results.html
@@ -41,7 +41,13 @@
{% transaction_table transactions n_max=8 transactions_url=t_url %}
{% endif %}
- {% if not accounts and not categories and not transactions %}
+ {% if invoices %}
+ {% translate "Invoices" %}
+ {% invoice_table invoices=invoices %}
+
{% translate "No results found." %}
{% endif %} {% endblock body %} diff --git a/nummi/search/views.py b/nummi/search/views.py index 55abba1..5a64a04 100644 --- a/nummi/search/views.py +++ b/nummi/search/views.py @@ -26,5 +26,6 @@ class SearchView(LoginRequiredMixin, TemplateView): context["transactions"] = _user.transaction_set.search(self.kwargs["search"]) context["accounts"] = _user.account_set.search(self.kwargs["search"]) context["categories"] = _user.category_set.search(self.kwargs["search"]) + context["invoices"] = _user.invoice_set.search(self.kwargs["search"])[:10] return context diff --git a/nummi/transaction/migrations/0005_invoice_metadata_invoice_tags.py b/nummi/transaction/migrations/0005_invoice_metadata_invoice_tags.py new file mode 100644 index 0000000..af684f5 --- /dev/null +++ b/nummi/transaction/migrations/0005_invoice_metadata_invoice_tags.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.7 on 2025-01-05 14:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("transaction", "0004_remove_transaction_account"), + ] + + operations = [ + migrations.AddField( + model_name="invoice", + name="metadata", + field=models.TextField(blank=True), + ), + migrations.AddField( + model_name="invoice", + name="tags", + field=models.TextField(blank=True), + ), + ] diff --git a/nummi/transaction/models.py b/nummi/transaction/models.py index 317b39b..f50e4fa 100644 --- a/nummi/transaction/models.py +++ b/nummi/transaction/models.py @@ -8,7 +8,9 @@ from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ from main.models import NummiModel, NummiQuerySet +from main.utils import pdf_outline_to_str from media.utils import get_path +from pypdf import PdfReader from statement.models import Statement @@ -74,6 +76,13 @@ class Transaction(NummiModel): verbose_name_plural = _("Transactions") +class InvoiceQuerySet(NummiQuerySet): + fields = { + "metadata": "B", + "tags": "C", + } + + class Invoice(NummiModel): id = models.UUIDField(primary_key=True, default=uuid4, editable=False) name = models.CharField( @@ -88,12 +97,35 @@ class Invoice(NummiModel): transaction = models.ForeignKey( Transaction, on_delete=models.CASCADE, editable=False ) + metadata = models.TextField(blank=True) + tags = models.TextField(blank=True) + + objects = InvoiceQuerySet.as_manager() def save(self, *args, **kwargs): if Invoice.objects.filter(id=self.id).exists(): _prever = Invoice.objects.get(id=self.id) if _prever.file and _prever.file != self.file: Path(_prever.file.path).unlink(missing_ok=True) + + reader = PdfReader(self.file) + + self.metadata = " ".join( + ( + m + for m in ( + reader.metadata.title, + reader.metadata.author, + reader.metadata.subject, + ) + 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)) + super().save(*args, **kwargs) def __str__(self): diff --git a/nummi/transaction/templates/transaction/invoice_table.html b/nummi/transaction/templates/transaction/invoice_table.html index 7b5919b..07cd9c1 100644 --- a/nummi/transaction/templates/transaction/invoice_table.html +++ b/nummi/transaction/templates/transaction/invoice_table.html @@ -3,14 +3,19 @@