|
@@ -4,18 +4,14 @@ from django.contrib.auth import get_user_model
|
|
from django.urls import reverse
|
|
from django.urls import reverse
|
|
|
|
|
|
from misago.acl import serialize_acl
|
|
from misago.acl import serialize_acl
|
|
|
|
+from misago.core.serializers import MutableFields
|
|
|
|
|
|
from . import RankSerializer
|
|
from . import RankSerializer
|
|
|
|
|
|
|
|
|
|
-__all__ = [
|
|
|
|
- 'AuthenticatedUserSerializer',
|
|
|
|
- 'AnonymousUserSerializer',
|
|
|
|
- 'BasicUserSerializer',
|
|
|
|
- 'UserSerializer',
|
|
|
|
- 'ScoredUserSerializer',
|
|
|
|
- 'UserProfileSerializer',
|
|
|
|
-]
|
|
|
|
|
|
+UserModel = get_user_model()
|
|
|
|
+
|
|
|
|
+__all__ = ['StatusSerializer', 'UserSerializer', 'UserCardSerializer']
|
|
|
|
|
|
|
|
|
|
class StatusSerializer(serializers.Serializer):
|
|
class StatusSerializer(serializers.Serializer):
|
|
@@ -30,193 +26,53 @@ class StatusSerializer(serializers.Serializer):
|
|
banned_until = serializers.DateTimeField()
|
|
banned_until = serializers.DateTimeField()
|
|
|
|
|
|
|
|
|
|
-class AuthenticatedUserSerializer(serializers.ModelSerializer):
|
|
|
|
- acl = serializers.SerializerMethodField()
|
|
|
|
|
|
+class UserSerializer(serializers.ModelSerializer, MutableFields):
|
|
|
|
+ email = serializers.SerializerMethodField()
|
|
rank = RankSerializer(many=False, read_only=True)
|
|
rank = RankSerializer(many=False, read_only=True)
|
|
|
|
+ signature = serializers.SerializerMethodField()
|
|
|
|
+
|
|
|
|
+ acl = serializers.SerializerMethodField()
|
|
|
|
+ is_followed = serializers.SerializerMethodField()
|
|
|
|
+ is_blocked = serializers.SerializerMethodField()
|
|
|
|
+ meta = serializers.SerializerMethodField()
|
|
|
|
+ status = serializers.SerializerMethodField()
|
|
|
|
|
|
absolute_url = serializers.SerializerMethodField()
|
|
absolute_url = serializers.SerializerMethodField()
|
|
api_url = serializers.SerializerMethodField()
|
|
api_url = serializers.SerializerMethodField()
|
|
|
|
|
|
class Meta:
|
|
class Meta:
|
|
- model = get_user_model()
|
|
|
|
|
|
+ model = UserModel
|
|
fields = (
|
|
fields = (
|
|
'id',
|
|
'id',
|
|
'username',
|
|
'username',
|
|
'slug',
|
|
'slug',
|
|
'email',
|
|
'email',
|
|
'joined_on',
|
|
'joined_on',
|
|
- 'is_hiding_presence',
|
|
|
|
- 'title',
|
|
|
|
- 'full_title',
|
|
|
|
- 'short_title',
|
|
|
|
'rank',
|
|
'rank',
|
|
- 'avatars',
|
|
|
|
- 'limits_private_thread_invites_to',
|
|
|
|
- 'unread_private_threads',
|
|
|
|
- 'subscribe_to_started_threads',
|
|
|
|
- 'subscribe_to_replied_threads',
|
|
|
|
- 'threads',
|
|
|
|
- 'posts',
|
|
|
|
- 'followers',
|
|
|
|
- 'following',
|
|
|
|
- 'acl',
|
|
|
|
- 'absolute_url',
|
|
|
|
- 'api_url'
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- def get_acl(self, obj):
|
|
|
|
- return serialize_acl(obj)
|
|
|
|
-
|
|
|
|
- def get_absolute_url(self, obj):
|
|
|
|
- return obj.get_absolute_url()
|
|
|
|
-
|
|
|
|
- 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}),
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-class AnonymousUserSerializer(serializers.Serializer):
|
|
|
|
- id = serializers.ReadOnlyField()
|
|
|
|
- acl = serializers.SerializerMethodField()
|
|
|
|
-
|
|
|
|
- def get_acl(self, obj):
|
|
|
|
- if hasattr(obj, 'acl'):
|
|
|
|
- return serialize_acl(obj)
|
|
|
|
- else:
|
|
|
|
- return {}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-class BaseSerializer(serializers.ModelSerializer):
|
|
|
|
- absolute_url = serializers.SerializerMethodField()
|
|
|
|
-
|
|
|
|
- def get_absolute_url(self, obj):
|
|
|
|
- return obj.get_absolute_url()
|
|
|
|
-
|
|
|
|
- def get_short_title(self, obj):
|
|
|
|
- return obj.short_title
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-class BasicUserSerializer(BaseSerializer):
|
|
|
|
- class Meta:
|
|
|
|
- model = get_user_model()
|
|
|
|
- fields = (
|
|
|
|
- 'id',
|
|
|
|
- 'username',
|
|
|
|
- 'slug',
|
|
|
|
- 'avatars',
|
|
|
|
- 'absolute_url',
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-class UserSerializer(BaseSerializer):
|
|
|
|
- rank = RankSerializer(many=False, read_only=True)
|
|
|
|
- short_title = serializers.SerializerMethodField()
|
|
|
|
- status = serializers.SerializerMethodField()
|
|
|
|
- signature = serializers.SerializerMethodField()
|
|
|
|
-
|
|
|
|
- class Meta:
|
|
|
|
- model = get_user_model()
|
|
|
|
- fields = (
|
|
|
|
- 'id',
|
|
|
|
- 'username',
|
|
|
|
- 'slug',
|
|
|
|
- 'joined_on',
|
|
|
|
- 'avatars',
|
|
|
|
'title',
|
|
'title',
|
|
'short_title',
|
|
'short_title',
|
|
- 'rank',
|
|
|
|
- 'signature',
|
|
|
|
- 'threads',
|
|
|
|
- 'posts',
|
|
|
|
- 'followers',
|
|
|
|
- 'following',
|
|
|
|
- 'status',
|
|
|
|
- 'absolute_url',
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- def get_status(self, obj):
|
|
|
|
- try:
|
|
|
|
- return StatusSerializer(obj.status).data
|
|
|
|
- except AttributeError:
|
|
|
|
- return None
|
|
|
|
-
|
|
|
|
- def get_signature(self, obj):
|
|
|
|
- if obj.has_valid_signature:
|
|
|
|
- return obj.signature_parsed
|
|
|
|
- else:
|
|
|
|
- return None
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-class ScoredUserSerializer(UserSerializer):
|
|
|
|
- meta = serializers.SerializerMethodField()
|
|
|
|
-
|
|
|
|
- class Meta:
|
|
|
|
- model = get_user_model()
|
|
|
|
- fields = (
|
|
|
|
- 'id',
|
|
|
|
- 'username',
|
|
|
|
- 'slug',
|
|
|
|
- 'joined_on',
|
|
|
|
'avatars',
|
|
'avatars',
|
|
- 'title',
|
|
|
|
- 'rank',
|
|
|
|
- 'signature',
|
|
|
|
- 'threads',
|
|
|
|
- 'posts',
|
|
|
|
- 'followers',
|
|
|
|
- 'following',
|
|
|
|
- 'meta',
|
|
|
|
- 'status',
|
|
|
|
- 'absolute_url',
|
|
|
|
- )
|
|
|
|
-
|
|
|
|
- def get_meta(self, obj):
|
|
|
|
- return {'score': obj.score}
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-class UserProfileSerializer(UserSerializer):
|
|
|
|
- email = serializers.SerializerMethodField()
|
|
|
|
- is_followed = serializers.SerializerMethodField()
|
|
|
|
- is_blocked = serializers.SerializerMethodField()
|
|
|
|
- acl = serializers.SerializerMethodField()
|
|
|
|
- api_url = serializers.SerializerMethodField()
|
|
|
|
-
|
|
|
|
- class Meta:
|
|
|
|
- model = get_user_model()
|
|
|
|
- fields = (
|
|
|
|
- 'id',
|
|
|
|
- 'username',
|
|
|
|
- 'slug',
|
|
|
|
- 'email',
|
|
|
|
- 'joined_on',
|
|
|
|
'is_avatar_locked',
|
|
'is_avatar_locked',
|
|
- 'avatars',
|
|
|
|
- 'title',
|
|
|
|
- 'rank',
|
|
|
|
'signature',
|
|
'signature',
|
|
'is_signature_locked',
|
|
'is_signature_locked',
|
|
- 'threads',
|
|
|
|
- 'posts',
|
|
|
|
'followers',
|
|
'followers',
|
|
'following',
|
|
'following',
|
|
|
|
+ 'threads',
|
|
|
|
+ 'posts',
|
|
|
|
+
|
|
|
|
+ 'acl',
|
|
'is_followed',
|
|
'is_followed',
|
|
'is_blocked',
|
|
'is_blocked',
|
|
|
|
+ 'meta',
|
|
'status',
|
|
'status',
|
|
- 'acl',
|
|
|
|
|
|
+
|
|
'absolute_url',
|
|
'absolute_url',
|
|
'api_url',
|
|
'api_url',
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+ def get_acl(self, obj):
|
|
|
|
+ return obj.acl_
|
|
|
|
+
|
|
def get_email(self, obj):
|
|
def get_email(self, obj):
|
|
if (obj == self.context['user'] or
|
|
if (obj == self.context['user'] or
|
|
self.context['user'].acl['can_see_users_emails']):
|
|
self.context['user'].acl['can_see_users_emails']):
|
|
@@ -224,9 +80,6 @@ class UserProfileSerializer(UserSerializer):
|
|
else:
|
|
else:
|
|
return None
|
|
return None
|
|
|
|
|
|
- def get_acl(self, obj):
|
|
|
|
- return obj.acl_
|
|
|
|
-
|
|
|
|
def get_is_followed(self, obj):
|
|
def get_is_followed(self, obj):
|
|
if obj.acl_['can_follow']:
|
|
if obj.acl_['can_follow']:
|
|
return self.context['user'].is_following(obj)
|
|
return self.context['user'].is_following(obj)
|
|
@@ -239,16 +92,42 @@ class UserProfileSerializer(UserSerializer):
|
|
else:
|
|
else:
|
|
return False
|
|
return False
|
|
|
|
|
|
|
|
+ def get_meta(self, obj):
|
|
|
|
+ return {'score': obj.score}
|
|
|
|
+
|
|
|
|
+ def get_short_title(self, obj):
|
|
|
|
+ return obj.short_title
|
|
|
|
+
|
|
|
|
+ def get_signature(self, obj):
|
|
|
|
+ if obj.has_valid_signature:
|
|
|
|
+ return obj.signature_parsed
|
|
|
|
+ else:
|
|
|
|
+ return None
|
|
|
|
+
|
|
|
|
+ def get_status(self, obj):
|
|
|
|
+ try:
|
|
|
|
+ return StatusSerializer(obj.status).data
|
|
|
|
+ except AttributeError:
|
|
|
|
+ return None
|
|
|
|
+
|
|
|
|
+ def get_absolute_url(self, obj):
|
|
|
|
+ return obj.get_absolute_url()
|
|
|
|
+
|
|
def get_api_url(self, obj):
|
|
def get_api_url(self, obj):
|
|
return {
|
|
return {
|
|
'root': reverse('misago:api:user-detail', kwargs={'pk': obj.pk}),
|
|
'root': reverse('misago:api:user-detail', kwargs={'pk': obj.pk}),
|
|
'follow': reverse('misago:api:user-follow', kwargs={'pk': obj.pk}),
|
|
'follow': reverse('misago:api:user-follow', kwargs={'pk': obj.pk}),
|
|
'ban': reverse('misago:api:user-ban', kwargs={'pk': obj.pk}),
|
|
'ban': reverse('misago:api:user-ban', kwargs={'pk': obj.pk}),
|
|
'moderate_avatar': reverse(
|
|
'moderate_avatar': reverse(
|
|
- 'misago:api:user-moderate-avatar',kwargs={'pk': obj.pk}),
|
|
|
|
|
|
+ 'misago:api:user-moderate-avatar', kwargs={'pk': obj.pk}),
|
|
'moderate_username': reverse(
|
|
'moderate_username': reverse(
|
|
- 'misago:api:user-moderate-username',kwargs={'pk': obj.pk}),
|
|
|
|
|
|
+ 'misago:api:user-moderate-username', kwargs={'pk': obj.pk}),
|
|
'delete': reverse('misago:api:user-delete', kwargs={'pk': obj.pk}),
|
|
'delete': reverse('misago:api:user-delete', kwargs={'pk': obj.pk}),
|
|
'threads': reverse('misago:api:user-threads', kwargs={'pk': obj.pk}),
|
|
'threads': reverse('misago:api:user-threads', kwargs={'pk': obj.pk}),
|
|
'posts': reverse('misago:api:user-posts', kwargs={'pk': obj.pk}),
|
|
'posts': reverse('misago:api:user-posts', kwargs={'pk': obj.pk}),
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+UserCardSerializer = UserSerializer.subset_fields(
|
|
|
|
+ 'id', 'username', 'joined_on', 'rank', 'title', 'avatars', 'followers',
|
|
|
|
+ 'threads', 'posts', 'status', 'absolute_url')
|