Beispiel #1
0
class ProfileSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(source='user.id', read_only=True)
    username = serializers.CharField(source='user.username')
    display_name = serializers.CharField(source='name', required=False)
    date_joined = DateTimeUTCField(source='user.date_joined', read_only=True)
    avatar = serializers.SerializerMethodField('get_avatar_url')
    email = (PermissionMod(serializers.EmailField,
                           permissions=[OnlySelf])(source='user.email',
                                                   required=True))
    settings = (PermissionMod(UserSettingSerializer,
                              permissions=[OnlySelf])(many=True,
                                                      read_only=True))
    helpfulness = serializers.ReadOnlyField(source='answer_helpfulness')
    answer_count = serializers.SerializerMethodField()
    question_count = serializers.SerializerMethodField()
    solution_count = serializers.SerializerMethodField()
    last_answer_date = serializers.SerializerMethodField()
    is_active = serializers.BooleanField(source='user.is_active',
                                         read_only=True)
    # This is a write only field. It is very important it stays that way!
    password = serializers.CharField(source='user.password', write_only=True)

    class Meta:
        model = Profile
        fields = [
            'answer_count',
            'avatar',
            'bio',
            'city',
            'country',
            'date_joined',
            'display_name',
            'email',
            'facebook',
            'helpfulness',
            'id',
            'irc_handle',
            'is_active',
            'last_answer_date',
            'locale',
            'mozillians',
            # Password is here so it can be involved in write operations. It is
            # marked as write-only above, so will not be visible.
            'password',
            'question_count',
            'settings',
            'solution_count',
            'timezone',
            'twitter',
            'username',
            'website',
        ]

    def get_avatar_url(self, profile):
        request = self.context.get('request')
        size = request.REQUEST.get('avatar_size', 48) if request else 48
        return profile_avatar(profile.user, size=size)

    def get_question_count(self, profile):
        return num_questions(profile.user)

    def get_answer_count(self, profile):
        return num_answers(profile.user)

    def get_solution_count(self, profile):
        return num_solutions(profile.user)

    def get_last_answer_date(self, profile):
        last_answer = profile.user.answers.order_by('-created').first()
        return last_answer.created if last_answer else None

    def validate(self, data):
        if data.get('name') is None:
            username = data.get('user', {}).get('username')
            data['name'] = username

        return data

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        u = RegistrationProfile.objects.create_inactive_user(
            user_data['username'], user_data['password'], user_data['email'])
        p = u.profile
        for key, val in validated_data.items():
            setattr(p, key, val)
        p.save()
        return p

    def update(self, instance, validated_data):
        if 'user' in validated_data:
            user_data = validated_data.pop('user')
            for key, val in user_data.items():
                setattr(instance.user, key, val)
            instance.user.save()
        return super(ProfileSerializer, self).update(instance, validated_data)

    def validate_username(self, username):
        if re.match(r'^[\w.-]{4,30}$', username) is None:
            raise ValidationError(
                'Usernames may only be letters, numbers, "." and "-".')

        if self.instance:
            # update
            if username != self.instance.user.username:
                raise ValidationError("Can't change this field.")
        else:
            # create
            if User.objects.filter(username=username).exists():
                raise ValidationError('A user with that username exists')

        return username

    def validate_email(self, email):
        if not self.instance:
            # create
            if User.objects.filter(email=email).exists():
                raise ValidationError(
                    'A user with that email address already exists.')
        return email
Beispiel #2
0
class ProfileSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(source="user.id", read_only=True)
    username = serializers.CharField(source="user.username")
    display_name = serializers.CharField(source="name", required=False)
    date_joined = DateTimeUTCField(source="user.date_joined", read_only=True)
    avatar = serializers.SerializerMethodField("get_avatar_url")
    email = PermissionMod(serializers.EmailField,
                          permissions=[OnlySelf])(source="user.email",
                                                  required=True)
    settings = PermissionMod(UserSettingSerializer,
                             permissions=[OnlySelf])(many=True, read_only=True)
    helpfulness = serializers.ReadOnlyField(source="answer_helpfulness")
    answer_count = serializers.SerializerMethodField()
    question_count = serializers.SerializerMethodField()
    solution_count = serializers.SerializerMethodField()
    last_answer_date = serializers.SerializerMethodField()
    is_active = serializers.BooleanField(source="user.is_active",
                                         read_only=True)
    timezone = TimezoneField(required=False)

    class Meta:
        model = Profile
        fields = [
            "answer_count",
            "avatar",
            "bio",
            "city",
            "country",
            "date_joined",
            "display_name",
            "email",
            "facebook",
            "helpfulness",
            "id",
            "irc_handle",
            "is_active",
            "last_answer_date",
            "locale",
            "mozillians",
            "question_count",
            "settings",
            "solution_count",
            "timezone",
            "twitter",
            "username",
            "website",
        ]

    def get_avatar_url(self, profile):
        request = self.context.get("request")
        size = request.GET.get("avatar_size", 200) if request else 200
        return profile_avatar(profile.user, size=size)

    def get_question_count(self, profile):
        return num_questions(profile.user)

    def get_answer_count(self, profile):
        return num_answers(profile.user)

    def get_solution_count(self, profile):
        return num_solutions(profile.user)

    def get_last_answer_date(self, profile):
        last_answer = profile.user.answers.order_by("-created").first()
        return last_answer.created if last_answer else None
Beispiel #3
0
class ProfileSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(source="user.id", read_only=True)
    username = serializers.CharField(source="user.username")
    display_name = serializers.CharField(source="name", required=False)
    date_joined = DateTimeUTCField(source="user.date_joined", read_only=True)
    avatar = serializers.SerializerMethodField("get_avatar_url")
    email = PermissionMod(serializers.EmailField,
                          permissions=[OnlySelf])(source="user.email",
                                                  required=True)
    settings = PermissionMod(UserSettingSerializer,
                             permissions=[OnlySelf])(many=True, read_only=True)
    helpfulness = serializers.ReadOnlyField(source="answer_helpfulness")
    answer_count = serializers.SerializerMethodField()
    question_count = serializers.SerializerMethodField()
    solution_count = serializers.SerializerMethodField()
    last_answer_date = serializers.SerializerMethodField()
    is_active = serializers.BooleanField(source="user.is_active",
                                         read_only=True)
    # This is a write only field. It is very important it stays that way!
    password = serializers.CharField(source="user.password", write_only=True)
    timezone = TimezoneField(required=False)

    class Meta:
        model = Profile
        fields = [
            "answer_count",
            "avatar",
            "bio",
            "city",
            "country",
            "date_joined",
            "display_name",
            "email",
            "facebook",
            "helpfulness",
            "id",
            "irc_handle",
            "is_active",
            "last_answer_date",
            "locale",
            "mozillians",
            # Password is here so it can be involved in write operations. It is
            # marked as write-only above, so will not be visible.
            "password",
            "question_count",
            "settings",
            "solution_count",
            "timezone",
            "twitter",
            "username",
            "website",
        ]

    def get_avatar_url(self, profile):
        request = self.context.get("request")
        size = request.GET.get("avatar_size", 200) if request else 200
        return profile_avatar(profile.user, size=size)

    def get_question_count(self, profile):
        return num_questions(profile.user)

    def get_answer_count(self, profile):
        return num_answers(profile.user)

    def get_solution_count(self, profile):
        return num_solutions(profile.user)

    def get_last_answer_date(self, profile):
        last_answer = profile.user.answers.order_by("-created").first()
        return last_answer.created if last_answer else None

    def validate(self, data):
        if data.get("name") is None:
            username = data.get("user", {}).get("username")
            data["name"] = username

        return data

    def create(self, validated_data):
        user_data = validated_data.pop("user")
        u = RegistrationProfile.objects.create_inactive_user(
            user_data["username"], user_data["password"], user_data["email"])
        p = u.profile
        for key, val in validated_data.items():
            setattr(p, key, val)
        p.save()
        return p

    def update(self, instance, validated_data):
        if "user" in validated_data:
            user_data = validated_data.pop("user")
            for key, val in user_data.items():
                setattr(instance.user, key, val)
            instance.user.save()
        return super(ProfileSerializer, self).update(instance, validated_data)

    def validate_username(self, username):
        if re.match(r"^[\w.-]{4,30}$", username) is None:
            raise ValidationError(
                'Usernames may only be letters, numbers, "." and "-".')

        if self.instance:
            # update
            if username != self.instance.user.username:
                raise ValidationError("Can't change this field.")
        else:
            # create
            if User.objects.filter(username=username).exists():
                raise ValidationError("A user with that username exists")

        return username

    def validate_email(self, email):
        if not self.instance:
            # create
            if User.objects.filter(email=email).exists():
                raise ValidationError(
                    "A user with that email address already exists.")
        return email