diff --git a/app/apps/currencies/urls.py b/app/apps/currencies/urls.py index 1ebe84d..d93a4ef 100644 --- a/app/apps/currencies/urls.py +++ b/app/apps/currencies/urls.py @@ -18,6 +18,16 @@ urlpatterns = [ ), path("exchange-rates/", views.exchange_rates_index, name="exchange_rates_index"), path("exchange-rates/list/", views.exchange_rates_list, name="exchange_rates_list"), + path( + "exchange-rates/pair/", + views.exchange_rates_list_pair, + name="exchange_rates_list_pair", + ), + path( + "exchange-rates/pair//", + views.exchange_rates_list_pair, + name="exchange_rates_list_pair", + ), path("exchange-rates/add/", views.exchange_rate_add, name="exchange_rate_add"), path( "exchange-rates//edit/", diff --git a/app/apps/currencies/views/exchange_rates.py b/app/apps/currencies/views/exchange_rates.py index f989fe6..48014d7 100644 --- a/app/apps/currencies/views/exchange_rates.py +++ b/app/apps/currencies/views/exchange_rates.py @@ -1,5 +1,7 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required +from django.db.models import F, CharField, Value +from django.db.models.functions import Concat from django.http import HttpResponse from django.shortcuts import render, get_object_or_404 from django.utils.translation import gettext_lazy as _ @@ -24,11 +26,46 @@ def exchange_rates_index(request): @login_required @require_http_methods(["GET"]) def exchange_rates_list(request): - exchange_rates = ExchangeRate.objects.all().order_by("-date") + pairings = ( + ExchangeRate.objects.values("from_currency__code", "to_currency__code") + .distinct() + .annotate( + pair=Concat( + "from_currency__code", + Value(" x "), + "to_currency__code", + output_field=CharField(), + ) + ) + .values_list("pair", "from_currency__code", "to_currency__code") + ) + return render( request, "exchange_rates/fragments/list.html", - {"exchange_rates": exchange_rates}, + {"pairings": pairings}, + ) + + +@only_htmx +@login_required +@require_http_methods(["GET"]) +def exchange_rates_list_pair(request, from_currency=None, to_currency=None): + if from_currency and to_currency: + exchange_rates = ExchangeRate.objects.filter( + from_currency__code=from_currency, to_currency__code=to_currency + ).order_by("-date") + else: + exchange_rates = ExchangeRate.objects.all().order_by("-date") + + return render( + request, + "exchange_rates/fragments/table.html", + { + "exchange_rates": exchange_rates, + "from_currency": from_currency, + "to_currency": to_currency, + }, ) diff --git a/app/templates/exchange_rates/fragments/list.html b/app/templates/exchange_rates/fragments/list.html index b999d0e..a7fa22a 100644 --- a/app/templates/exchange_rates/fragments/list.html +++ b/app/templates/exchange_rates/fragments/list.html @@ -16,44 +16,22 @@ {% endspaceless %} -
- - - - - - - - - - - {% for exchange_rate in exchange_rates %} - - - - - - - {% endfor %} - -
{% translate 'Date' %}{% translate 'Pairing' %}{% translate 'Rate' %}
- - - {{ exchange_rate.date|date:"SHORT_DATETIME_FORMAT" }}{{ exchange_rate.from_currency.code }} x {{ exchange_rate.to_currency.code }}1 {{ exchange_rate.from_currency.code }} ≅ {% currency_display amount=exchange_rate.rate prefix=exchange_rate.to_currency.prefix suffix=exchange_rate.to_currency.suffix decimal_places=exchange_rate.to_currency.decimal_places%}
+
+
+ +
+ +
+ +
diff --git a/app/templates/exchange_rates/fragments/table.html b/app/templates/exchange_rates/fragments/table.html new file mode 100644 index 0000000..202f645 --- /dev/null +++ b/app/templates/exchange_rates/fragments/table.html @@ -0,0 +1,50 @@ +{% load currency_display %} +{% load i18n %} +{% if from_currency and to_currency %} +
+{% else %} +
+{% endif %} +
+ + + + + + + + + + + {% for exchange_rate in exchange_rates %} + + + + + + + {% endfor %} + +
{% translate 'Date' %}{% translate 'Pairing' %}{% translate 'Rate' %}
+ + + {{ exchange_rate.date|date:"SHORT_DATETIME_FORMAT" }}{{ exchange_rate.from_currency.code }} x {{ exchange_rate.to_currency.code }}1 {{ exchange_rate.from_currency.code }} ≅ {% currency_display amount=exchange_rate.rate prefix=exchange_rate.to_currency.prefix suffix=exchange_rate.to_currency.suffix decimal_places=exchange_rate.to_currency.decimal_places%}
+
+
diff --git a/app/templates/exchange_rates/pages/index.html b/app/templates/exchange_rates/pages/index.html index 5527f7a..1afd684 100644 --- a/app/templates/exchange_rates/pages/index.html +++ b/app/templates/exchange_rates/pages/index.html @@ -4,5 +4,5 @@ {% block title %}{% translate 'Exchange Rates' %}{% endblock %} {% block content %} -
+
{% endblock %}