Improving CSV reports performance

remotes/origin/logger
Alejandro Alonso 2016-02-05 08:11:22 +01:00 committed by Jesús Espino
parent 14bdf47442
commit 172ce73007
3 changed files with 70 additions and 22 deletions

View File

@ -28,7 +28,9 @@ from taiga.base.utils import db, text
from taiga.projects.issues.apps import ( from taiga.projects.issues.apps import (
connect_issues_signals, connect_issues_signals,
disconnect_issues_signals) disconnect_issues_signals)
from taiga.projects.votes import services as votes_services from taiga.projects.votes.utils import attach_total_voters_to_queryset
from taiga.projects.notifications.utils import attach_watchers_to_queryset
from . import models from . import models
@ -88,9 +90,21 @@ def issues_to_csv(project, queryset):
"attachments", "external_reference", "tags", "attachments", "external_reference", "tags",
"watchers", "voters", "watchers", "voters",
"created_date", "modified_date", "finished_date"] "created_date", "modified_date", "finished_date"]
for custom_attr in project.issuecustomattributes.all():
custom_attrs = project.issuecustomattributes.all()
for custom_attr in custom_attrs:
fieldnames.append(custom_attr.name) fieldnames.append(custom_attr.name)
queryset = queryset.prefetch_related("attachments",
"generated_user_stories",
"custom_attributes_values")
queryset = queryset.select_related("owner",
"assigned_to",
"status",
"project")
queryset = attach_total_voters_to_queryset(queryset)
queryset = attach_watchers_to_queryset(queryset)
writer = csv.DictWriter(csv_data, fieldnames=fieldnames) writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
writer.writeheader() writer.writeheader()
for issue in queryset: for issue in queryset:
@ -111,14 +125,14 @@ def issues_to_csv(project, queryset):
"attachments": issue.attachments.count(), "attachments": issue.attachments.count(),
"external_reference": issue.external_reference, "external_reference": issue.external_reference,
"tags": ",".join(issue.tags or []), "tags": ",".join(issue.tags or []),
"watchers": [u.id for u in issue.get_watchers()], "watchers": issue.watchers,
"voters": votes_services.get_voters(issue).count(), "voters": issue.total_voters,
"created_date": issue.created_date, "created_date": issue.created_date,
"modified_date": issue.modified_date, "modified_date": issue.modified_date,
"finished_date": issue.finished_date, "finished_date": issue.finished_date,
} }
for custom_attr in project.issuecustomattributes.all(): for custom_attr in custom_attrs:
value = issue.custom_attributes_values.attributes_values.get(str(custom_attr.id), None) value = issue.custom_attributes_values.attributes_values.get(str(custom_attr.id), None)
issue_data[custom_attr.name] = value issue_data[custom_attr.name] = value

View File

@ -24,7 +24,8 @@ from taiga.projects.tasks.apps import (
connect_tasks_signals, connect_tasks_signals,
disconnect_tasks_signals) disconnect_tasks_signals)
from taiga.events import events from taiga.events import events
from taiga.projects.votes import services as votes_services from taiga.projects.votes.utils import attach_total_voters_to_queryset
from taiga.projects.notifications.utils import attach_watchers_to_queryset
from . import models from . import models
@ -99,9 +100,22 @@ def tasks_to_csv(project, queryset):
"status", "is_iocaine", "is_closed", "us_order", "status", "is_iocaine", "is_closed", "us_order",
"taskboard_order", "attachments", "external_reference", "tags", "taskboard_order", "attachments", "external_reference", "tags",
"watchers", "voters"] "watchers", "voters"]
for custom_attr in project.taskcustomattributes.all():
custom_attrs = project.taskcustomattributes.all()
for custom_attr in custom_attrs:
fieldnames.append(custom_attr.name) fieldnames.append(custom_attr.name)
queryset = queryset.prefetch_related("attachments",
"custom_attributes_values")
queryset = queryset.select_related("milestone",
"owner",
"assigned_to",
"status",
"project")
queryset = attach_total_voters_to_queryset(queryset)
queryset = attach_watchers_to_queryset(queryset)
writer = csv.DictWriter(csv_data, fieldnames=fieldnames) writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
writer.writeheader() writer.writeheader()
for task in queryset: for task in queryset:
@ -123,10 +137,10 @@ def tasks_to_csv(project, queryset):
"attachments": task.attachments.count(), "attachments": task.attachments.count(),
"external_reference": task.external_reference, "external_reference": task.external_reference,
"tags": ",".join(task.tags or []), "tags": ",".join(task.tags or []),
"watchers": [u.id for u in task.get_watchers()], "watchers": task.watchers,
"voters": votes_services.get_voters(task).count(), "voters": task.total_voters,
} }
for custom_attr in project.taskcustomattributes.all(): for custom_attr in custom_attrs:
value = task.custom_attributes_values.attributes_values.get(str(custom_attr.id), None) value = task.custom_attributes_values.attributes_values.get(str(custom_attr.id), None)
task_data[custom_attr.name] = value task_data[custom_attr.name] = value

View File

@ -32,7 +32,8 @@ from taiga.projects.userstories.apps import (
disconnect_userstories_signals) disconnect_userstories_signals)
from taiga.events import events from taiga.events import events
from taiga.projects.votes import services as votes_services from taiga.projects.votes.utils import attach_total_voters_to_queryset
from taiga.projects.notifications.utils import attach_watchers_to_queryset
from . import models from . import models
@ -132,8 +133,11 @@ def userstories_to_csv(project,queryset):
fieldnames = ["ref", "subject", "description", "milestone", "owner", fieldnames = ["ref", "subject", "description", "milestone", "owner",
"owner_full_name", "assigned_to", "assigned_to_full_name", "owner_full_name", "assigned_to", "assigned_to_full_name",
"status", "is_closed"] "status", "is_closed"]
for role in project.roles.filter(computable=True).order_by('name'):
roles = project.roles.filter(computable=True).order_by('slug')
for role in roles:
fieldnames.append("{}-points".format(role.slug)) fieldnames.append("{}-points".format(role.slug))
fieldnames.append("total-points") fieldnames.append("total-points")
fieldnames += ["backlog_order", "sprint_order", "kanban_order", fieldnames += ["backlog_order", "sprint_order", "kanban_order",
@ -143,9 +147,26 @@ def userstories_to_csv(project,queryset):
"tags", "tags",
"watchers", "voters"] "watchers", "voters"]
for custom_attr in project.userstorycustomattributes.all(): custom_attrs = project.userstorycustomattributes.all()
for custom_attr in custom_attrs:
fieldnames.append(custom_attr.name) fieldnames.append(custom_attr.name)
queryset = queryset.prefetch_related("role_points",
"role_points__points",
"role_points__role",
"tasks",
"attachments",
"custom_attributes_values")
queryset = queryset.select_related("milestone",
"project",
"status",
"owner",
"assigned_to",
"generated_from_issue")
queryset = attach_total_voters_to_queryset(queryset)
queryset = attach_watchers_to_queryset(queryset)
writer = csv.DictWriter(csv_data, fieldnames=fieldnames) writer = csv.DictWriter(csv_data, fieldnames=fieldnames)
writer.writeheader() writer.writeheader()
for us in queryset: for us in queryset:
@ -173,18 +194,17 @@ def userstories_to_csv(project,queryset):
"external_reference": us.external_reference, "external_reference": us.external_reference,
"tasks": ",".join([str(task.ref) for task in us.tasks.all()]), "tasks": ",".join([str(task.ref) for task in us.tasks.all()]),
"tags": ",".join(us.tags or []), "tags": ",".join(us.tags or []),
"watchers": [u.id for u in us.get_watchers()], "watchers": us.watchers,
"voters": votes_services.get_voters(us).count(), "voters": us.total_voters,
} }
for role in us.project.roles.filter(computable=True).order_by('name'): us_role_points_by_role_id = {us_rp.role.id: us_rp.points.value for us_rp in us.role_points.all()}
if us.role_points.filter(role_id=role.id).count() == 1: for role in roles:
row["{}-points".format(role.slug)] = us.role_points.get(role_id=role.id).points.value row["{}-points".format(role.slug)] = us_role_points_by_role_id.get(role.id, 0)
else:
row["{}-points".format(role.slug)] = 0
row['total-points'] = us.get_total_points() row['total-points'] = us.get_total_points()
for custom_attr in project.userstorycustomattributes.all(): for custom_attr in custom_attrs:
value = us.custom_attributes_values.attributes_values.get(str(custom_attr.id), None) value = us.custom_attributes_values.attributes_values.get(str(custom_attr.id), None)
row[custom_attr.name] = value row[custom_attr.name] = value