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