From 7cfa61292a12c49b9aa1f46711d3351ef77f66f8 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Thu, 21 Jun 2018 19:22:51 +0200 Subject: [PATCH] See #248: can now filter on invitation status and delete invitations --- api/funkwhale_api/manage/filters.py | 8 +++- api/funkwhale_api/manage/serializers.py | 9 +++++ api/funkwhale_api/manage/views.py | 10 +++++ api/funkwhale_api/users/models.py | 9 +++-- api/tests/users/test_models.py | 9 +++++ front/src/components/common/ActionTable.vue | 3 +- .../manage/users/InvitationForm.vue | 2 +- .../manage/users/InvitationsTable.vue | 37 ++++++++++++------- 8 files changed, 67 insertions(+), 20 deletions(-) diff --git a/api/funkwhale_api/manage/filters.py b/api/funkwhale_api/manage/filters.py index 16ee5c162..5f83ebf1a 100644 --- a/api/funkwhale_api/manage/filters.py +++ b/api/funkwhale_api/manage/filters.py @@ -40,7 +40,13 @@ class ManageUserFilterSet(filters.FilterSet): class ManageInvitationFilterSet(filters.FilterSet): q = fields.SearchFilter(search_fields=["owner__username", "code", "owner__email"]) + is_open = filters.BooleanFilter(method="filter_is_open") class Meta: model = users_models.Invitation - fields = ["q"] + fields = ["q", "is_open"] + + def filter_is_open(self, queryset, field_name, value): + if value is None: + return queryset + return queryset.open(value) diff --git a/api/funkwhale_api/manage/serializers.py b/api/funkwhale_api/manage/serializers.py index f5d52bcac..d1a9ebb84 100644 --- a/api/funkwhale_api/manage/serializers.py +++ b/api/funkwhale_api/manage/serializers.py @@ -151,3 +151,12 @@ class ManageInvitationSerializer(serializers.ModelSerializer): "An invitation with this code already exists" ) return value + + +class ManageInvitationActionSerializer(common_serializers.ActionSerializer): + actions = [common_serializers.Action("delete", allow_all=False)] + filterset_class = filters.ManageInvitationFilterSet + + @transaction.atomic + def handle_delete(self, objects): + return objects.delete() diff --git a/api/funkwhale_api/manage/views.py b/api/funkwhale_api/manage/views.py index 803f8db7c..ae3c08a57 100644 --- a/api/funkwhale_api/manage/views.py +++ b/api/funkwhale_api/manage/views.py @@ -86,3 +86,13 @@ class ManageInvitationViewSet( def perform_create(self, serializer): serializer.save(owner=self.request.user) + + @list_route(methods=["post"]) + def action(self, request, *args, **kwargs): + queryset = self.get_queryset() + serializer = serializers.ManageInvitationActionSerializer( + request.data, queryset=queryset + ) + serializer.is_valid(raise_exception=True) + result = serializer.save() + return response.Response(result, status=200) diff --git a/api/funkwhale_api/users/models.py b/api/funkwhale_api/users/models.py index 61f57a3c5..e205d04d7 100644 --- a/api/funkwhale_api/users/models.py +++ b/api/funkwhale_api/users/models.py @@ -157,12 +157,13 @@ def generate_code(length=10): class InvitationQuerySet(models.QuerySet): - def open(self): + def open(self, include=True): now = timezone.now() qs = self.annotate(_users=models.Count("users")) - qs = qs.filter(_users=0) - qs = qs.exclude(expiration_date__lte=now) - return qs + query = models.Q(_users=0, expiration_date__gt=now) + if include: + return qs.filter(query) + return qs.exclude(query) class Invitation(models.Model): diff --git a/api/tests/users/test_models.py b/api/tests/users/test_models.py index 475691293..ea760cc6c 100644 --- a/api/tests/users/test_models.py +++ b/api/tests/users/test_models.py @@ -118,3 +118,12 @@ def test_can_filter_open_invitations(factories): assert models.Invitation.objects.count() == 3 assert list(models.Invitation.objects.open()) == [okay] + + +def test_can_filter_closed_invitations(factories): + factories["users.Invitation"]() + expired = factories["users.Invitation"](expired=True) + used = factories["users.User"](invited=True).invitation + + assert models.Invitation.objects.count() == 3 + assert list(models.Invitation.objects.open(False)) == [expired, used] diff --git a/front/src/components/common/ActionTable.vue b/front/src/components/common/ActionTable.vue index f23479066..097fb2938 100644 --- a/front/src/components/common/ActionTable.vue +++ b/front/src/components/common/ActionTable.vue @@ -36,7 +36,7 @@
{{ $t('{% count %} on {% total %} selected', {count: objectsData.count, total: objectsData.count}) }} {{ $t('{% count %} on {% total %} selected', {count: checked.length, total: objectsData.count}) }} -