I would like to set IsAuthenticated permission for GET and IsTeamLeader permission for POST with ListCreateAPIView and ModelSerializer, but without having a unique permission that check the request method in has_permission, as suggested in these questions here and here.
How could I do that ?
@permission_classes([IsAuthenticated])
class ManagerListView(ListCreateAPIView):
queryset = Manager.objects.all()
serializer_class = ManagerSerializer
class IsTeamLeader(permissions.BasePermission):
def has_permission(self, request, view):
if Manager.objects.filter(pk=request.user.pk).exists():
return Manager.objects.get(pk=request.user.pk).is_team_leader
class ManagerSerializer(serializers.ModelSerializer):
password1 = serializers.CharField(write_only=True)
password2 = serializers.CharField(write_only=True)
fields = serializers.JSONField(write_only=True)
def validate(self, data):
if data['password1'] != data['password2']:
raise serializers.ValidationError('Passwords must match.')
return data
def create(self, validated_data):
data = {
key: value for key, value in validated_data.items()
if key not in ('password1', 'password2')
}
data['password'] = validated_data['password1']
user = self.Meta.model.objects.create_user(**data)
return user
class Meta:
model = Manager
fields = ('id', 'email', 'first_name', 'last_name', 'username', 'role', 'is_team_leader', 'password1', 'password2', 'fields')
read_only_fields = ('id', 'first_name', 'last_name', 'role', 'is_team_leader', 'address', 'contact')
CodePudding user response:
You can do this by overriding get_permission ftn in your views class, if the method is GET you can return your expected permission class else you can return default it would be for POST method e.g:
def get_permissions(self):
self.permission_classes = [IsTeamLeader]
if self.request.method == "GET":
self.permission_classes = [IsAuthenticated]
return super(ManagerListView, self).get_permissions()
let me know if it helps you.
As above will block the Browsable form in html view you can add one tricky condition and update the ftn. (not recommended)
def get_permissions(self):
self.permission_classes = [IsAuthenticated]
if self.request.method == "POST" and self.request.data:
self.permission_classes = [IsTeamLeader]
return super(ManagerListView, self).get_permissions()
