diff --git a/core/serializers/profile.py b/core/serializers/profile.py index 5d1e599a3c2c58e6fdaecd9393b3ce994de3132a..a7b68bf560210952434e884e7858b9c07b8e0737 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 565a0a81729237eb4d3d9b50d16cb0605c0332fe..fc3b6af5d9b10d9b0239b841bef77c678865cc41 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,