diff --git a/apps/authorization/api/v1/api.py b/apps/authorization/api/v1/api.py index 225a1f1..6a125e1 100644 --- a/apps/authorization/api/v1/api.py +++ b/apps/authorization/api/v1/api.py @@ -1,5 +1,6 @@ from rest_framework_simplejwt.authentication import JWTAuthentication from rest_framework.permissions import AllowAny, IsAuthenticated +from apps.core.exceptions import ConflictException from rest_framework.exceptions import APIException from apps.authorization.api.v1.serializers import ( RoleSerializer, @@ -64,6 +65,16 @@ class PermissionViewSet(viewsets.ModelViewSet): filter_backends = [filters.SearchFilter] search_fields = ['page__name', ] + def create(self, request, *args, **kwargs): + if self.queryset.filter(name=request.data['name'], page_id=request.data['page']).exists(): + raise ConflictException('a permission with this page exists.') + serializer = self.serializer_class(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_200_OK) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + class UserRelationViewSet(viewsets.ModelViewSet): """ Crud Operations for User Relations """ diff --git a/apps/authorization/migrations/0017_alter_permissions_name.py b/apps/authorization/migrations/0017_alter_permissions_name.py new file mode 100644 index 0000000..e32fbb1 --- /dev/null +++ b/apps/authorization/migrations/0017_alter_permissions_name.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0 on 2025-06-08 11:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authorization', '0016_alter_permissions_name'), + ] + + operations = [ + migrations.AlterField( + model_name='permissions', + name='name', + field=models.CharField(max_length=50), + ), + ] diff --git a/apps/authorization/models.py b/apps/authorization/models.py index 229d2df..385af2d 100644 --- a/apps/authorization/models.py +++ b/apps/authorization/models.py @@ -21,7 +21,7 @@ class Page(BaseModel): class Permissions(BaseModel): """ permission level of users """ - name = models.CharField(max_length=50, unique=True) + name = models.CharField(max_length=50) description = models.TextField(max_length=500) category_choices = ( ('api', 'Api'), diff --git a/apps/core/exceptions.py b/apps/core/exceptions.py index 5262288..b57a86a 100644 --- a/apps/core/exceptions.py +++ b/apps/core/exceptions.py @@ -4,3 +4,12 @@ you can check out the Django Rest Framework documentation at: https://www.django-rest-framework.org/api-guide/exceptions/#custom-exception-handling """ + +from rest_framework.exceptions import APIException +from rest_framework import status + + +class ConflictException(APIException): + status_code = status.HTTP_409_CONFLICT + default_detail = "Object already exists." + default_code = "conflict"