funkwhale/api/funkwhale_api/users/serializers.py

137 wiersze
3.7 KiB
Python
Czysty Zwykły widok Historia

import re
from django.core import validators
from django.utils.deconstruct import deconstructible
from django.utils.translation import gettext_lazy as _
2018-05-06 09:30:41 +00:00
from rest_auth.serializers import PasswordResetSerializer as PRS
from rest_auth.registration.serializers import RegisterSerializer as RS
2018-06-10 08:55:16 +00:00
from rest_framework import serializers
2018-07-13 12:10:39 +00:00
from versatileimagefield.serializers import VersatileImageFieldSerializer
from funkwhale_api.activity import serializers as activity_serializers
from funkwhale_api.common import serializers as common_serializers
from . import adapters
from . import models
@deconstructible
class ASCIIUsernameValidator(validators.RegexValidator):
regex = r"^[\w]+$"
message = _(
"Enter a valid username. This value may contain only English letters, "
"numbers, and _ characters."
)
flags = re.ASCII
username_validators = [ASCIIUsernameValidator()]
class RegisterSerializer(RS):
invitation = serializers.CharField(
required=False, allow_null=True, allow_blank=True
)
def validate_invitation(self, value):
if not value:
return
try:
return models.Invitation.objects.open().get(code__iexact=value)
except models.Invitation.DoesNotExist:
raise serializers.ValidationError("Invalid invitation code")
def save(self, request):
user = super().save(request)
if self.validated_data.get("invitation"):
user.invitation = self.validated_data.get("invitation")
user.save(update_fields=["invitation"])
2018-07-22 10:20:16 +00:00
user.actor = models.create_actor(user)
user.save(update_fields=["actor"])
return user
class UserActivitySerializer(activity_serializers.ModelSerializer):
type = serializers.SerializerMethodField()
2018-06-09 13:36:16 +00:00
name = serializers.CharField(source="username")
local_id = serializers.CharField(source="username")
class Meta:
model = models.User
2018-06-09 13:36:16 +00:00
fields = ["id", "local_id", "name", "type"]
def get_type(self, obj):
2018-06-09 13:36:16 +00:00
return "Person"
class AvatarField(
common_serializers.StripExifImageField, VersatileImageFieldSerializer
):
pass
avatar_field = AvatarField(allow_null=True, sizes="square")
2018-07-13 12:10:39 +00:00
2018-07-17 11:09:13 +00:00
class UserBasicSerializer(serializers.ModelSerializer):
avatar = avatar_field
class Meta:
model = models.User
fields = ["id", "username", "name", "date_joined", "avatar"]
2018-03-03 10:20:21 +00:00
class UserWriteSerializer(serializers.ModelSerializer):
2018-07-13 12:10:39 +00:00
avatar = avatar_field
2018-03-03 10:20:21 +00:00
class Meta:
model = models.User
2018-07-13 12:10:39 +00:00
fields = ["name", "privacy_level", "avatar"]
2018-03-03 10:20:21 +00:00
class UserReadSerializer(serializers.ModelSerializer):
permissions = serializers.SerializerMethodField()
full_username = serializers.SerializerMethodField()
2018-07-13 12:10:39 +00:00
avatar = avatar_field
class Meta:
model = models.User
fields = [
2018-06-09 13:36:16 +00:00
"id",
"username",
"full_username",
2018-06-09 13:36:16 +00:00
"name",
"email",
"is_staff",
"is_superuser",
"permissions",
"date_joined",
"privacy_level",
2018-07-13 12:10:39 +00:00
"avatar",
]
def get_permissions(self, o):
return o.get_permissions()
2018-05-06 09:30:41 +00:00
def get_full_username(self, o):
if o.actor:
return o.actor.full_username
2018-05-06 09:30:41 +00:00
class MeSerializer(UserReadSerializer):
quota_status = serializers.SerializerMethodField()
class Meta(UserReadSerializer.Meta):
fields = UserReadSerializer.Meta.fields + ["quota_status"]
def get_quota_status(self, o):
return o.get_quota_status() if o.actor else 0
2018-05-06 09:30:41 +00:00
class PasswordResetSerializer(PRS):
def get_email_options(self):
return {"extra_email_context": adapters.get_email_context()}