from rest_framework import serializers from account import models from common import email class ChoiceSerializer(serializers.ModelSerializer): class Meta: model = models.GroupChoice fields = ('choice', 'profile') class ProfileSerializer_User(serializers.ModelSerializer): groups = serializers.SlugRelatedField( many=True, slug_field='choice', queryset=models.GroupChoice.objects.all()) updated_at = serializers.DateTimeField(read_only=True) full_name = serializers.SerializerMethodField() bits = serializers.SerializerMethodField() class Meta: model = models.Profile read_only_fields = ('id', 'join_date', 'updated_at', 'full_name', ) fields = ( 'id', 'join_date', 'updated_at', 'nick', 'signed', 'groups', 'motivation_about', 'motivation_profession', 'motivation_exercise', 'full_name', 'role', 'bits' ) def validate_updated_at(self, value): deadline = models.Deadline.get_solo().deadline if deadline is not None and value > deadline: raise serializers.ValidationError( "You cannot join after the deadline") return value def validate_role(self, value): modifier_role = self.context['request'].user.profile.role if value != modifier_role: raise serializers.ValidationError( "You don't have permission to change role") return value def validate_signed(self, value): if value is False: raise serializers.ValidationError("You cannot join without signed") return value def update(self, instance, validated_data): new_role = validated_data.get('role', instance.role) if instance.role != new_role: if new_role == 'Student': email.admitted(instance.user) if new_role == 'Denied': email.denied(instance.user) return super().update(instance, validated_data) def get_full_name(self, obj): return obj.full_name def get_bits(self, obj): if obj.homework_bits is None: return obj.events_visited return obj.homework_bits + obj.events_visited class ProfileSerializer_Staff(serializers.ModelSerializer): groups = serializers.SlugRelatedField( many=True, slug_field='choice', queryset=models.GroupChoice.objects.all()) updated_at = serializers.DateTimeField(read_only=True) full_name = serializers.SerializerMethodField() class Meta: model = models.Profile read_only_fields = ('id', 'join_date', 'updated_at', 'full_name', ) fields = ( 'id', 'join_date', 'updated_at', 'nick', 'signed', 'groups', 'motivation_about', 'motivation_profession', 'motivation_exercise', 'full_name', 'role', 'events_visited', 'homework_bits' ) def validate_updated_at(self, value): deadline = models.Deadline.get_solo().deadline if deadline is not None and value > deadline: raise serializers.ValidationError( "You cannot join after the deadline") return value def validate_role(self, value): return value def validate_signed(self, value): return value def update(self, instance, validated_data): new_role = validated_data.get('role', instance.role) if instance.role != new_role: if new_role == 'Student': email.admitted(instance.user) if new_role == 'Denied': email.denied(instance.user) return super().update(instance, validated_data) def get_full_name(self, obj): return obj.full_name class MonitoringSerializer(serializers.ModelSerializer): full_name = serializers.SerializerMethodField() email = serializers.SerializerMethodField() class Meta: model = models.Profile read_only_fields = ( 'full_name', 'email', 'events_visited', 'homework_bits', ) fields = ( 'full_name', 'email', 'events_visited', 'homework_bits', ) def get_full_name(self, obj): return obj.full_name def get_email(self, obj): return obj.user.email