From 559257e48360267b60bcbe39d78affb1125fff20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Thu, 14 Nov 2013 17:42:42 +0100 Subject: [PATCH] Adding projects tags api action --- greenmine/projects/aggregates/tags.py | 32 +++++++++++++++++++++++++++ greenmine/projects/api.py | 6 +++++ 2 files changed, 38 insertions(+) create mode 100644 greenmine/projects/aggregates/tags.py diff --git a/greenmine/projects/aggregates/tags.py b/greenmine/projects/aggregates/tags.py new file mode 100644 index 00000000..be7478a5 --- /dev/null +++ b/greenmine/projects/aggregates/tags.py @@ -0,0 +1,32 @@ +from contextlib import closing +from django.db import connection + +def _get_issues_tags(project): + extra_sql = ("select unnest(unpickle(tags)) as tagname " + "from issues_issue where project_id = %s " + "group by unnest(unpickle(tags)) " + "order by tagname asc") + + with closing(connection.cursor()) as cursor: + cursor.execute(extra_sql, [project.id]) + rows = cursor.fetchall() + + return set([x[0] for x in rows]) + +def _get_stories_tags(project): + extra_sql = ("select unnest(unpickle(tags)) as tagname, count(unnest(unpickle(tags))) " + "from userstories_userstory where project_id = %s " + "group by unnest(unpickle(tags)) " + "order by tagname asc") + + with closing(connection.cursor()) as cursor: + cursor.execute(extra_sql, [project.id]) + rows = cursor.fetchall() + + return set([x[0] for x in rows]) + +def get_all_tags(project): + result = set() + result.update(_get_issues_tags(project)) + result.update(_get_stories_tags(project)) + return sorted(result) diff --git a/greenmine/projects/api.py b/greenmine/projects/api.py index 2b1544a9..e4c8653f 100644 --- a/greenmine/projects/api.py +++ b/greenmine/projects/api.py @@ -9,6 +9,7 @@ from rest_framework.decorators import detail_route from greenmine.base import filters from greenmine.base.api import ModelCrudViewSet, ModelListViewSet from greenmine.base.notifications.api import NotificationSenderMixin +from greenmine.projects.aggregates.tags import get_all_tags from . import serializers from . import models @@ -39,6 +40,11 @@ class ProjectViewSet(ModelCrudViewSet): project = self.get_object() return Response(filters_aggr.get_issues_filters_data(project)) + @detail_route(methods=['get']) + def tags(self, request, pk=None): + project = self.get_object() + return Response(get_all_tags(project)) + def get_queryset(self): qs = super(ProjectViewSet, self).get_queryset() qs = qs.filter(Q(owner=self.request.user) |