114 lines
3.4 KiB
Python
114 lines
3.4 KiB
Python
from __future__ import unicode_literals
|
|
|
|
from django.contrib.auth.models import Group
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from rest_framework import serializers
|
|
from rest_framework.exceptions import ValidationError
|
|
|
|
from user_management.serializers import GroupSerializer
|
|
|
|
from .classes import Permission
|
|
from .models import Role, StoredPermission
|
|
|
|
|
|
class PermissionSerializer(serializers.Serializer):
|
|
namespace = serializers.CharField()
|
|
pk = serializers.CharField()
|
|
label = serializers.CharField()
|
|
|
|
def to_representation(self, instance):
|
|
if isinstance(instance, StoredPermission):
|
|
return super(PermissionSerializer, self).to_representation(
|
|
instance.volatile_permission
|
|
)
|
|
else:
|
|
return super(PermissionSerializer, self).to_representation(
|
|
instance
|
|
)
|
|
|
|
|
|
class RoleSerializer(serializers.HyperlinkedModelSerializer):
|
|
groups = GroupSerializer(many=True)
|
|
|
|
class Meta:
|
|
extra_kwargs = {
|
|
'url': {'view_name': 'rest_api:role-detail'},
|
|
}
|
|
fields = ('groups', 'id', 'label', 'url')
|
|
model = Role
|
|
|
|
|
|
class WritableRoleSerializer(serializers.HyperlinkedModelSerializer):
|
|
groups_pk_list = serializers.CharField(
|
|
help_text=_(
|
|
'Comma separated list of groups primary keys to add to, or replace'
|
|
' in this role.'
|
|
), required=False
|
|
)
|
|
|
|
permissions_pk_list = serializers.CharField(
|
|
help_text=_(
|
|
'Comma separated list of permission primary keys to grant to this '
|
|
'role.'
|
|
), required=False
|
|
)
|
|
|
|
class Meta:
|
|
fields = ('groups_pk_list', 'id', 'label', 'permissions_pk_list')
|
|
model = Role
|
|
|
|
def create(self, validated_data):
|
|
result = validated_data.copy()
|
|
|
|
self.groups_pk_list = validated_data.pop('groups_pk_list', '')
|
|
self.permissions_pk_list = validated_data.pop(
|
|
'permissions_pk_list', ''
|
|
)
|
|
|
|
instance = super(WritableRoleSerializer, self).create(validated_data)
|
|
|
|
if self.groups_pk_list:
|
|
self._add_groups(instance=instance)
|
|
|
|
if self.permissions_pk_list:
|
|
self._add_permissions(instance=instance)
|
|
|
|
return result
|
|
|
|
def _add_groups(self, instance):
|
|
instance.groups.add(
|
|
*Group.objects.filter(pk__in=self.groups_pk_list.split(','))
|
|
)
|
|
|
|
def _add_permissions(self, instance):
|
|
for pk in self.permissions_pk_list.split(','):
|
|
try:
|
|
stored_permission = Permission.get(get_dict={'pk': pk})
|
|
instance.permissions.add(stored_permission)
|
|
instance.save()
|
|
except KeyError:
|
|
raise ValidationError(_('No such permission: %s') % pk)
|
|
|
|
def update(self, instance, validated_data):
|
|
result = validated_data.copy()
|
|
|
|
self.groups_pk_list = validated_data.pop('groups_pk_list', '')
|
|
self.permissions_pk_list = validated_data.pop(
|
|
'permissions_pk_list', ''
|
|
)
|
|
|
|
result = super(WritableRoleSerializer, self).update(
|
|
instance, validated_data
|
|
)
|
|
|
|
if self.groups_pk_list:
|
|
instance.groups.clear()
|
|
self._add_groups(instance=instance)
|
|
|
|
if self.permissions_pk_list:
|
|
instance.permissions.clear()
|
|
self._add_permissions(instance=instance)
|
|
|
|
return result
|