From 5cb0bc110d60a05d73901b6d1947418f2b942e33 Mon Sep 17 00:00:00 2001 From: Gijs Hendriksen Date: Wed, 28 Nov 2018 21:04:30 +0100 Subject: [PATCH] Updated MemberRetrieveSerializer to ProfileRetrieveSerializer --- website/members/api/serializers.py | 97 ++++++++++++++++-------------- website/members/api/viewsets.py | 22 +++---- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/website/members/api/serializers.py b/website/members/api/serializers.py index eb7e1379..5b8983e4 100644 --- a/website/members/api/serializers.py +++ b/website/members/api/serializers.py @@ -1,4 +1,3 @@ -from django.conf import settings from django.templatetags.static import static from django.urls import reverse from rest_framework import serializers @@ -7,7 +6,6 @@ from events.api.serializers import CalenderJSSerializer from members.models import Member, Profile from members.services import member_achievements, member_societies from thaliawebsite.api.services import create_image_thumbnail_dict -from utils.templatetags.thumbnail import thumbnail class MemberBirthdaySerializer(CalenderJSSerializer): @@ -48,63 +46,46 @@ class MemberBirthdaySerializer(CalenderJSSerializer): return 'white' -class MemberRetrieveSerializer(serializers.ModelSerializer): +class ProfileRetrieveSerializer(serializers.ModelSerializer): class Meta: - model = Member + model = Profile fields = ('pk', 'display_name', 'avatar', 'profile_description', 'birthday', 'starting_year', 'programme', 'website', 'membership_type', 'achievements', 'societies') - display_name = serializers.SerializerMethodField('_display_name') + pk = serializers.SerializerMethodField('_pk') avatar = serializers.SerializerMethodField('_avatar') - profile_description = serializers.SerializerMethodField( - '_profile_description') birthday = serializers.SerializerMethodField('_birthday') - starting_year = serializers.SerializerMethodField('_starting_year') - programme = serializers.SerializerMethodField('_programme') - website = serializers.SerializerMethodField('_website') membership_type = serializers.SerializerMethodField('_membership_type') achievements = serializers.SerializerMethodField('_achievements') societies = serializers.SerializerMethodField('_societies') - def _display_name(self, instance): - return instance.profile.display_name() - - def _profile_description(self, instance): - return instance.profile.profile_description + def _pk(self, instance): + return instance.user.pk def _birthday(self, instance): - if instance.profile.show_birthday: - return instance.profile.birthday + if instance.show_birthday: + return instance.birthday return None - def _starting_year(self, instance): - return instance.profile.starting_year - - def _programme(self, instance): - return instance.profile.programme - - def _website(self, instance): - return instance.profile.website - def _membership_type(self, instance): - membership = instance.current_membership + membership = instance.user.current_membership if membership: return membership.type return None def _achievements(self, instance): - return member_achievements(instance) + return member_achievements(instance.user) def _societies(self, instance): - return member_societies(instance) + return member_societies(instance.user) def _avatar(self, instance): placeholder = self.context['request'].build_absolute_uri( static('members/images/default-avatar.jpg')) file = None - if instance.profile.photo: - file = instance.profile.photo + if instance.photo: + file = instance.photo return create_image_thumbnail_dict( self.context['request'], file, placeholder=placeholder, size_large='800x800') @@ -113,25 +94,14 @@ class MemberRetrieveSerializer(serializers.ModelSerializer): class MemberListSerializer(serializers.ModelSerializer): class Meta: model = Member - fields = ('pk', 'display_name', 'photo', 'avatar') + fields = ('pk', 'display_name', 'avatar') display_name = serializers.SerializerMethodField('_display_name') - photo = serializers.SerializerMethodField('_photo') avatar = serializers.SerializerMethodField('_avatar') def _display_name(self, instance): return instance.profile.display_name() - def _photo(self, instance): - if instance.profile.photo: - return self.context['request'].build_absolute_uri( - thumbnail(instance.profile.photo, - settings.THUMBNAIL_SIZES['medium'], - 1)) - else: - return self.context['request'].build_absolute_uri( - static('members/images/default-avatar.jpg')) - def _avatar(self, instance): placeholder = self.context['request'].build_absolute_uri( static('members/images/default-avatar.jpg')) @@ -143,19 +113,32 @@ class MemberListSerializer(serializers.ModelSerializer): size_large='800x800') -class ProfileSerializer(serializers.ModelSerializer): +class ProfileEditSerializer(serializers.ModelSerializer): class Meta: model = Profile - fields = ('email', 'first_name', 'last_name', 'address_street', + fields = ('pk', 'email', 'first_name', 'last_name', 'address_street', 'address_street2', 'address_postal_code', 'address_city', 'phone_number', 'show_birthday', 'website', 'photo', 'emergency_contact', 'emergency_contact_phone_number', 'profile_description', 'nickname', 'display_name_preference', - 'language', 'receive_optin', 'receive_newsletter') + 'language', 'receive_optin', 'receive_newsletter', + 'display_name', 'avatar', 'birthday', 'starting_year', + 'programme', 'membership_type', 'achievements', 'societies') + read_only_fields = ('display_name', 'starting_year', 'programme', + 'birthday') + + pk = serializers.SerializerMethodField('_pk') email = serializers.SerializerMethodField('_email') first_name = serializers.SerializerMethodField('_first_name') last_name = serializers.SerializerMethodField('_last_name') + avatar = serializers.SerializerMethodField('_avatar') + membership_type = serializers.SerializerMethodField('_membership_type') + achievements = serializers.SerializerMethodField('_achievements') + societies = serializers.SerializerMethodField('_societies') + + def _pk(self, instance): + return instance.user.pk def _email(self, instance): return instance.user.email @@ -166,6 +149,28 @@ class ProfileSerializer(serializers.ModelSerializer): def _last_name(self, instance): return instance.user.last_name + def _membership_type(self, instance): + membership = instance.user.current_membership + if membership: + return membership.type + return None + + def _achievements(self, instance): + return member_achievements(instance.user) + + def _societies(self, instance): + return member_societies(instance.user) + + def _avatar(self, instance): + placeholder = self.context['request'].build_absolute_uri( + static('members/images/default-avatar.jpg')) + file = None + if instance.photo: + file = instance.photo + return create_image_thumbnail_dict( + self.context['request'], file, placeholder=placeholder, + size_large='800x800') + class SentryIdentitySerializer(serializers.ModelSerializer): class Meta: diff --git a/website/members/api/viewsets.py b/website/members/api/viewsets.py index 91ff0338..80eb74d6 100644 --- a/website/members/api/viewsets.py +++ b/website/members/api/viewsets.py @@ -6,9 +6,9 @@ from rest_framework.decorators import action from rest_framework.response import Response from members.api.serializers import (MemberBirthdaySerializer, - MemberRetrieveSerializer, MemberListSerializer, - ProfileSerializer) + ProfileRetrieveSerializer, + ProfileEditSerializer) from members.models import Member from utils.snippets import extract_date_range @@ -24,9 +24,12 @@ class MemberViewset(viewsets.ReadOnlyModelViewSet, def get_serializer_class(self): if self.action == 'retrieve': - return MemberRetrieveSerializer + if (self.is_self_reference() or + self.request.user.has_perm('members.change_profile')): + return ProfileEditSerializer + return ProfileRetrieveSerializer elif self.action.endswith('update'): - return ProfileSerializer + return ProfileEditSerializer return MemberListSerializer def get_queryset(self): @@ -42,20 +45,17 @@ class MemberViewset(viewsets.ReadOnlyModelViewSet, lookup_arg in ('me', str(self.request.member.pk))) def get_permissions(self): - if not self.action.endswith('update') or self.is_self_reference(): + if (self.action and (not self.action.endswith('update') + or self.is_self_reference())): return [permissions.IsAuthenticated()] else: return [permissions.DjangoModelPermissions()] def get_object(self): if self.is_self_reference(): - member = self.request.member + return self.request.member.profile else: - member = super().get_object() - - if self.action.endswith('update'): - return member.profile - return member + return super().get_object().profile def _get_birthdays(self, member, start, end): birthdays = [] -- GitLab