from rest_framework import serializers from django.contrib.auth import get_user_model from django.urls import reverse from misago.acl import serialize_acl from .user import UserSerializer UserModel = get_user_model() __all__ = ['AuthenticatedUserSerializer', 'AnonymousUserSerializer',] class AuthFlags(object): def get_is_authenticated(self, obj): return bool(obj.is_authenticated) def get_is_anonymous(self, obj): return bool(obj.is_anonymous) class AuthenticatedUserSerializer(UserSerializer, AuthFlags): email = serializers.SerializerMethodField() is_authenticated = serializers.SerializerMethodField() is_anonymous = serializers.SerializerMethodField() class Meta: model = UserModel fields = UserSerializer.Meta.fields + ( 'is_authenticated', 'is_anonymous', ) def get_acl(self, obj): return serialize_acl(obj) def get_email(self, obj): return obj.email def get_api_url(self, obj): return { 'avatar': reverse( 'misago:api:user-avatar', kwargs={'pk': obj.pk}), 'options': reverse( 'misago:api:user-forum-options', kwargs={'pk': obj.pk}), 'username': reverse( 'misago:api:user-username', kwargs={'pk': obj.pk}), 'change_email': reverse( 'misago:api:user-change-email', kwargs={'pk': obj.pk}), 'change_password': reverse( 'misago:api:user-change-password', kwargs={'pk': obj.pk}), } AuthenticatedUserSerializer = AuthenticatedUserSerializer.subset_exclude( 'is_avatar_locked', 'is_blocked', 'is_followed', 'is_signature_locked', 'meta', 'signature', 'status', ) class AnonymousUserSerializer(serializers.Serializer, AuthFlags): id = serializers.ReadOnlyField() acl = serializers.SerializerMethodField() is_authenticated = serializers.SerializerMethodField() is_anonymous = serializers.SerializerMethodField() def get_acl(self, obj): if hasattr(obj, 'acl'): return serialize_acl(obj) else: return {}