From c3c06bebe5b0aef306e2611da5773c0f742592d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Mon, 8 Feb 2016 17:39:12 +0100 Subject: [PATCH] Issue #3886: Fix empty full_names in Story and Issues filter lists --- taiga/projects/issues/services.py | 204 +++++++++++++------------ taiga/projects/userstories/services.py | 88 ++++++----- 2 files changed, 152 insertions(+), 140 deletions(-) diff --git a/taiga/projects/issues/services.py b/taiga/projects/issues/services.py index 6ae35b2a..6d1871e3 100644 --- a/taiga/projects/issues/services.py +++ b/taiga/projects/issues/services.py @@ -149,21 +149,22 @@ def _get_issues_statuses(project, queryset): extra_sql = """ WITH counters AS ( - SELECT status_id, count(status_id) count - FROM "issues_issue" - INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} - GROUP BY status_id - ) - SELECT "projects_issuestatus"."id", - "projects_issuestatus"."name", - "projects_issuestatus"."color", - "projects_issuestatus"."order", - COALESCE(counters.count, 0) - FROM "projects_issuestatus" + SELECT status_id, count(status_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY status_id + ) + + SELECT "projects_issuestatus"."id", + "projects_issuestatus"."name", + "projects_issuestatus"."color", + "projects_issuestatus"."order", + COALESCE(counters.count, 0) + FROM "projects_issuestatus" LEFT OUTER JOIN counters ON counters.status_id = projects_issuestatus.id - WHERE "projects_issuestatus"."project_id" = %s - ORDER BY "projects_issuestatus"."order"; + WHERE "projects_issuestatus"."project_id" = %s + ORDER BY "projects_issuestatus"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -190,21 +191,22 @@ def _get_issues_types(project, queryset): extra_sql = """ WITH counters AS ( - SELECT type_id, count(type_id) count - FROM "issues_issue" - INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} - GROUP BY type_id - ) - SELECT "projects_issuetype"."id", - "projects_issuetype"."name", - "projects_issuetype"."color", - "projects_issuetype"."order", - COALESCE(counters.count, 0) - FROM "projects_issuetype" + SELECT type_id, count(type_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY type_id + ) + + SELECT "projects_issuetype"."id", + "projects_issuetype"."name", + "projects_issuetype"."color", + "projects_issuetype"."order", + COALESCE(counters.count, 0) + FROM "projects_issuetype" LEFT OUTER JOIN counters ON counters.type_id = projects_issuetype.id - WHERE "projects_issuetype"."project_id" = %s - ORDER BY "projects_issuetype"."order"; + WHERE "projects_issuetype"."project_id" = %s + ORDER BY "projects_issuetype"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -231,21 +233,22 @@ def _get_issues_priorities(project, queryset): extra_sql = """ WITH counters AS ( - SELECT priority_id, count(priority_id) count - FROM "issues_issue" - INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} - GROUP BY priority_id - ) - SELECT "projects_priority"."id", - "projects_priority"."name", - "projects_priority"."color", - "projects_priority"."order", - COALESCE(counters.count, 0) - FROM "projects_priority" + SELECT priority_id, count(priority_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY priority_id + ) + + SELECT "projects_priority"."id", + "projects_priority"."name", + "projects_priority"."color", + "projects_priority"."order", + COALESCE(counters.count, 0) + FROM "projects_priority" LEFT OUTER JOIN counters ON counters.priority_id = projects_priority.id - WHERE "projects_priority"."project_id" = %s - ORDER BY "projects_priority"."order"; + WHERE "projects_priority"."project_id" = %s + ORDER BY "projects_priority"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -272,21 +275,22 @@ def _get_issues_severities(project, queryset): extra_sql = """ WITH counters AS ( - SELECT severity_id, count(severity_id) count - FROM "issues_issue" - INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} - GROUP BY severity_id - ) - SELECT "projects_severity"."id", - "projects_severity"."name", - "projects_severity"."color", - "projects_severity"."order", - COALESCE(counters.count, 0) - FROM "projects_severity" + SELECT severity_id, count(severity_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY severity_id + ) + + SELECT "projects_severity"."id", + "projects_severity"."name", + "projects_severity"."color", + "projects_severity"."order", + COALESCE(counters.count, 0) + FROM "projects_severity" LEFT OUTER JOIN counters ON counters.severity_id = projects_severity.id - WHERE "projects_severity"."project_id" = %s - ORDER BY "projects_severity"."order"; + WHERE "projects_severity"."project_id" = %s + ORDER BY "projects_severity"."order"; """.format(where=where) with closing(connection.cursor()) as cursor: @@ -313,28 +317,30 @@ def _get_issues_assigned_to(project, queryset): extra_sql = """ WITH counters AS ( - SELECT assigned_to_id, count(assigned_to_id) count - FROM "issues_issue" - INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} AND "issues_issue"."assigned_to_id" IS NOT NULL - GROUP BY assigned_to_id - ) - SELECT - "projects_membership"."user_id" user_id, - "users_user"."full_name", - COALESCE("counters".count, 0) count - FROM projects_membership + SELECT assigned_to_id, count(assigned_to_id) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} AND "issues_issue"."assigned_to_id" IS NOT NULL + GROUP BY assigned_to_id + ) + + SELECT "projects_membership"."user_id" user_id, + "users_user"."full_name", + "users_user"."username", + COALESCE("counters".count, 0) count + FROM projects_membership LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."assigned_to_id") - INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") - WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL -- unassigned issues UNION - SELECT NULL user_id, NULL, count(coalesce(assigned_to_id, -1)) count - FROM "issues_issue" - INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} AND "issues_issue"."assigned_to_id" IS NULL - GROUP BY assigned_to_id + + SELECT NULL user_id, NULL, NULL, count(coalesce(assigned_to_id, -1)) count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} AND "issues_issue"."assigned_to_id" IS NULL + GROUP BY assigned_to_id """.format(where=where) with closing(connection.cursor()) as cursor: @@ -343,10 +349,10 @@ def _get_issues_assigned_to(project, queryset): result = [] none_valued_added = False - for id, full_name, count in rows: + for id, full_name, username, count in rows: result.append({ "id": id, - "full_name": full_name or "", + "full_name": full_name or username or "", "count": count, }) @@ -372,30 +378,32 @@ def _get_issues_owners(project, queryset): extra_sql = """ WITH counters AS ( - SELECT "issues_issue"."owner_id" owner_id, count("issues_issue"."owner_id") count - FROM "issues_issue" - INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") - WHERE {where} - GROUP BY "issues_issue"."owner_id" - ) - SELECT - "projects_membership"."user_id" id, - "users_user"."full_name", - COALESCE("counters".count, 0) count - FROM projects_membership + SELECT "issues_issue"."owner_id" owner_id, count("issues_issue"."owner_id") count + FROM "issues_issue" + INNER JOIN "projects_project" ON ("issues_issue"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY "issues_issue"."owner_id" + ) + + SELECT "projects_membership"."user_id" id, + "users_user"."full_name", + "users_user"."username", + COALESCE("counters".count, 0) count + FROM projects_membership LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."owner_id") - INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") - WHERE ("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE ("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) -- System users UNION - SELECT - "users_user"."id" user_id, - "users_user"."full_name" full_name, - COALESCE("counters".count, 0) count - FROM users_user - LEFT OUTER JOIN counters ON ("users_user"."id" = "counters"."owner_id") - WHERE ("users_user"."is_system" IS TRUE) + + SELECT "users_user"."id" user_id, + "users_user"."full_name" full_name, + "users_user"."username", + COALESCE("counters".count, 0) count + FROM users_user + LEFT OUTER JOIN counters ON ("users_user"."id" = "counters"."owner_id") + WHERE ("users_user"."is_system" IS TRUE) """.format(where=where) with closing(connection.cursor()) as cursor: @@ -403,11 +411,11 @@ def _get_issues_owners(project, queryset): rows = cursor.fetchall() result = [] - for id, full_name, count in rows: + for id, full_name, username, count in rows: if count > 0: result.append({ "id": id, - "full_name": full_name, + "full_name": full_name or username or "", "count": count, }) return sorted(result, key=itemgetter("full_name")) diff --git a/taiga/projects/userstories/services.py b/taiga/projects/userstories/services.py index f7685481..4270ec54 100644 --- a/taiga/projects/userstories/services.py +++ b/taiga/projects/userstories/services.py @@ -258,28 +258,30 @@ def _get_userstories_assigned_to(project, queryset): extra_sql = """ WITH counters AS ( - SELECT assigned_to_id, count(assigned_to_id) count - FROM "userstories_userstory" - INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") - WHERE {where} AND "userstories_userstory"."assigned_to_id" IS NOT NULL - GROUP BY assigned_to_id - ) - SELECT - "projects_membership"."user_id" user_id, - "users_user"."full_name", - COALESCE("counters".count, 0) count - FROM projects_membership + SELECT assigned_to_id, count(assigned_to_id) count + FROM "userstories_userstory" + INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") + WHERE {where} AND "userstories_userstory"."assigned_to_id" IS NOT NULL + GROUP BY assigned_to_id + ) + + SELECT "projects_membership"."user_id" user_id, + "users_user"."full_name", + "users_user"."username", + COALESCE("counters".count, 0) count + FROM projects_membership LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."assigned_to_id") - INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") - WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE "projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL -- unassigned userstories UNION - SELECT NULL user_id, NULL, count(coalesce(assigned_to_id, -1)) count - FROM "userstories_userstory" - INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") - WHERE {where} AND "userstories_userstory"."assigned_to_id" IS NULL - GROUP BY assigned_to_id + + SELECT NULL user_id, NULL, NULL, count(coalesce(assigned_to_id, -1)) count + FROM "userstories_userstory" + INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") + WHERE {where} AND "userstories_userstory"."assigned_to_id" IS NULL + GROUP BY assigned_to_id """.format(where=where) with closing(connection.cursor()) as cursor: @@ -288,10 +290,10 @@ def _get_userstories_assigned_to(project, queryset): result = [] none_valued_added = False - for id, full_name, count in rows: + for id, full_name, username, count in rows: result.append({ "id": id, - "full_name": full_name or "", + "full_name": full_name or username or "", "count": count, }) @@ -317,30 +319,32 @@ def _get_userstories_owners(project, queryset): extra_sql = """ WITH counters AS ( - SELECT "userstories_userstory"."owner_id" owner_id, count(coalesce("userstories_userstory"."owner_id", -1)) count - FROM "userstories_userstory" - INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") - WHERE {where} - GROUP BY "userstories_userstory"."owner_id" - ) - SELECT - "projects_membership"."user_id" id, - "users_user"."full_name", - COALESCE("counters".count, 0) count - FROM projects_membership + SELECT "userstories_userstory"."owner_id" owner_id, count(coalesce("userstories_userstory"."owner_id", -1)) count + FROM "userstories_userstory" + INNER JOIN "projects_project" ON ("userstories_userstory"."project_id" = "projects_project"."id") + WHERE {where} + GROUP BY "userstories_userstory"."owner_id" + ) + + SELECT "projects_membership"."user_id" id, + "users_user"."full_name", + "users_user"."username", + COALESCE("counters".count, 0) count + FROM projects_membership LEFT OUTER JOIN counters ON ("projects_membership"."user_id" = "counters"."owner_id") - INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") - WHERE ("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) + INNER JOIN "users_user" ON ("projects_membership"."user_id" = "users_user"."id") + WHERE ("projects_membership"."project_id" = %s AND "projects_membership"."user_id" IS NOT NULL) -- System users UNION - SELECT - "users_user"."id" user_id, - "users_user"."full_name" full_name, - COALESCE("counters".count, 0) count - FROM users_user - LEFT OUTER JOIN counters ON ("users_user"."id" = "counters"."owner_id") - WHERE ("users_user"."is_system" IS TRUE) + + SELECT "users_user"."id" user_id, + "users_user"."full_name" full_name, + "users_user"."username" username, + COALESCE("counters".count, 0) count + FROM users_user + LEFT OUTER JOIN counters ON ("users_user"."id" = "counters"."owner_id") + WHERE ("users_user"."is_system" IS TRUE) """.format(where=where) with closing(connection.cursor()) as cursor: @@ -348,11 +352,11 @@ def _get_userstories_owners(project, queryset): rows = cursor.fetchall() result = [] - for id, full_name, count in rows: + for id, full_name, username, count in rows: if count > 0: result.append({ "id": id, - "full_name": full_name, + "full_name": full_name or username or "", "count": count, }) return sorted(result, key=itemgetter("full_name"))