From 13e0e79f4432c1432c233cc8cc0d9d63b97ced0a Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Tue, 21 Jun 2016 14:04:15 +0200 Subject: [PATCH] Fixing filter_data endpoint for userstories and issues --- taiga/projects/issues/services.py | 49 +++++++++++++++++++++----- taiga/projects/userstories/services.py | 49 +++++++++++++++++++++----- 2 files changed, 80 insertions(+), 18 deletions(-) diff --git a/taiga/projects/issues/services.py b/taiga/projects/issues/services.py index a494b1f4..3ebcec7a 100644 --- a/taiga/projects/issues/services.py +++ b/taiga/projects/issues/services.py @@ -423,16 +423,47 @@ def _get_issues_owners(project, queryset): return sorted(result, key=itemgetter("full_name")) -def _get_issues_tags(queryset): - tags = [] - for t_list in queryset.values_list("tags", flat=True): - if t_list is None: - continue - tags += list(t_list) +def _get_issues_tags(project, queryset): + compiler = connection.ops.compiler(queryset.query.compiler)(queryset.query, connection, None) + queryset_where_tuple = queryset.query.where.as_sql(compiler, connection) + where = queryset_where_tuple[0] + where_params = queryset_where_tuple[1] - tags = [{"name":e, "count":tags.count(e)} for e in set(tags)] + extra_sql = """ + WITH + issues_tags AS ( + SELECT tag, COUNT(tag) counter FROM ( + SELECT UNNEST(tags) tag + FROM issues_issue + WHERE {where} + ) tags + GROUP BY tag + ), + project_tags AS ( + SELECT reduce_dim(tags_colors) tag_color + FROM projects_project + WHERE id=%s + ) - return sorted(tags, key=itemgetter("name")) + SELECT + tag_color[1] tag, issues_tags.counter counter + FROM project_tags + LEFT JOIN + issues_tags ON project_tags.tag_color[1] = issues_tags.tag + ORDER BY tag + """.format(where=where) + + with closing(connection.cursor()) as cursor: + cursor.execute(extra_sql, where_params + [project.id]) + rows = cursor.fetchall() + + result = [] + for name, count in rows: + result.append({ + "name": name, + "count": 0 if count is None else count, + }) + return result def get_issues_filters_data(project, querysets): @@ -447,7 +478,7 @@ def get_issues_filters_data(project, querysets): ("severities", _get_issues_severities(project, querysets["severities"])), ("assigned_to", _get_issues_assigned_to(project, querysets["assigned_to"])), ("owners", _get_issues_owners(project, querysets["owners"])), - ("tags", _get_issues_tags(querysets["tags"])), + ("tags", _get_issues_tags(project, querysets["tags"])), ]) return data diff --git a/taiga/projects/userstories/services.py b/taiga/projects/userstories/services.py index 5ce47635..1e2e11bf 100644 --- a/taiga/projects/userstories/services.py +++ b/taiga/projects/userstories/services.py @@ -379,16 +379,47 @@ def _get_userstories_owners(project, queryset): return sorted(result, key=itemgetter("full_name")) -def _get_userstories_tags(queryset): - tags = [] - for t_list in queryset.values_list("tags", flat=True): - if t_list is None: - continue - tags += list(t_list) +def _get_userstories_tags(project, queryset): + compiler = connection.ops.compiler(queryset.query.compiler)(queryset.query, connection, None) + queryset_where_tuple = queryset.query.where.as_sql(compiler, connection) + where = queryset_where_tuple[0] + where_params = queryset_where_tuple[1] - tags = [{"name":e, "count":tags.count(e)} for e in set(tags)] + extra_sql = """ + WITH + userstories_tags AS ( + SELECT tag, COUNT(tag) counter FROM ( + SELECT UNNEST(tags) tag + FROM userstories_userstory + WHERE {where} + ) tags + GROUP BY tag + ), + project_tags AS ( + SELECT reduce_dim(tags_colors) tag_color + FROM projects_project + WHERE id=%s + ) - return sorted(tags, key=itemgetter("name")) + SELECT + tag_color[1] tag, userstories_tags.counter counter + FROM project_tags + LEFT JOIN + userstories_tags ON project_tags.tag_color[1] = userstories_tags.tag + ORDER BY tag + """.format(where=where) + + with closing(connection.cursor()) as cursor: + cursor.execute(extra_sql, where_params + [project.id]) + rows = cursor.fetchall() + + result = [] + for name, count in rows: + result.append({ + "name": name, + "count": 0 if count is None else count, + }) + return result def get_userstories_filters_data(project, querysets): @@ -400,7 +431,7 @@ def get_userstories_filters_data(project, querysets): ("statuses", _get_userstories_statuses(project, querysets["statuses"])), ("assigned_to", _get_userstories_assigned_to(project, querysets["assigned_to"])), ("owners", _get_userstories_owners(project, querysets["owners"])), - ("tags", _get_userstories_tags(querysets["tags"])), + ("tags", _get_userstories_tags(project, querysets["tags"])), ]) return data