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