2019-12-03 13:22:18 +08:00
|
|
|
from django.conf import settings
|
2019-12-03 14:53:47 +08:00
|
|
|
from django.contrib.auth import login
|
2019-12-03 13:22:18 +08:00
|
|
|
from rest_framework import serializers
|
|
|
|
|
from rest_framework.exceptions import ValidationError
|
|
|
|
|
|
2022-02-18 21:17:27 -08:00
|
|
|
from users.models import User, create_token_if_necessary
|
2019-12-03 13:22:18 +08:00
|
|
|
|
|
|
|
|
|
2020-07-23 23:56:24 +08:00
|
|
|
class PublicUserSerializer(serializers.HyperlinkedModelSerializer):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = User
|
|
|
|
|
fields = (
|
|
|
|
|
'username',
|
|
|
|
|
'gravatar',
|
|
|
|
|
settings.DRF_URL_FIELD_NAME,
|
|
|
|
|
)
|
|
|
|
|
extra_kwargs = {
|
|
|
|
|
settings.DRF_URL_FIELD_NAME: {
|
|
|
|
|
"view_name": "public-users:user-detail",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2019-12-03 13:22:18 +08:00
|
|
|
class UserSerializer(serializers.HyperlinkedModelSerializer):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = User
|
|
|
|
|
fields = (
|
|
|
|
|
'username',
|
2022-02-18 20:27:19 -08:00
|
|
|
'token',
|
2019-12-03 13:22:18 +08:00
|
|
|
'email',
|
|
|
|
|
'gravatar',
|
|
|
|
|
'password',
|
|
|
|
|
'password_repeat',
|
|
|
|
|
settings.DRF_URL_FIELD_NAME,
|
|
|
|
|
)
|
|
|
|
|
extra_kwargs = {
|
|
|
|
|
settings.DRF_URL_FIELD_NAME: {
|
|
|
|
|
"view_name": "users:user-detail",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
password = serializers.CharField(
|
|
|
|
|
write_only=True,
|
|
|
|
|
required=True,
|
|
|
|
|
allow_blank=False,
|
|
|
|
|
min_length=6,
|
|
|
|
|
max_length=32,
|
|
|
|
|
)
|
|
|
|
|
password_repeat = serializers.CharField(
|
|
|
|
|
write_only=True,
|
|
|
|
|
required=True,
|
|
|
|
|
allow_blank=False,
|
|
|
|
|
min_length=6,
|
|
|
|
|
max_length=32,
|
|
|
|
|
)
|
2022-02-18 20:27:19 -08:00
|
|
|
token = serializers.SerializerMethodField(read_only=True)
|
2019-12-03 13:22:18 +08:00
|
|
|
|
|
|
|
|
def create(self, validated_data):
|
2019-12-05 20:18:05 +08:00
|
|
|
if validated_data['password'] != validated_data['password_repeat']:
|
2019-12-03 13:22:18 +08:00
|
|
|
raise ValidationError(
|
|
|
|
|
detail={
|
|
|
|
|
"password_repeat": "Tow password doesn't match",
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
validated_data.pop('password_repeat')
|
|
|
|
|
password = validated_data.pop('password')
|
|
|
|
|
user = super(UserSerializer, self).create(
|
|
|
|
|
validated_data,
|
|
|
|
|
)
|
|
|
|
|
user.set_password(password)
|
|
|
|
|
user.save()
|
2019-12-03 14:53:47 +08:00
|
|
|
login(
|
|
|
|
|
self.context['request'],
|
|
|
|
|
user=user,
|
|
|
|
|
backend=settings.AUTHENTICATION_BACKENDS[0],
|
|
|
|
|
)
|
2019-12-03 13:22:18 +08:00
|
|
|
return user
|
2022-02-18 20:27:19 -08:00
|
|
|
|
|
|
|
|
def get_token(self, obj: User):
|
2022-04-14 07:47:34 -07:00
|
|
|
if self.context['request'].user == obj:
|
|
|
|
|
return create_token_if_necessary(obj).key
|
|
|
|
|
return None
|