diff --git a/nummi/main/models.py b/nummi/main/models.py
index 97a7432..f848d54 100644
--- a/nummi/main/models.py
+++ b/nummi/main/models.py
@@ -26,7 +26,7 @@ class NummiQuerySet(models.QuerySet):
),
SearchQuery(search, search_type="websearch"),
),
- similarity=TrigramSimilarity("name", search),
+ similarity=TrigramSimilarity(self.main_field, search),
)
.filter(models.Q(rank__gte=0.1) | models.Q(similarity__gte=0.3))
.order_by("-rank")
diff --git a/nummi/search/templates/search/search_results.html b/nummi/search/templates/search/search_results.html
index 197a668..cd04b0c 100644
--- a/nummi/search/templates/search/search_results.html
+++ b/nummi/search/templates/search/search_results.html
@@ -1,6 +1,6 @@
{% extends "main/base.html" %}
{% load i18n static %}
-{% load main_extras account_extras transaction_extras %}
+{% load main_extras account_extras transaction_extras statement_extras %}
{% block title %}
{% translate "Search" %} – Nummi
{% endblock title %}
@@ -21,6 +21,12 @@
{% account_table accounts search=True %}
{% endif %}
+ {% if statements %}
+
+ {% translate "Statements" %}
+ {% statement_table statements %}
+
+ {% endif %}
{% if categories %}
{% translate "Categories" %}
diff --git a/nummi/search/views.py b/nummi/search/views.py
index 5a64a04..a616af3 100644
--- a/nummi/search/views.py
+++ b/nummi/search/views.py
@@ -25,6 +25,7 @@ class SearchView(LoginRequiredMixin, TemplateView):
context["search"] = self.kwargs["search"]
context["transactions"] = _user.transaction_set.search(self.kwargs["search"])
context["accounts"] = _user.account_set.search(self.kwargs["search"])
+ context["statements"] = _user.statement_set.search(self.kwargs["search"])
context["categories"] = _user.category_set.search(self.kwargs["search"])
context["invoices"] = _user.invoice_set.search(self.kwargs["search"])[:10]
diff --git a/nummi/statement/migrations/0004_statement_metadata_statement_tags.py b/nummi/statement/migrations/0004_statement_metadata_statement_tags.py
new file mode 100644
index 0000000..d1c2983
--- /dev/null
+++ b/nummi/statement/migrations/0004_statement_metadata_statement_tags.py
@@ -0,0 +1,22 @@
+# Generated by Django 4.2.7 on 2025-01-05 17:54
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("statement", "0003_remove_statement_diff_remove_statement_sum"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="statement",
+ name="metadata",
+ field=models.TextField(blank=True),
+ ),
+ migrations.AddField(
+ model_name="statement",
+ name="tags",
+ field=models.TextField(blank=True),
+ ),
+ ]
diff --git a/nummi/statement/models.py b/nummi/statement/models.py
index fe661a8..d7545e8 100644
--- a/nummi/statement/models.py
+++ b/nummi/statement/models.py
@@ -7,7 +7,17 @@ from django.core.validators import FileExtensionValidator
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
+from main.models import NummiQuerySet
+from main.utils import pdf_outline_to_str
from media.utils import get_path
+from pypdf import PdfReader
+
+
+class StatementQuerySet(NummiQuerySet):
+ main_field = "metadata"
+ fields = {
+ "tags": "B",
+ }
class Statement(AccountModel):
@@ -30,6 +40,10 @@ class Statement(AccountModel):
blank=True,
default="",
)
+ metadata = models.TextField(blank=True)
+ tags = models.TextField(blank=True)
+
+ objects = StatementQuerySet.as_manager()
def __str__(self):
return _("%(date)s statement") % {"date": self.date}
@@ -40,6 +54,28 @@ class Statement(AccountModel):
if _prever.file and _prever.file != self.file:
Path(_prever.file.path).unlink(missing_ok=True)
+ if self.file:
+ reader = PdfReader(self.file)
+
+ if reader.metadata:
+ self.metadata = " ".join(
+ (
+ m.replace("\x00", "").strip()
+ 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().replace("\x00", "") for page in reader.pages)
+ )
+ self.tags = " ".join((tag for tag in _tags.split() if len(tag) >= 3))
+
super().save(*args, **kwargs)
@property