mirror of
https://framagit.org/la-chariotte/la-chariotte.git
synced 2025-04-28 18:02:43 +02:00
feat: add a /stats endpoint
This commit is contained in:
parent
d67bbc7d8c
commit
a1c179f612
4 changed files with 69 additions and 1 deletions
28
la_chariotte/order/views/stats.py
Normal file
28
la_chariotte/order/views/stats.py
Normal file
|
@ -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",
|
||||
)
|
38
la_chariotte/tests/test_views_stats.py
Normal file
38
la_chariotte/tests/test_views_stats.py
Normal file
|
@ -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,
|
||||
}
|
|
@ -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"),
|
||||
]
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue