Improving timeline API performance

remotes/origin/logger
Alejandro Alonso 2015-12-13 22:22:24 +01:00
parent 9ecf762e11
commit afb5af1527
2 changed files with 20 additions and 13 deletions

View File

@ -76,15 +76,23 @@ class TimelineViewSet(ReadOnlyListViewSet):
qs = self.get_timeline(obj)
if request.GET.get("only_relevant", None) is not None:
qs = qs.exclude(event_type="issues.issue.change", data__at_values_diff="{}")
qs = qs.exclude(event_type="tasks.task.change", data__at_values_diff="{}")
qs = qs.exclude(event_type="userstories.userstory.change", data__at_values_diff="{}")
qs = qs.exclude(event_type="wiki.wikipage.change", data__at_values_diff="{}")
qs = qs.exclude(event_type="issues.issue.delete")
qs = qs.exclude(event_type="tasks.task.delete")
qs = qs.exclude(event_type="userstories.userstory.delete")
qs = qs.exclude(event_type="wiki.wikipage.delete")
qs = qs.exclude(event_type="projects.project.change")
qs = qs.extra(where=[
"""
NOT(
data::text LIKE '%%\"values_diff\": {}%%'
AND
event_type::text = ANY('{issues.issue.change,
tasks.task.change,
userstories.userstory.change,
wiki.wikipage.change}'::text[])
)
"""])
qs = qs.exclude(event_type__in=["issues.issue.delete",
"tasks.task.delete",
"userstories.userstory.delete",
"wiki.wikipage.delete",
"projects.project.change"])
return self.response_for_queryset(qs)

View File

@ -130,10 +130,9 @@ def filter_timeline_for_user(timeline, user):
# Filtering private projects where user is member
if not user.is_anonymous():
for membership in user.cached_memberships:
for content_type_key, content_type in content_types.items():
if content_type_key in membership.role.permissions or membership.is_owner:
tl_filter |= Q(project=membership.project, data_content_type=content_type)
tl_filter |= Q(project=membership.project, data_content_type=membership_content_type)
data_content_types = list(filter(None, [content_types.get(a, None) for a in membership.role.permissions]))
data_content_types.append(membership_content_type)
tl_filter |= Q(project=membership.project, data_content_type__in=data_content_types)
timeline = timeline.filter(tl_filter)
return timeline