pulseapi/profiles/serializers/profiles.py (136 lines of code) (raw):
from rest_framework import serializers
from pulseapi.entries.models import Entry
from pulseapi.issues.models import Issue
from pulseapi.profiles.models import UserProfile
# Helper function to remove a value from a dictionary
# by key, removing the key itself as well.
def remove_key(data, key):
try:
del data[key]
except KeyError:
pass
class UserProfileBasicSerializer(serializers.BaseSerializer):
"""
A read-only serializer that serializes a user profile by only including indentity
information like `id` and `name`.
"""
def to_representation(self, obj):
return {
'id': obj.id,
'name': obj.name,
'is_active': obj.is_active,
}
class UserProfileTrimExtendedInfoMixin:
def trim_extended_information_from_dict(self, profile, profile_dict):
if profile and profile.enable_extended_information is False:
remove_key(profile_dict, 'user_bio_long')
remove_key(profile_dict, 'program_type')
remove_key(profile_dict, 'program_year')
remove_key(profile_dict, 'affiliation')
# Whether this flag is set or not, it should not
# end up in the actual serialized profile data.
remove_key(profile_dict, 'enable_extended_information')
return profile_dict
class UserProfileListSerializer(UserProfileTrimExtendedInfoMixin, serializers.ModelSerializer):
"""
A serializer to serialize user profiles for optimally viewing
in a list
"""
def to_representation(self, instance):
serialized_profile = super().to_representation(instance)
return self.trim_extended_information_from_dict(
instance,
serialized_profile
)
class Meta:
model = UserProfile
read_only_fields = fields = (
'id',
'name',
'is_active',
'is_group',
'thumbnail',
'user_bio',
'user_bio_long',
'location',
'affiliation',
'profile_type',
'program_type',
'program_year',
)
class UserProfileSerializer(UserProfileTrimExtendedInfoMixin, serializers.ModelSerializer):
"""
Serializes a user profile.
Note that the following fields should only show up when
the 'enable_extended_information' flag is set to True:
- user_bio_long
- program_type
- program_year
- affiliation
"""
profile_id = serializers.ReadOnlyField(source='id')
custom_name = serializers.CharField(
max_length=70,
required=False,
allow_blank=True,
)
location = serializers.CharField(
max_length=1024,
required=False,
allow_blank=True,
)
thumbnail = serializers.ImageField(
required=False,
allow_null=True,
)
issues = serializers.SlugRelatedField(
many=True,
slug_field='name',
queryset=Issue.objects,
required=False
)
twitter = serializers.URLField(
max_length=2048,
required=False,
allow_blank=True,
)
linkedin = serializers.URLField(
max_length=2048,
required=False,
allow_blank=True,
)
github = serializers.URLField(
max_length=2048,
required=False,
allow_blank=True,
)
website = serializers.URLField(
max_length=2048,
required=False,
allow_blank=True,
)
user_bio = serializers.CharField(
max_length=140,
required=False,
allow_blank=True,
)
is_active = serializers.BooleanField(required=False)
profile_type = serializers.StringRelatedField()
program_type = serializers.StringRelatedField()
program_year = serializers.StringRelatedField()
entry_count = serializers.SerializerMethodField()
def get_entry_count(self, obj):
entry_queryset = Entry.objects.public()
return {
'created': obj.related_entry_creators.filter(entry__in=entry_queryset).count(),
'published': entry_queryset.filter(
published_by=obj.related_user
).count() if getattr(obj, 'related_user', None) else 0,
'favorited': obj.bookmarks_from.count(),
}
def to_representation(self, instance):
serialized_profile = super().to_representation(instance)
return self.trim_extended_information_from_dict(
instance,
serialized_profile
)
def update(self, instance, validated_data):
validated_data = self.trim_extended_information_from_dict(
instance,
validated_data
)
return super(UserProfileSerializer, self).update(instance, validated_data)
class Meta:
"""
Meta class. Because
"""
model = UserProfile
read_only_fields = ('profile_type', 'entry_count', 'is_active',)
exclude = [
'created_at',
'bookmarks',
'id',
'is_group',
]
class UserProfilePublicSerializer(UserProfileSerializer):
"""
Serializes a user profile for public view
"""
name = serializers.CharField(read_only=True)
my_profile = serializers.SerializerMethodField()
def get_my_profile(self, instance):
user = self.context.get('user')
return user == instance.user