From a1c179f61204275be41b3dab01635adaf3189259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Sat, 13 Apr 2024 19:52:48 +0200 Subject: [PATCH] feat: add a /stats endpoint --- la_chariotte/order/views/stats.py | 28 +++++++++++++++++++ la_chariotte/tests/test_views_stats.py | 38 ++++++++++++++++++++++++++ la_chariotte/urls.py | 2 ++ pyproject.toml | 2 +- 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 la_chariotte/order/views/stats.py create mode 100644 la_chariotte/tests/test_views_stats.py diff --git a/la_chariotte/order/views/stats.py b/la_chariotte/order/views/stats.py new file mode 100644 index 0000000..4cf4df9 --- /dev/null +++ b/la_chariotte/order/views/stats.py @@ -0,0 +1,28 @@ +import json +from datetime import datetime, timedelta + +from django.http import HttpResponse +from django.utils.timezone import make_aware + +from la_chariotte.accounts.models import CustomUser +from la_chariotte.order.models import GroupedOrder, Order + + +def stats(request): + last_month = make_aware(datetime.today() - timedelta(days=30)) + + last_month_grouped_orders = GroupedOrder.objects.filter( + deadline__gte=last_month + ).count() + + return HttpResponse( + json.dumps( + { + "total_users": CustomUser.objects.count(), + "total_grouped_orders": GroupedOrder.objects.count(), + "total_orders": Order.objects.count(), + "last_month_grouped_orders": last_month_grouped_orders, + } + ), + content_type="application/json", + ) diff --git a/la_chariotte/tests/test_views_stats.py b/la_chariotte/tests/test_views_stats.py new file mode 100644 index 0000000..3323900 --- /dev/null +++ b/la_chariotte/tests/test_views_stats.py @@ -0,0 +1,38 @@ +from datetime import datetime, timedelta + +from django.contrib import auth +from django.urls import reverse + +from .utils import create_grouped_order, order_items_in_grouped_order + + +def test_stats(client_log): + response = client_log.get(reverse("stats")) + assert response.status_code == 200 + assert response.json() == { + "total_grouped_orders": 0, + "total_orders": 0, + "total_users": 1, + "last_month_grouped_orders": 0, + } + + # Create a new grouped-order, place an order and check that the stats changed. + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=auth.get_user(client_log), + ) + order_items_in_grouped_order(grouped_order) + + grouped_order.deadline = datetime.now() - timedelta(days=10) + grouped_order.save() + + response = client_log.get(reverse("stats")) + assert response.status_code == 200 + assert response.json() == { + "total_grouped_orders": 1, + "total_orders": 3, + "total_users": 1, + "last_month_grouped_orders": 1, + } diff --git a/la_chariotte/urls.py b/la_chariotte/urls.py index 611bcc4..0931974 100644 --- a/la_chariotte/urls.py +++ b/la_chariotte/urls.py @@ -25,6 +25,7 @@ from django.views.generic.base import TemplateView from la_chariotte import settings from la_chariotte.order.views import JoinGroupedOrderView +from la_chariotte.order.views.stats import stats urlpatterns = [ path("admin/", admin.site.urls), @@ -83,4 +84,5 @@ urlpatterns = [ ), name="about_chariotte", ), + path("stats/", stats, name="stats"), ] diff --git a/pyproject.toml b/pyproject.toml index 7745095..ad899e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ dependencies = [ "icalendar>=5.0.7,<6", "base36>=0.1.1,<1", "django-weasyprint==1.1.0.post1", # see below - "weasyprint==52.5", # pin weasyprint to not depend on latest libpango + "weasyprint==52.5", # pin weasyprint to not depend on latest libpango "html2text>=2020.1.16", "django-crispy-forms>=2.0,<3", "crispy-bulma>=0.11.0,<1",