Files
mayan-edms/mayan/apps/user_management/serializers.py
Roberto Rosario ae1634c378 Users: Finish API refactor
- Update groups add, remove and users add, remove methods trigger
only one event on the parent method and multiple on the child method.

- Add missing group_list, _add, _remove permissions.

- Monkey patch Django's User and Group model save method to
trigger the creation and edited events.

- Monkeypatch user sorting to silence warnings.

- Improve test mixins to allow reuse of view and API view
requests.

- Finish adding all API tests.

- Add events test from API view requests.

- Remove event commits from views.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2019-02-08 00:44:26 -04:00

171 lines
5.6 KiB
Python

from __future__ import unicode_literals
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.contrib.auth.password_validation import validate_password
from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers
from mayan.apps.rest_api.mixins import ExternalObjectListSerializerMixin
from .permissions import permission_group_edit, permission_user_edit
from .querysets import get_user_queryset
class GroupSerializer(serializers.HyperlinkedModelSerializer):
user_add_url = serializers.HyperlinkedIdentityField(
lookup_url_kwarg='group_id', view_name='rest_api:group-user-add'
)
user_list_url = serializers.HyperlinkedIdentityField(
lookup_url_kwarg='group_id', view_name='rest_api:group-user-list'
)
user_remove_url = serializers.HyperlinkedIdentityField(
lookup_url_kwarg='group_id', view_name='rest_api:group-user-remove'
)
class Meta:
extra_kwargs = {
'url': {
'lookup_url_kwarg': 'group_id',
'view_name': 'rest_api:group-detail'
}
}
fields = (
'id', 'name', 'url', 'user_add_url', 'user_list_url',
'user_remove_url'
)
model = Group
class GroupUserAddRemoveSerializer(ExternalObjectListSerializerMixin, serializers.Serializer):
user_id = serializers.CharField(
help_text=_(
'Primary key of the user that will be added or removed.'
), required=False, write_only=True
)
user_id_list = serializers.CharField(
help_text=_(
'Comma separated list of user primary keys that will be added or '
'removed.'
), required=False, write_only=True
)
class Meta:
external_object_list_queryset = get_user_queryset()
external_object_list_permission = permission_user_edit
external_object_list_pk_field = 'user_id'
external_object_list_pk_list_field = 'user_id_list'
def users_add(self, instance):
instance.users_add(
users=self.get_external_object_list(),
_user=self.context['request'].user
)
def users_remove(self, instance):
instance.users_remove(
users=self.get_external_object_list(),
_user=self.context['request'].user
)
class UserGroupAddRemoveSerializer(ExternalObjectListSerializerMixin, serializers.Serializer):
group_id = serializers.CharField(
help_text=_(
'Primary key of the group that will be added or removed.'
), required=False, write_only=True
)
group_id_list = serializers.CharField(
help_text=_(
'Comma separated list of group primary keys that will be added or '
'removed.'
), required=False, write_only=True
)
class Meta:
external_object_list_queryset = Group.objects.all()
external_object_list_permission = permission_group_edit
external_object_list_pk_field = 'group_id'
external_object_list_pk_list_field = 'group_id_list'
def groups_add(self, instance):
instance.groups_add(
groups=self.get_external_object_list(),
_user=self.context['request'].user
)
def groups_remove(self, instance):
instance.groups_remove(
groups=self.get_external_object_list(),
_user=self.context['request'].user
)
class UserSerializer(serializers.HyperlinkedModelSerializer):
group_add_url = serializers.HyperlinkedIdentityField(
lookup_url_kwarg='user_id', view_name='rest_api:user-group-add'
)
group_list_url = serializers.HyperlinkedIdentityField(
lookup_url_kwarg='user_id', view_name='rest_api:user-group-list'
)
group_remove_url = serializers.HyperlinkedIdentityField(
lookup_url_kwarg='user_id', view_name='rest_api:user-group-remove'
)
password = serializers.CharField(
required=False, style={'input_type': 'password'}, write_only=True
)
class Meta:
extra_kwargs = {
'url': {
'lookup_url_kwarg': 'user_id',
'view_name': 'rest_api:user-detail'
}
}
fields = (
'first_name', 'date_joined', 'email', 'group_add_url',
'group_list_url', 'group_remove_url', 'id', 'is_active',
'last_login', 'last_name', 'password', 'url', 'username'
)
model = get_user_model()
read_only_fields = ('is_active', 'last_login', 'date_joined')
def create(self, validated_data):
password = validated_data.pop('password', None)
instance = super(UserSerializer, self).create(validated_data)
if password:
instance.set_password(password)
instance.save()
return instance
def update(self, instance, validated_data):
if 'password' in validated_data:
instance.set_password(validated_data['password'])
validated_data.pop('password')
instance = super(UserSerializer, self).update(instance, validated_data)
return instance
def validate(self, data):
if 'password' in data:
validate_password(data['password'], self.instance)
return data
class CurrentUserSerializer(UserSerializer):
class Meta(UserSerializer.Meta):
# Remove some fields that don't apply to the current user
_field_list = (
'group_add_url', 'group_list_url', 'group_remove_url', 'url'
)
fields = [
field for field in UserSerializer.Meta.fields if field not in _field_list
]