From 807bce65b62360714f0b612ef45c132b391901f1 Mon Sep 17 00:00:00 2001 From: Josue Kouka Date: Tue, 6 Mar 2018 14:11:12 +0100 Subject: [PATCH] api: add federations stats endpoint (#14787) --- mandayejs/mandaye/api.py | 16 ++++++++++++++++ mandayejs/urls.py | 3 ++- tests/test_api.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/mandayejs/mandaye/api.py b/mandayejs/mandaye/api.py index e26dc39..d43a83a 100644 --- a/mandayejs/mandaye/api.py +++ b/mandayejs/mandaye/api.py @@ -18,6 +18,7 @@ from __future__ import absolute_import from django.shortcuts import get_object_or_404 from django.contrib.auth.models import User +from django.db import models from rest_framework import status from rest_framework.views import APIView @@ -78,3 +79,18 @@ class MandayeAPI(APIView): api = MandayeAPI.as_view() + + +class MandayeStatsAPI(APIView): + + http_method_names = ['get'] + + def get(self, request, *args, **kwargs): + data = UserCredentials.objects.aggregate( + users_linked=models.Sum(models.Case(models.When(linked=True, then=1), output_field=models.IntegerField())), + users_unlinked=models.Sum(models.Case(models.When(linked=False, then=1), output_field=models.IntegerField())) + ) + return Response(data) + + +api_stats = MandayeStatsAPI.as_view() diff --git a/mandayejs/urls.py b/mandayejs/urls.py index 631bcd2..683c113 100644 --- a/mandayejs/urls.py +++ b/mandayejs/urls.py @@ -30,7 +30,8 @@ urlpatterns = patterns('', url(r'^_mandaye/post-login-do/$', 'mandayejs.mandaye.views.post_login_do', name='post-login-do'), url(r'^_mandaye/admin/', include(admin.site.urls)), url(r'^_mandaye/ws/(?P.*)$', app_web_services, name='app-web-services'), - url(r'^_mandaye/api/', 'mandayejs.mandaye.api.api', name='api') + url(r'^_mandaye/api/$', 'mandayejs.mandaye.api.api', name='api'), + url(r'^_mandaye/api/stats/$', 'mandayejs.mandaye.api.api_stats', name='api-stats') ) if 'mellon' in settings.INSTALLED_APPS: diff --git a/tests/test_api.py b/tests/test_api.py index 7453512..63a68d5 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -2,10 +2,13 @@ import mock import pytest from django.conf import settings +from django.core.urlresolvers import reverse from mandayejs.mandaye.models import UserCredentials from utils import create_user, create_credentials, get_uuid, get_user +pytestmark = pytest.mark.django_db + def test_api_get(client, url): response = client.get(url) @@ -150,3 +153,28 @@ def test_signed_api_delete(client_service, url_signed): assert response.status_code == status_code['success'] if url_signed.orig == 'testserver': assert UserCredentials.objects.filter(user=josh).exists() is False + + +def test_api_stats(client): + url = reverse('api-stats') + + if client.session.values(): + status_code = 200 + else: + status_code = 403 + + for username in ('john', 'jane', 'doe'): + user = create_user(username=username) + creds = create_credentials(user, { + 'login': username, + 'password': username + }) + if username != 'doe': + creds.linked = True + creds.save() + + response = client.get(url) + assert response.status_code == status_code + + if status_code == 200: + assert {'users_linked': 2, 'users_unlinked': 1} == response.data -- 2.11.0