From 4cf77e1b18a3819e15729a3d6205bfd7bb35681c Mon Sep 17 00:00:00 2001 From: Chris Li <c58li@uwaterloo.ca> Date: Sat, 11 Feb 2023 12:55:45 -0500 Subject: [PATCH] Enable modify username and email. --- core/serializers/profile.py | 45 +++++++++++++++++++++++++++++++++++-- core/signals.py | 2 +- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/core/serializers/profile.py b/core/serializers/profile.py index 5d1e599..a7b68bf 100644 --- a/core/serializers/profile.py +++ b/core/serializers/profile.py @@ -1,10 +1,51 @@ from rest_framework import serializers +from django_countries.serializers import CountryFieldMixin +from django.contrib.auth.models import User from core.models.profile import Profile +class UserUpdateSerializer(serializers.Serializer): + username = serializers.CharField(required=False) + email = serializers.EmailField(required=False) + + def validate(self, data): + if 'username' in data and User.objects.filter(username=data['username']).count() != 0: + raise serializers.ValidationError({ + 'username': "This username is being used by others." + }) + if 'email' in data and User.objects.filter(username=data['email']).count() != 0: + raise serializers.ValidationError({ + 'email': "This email address is being used by others." + }) + return data + + def update(self, instance, validated_data): + instance.username = validated_data.get('username', instance.username) + instance.email = validated_data.get('email', instance.email) + if validated_data.get('email', None): + instance.is_active = False + instance.save() + return instance + + +class ProfileSerializer(CountryFieldMixin, serializers.ModelSerializer): + user = UserUpdateSerializer(required=False) -class ProfileSerializer(serializers.ModelSerializer): - country = serializers.CharField() class Meta: model = Profile fields = ('user', 'bio', 'birthday', 'country', 'city', 'affiliation', 'photo') + + def update(self, instance, validated_data): + user_data = validated_data.get('user', None) + if user_data: + user = instance.user + user_serializer = UserUpdateSerializer(data=user_data) + user_serializer.is_valid(raise_exception=True) + user_serializer.update(user, user_data) + + for attr in self.Meta.fields: + if attr == 'user': + continue + setattr(instance, attr, validated_data.get(attr, getattr(instance, attr))) + instance.save() + return instance diff --git a/core/signals.py b/core/signals.py index 565a0a8..fc3b6af 100644 --- a/core/signals.py +++ b/core/signals.py @@ -20,7 +20,7 @@ def create_related_profile(sender, instance, created, *args, **kwargs): @receiver(post_save, sender=User) def send_activation_email(sender, instance, created, *args, **kwargs): # send an e-mail to the user - if instance and created: + if instance and (created or not instance.is_active): context = { 'current_user': instance, 'username': instance.username, -- GitLab