From e14f5894bd44ae0c39a3a6e0a5b0dc42b0b82215 Mon Sep 17 00:00:00 2001 From: Chris Lawton <chris.lawton@torchbox.com> Date: Tue, 7 May 2019 17:26:06 +0100 Subject: [PATCH] add last updated to detail view grouped submissions --- opentech/apply/funds/api_views.py | 2 +- opentech/apply/funds/models/submissions.py | 13 +++++++++---- opentech/apply/funds/serializers.py | 8 +++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/funds/api_views.py index f4017549d..1bb4c2d5a 100644 --- a/opentech/apply/funds/api_views.py +++ b/opentech/apply/funds/api_views.py @@ -53,7 +53,7 @@ class SubmissionsFilter(filters.FilterSet): class SubmissionList(generics.ListAPIView): - queryset = ApplicationSubmission.objects.current() + queryset = ApplicationSubmission.objects.current().with_latest_update() serializer_class = SubmissionListSerializer permission_classes = ( permissions.IsAuthenticated, IsApplyStaffUser, diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py index 5f2a90273..93442fa1e 100644 --- a/opentech/apply/funds/models/submissions.py +++ b/opentech/apply/funds/models/submissions.py @@ -115,18 +115,23 @@ class ApplicationSubmissionQueryset(JSONOrderable): # Applications which have the current stage active (have not been progressed) return self.exclude(next__isnull=False) - def for_table(self, user): + def with_latest_update(self): activities = self.model.activities.field.model latest_activity = activities.objects.filter(submission=OuterRef('id')).select_related('user') + return self.annotate( + last_user_update=Subquery(latest_activity[:1].values('user__full_name')), + last_update=Subquery(latest_activity.values('timestamp')[:1]), + ) + + def for_table(self, user): + activities = self.model.activities.field.model comments = activities.comments.filter(submission=OuterRef('id')).visible_to(user) roles_for_review = self.model.assigned.field.model.objects.with_roles().filter( submission=OuterRef('id'), reviewer=user) reviews = self.model.reviews.field.model.objects.filter(submission=OuterRef('id')) - return self.annotate( - last_user_update=Subquery(latest_activity[:1].values('user__full_name')), - last_update=Subquery(latest_activity.values('timestamp')[:1]), + return self.with_latest_update().annotate( comment_count=Coalesce( Subquery( comments.values('submission').order_by().annotate(count=Count('pk')).values('count'), diff --git a/opentech/apply/funds/serializers.py b/opentech/apply/funds/serializers.py index 4f3640364..a2f4edd4a 100644 --- a/opentech/apply/funds/serializers.py +++ b/opentech/apply/funds/serializers.py @@ -1,3 +1,5 @@ +import datetime + import mistune from django.contrib.auth import get_user_model @@ -121,14 +123,18 @@ class ReviewSummarySerializer(serializers.Serializer): return response +class TimestampField(serializers.Field): + def to_representation(self, value): + return value.timestamp() class SubmissionListSerializer(serializers.ModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='funds:api:submissions:detail') round = serializers.SerializerMethodField() + last_update = TimestampField() class Meta: model = ApplicationSubmission - fields = ('id', 'title', 'status', 'url', 'round') + fields = ('id', 'title', 'status', 'url', 'round', 'last_update') def get_round(self, obj): """ -- GitLab