diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/funds/api_views.py index bc3862af466f947b9ccb2c1bdffcdf8a4b9607da..26ffec25506d942b6783f3da1db5200d02c55fe3 100644 --- a/opentech/apply/funds/api_views.py +++ b/opentech/apply/funds/api_views.py @@ -56,7 +56,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 4d1ca335ed40acfd67c344356073b2247da8fb27..7b12eb0842d62b4fe12a3b878d75348b536bd81e 100644 --- a/opentech/apply/funds/serializers.py +++ b/opentech/apply/funds/serializers.py @@ -122,13 +122,19 @@ 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): """ diff --git a/opentech/static_src/src/app/src/components/GroupedListing/index.js b/opentech/static_src/src/app/src/components/GroupedListing/index.js index 88bd5dc9e075c8f18a9e4757de8136ac7190c607..43c72b22d8682ff2491d1e3f293949e65e9f6a11 100644 --- a/opentech/static_src/src/app/src/components/GroupedListing/index.js +++ b/opentech/static_src/src/app/src/components/GroupedListing/index.js @@ -89,6 +89,10 @@ export default class GroupedListing extends React.Component { items: values.reduce((acc, value) => acc.concat(groupedItems[value] || []), []) })).filter(({items}) => items.length !== 0) + orderedItems.map(value => { + value.items.sort((a,b) => a.lastUpdate > b.lastUpdate ? -1 : 1) + }) + this.setState({orderedItems}); }