Skip to content
Snippets Groups Projects
Commit 402a9a97 authored by Bodor Máté's avatar Bodor Máté
Browse files

Add role base permissions

parent 6b4ff46f
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,7 @@ from rest_framework import viewsets ...@@ -2,6 +2,7 @@ from rest_framework import viewsets
from rest_framework import permissions from rest_framework import permissions
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.decorators import list_route from rest_framework.decorators import list_route
from common.permissions import IsSafeOrPatch
from . import models from . import models
from . import serializers from . import serializers
...@@ -9,11 +10,11 @@ from . import serializers ...@@ -9,11 +10,11 @@ from . import serializers
class ProfileViewSet(viewsets.ModelViewSet): class ProfileViewSet(viewsets.ModelViewSet):
serializer_class = serializers.ProfileSerializer serializer_class = serializers.ProfileSerializer
permission_classes = (permissions.IsAuthenticated, ) permission_classes = (permissions.IsAuthenticated, IsSafeOrPatch)
def get_queryset(self): def get_queryset(self):
user = self.request.user user = self.request.user
if user.has_perm(permissions.IsAdminUser): if user.profile.role == 'Staff':
role = self.request.query_params.get("role", None) role = self.request.query_params.get("role", None)
if role is not None: if role is not None:
return models.Profile.objects.filter(role=role) return models.Profile.objects.filter(role=role)
......
...@@ -3,27 +3,36 @@ from rest_framework.permissions import SAFE_METHODS ...@@ -3,27 +3,36 @@ from rest_framework.permissions import SAFE_METHODS
class IsStaffOrReadOnly(BasePermission): class IsStaffOrReadOnly(BasePermission):
"""
The request is authenticated as a staff, or is a read-only request.
"""
def has_permission(self, request, view): def has_permission(self, request, view):
return request.method in SAFE_METHODS or request.user and request.user.is_staff return request.method in SAFE_METHODS or\
(request.user.is_authenticated and request.user.profile.role == 'Staff')
class IsStaffOrReadOnlyForAuthenticated(BasePermission): class IsStaffOrReadOnlyForAuthenticated(BasePermission):
"""
The request is authenticated as a staff, or is a read-only request for authenticated.
"""
def has_permission(self, request, view): def has_permission(self, request, view):
return request.user.is_staff or request.method in SAFE_METHODS and request.user.is_authenticated return request.user.is_authenticated and\
(request.method in SAFE_METHODS or request.user.profile.role == 'Staff')
class IsStaffUser(BasePermission): class IsStaffUser(BasePermission):
""" def has_permission(self, request, view):
The request is authenticated as a staff return request.user.is_authenticated and request.user.profile.role == 'Staff'
"""
class IsSafeOrPatch(BasePermission):
def has_permission(self, request, view):
return request.method in SAFE_METHODS or request.method == 'PATCH'
class IsStaffOrStudent(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated and\
(request.user.profile.role == 'Staff' or request.user.profile.role == 'Student')
class StudentJustCreate(BasePermission):
def has_permission(self, request, view): def has_permission(self, request, view):
return request.user.is_staff if request.user.is_authenticated and request.user.profile.role == 'Staff':
return True
return request.user.is_authenticated and request.user.profile.role == 'Student' and\
(request.method in SAFE_METHODS or request.method == 'CREATE')
...@@ -8,4 +8,4 @@ from . import serializers ...@@ -8,4 +8,4 @@ from . import serializers
class DocumentViewSet(viewsets.ModelViewSet): class DocumentViewSet(viewsets.ModelViewSet):
queryset = models.Document.objects.all() queryset = models.Document.objects.all()
serializer_class = serializers.DocumentSerializer serializer_class = serializers.DocumentSerializer
permission_classes = (permissions.IsStaffOrReadOnly, ) permission_classes = (permissions.IsStaffOrStudent, )
from rest_framework import viewsets from rest_framework import viewsets
from common import permissions
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from . import serializers from . import serializers
from . import models from . import models
from common import permissions
class TasksViewSet(viewsets.ModelViewSet): class TasksViewSet(viewsets.ModelViewSet):
...@@ -14,12 +14,12 @@ class TasksViewSet(viewsets.ModelViewSet): ...@@ -14,12 +14,12 @@ class TasksViewSet(viewsets.ModelViewSet):
class SolutionsViewSet(viewsets.ModelViewSet): class SolutionsViewSet(viewsets.ModelViewSet):
serializer_class = serializers.SolutionSerializer serializer_class = serializers.SolutionSerializer
permission_classes = (IsAuthenticated, ) permission_classes = (permissions.IsStaffOrStudent, permissions.StudentJustCreate)
def get_queryset(self): def get_queryset(self):
user = self.request.user user = self.request.user
queryset = models.Solution.objects.filter(created_by=user.profile) queryset = models.Solution.objects.filter(created_by=user.profile)
if user.has_perm(permissions.IsStaffUser): if user.profile.role == 'Staff':
queryset = models.Solution.objects.all() queryset = models.Solution.objects.all()
profile_id = self.request.query_params.get('profileID', None) profile_id = self.request.query_params.get('profileID', None)
if profile_id is not None: if profile_id is not None:
......
# Generated by Django 2.0.1 on 2019-01-14 18:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('stats', '0005_auto_20190114_1713'),
]
operations = [
migrations.AlterField(
model_name='event',
name='visitors',
field=models.ManyToManyField(blank=True, related_name='events', to='account.Profile'),
),
]
...@@ -12,7 +12,6 @@ class Event(models.Model): ...@@ -12,7 +12,6 @@ class Event(models.Model):
Profile, Profile,
related_name='events', related_name='events',
blank=True, blank=True,
null=True,
) )
created_by = models.ForeignKey( created_by = models.ForeignKey(
Profile, Profile,
......
...@@ -6,7 +6,6 @@ from . import models ...@@ -6,7 +6,6 @@ from . import models
class EventSerializer(serializers.ModelSerializer): class EventSerializer(serializers.ModelSerializer):
created_by_name = serializers.SerializerMethodField() created_by_name = serializers.SerializerMethodField()
visitor_number = serializers.SerializerMethodField() visitor_number = serializers.SerializerMethodField()
# visitors = serializers.SerializerMethodField()
class Meta: class Meta:
model = models.Event model = models.Event
...@@ -19,9 +18,6 @@ class EventSerializer(serializers.ModelSerializer): ...@@ -19,9 +18,6 @@ class EventSerializer(serializers.ModelSerializer):
def get_visitor_number(self, obj): def get_visitor_number(self, obj):
return obj.visitors.all().count() return obj.visitors.all().count()
# def get_visitors(self, obj):
# return obj.visitors.all()
class NoteSerializer(serializers.ModelSerializer): class NoteSerializer(serializers.ModelSerializer):
created_by = serializers.HiddenField(default=CurrentUserProfileDefault()) created_by = serializers.HiddenField(default=CurrentUserProfileDefault())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment