(api) add CRUD for mailbox manager MailDomain models

Add create,list,retrieve and delete actions for MailDomain model.
This commit is contained in:
Marie PUPO JEAMMET
2024-04-17 11:19:22 +02:00
committed by Marie
parent ac81e86c88
commit df24c24da1
13 changed files with 505 additions and 31 deletions

View File

@@ -0,0 +1,12 @@
"""Permission handlers for the People mailbox manager app."""
from core.api import permissions as core_permissions
class AccessPermission(core_permissions.IsAuthenticated):
"""Permission class for access objects."""
def has_object_permission(self, request, view, obj):
"""Check permission for a given object."""
abilities = obj.get_abilities(request.user)
return abilities.get(request.method.lower(), False)

View File

@@ -1,4 +1,4 @@
"""Client serializers for the People mailbox_manager app."""
"""Client serializers for People's mailbox manager app."""
from rest_framework import serializers
@@ -18,4 +18,24 @@ class MailDomainSerializer(serializers.ModelSerializer):
class Meta:
model = models.MailDomain
fields = ["id", "name"]
fields = [
"id",
"name",
"created_at",
"updated_at",
]
class MailDomainAccessSerializer(serializers.ModelSerializer):
"""Serialize mail domain accesses."""
class Meta:
model = models.MailDomainAccess
fields = [
"id",
"user",
"role",
"created_at",
"updated_at",
]
read_only_fields = ["id"]

View File

@@ -1,22 +1,75 @@
"""API endpoints"""
from rest_framework import mixins, viewsets
from rest_framework import filters, mixins, viewsets
from rest_framework import permissions as drf_permissions
from core import models as core_models
from mailbox_manager import models
from . import serializers
from mailbox_manager.api import permissions, serializers
# pylint: disable=too-many-ancestors
class MailDomainViewSet(
mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet,
):
"""
MailDomain viewset.
GET /api/<version>/mail-domains/
Return a list of mail domains user has access to.
GET /api/<version>/mail-domains/<domain-id>/
Return details for a mail domain user has access to.
POST /api/<version>/mail-domains/ with expected data:
- name: str
Return newly created domain
DELETE /api/<version>/mail-domains/<domain-id>/
Delete targeted team access
"""
permission_classes = [permissions.AccessPermission]
serializer_class = serializers.MailDomainSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ["created_at", "name"]
ordering = ["-created_at"]
queryset = models.MailDomain.objects.all()
def get_queryset(self):
return self.queryset.filter(accesses__user=self.request.user)
def perform_create(self, serializer):
"""Set the current user as owner of the newly created mail domain."""
domain = serializer.save()
models.MailDomainAccess.objects.create(
user=self.request.user,
domain=domain,
role=core_models.RoleChoices.OWNER,
)
# pylint: disable=too-many-ancestors
class MailDomainAccessViewSet(
mixins.ListModelMixin,
viewsets.GenericViewSet,
):
"""MailDomain ViewSet"""
"""
MailDomainAccess viewset.
"""
permission_classes = [drf_permissions.IsAuthenticated]
serializer_class = serializers.MailDomainSerializer
queryset = models.MailDomain.objects.all()
serializer_class = serializers.MailDomainAccessSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ["created_at", "user", "domain", "role"]
ordering = ["-created_at"]
queryset = models.MailDomainAccess.objects.all()
class MailBoxViewSet(