2022-11-12 18:46:52 +00:00
|
|
|
from django.contrib.auth.models import Group
|
2022-11-13 21:55:37 +00:00
|
|
|
from django.contrib.auth.models import Permission
|
2022-11-12 18:46:52 +00:00
|
|
|
from django.contrib.auth.models import User
|
|
|
|
|
from rest_framework import serializers
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
|
|
|
|
|
|
|
|
inherited_permissions = serializers.SerializerMethodField()
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = User
|
|
|
|
|
fields = (
|
|
|
|
|
"id",
|
|
|
|
|
"username",
|
|
|
|
|
"first_name",
|
|
|
|
|
"last_name",
|
2022-11-13 21:55:37 +00:00
|
|
|
"email",
|
2022-11-12 18:46:52 +00:00
|
|
|
"date_joined",
|
2022-11-13 21:55:37 +00:00
|
|
|
"last_login",
|
2022-11-12 18:46:52 +00:00
|
|
|
"is_active",
|
2022-11-13 21:55:37 +00:00
|
|
|
"is_staff",
|
2022-11-12 18:46:52 +00:00
|
|
|
"is_superuser",
|
|
|
|
|
"groups",
|
2022-11-13 21:55:37 +00:00
|
|
|
"user_permissions",
|
2022-11-12 18:46:52 +00:00
|
|
|
"inherited_permissions",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def get_inherited_permissions(self, obj):
|
2022-11-13 21:55:37 +00:00
|
|
|
inherited_permissions_ids = []
|
|
|
|
|
inherited_permissions = obj.get_group_permissions()
|
|
|
|
|
for permission in inherited_permissions:
|
|
|
|
|
inherited_permissions_ids.append(
|
|
|
|
|
perm_to_permission(permission).pk,
|
|
|
|
|
)
|
|
|
|
|
return list(set(inherited_permissions_ids))
|
2022-11-12 18:46:52 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class GroupSerializer(serializers.ModelSerializer):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = Group
|
|
|
|
|
fields = (
|
|
|
|
|
"id",
|
|
|
|
|
"name",
|
|
|
|
|
"permissions",
|
|
|
|
|
)
|
|
|
|
|
|
2022-11-13 21:55:37 +00:00
|
|
|
|
|
|
|
|
def perm_to_permission(perm):
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
Convert a identifier string permission format in 'app_label.codename'
|
|
|
|
|
(teremd as *perm*) to a django permission instance.
|
|
|
|
|
|
|
|
|
|
Examples
|
|
|
|
|
--------
|
|
|
|
|
>>> permission = perm_to_permission('auth.add_user')
|
|
|
|
|
>>> permission.content_type.app_label == 'auth'
|
|
|
|
|
True
|
|
|
|
|
>>> permission.codename == 'add_user'
|
|
|
|
|
True
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
app_label, codename = perm.split(".", 1)
|
|
|
|
|
except IndexError:
|
|
|
|
|
raise AttributeError(
|
|
|
|
|
"The format of identifier string permission (perm) is wrong. "
|
|
|
|
|
"It should be in 'app_label.codename'.",
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
permission = Permission.objects.get(
|
|
|
|
|
content_type__app_label=app_label,
|
|
|
|
|
codename=codename,
|
|
|
|
|
)
|
|
|
|
|
return permission
|