diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/funds/api_views.py index f4017549d73e23fa0304316b877b793ac9df1402..1bb4c2d5a2f1f2462cb05151bfb4ed73af7dc934 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 5f2a9027306d1e7b2e89eb612be34e6d64d8dd50..93442fa1e2ab35518ff80bed336238899962f96e 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 4f3640364745f041ecd37c2ef90a98d2f1375c3b..a2f4edd4a8cfa16d6a09f441607338e6bb32061d 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): """