From 129b47ad7cc8874ec9bdd5cdf3964b13fc1b79b0 Mon Sep 17 00:00:00 2001 From: Ernst Odolphi Date: Tue, 9 Aug 2022 11:15:51 +0200 Subject: [PATCH] Do not paginate related segments. Add tests for related segment view. Filter closed segments from related list. --- bluebottle/segments/tests/test_api.py | 50 +++++++++++++++++++++++++++ bluebottle/segments/views.py | 20 +++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/bluebottle/segments/tests/test_api.py b/bluebottle/segments/tests/test_api.py index 06110eddd3..b28b0bc149 100644 --- a/bluebottle/segments/tests/test_api.py +++ b/bluebottle/segments/tests/test_api.py @@ -437,3 +437,53 @@ def test_retrieve_activity_with_invisible_segment(self): len(self.response.data["segments"]), 0 ) + + +class RelatedSegmentListAPITestCase(APITestCase): + + def setUp(self): + super().setUp() + + self.serializer = SegmentDetailSerializer + + self.segment_type = SegmentTypeFactory.create() + self.segments = SegmentFactory.create_batch(10, segment_type=self.segment_type) + + self.url = reverse('related-segment-detail', args=(self.segment_type.pk, )) + + def test_get(self): + self.perform_get() + self.assertStatus(status.HTTP_200_OK) + self.assertSize(10) + + self.assertAttribute('name') + self.assertAttribute('logo') + self.assertAttribute('story') + + def test_get_closed_segment(self): + self.segments[0].closed = True + self.segments[0].save() + + self.perform_get() + self.assertStatus(status.HTTP_200_OK) + self.assertSize(9) + + def test_get_closed_segments_user(self): + self.segments[0].closed = True + self.segments[0].save() + self.user.segments.add(self.segments[0]) + self.user.save() + + self.perform_get(user=self.user) + self.assertStatus(status.HTTP_200_OK) + self.assertSize(10) + + def test_get_closed_platform(self): + with self.closed_site(): + self.perform_get() + self.assertStatus(status.HTTP_401_UNAUTHORIZED) + + def test_get_closed_platform_logged_in(self): + with self.closed_site(): + self.perform_get(user=self.user) + self.assertStatus(status.HTTP_200_OK) diff --git a/bluebottle/segments/views.py b/bluebottle/segments/views.py index 270994fa56..f3919d6736 100644 --- a/bluebottle/segments/views.py +++ b/bluebottle/segments/views.py @@ -1,3 +1,5 @@ +from django.db.models import Q + from rest_framework.pagination import PageNumberPagination from bluebottle.activities.permissions import ActivitySegmentPermission @@ -62,15 +64,29 @@ class RelatedSegmentDetail(JsonApiViewMixin, ListAPIView): serializer_class = SegmentDetailSerializer queryset = Segment.objects.filter(segment_type__is_active=True).select_related('segment_type') + pagination_class = None + permission_classes = [ OpenSegmentOrMember, TenantConditionalOpenClose, ] def get_queryset(self): - queryset = super().get_queryset() + queryset = super().get_queryset().filter( + segment_type_id=self.kwargs['segment_type'], + ) + + if not self.request.user.is_staff: + if self.request.user.is_authenticated: + user_segments = (segment.pk for segment in self.request.user.segments.all()) + else: + user_segments = [] + + queryset = queryset.filter( + Q(closed=False) | Q(pk__in=user_segments) + ) - return queryset.filter(segment_type_id=self.kwargs['segment_type']) + return queryset class SegmentPublicDetail(JsonApiViewMixin, RetrieveAPIView):