From 19bbe1c5120bade2a88fb3c25667a44d9e1fbcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Fri, 8 Jan 2016 12:31:59 +0100 Subject: [PATCH] Task #3716: [/api/v1/stats/discover] Show stats for discover secction --- taiga/stats/api.py | 33 ++++++++++++++++++++++++--------- taiga/stats/apps.py | 6 ++---- taiga/stats/permissions.py | 4 ++++ taiga/stats/routers.py | 9 ++++++++- taiga/stats/services.py | 33 +++++++++++++++++++++++++++------ 5 files changed, 65 insertions(+), 20 deletions(-) diff --git a/taiga/stats/api.py b/taiga/stats/api.py index 0afefeb8..301b056e 100644 --- a/taiga/stats/api.py +++ b/taiga/stats/api.py @@ -17,25 +17,40 @@ from collections import OrderedDict from django.conf import settings from django.views.decorators.cache import cache_page -from taiga.base.api import viewsets from taiga.base import response +from taiga.base.api import viewsets from . import permissions from . import services -class SystemStatsViewSet(viewsets.ViewSet): +CACHE_TIMEOUT = getattr(settings, "STATS_CACHE_TIMEOUT", 0) + + +class BaseStatsViewSet(viewsets.ViewSet): + @property + def _cache_timeout(self): + return CACHE_TIMEOUT + + def dispatch(self, *args, **kwargs): + return cache_page(self._cache_timeout)(super().dispatch)(*args, **kwargs) + + +class SystemStatsViewSet(BaseStatsViewSet): permission_classes = (permissions.SystemStatsPermission,) def list(self, request, **kwargs): stats = OrderedDict() - stats["users"] = services.get_users_stats() - stats["projects"] = services.get_projects_stats() - stats["userstories"] = services.get_user_stories_stats() + stats["users"] = services.get_users_public_stats() + stats["projects"] = services.get_projects_public_stats() + stats["userstories"] = services.get_user_stories_public_stats() return response.Ok(stats) - def _get_cache_timeout(self): - return getattr(settings, "STATS_CACHE_TIMEOUT", 0) - def dispatch(self, *args, **kwargs): - return cache_page(self._get_cache_timeout())(super().dispatch)(*args, **kwargs) +class DiscoverStatsViewSet(BaseStatsViewSet): + permission_classes = (permissions.DiscoverStatsPermission,) + + def list(self, request, **kwargs): + stats = OrderedDict() + stats["projects"] = services.get_projects_discover_stats(user=request.user) + return response.Ok(stats) diff --git a/taiga/stats/apps.py b/taiga/stats/apps.py index 4adcc38a..edb0e90e 100644 --- a/taiga/stats/apps.py +++ b/taiga/stats/apps.py @@ -14,7 +14,6 @@ from django.apps import AppConfig from django.apps import apps -from django.conf import settings from django.conf.urls import include, url from .routers import router @@ -25,6 +24,5 @@ class StatsAppConfig(AppConfig): verbose_name = "Stats" def ready(self): - if settings.STATS_ENABLED: - from taiga.urls import urlpatterns - urlpatterns.append(url(r'^api/v1/', include(router.urls))) + from taiga.urls import urlpatterns + urlpatterns.append(url(r'^api/v1/', include(router.urls))) diff --git a/taiga/stats/permissions.py b/taiga/stats/permissions.py index db48b945..369a7000 100644 --- a/taiga/stats/permissions.py +++ b/taiga/stats/permissions.py @@ -18,3 +18,7 @@ from taiga.base.api import permissions class SystemStatsPermission(permissions.TaigaResourcePermission): global_perms = permissions.AllowAny() + + +class DiscoverStatsPermission(permissions.TaigaResourcePermission): + global_perms = permissions.AllowAny() diff --git a/taiga/stats/routers.py b/taiga/stats/routers.py index e082567f..6dbb4e09 100644 --- a/taiga/stats/routers.py +++ b/taiga/stats/routers.py @@ -12,9 +12,16 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from django.conf import settings + from taiga.base import routers + from . import api router = routers.DefaultRouter(trailing_slash=False) -router.register(r"stats/system", api.SystemStatsViewSet, base_name="system-stats") + +if settings.STATS_ENABLED: + router.register(r"stats/system", api.SystemStatsViewSet, base_name="system-stats") + +router.register(r"stats/discover", api.DiscoverStatsViewSet, base_name="discover-stats") diff --git a/taiga/stats/services.py b/taiga/stats/services.py index 9d196094..26934be3 100644 --- a/taiga/stats/services.py +++ b/taiga/stats/services.py @@ -22,9 +22,13 @@ from datetime import timedelta from collections import OrderedDict -def get_users_stats(): +########################################################################### +# Public Stats +########################################################################### + +def get_users_public_stats(): model = apps.get_model("users", "User") - queryset = model.objects.filter(is_active=True, is_system=False) + queryset = model.objects.filter(is_active=True, is_system=False) stats = OrderedDict() today = timezone.now() @@ -71,9 +75,9 @@ def get_users_stats(): return stats -def get_projects_stats(): +def get_projects_public_stats(): model = apps.get_model("projects", "Project") - queryset = model.objects.all() + queryset = model.objects.all() stats = OrderedDict() today = timezone.now() @@ -109,9 +113,9 @@ def get_projects_stats(): return stats -def get_user_stories_stats(): +def get_user_stories_public_stats(): model = apps.get_model("userstories", "UserStory") - queryset = model.objects.all() + queryset = model.objects.all() stats = OrderedDict() today = timezone.now() @@ -130,3 +134,20 @@ def get_user_stories_stats(): .count()) / 5 return stats + +########################################################################### +# Discover Stats +########################################################################### + +def get_projects_discover_stats(user=None): + model = apps.get_model("projects", "Project") + queryset = model.objects.all() + stats = OrderedDict() + + # Get Public (visible) projects + queryset = queryset.filter(Q(is_private=False) | + Q(is_private=True, anon_permissions__contains=["view_project"])) + + stats["total"] = queryset.count() + + return stats