paperless-ngx/src/paperless/serialisers.py

116 lines
3.3 KiB
Python
Raw Normal View History

2022-11-12 18:46:52 +00:00
from django.contrib.auth.models import Group
2022-11-13 22:58:07 -08: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
2022-11-23 00:35:17 -08:00
class ObfuscatedUserPasswordField(serializers.Field):
"""
Sends *** string instead of password in the clear
"""
def to_representation(self, value):
return "**********" if len(value) > 0 else ""
def to_internal_value(self, data):
return data
2022-11-12 18:46:52 +00:00
class UserSerializer(serializers.ModelSerializer):
password = ObfuscatedUserPasswordField(required=False)
2022-11-13 22:58:07 -08:00
user_permissions = serializers.SlugRelatedField(
many=True,
queryset=Permission.objects.all(),
slug_field="codename",
2023-03-01 00:33:01 -08:00
required=False,
2022-11-13 22:58:07 -08:00
)
2022-11-12 18:46:52 +00:00
inherited_permissions = serializers.SerializerMethodField()
class Meta:
model = User
fields = (
"id",
"username",
"email",
2022-11-23 00:35:17 -08:00
"password",
2022-11-12 18:46:52 +00:00
"first_name",
"last_name",
"date_joined",
"is_staff",
"is_active",
2022-11-12 18:46:52 +00:00
"is_superuser",
"groups",
2022-11-13 22:58:07 -08:00
"user_permissions",
2022-11-12 18:46:52 +00:00
"inherited_permissions",
)
def get_inherited_permissions(self, obj):
return obj.get_group_permissions()
2022-11-12 18:46:52 +00:00
2022-11-23 00:35:17 -08:00
def update(self, instance, validated_data):
if "password" in validated_data:
if len(validated_data.get("password").replace("*", "")) > 0:
instance.set_password(validated_data.get("password"))
instance.save()
validated_data.pop("password")
super().update(instance, validated_data)
return instance
def create(self, validated_data):
groups = None
if "groups" in validated_data:
groups = validated_data.pop("groups")
user_permissions = None
if "user_permissions" in validated_data:
user_permissions = validated_data.pop("user_permissions")
password = None
if (
"password" in validated_data
and len(validated_data.get("password").replace("*", "")) > 0
):
password = validated_data.pop("password")
2022-11-23 00:35:17 -08:00
user = User.objects.create(**validated_data)
# set groups
if groups:
user.groups.set(groups)
# set permissions
if user_permissions:
user.user_permissions.set(user_permissions)
# set password
if password:
user.set_password(password)
user.save()
return user
2022-11-12 18:46:52 +00:00
class GroupSerializer(serializers.ModelSerializer):
2022-11-13 22:58:07 -08:00
permissions = serializers.SlugRelatedField(
many=True,
queryset=Permission.objects.all(),
slug_field="codename",
)
2022-11-12 18:46:52 +00:00
class Meta:
model = Group
fields = (
"id",
"name",
"permissions",
)
2023-12-02 08:26:42 -08:00
class ProfileSerializer(serializers.ModelSerializer):
email = serializers.EmailField(allow_null=False)
password = ObfuscatedUserPasswordField(required=False, allow_null=False)
auth_token = serializers.SlugRelatedField(read_only=True, slug_field="key")
class Meta:
model = User
fields = (
"email",
"password",
"first_name",
"last_name",
"auth_token",
)