Improving timeline API performance

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

View File

@ -76,15 +76,23 @@ class TimelineViewSet(ReadOnlyListViewSet):
qs = self.get_timeline(obj) qs = self.get_timeline(obj)
if request.GET.get("only_relevant", None) is not None: if request.GET.get("only_relevant", None) is not None:
qs = qs.exclude(event_type="issues.issue.change", data__at_values_diff="{}") qs = qs.extra(where=[
qs = qs.exclude(event_type="tasks.task.change", data__at_values_diff="{}") """
qs = qs.exclude(event_type="userstories.userstory.change", data__at_values_diff="{}") NOT(
qs = qs.exclude(event_type="wiki.wikipage.change", data__at_values_diff="{}") data::text LIKE '%%\"values_diff\": {}%%'
qs = qs.exclude(event_type="issues.issue.delete") AND
qs = qs.exclude(event_type="tasks.task.delete") event_type::text = ANY('{issues.issue.change,
qs = qs.exclude(event_type="userstories.userstory.delete") tasks.task.change,
qs = qs.exclude(event_type="wiki.wikipage.delete") userstories.userstory.change,
qs = qs.exclude(event_type="projects.project.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) 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 # Filtering private projects where user is member
if not user.is_anonymous(): if not user.is_anonymous():
for membership in user.cached_memberships: for membership in user.cached_memberships:
for content_type_key, content_type in content_types.items(): data_content_types = list(filter(None, [content_types.get(a, None) for a in membership.role.permissions]))
if content_type_key in membership.role.permissions or membership.is_owner: data_content_types.append(membership_content_type)
tl_filter |= Q(project=membership.project, data_content_type=content_type) tl_filter |= Q(project=membership.project, data_content_type__in=data_content_types)
tl_filter |= Q(project=membership.project, data_content_type=membership_content_type)
timeline = timeline.filter(tl_filter) timeline = timeline.filter(tl_filter)
return timeline return timeline