diff --git a/accounting/templates/accounting/search.html b/accounting/templates/accounting/search.html new file mode 100644 index 0000000..ec94871 --- /dev/null +++ b/accounting/templates/accounting/search.html @@ -0,0 +1,174 @@ +{% extends "base.html" %} +{% comment %} +The Mia Accounting Application +cash.html: The template for the cash account reports + + Copyright (c) 2020 imacat. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Author: imacat@mail.imacat.idv.tw (imacat) +First written: 2020/7/21 +{% endcomment %} +{% load static %} +{% load i18n %} +{% load humanize %} +{% load mia_core %} +{% load accounting %} + +{% block settings %} + {% blocktrans asvar title with query=request.GET.q context "Accounting|" %}Search Result for “{{ query }}”{% endblocktrans %} + {% setvar "title" title %} + {% setvar "use_period_chooser" True %} + {% static "accounting/css/report.css" as css %} + {% setvar "css" css %} +{% endblock %} + +{% block content %} + +
+
+ + +
+ {% with current_report_icon="fas fa-search" %} + {% trans "Search" context "Accounting|" as current_report_title %} + {% include "accounting/include/report-chooser.html" %} + {% endwith %} +
+ + +
+
+ +{% if item_list %} + {% include "mia_core/include/pagination.html" %} + + {# The table for large screens #} + + + + + + + + + + + + + + {% for item in item_list %} + + + + + + + + + + {% endfor %} + +
{% trans "Date" context "Accounting|" as text %}{{ text|force_escape }}{% trans "Subject" context "Accounting|" as text %}{{ text|force_escape }}{% trans "Summary" context "Accounting|" as text %}{{ text|force_escape }}{% trans "Debit" context "Accounting|" as text %}{{ text|force_escape }}{% trans "Credit" context "Accounting|" as text %}{{ text|force_escape }}{% trans "Notes" context "Accounting|" as text %}{{ text|force_escape }}{% trans "View" context "Accounting|" as text %}{{ text|force_escape }}
{{ item.transaction.date|smart_date }}{{ item.subject.title|title }}
{{ item.summary|default:"" }}{% if not item.is_balanced %} + + {% trans "Unbalanced" context "Accounting|" as text %} + {{ text|force_escape }} + + {% endif %}{% if item.has_order_hole %} + + {% trans "Need Reorder" context "Accounting|" as text %} + {{ text|force_escape }} + + {% endif %}
{{ item.debit_amount|accounting_amount }}{{ item.credit_amount|accounting_amount }}{{ item.transaction.note|default:"" }} + + + {% trans "View" context "Accounting|" as text %}{{ text|force_escape }} + +
+ + {# The list for small screens #} + +{% else %} +

{{ _("There is currently no data.")|force_escape }}

+{% endif %} + +{% endblock %} diff --git a/accounting/urls.py b/accounting/urls.py index 9429474..0916812 100644 --- a/accounting/urls.py +++ b/accounting/urls.py @@ -74,7 +74,7 @@ urlpatterns = [ path("balance-sheet/", reports.balance_sheet, name="balance-sheet"), path("search", - mia_core_views.todo, name="search"), + reports.search, name="search"), path("transactions//create", mia_core_views.todo, name="transactions.create"), path("transactions//store", diff --git a/accounting/views/reports.py b/accounting/views/reports.py index dbfedab..72c8494 100644 --- a/accounting/views/reports.py +++ b/accounting/views/reports.py @@ -26,7 +26,7 @@ from django.http import HttpResponseRedirect, Http404 from django.shortcuts import render from django.urls import reverse from django.utils import dateformat, timezone -from django.utils.translation import pgettext +from django.utils.translation import pgettext, get_language from django.views.decorators.http import require_GET from accounting.models import Record, Transaction, Subject, \ @@ -35,7 +35,7 @@ from accounting.utils import ReportUrl from mia import settings from mia_core.digest_auth import digest_login_required from mia_core.period import Period -from mia_core.utils import Pagination +from mia_core.utils import Pagination, get_multi_lingual_search @require_GET @@ -791,6 +791,34 @@ def balance_sheet(request, period_spec): }) +@require_GET +@digest_login_required +def search(request): + """The search. + + Args: + request (HttpRequest) The request. + + Returns: + HttpResponse: The response. + """ + # The accounting records + query = request.GET.get("q") + if query is None: + records = [] + else: + records = Record.objects.filter( + get_multi_lingual_search("subject__title", query) + | Q(subject__code__icontains=query) + | Q(summary__icontains=query) + | Q(transaction__note__icontains=query)) + pagination = Pagination(request, records, True) + return render(request, "accounting/search.html", { + "item_list": pagination.items, + "pagination": pagination, + }) + + def _get_period(period_spec): """Obtains the period helper. diff --git a/mia_core/utils.py b/mia_core/utils.py index 82009da..404300f 100644 --- a/mia_core/utils.py +++ b/mia_core/utils.py @@ -22,7 +22,7 @@ import random import urllib.parse from django.conf import settings -from django.db.models import Model +from django.db.models import Model, Q from django.utils.translation import pgettext, get_language @@ -104,6 +104,27 @@ def get_multi_lingual_attr(model, name, default=None): return getattr(model, name + Language.default().db) +def get_multi_lingual_search(attr, query): + """Returns the query condition on a multi-lingual attribute. + + Args: + attr (str): The base name of the multi-lingual attribute. + query (str): The query. + + Returns: + Q: The query condition + """ + language = Language.current() + if language.is_default: + return Q(**{attr + language.db + "__icontains": query}) + default = Language.default() + q = (Q(**{attr + language.db + "__isnull": False}) + & Q(**{attr + language.db + "__icontains": query}))\ + | (Q(**{attr + language.db + "__isnull": True}) + & Q(**{attr + default.db + "__icontains": query})) + return q + + class UrlBuilder: """The URL builder.