import the namespace with the models
This commit is contained in:
parent
e7559446a7
commit
7965ecf779
6 changed files with 72 additions and 81 deletions
|
@ -6,64 +6,63 @@ The admin is the admin page configuration, describing which model should be visi
|
||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import (Department, StudentGroup, TeachingUnit, StudentCard, TeachingSession, Attendance, Absence,
|
from . import models
|
||||||
AbsenceAttachment, User)
|
|
||||||
|
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
@admin.register(User)
|
@admin.register(models.User)
|
||||||
class AdminUser(admin.ModelAdmin):
|
class AdminUser(admin.ModelAdmin):
|
||||||
list_display = ("id", "username", "email", "first_name", "last_name", "is_staff")
|
list_display = ("id", "username", "email", "first_name", "last_name", "is_staff")
|
||||||
search_fields = ("id", "username", "email", "first_name", "last_name", "is_staff")
|
search_fields = ("id", "username", "email", "first_name", "last_name", "is_staff")
|
||||||
list_filter = ("is_staff",)
|
list_filter = ("is_staff",)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Department)
|
@admin.register(models.Department)
|
||||||
class AdminDepartment(admin.ModelAdmin):
|
class AdminDepartment(admin.ModelAdmin):
|
||||||
list_display = ("id", "name", "email")
|
list_display = ("id", "name", "email")
|
||||||
search_fields = ("id", "name", "email")
|
search_fields = ("id", "name", "email")
|
||||||
|
|
||||||
|
|
||||||
@admin.register(StudentGroup)
|
@admin.register(models.StudentGroup)
|
||||||
class AdminStudentGroup(admin.ModelAdmin):
|
class AdminStudentGroup(admin.ModelAdmin):
|
||||||
list_display = ("id", "name", "owner", "department")
|
list_display = ("id", "name", "owner", "department")
|
||||||
search_fields = ("id", "name", "owner", "department")
|
search_fields = ("id", "name", "owner", "department")
|
||||||
|
|
||||||
|
|
||||||
@admin.register(TeachingUnit)
|
@admin.register(models.TeachingUnit)
|
||||||
class AdminTeachingUnit(admin.ModelAdmin):
|
class AdminTeachingUnit(admin.ModelAdmin):
|
||||||
list_display = ("id", "name")
|
list_display = ("id", "name")
|
||||||
search_fields = ("id", "name")
|
search_fields = ("id", "name")
|
||||||
|
|
||||||
|
|
||||||
@admin.register(StudentCard)
|
@admin.register(models.StudentCard)
|
||||||
class AdminStudentCard(admin.ModelAdmin):
|
class AdminStudentCard(admin.ModelAdmin):
|
||||||
list_display = ("id", "uid", "owner")
|
list_display = ("id", "uid", "owner")
|
||||||
search_fields = ("id", "uid", "owner")
|
search_fields = ("id", "uid", "owner")
|
||||||
readonly_fields = ("uid",)
|
readonly_fields = ("uid",)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(TeachingSession)
|
@admin.register(models.TeachingSession)
|
||||||
class AdminTeachingSession(admin.ModelAdmin):
|
class AdminTeachingSession(admin.ModelAdmin):
|
||||||
list_display = ("id", "start", "end", "duration", "teacher")
|
list_display = ("id", "start", "end", "duration", "teacher")
|
||||||
search_fields = ("id", "start", "end", "duration", "teacher")
|
search_fields = ("id", "start", "end", "duration", "teacher")
|
||||||
list_filter = ("start", "duration")
|
list_filter = ("start", "duration")
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Attendance)
|
@admin.register(models.Attendance)
|
||||||
class AdminAttendance(admin.ModelAdmin):
|
class AdminAttendance(admin.ModelAdmin):
|
||||||
list_display = ("id", "date", "student")
|
list_display = ("id", "date", "student")
|
||||||
search_fields = ("id", "date", "student")
|
search_fields = ("id", "date", "student")
|
||||||
list_filter = ("date",)
|
list_filter = ("date",)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Absence)
|
@admin.register(models.Absence)
|
||||||
class AdminAbsence(admin.ModelAdmin):
|
class AdminAbsence(admin.ModelAdmin):
|
||||||
list_display = ("id", "message", "student")
|
list_display = ("id", "message", "student")
|
||||||
search_fields = ("id", "message", "student")
|
search_fields = ("id", "message", "student")
|
||||||
|
|
||||||
|
|
||||||
@admin.register(AbsenceAttachment)
|
@admin.register(models.AbsenceAttachment)
|
||||||
class AdminAbsenceAttachment(admin.ModelAdmin):
|
class AdminAbsenceAttachment(admin.ModelAdmin):
|
||||||
list_display = ("id", "content", "absence")
|
list_display = ("id", "content", "absence")
|
||||||
search_fields = ("id", "content", "absence")
|
search_fields = ("id", "content", "absence")
|
||||||
|
|
|
@ -6,26 +6,25 @@ A permission describe which user is allowed to see and modify which objet with t
|
||||||
|
|
||||||
from rest_framework import permissions
|
from rest_framework import permissions
|
||||||
|
|
||||||
from Palto.Palto.models import (Department, TeachingUnit, StudentCard, StudentGroup, User, TeachingSession, Attendance,
|
from Palto.Palto import models
|
||||||
Absence, AbsenceAttachment)
|
|
||||||
|
|
||||||
|
|
||||||
class UserPermission(permissions.BasePermission):
|
class UserPermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: User) -> bool:
|
def has_object_permission(self, request, view, obj: models.User) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if request.method in permissions.SAFE_METHODS:
|
if request.method in permissions.SAFE_METHODS:
|
||||||
# if the user is in one of the same department as the requesting user, allow read
|
# if the user is in one of the same department as the requesting user, allow read
|
||||||
if obj in Department.multiple_related_users(request.user.related_departments):
|
if obj in models.Department.multiple_related_users(request.user.related_departments):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
class DepartmentPermission(permissions.BasePermission):
|
class DepartmentPermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: Department) -> bool:
|
def has_object_permission(self, request, view, obj: models.Department) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
@ -42,7 +41,7 @@ class DepartmentPermission(permissions.BasePermission):
|
||||||
|
|
||||||
|
|
||||||
class StudentGroupPermission(permissions.BasePermission):
|
class StudentGroupPermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: StudentGroup) -> bool:
|
def has_object_permission(self, request, view, obj: models.StudentGroup) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
@ -68,7 +67,7 @@ class StudentGroupPermission(permissions.BasePermission):
|
||||||
|
|
||||||
|
|
||||||
class TeachingUnitPermission(permissions.BasePermission):
|
class TeachingUnitPermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: TeachingUnit) -> bool:
|
def has_object_permission(self, request, view, obj: models.TeachingUnit) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
@ -90,7 +89,7 @@ class TeachingUnitPermission(permissions.BasePermission):
|
||||||
|
|
||||||
|
|
||||||
class StudentCardPermission(permissions.BasePermission):
|
class StudentCardPermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: StudentCard) -> bool:
|
def has_object_permission(self, request, view, obj: models.StudentCard) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
@ -108,7 +107,7 @@ class StudentCardPermission(permissions.BasePermission):
|
||||||
|
|
||||||
|
|
||||||
class TeachingSessionPermission(permissions.BasePermission):
|
class TeachingSessionPermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: TeachingSession) -> bool:
|
def has_object_permission(self, request, view, obj: models.TeachingSession) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
@ -134,7 +133,7 @@ class TeachingSessionPermission(permissions.BasePermission):
|
||||||
|
|
||||||
|
|
||||||
class AttendancePermission(permissions.BasePermission):
|
class AttendancePermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: Attendance) -> bool:
|
def has_object_permission(self, request, view, obj: models.Attendance) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
@ -160,7 +159,7 @@ class AttendancePermission(permissions.BasePermission):
|
||||||
|
|
||||||
|
|
||||||
class AbsencePermission(permissions.BasePermission):
|
class AbsencePermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: Absence) -> bool:
|
def has_object_permission(self, request, view, obj: models.Absence) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
@ -186,7 +185,7 @@ class AbsencePermission(permissions.BasePermission):
|
||||||
|
|
||||||
|
|
||||||
class AbsenceAttachmentPermission(permissions.BasePermission):
|
class AbsenceAttachmentPermission(permissions.BasePermission):
|
||||||
def has_object_permission(self, request, view, obj: AbsenceAttachment) -> bool:
|
def has_object_permission(self, request, view, obj: models.AbsenceAttachment) -> bool:
|
||||||
# if the requesting user is admin, allow all
|
# if the requesting user is admin, allow all
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -6,8 +6,7 @@ A serializers tell the API how should a model should be serialized to be used by
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from Palto.Palto.models import (User, Department, TeachingUnit, StudentCard, TeachingSession, Attendance, Absence,
|
from Palto.Palto import models
|
||||||
AbsenceAttachment, StudentGroup)
|
|
||||||
|
|
||||||
|
|
||||||
# TODO(Raphaël): Voir pour les related_name
|
# TODO(Raphaël): Voir pour les related_name
|
||||||
|
@ -15,56 +14,56 @@ from Palto.Palto.models import (User, Department, TeachingUnit, StudentCard, Tea
|
||||||
|
|
||||||
class UserSerializer(serializers.ModelSerializer):
|
class UserSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = models.User
|
||||||
fields = ['id', 'username', 'first_name', 'last_name', 'email']
|
fields = ['id', 'username', 'first_name', 'last_name', 'email']
|
||||||
|
|
||||||
|
|
||||||
class DepartmentSerializer(serializers.ModelSerializer):
|
class DepartmentSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Department
|
model = models.Department
|
||||||
fields = ['id', 'name', 'email', 'managers']
|
fields = ['id', 'name', 'email', 'managers']
|
||||||
# NOTE: teachers, students
|
# NOTE: teachers, students
|
||||||
|
|
||||||
|
|
||||||
class StudentGroupSerializer(serializers.ModelSerializer):
|
class StudentGroupSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = StudentGroup
|
model = models.StudentGroup
|
||||||
fields = ['id', 'name', 'owner', 'department']
|
fields = ['id', 'name', 'owner', 'department']
|
||||||
# NOTE: students
|
# NOTE: students
|
||||||
|
|
||||||
|
|
||||||
class TeachingUnitSerializer(serializers.ModelSerializer):
|
class TeachingUnitSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TeachingUnit
|
model = models.TeachingUnit
|
||||||
fields = ['id', 'name', 'department']
|
fields = ['id', 'name', 'department']
|
||||||
# NOTE: managers, teachers, student_groups
|
# NOTE: managers, teachers, student_groups
|
||||||
|
|
||||||
|
|
||||||
class StudentCardSerializer(serializers.ModelSerializer):
|
class StudentCardSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = StudentCard
|
model = models.StudentCard
|
||||||
fields = ['id', 'uid', 'department', 'owner']
|
fields = ['id', 'uid', 'department', 'owner']
|
||||||
|
|
||||||
|
|
||||||
class TeachingSessionSerializer(serializers.ModelSerializer):
|
class TeachingSessionSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TeachingSession
|
model = models.TeachingSession
|
||||||
fields = ['id', 'start', 'duration', 'note', 'unit', 'group', 'teacher']
|
fields = ['id', 'start', 'duration', 'note', 'unit', 'group', 'teacher']
|
||||||
|
|
||||||
|
|
||||||
class AttendanceSerializer(serializers.ModelSerializer):
|
class AttendanceSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Attendance
|
model = models.Attendance
|
||||||
fields = ['id', 'date', 'student', 'session']
|
fields = ['id', 'date', 'student', 'session']
|
||||||
|
|
||||||
|
|
||||||
class AbsenceSerializer(serializers.ModelSerializer):
|
class AbsenceSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Absence
|
model = models.Absence
|
||||||
fields = ['id', 'message', 'student', 'session']
|
fields = ['id', 'message', 'student', 'session']
|
||||||
|
|
||||||
|
|
||||||
class AbsenceAttachmentSerializer(serializers.ModelSerializer):
|
class AbsenceAttachmentSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = AbsenceAttachment
|
model = models.AbsenceAttachment
|
||||||
fields = ['id', 'content', 'absence']
|
fields = ['id', 'content', 'absence']
|
||||||
|
|
|
@ -6,7 +6,7 @@ Everything to test the API v1 is described here.
|
||||||
|
|
||||||
from django import test
|
from django import test
|
||||||
|
|
||||||
from Palto.Palto.models import User
|
from Palto.Palto import models
|
||||||
|
|
||||||
|
|
||||||
class UserTestCase(test.TestCase):
|
class UserTestCase(test.TestCase):
|
||||||
|
|
|
@ -7,20 +7,19 @@ All the urls for every model of the API are described here.
|
||||||
|
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
from .views import (UserViewSet, AbsenceAttachmentViewSet, AbsenceViewSet, AttendanceViewSet, TeachingSessionViewSet,
|
from . import views
|
||||||
StudentCardViewSet, TeachingUnitViewSet, StudentGroupViewSet, DepartmentViewSet)
|
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
|
|
||||||
router.register(r'users', UserViewSet, basename="User")
|
router.register(r'users', views.UserViewSet, basename="User")
|
||||||
router.register(r'departments', DepartmentViewSet, basename="Department")
|
router.register(r'departments', views.DepartmentViewSet, basename="Department")
|
||||||
router.register(r'student_groups', StudentGroupViewSet, basename="StudentGroup")
|
router.register(r'student_groups', views.StudentGroupViewSet, basename="StudentGroup")
|
||||||
router.register(r'teaching_units', TeachingUnitViewSet, basename="TeachingUnit")
|
router.register(r'teaching_units', views.TeachingUnitViewSet, basename="TeachingUnit")
|
||||||
router.register(r'student_cards', StudentCardViewSet, basename="StudentCard")
|
router.register(r'student_cards', views.StudentCardViewSet, basename="StudentCard")
|
||||||
router.register(r'teaching_sessions', TeachingSessionViewSet, basename="TeachingSession")
|
router.register(r'teaching_sessions', views.TeachingSessionViewSet, basename="TeachingSession")
|
||||||
router.register(r'attendances', AttendanceViewSet, basename="Attendance")
|
router.register(r'attendances', views.AttendanceViewSet, basename="Attendance")
|
||||||
router.register(r'absences', AbsenceViewSet, basename="Absence")
|
router.register(r'absences', views.AbsenceViewSet, basename="Absence")
|
||||||
router.register(r'absence_attachments', AbsenceAttachmentViewSet, basename="AbsenceAttachment")
|
router.register(r'absence_attachments', views.AbsenceAttachmentViewSet, basename="AbsenceAttachment")
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = router.urls
|
urlpatterns = router.urls
|
||||||
|
|
|
@ -7,65 +7,60 @@ An API view describe which models should display which files to user with which
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from .permissions import (UserPermission, DepartmentPermission, StudentGroupPermission, TeachingUnitPermission,
|
from . import permissions
|
||||||
StudentCardPermission, TeachingSessionPermission, AttendancePermission, AbsencePermission,
|
from . import serializers
|
||||||
AbsenceAttachmentPermission)
|
from ... import models
|
||||||
from .serializers import (UserSerializer, AbsenceAttachmentSerializer, AbsenceSerializer, AttendanceSerializer,
|
|
||||||
TeachingSessionSerializer, StudentCardSerializer, StudentGroupSerializer,
|
|
||||||
DepartmentSerializer, TeachingUnitSerializer)
|
|
||||||
from ...models import (User, AbsenceAttachment, Absence, Attendance, TeachingSession, StudentCard, TeachingUnit,
|
|
||||||
StudentGroup, Department)
|
|
||||||
|
|
||||||
|
|
||||||
class UserViewSet(viewsets.ModelViewSet):
|
class UserViewSet(viewsets.ModelViewSet):
|
||||||
serializer_class = UserSerializer
|
serializer_class = serializers.UserSerializer
|
||||||
queryset = User.objects.all()
|
queryset = models.User.objects.all()
|
||||||
permission_classes = [IsAuthenticated, UserPermission]
|
permission_classes = [IsAuthenticated, permissions.UserPermission]
|
||||||
|
|
||||||
|
|
||||||
class DepartmentViewSet(UserViewSet):
|
class DepartmentViewSet(UserViewSet):
|
||||||
serializer_class = DepartmentSerializer
|
serializer_class = serializers.DepartmentSerializer
|
||||||
queryset = Department.objects.all()
|
queryset = models.Department.objects.all()
|
||||||
permission_classes = [DepartmentPermission]
|
permission_classes = [permissions.DepartmentPermission]
|
||||||
|
|
||||||
|
|
||||||
class StudentGroupViewSet(UserViewSet):
|
class StudentGroupViewSet(UserViewSet):
|
||||||
serializer_class = StudentGroupSerializer
|
serializer_class = serializers.StudentGroupSerializer
|
||||||
queryset = StudentGroup.objects.all()
|
queryset = models.StudentGroup.objects.all()
|
||||||
permission_classes = [IsAuthenticated, StudentGroupPermission]
|
permission_classes = [IsAuthenticated, permissions.StudentGroupPermission]
|
||||||
|
|
||||||
|
|
||||||
class TeachingUnitViewSet(UserViewSet):
|
class TeachingUnitViewSet(UserViewSet):
|
||||||
serializer_class = TeachingUnitSerializer
|
serializer_class = serializers.TeachingUnitSerializer
|
||||||
queryset = TeachingUnit.objects.all()
|
queryset = models.TeachingUnit.objects.all()
|
||||||
permission_classes = [IsAuthenticated, TeachingUnitPermission]
|
permission_classes = [IsAuthenticated, permissions.TeachingUnitPermission]
|
||||||
|
|
||||||
|
|
||||||
class StudentCardViewSet(UserViewSet):
|
class StudentCardViewSet(UserViewSet):
|
||||||
serializer_class = StudentCardSerializer
|
serializer_class = serializers.StudentCardSerializer
|
||||||
queryset = StudentCard.objects.all()
|
queryset = models.StudentCard.objects.all()
|
||||||
permission_classes = [IsAuthenticated, StudentCardPermission]
|
permission_classes = [IsAuthenticated, permissions.StudentCardPermission]
|
||||||
|
|
||||||
|
|
||||||
class TeachingSessionViewSet(UserViewSet):
|
class TeachingSessionViewSet(UserViewSet):
|
||||||
serializer_class = TeachingSessionSerializer
|
serializer_class = serializers.TeachingSessionSerializer
|
||||||
queryset = TeachingSession.objects.all()
|
queryset = models.TeachingSession.objects.all()
|
||||||
permission_classes = [IsAuthenticated, TeachingSessionPermission]
|
permission_classes = [IsAuthenticated, permissions.TeachingSessionPermission]
|
||||||
|
|
||||||
|
|
||||||
class AttendanceViewSet(UserViewSet):
|
class AttendanceViewSet(UserViewSet):
|
||||||
serializer_class = AttendanceSerializer
|
serializer_class = serializers.AttendanceSerializer
|
||||||
queryset = Attendance.objects.all()
|
queryset = models.Attendance.objects.all()
|
||||||
permission_classes = [IsAuthenticated, AttendancePermission]
|
permission_classes = [IsAuthenticated, permissions.AttendancePermission]
|
||||||
|
|
||||||
|
|
||||||
class AbsenceViewSet(UserViewSet):
|
class AbsenceViewSet(UserViewSet):
|
||||||
serializer_class = AbsenceSerializer
|
serializer_class = serializers.AbsenceSerializer
|
||||||
queryset = Absence.objects.all()
|
queryset = models.Absence.objects.all()
|
||||||
permission_classes = [IsAuthenticated, AbsencePermission]
|
permission_classes = [IsAuthenticated, permissions.AbsencePermission]
|
||||||
|
|
||||||
|
|
||||||
class AbsenceAttachmentViewSet(UserViewSet):
|
class AbsenceAttachmentViewSet(UserViewSet):
|
||||||
serializer_class = AbsenceAttachmentSerializer
|
serializer_class = serializers.AbsenceAttachmentSerializer
|
||||||
queryset = AbsenceAttachment.objects.all()
|
queryset = models.AbsenceAttachment.objects.all()
|
||||||
permission_classes = [IsAuthenticated, AbsenceAttachmentPermission]
|
permission_classes = [IsAuthenticated, permissions.AbsenceAttachmentPermission]
|
||||||
|
|
Loading…
Reference in a new issue