Skip to content
Snippets Groups Projects
Commit 58813701 authored by florimondmanca's avatar florimondmanca
Browse files

improve users API

parent 5a27816c
Branches
No related tags found
No related merge requests found
......@@ -4,18 +4,13 @@ from rest_framework import serializers
from users.models import User
class UserSerializer(serializers.ModelSerializer):
"""Serializer for User."""
class UserSerializer(serializers.HyperlinkedModelSerializer):
"""Serializer for User.
date_of_birth = serializers.DateField()
password = serializers.CharField(write_only=True)
Actions: list, retrieve, update, partial_update, delete
"""
def create(self, validated_data):
password = validated_data.pop('password')
user = User.objects.create(**validated_data)
user.set_password(password)
user.save()
return user
date_of_birth = serializers.DateField()
def update(self, instance, validated_data):
for field in validated_data:
......@@ -28,6 +23,34 @@ class UserSerializer(serializers.ModelSerializer):
class Meta: # noqa
model = User
fields = ('id', 'email', 'password',
fields = ('id', 'url', 'email',
'first_name', 'last_name',
'phone_number', 'date_of_birth',)
extra_kwargs = {
'url': {'view_name': 'api:user-detail'},
'email': {'read_only': True},
}
class UserCreateSerializer(UserSerializer):
"""Serializer for creating users.
Actions: create
"""
date_of_birth = serializers.DateField()
password = serializers.CharField(write_only=True)
def create(self, validated_data):
password = validated_data.pop('password')
user = User.objects.create(**validated_data)
user.set_password(password)
user.save()
return user
class Meta(UserSerializer.Meta): # noqa
fields = (*UserSerializer.Meta.fields, 'password')
extra_kwargs = {
**UserSerializer.Meta.extra_kwargs,
'email': {'read_only': False},
}
......@@ -48,19 +48,19 @@ class UserAPITest(ModelAPITestCase):
url = f'/api/users/{obj.pk}/'
response = self.client.get(url)
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.data
self.assertEqual(obj.email, data['email'])
self.assertEqual(obj.first_name, data['first_name'])
self.assertEqual(obj.last_name, data['last_name'])
self.assertEqual(obj.phone_number, data['phone_number'])
date_of_birth = date_format(obj.date_of_birth, 'd/m/Y')
self.assertEqual(date_of_birth, data['date_of_birth'])
keys = (
'id',
'url',
'email',
'first_name',
'last_name',
'phone_number',
'date_of_birth',
)
for key in keys:
self.assertIn(key, response.data)
def test_create(self):
# data = self.create_data()
# data['password'] = 'hello25'
url = '/api/users/'
data = {
'email': 'john.doe@example.net',
......@@ -75,8 +75,11 @@ class UserAPITest(ModelAPITestCase):
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(User.objects.count(), 1)
user = User.objects.get()
special_fields = ('password', 'date_of_birth')
for field in filter(lambda f: f not in special_fields, data):
self.assertEqual(getattr(user, field), data[field])
for key in data:
if key == 'password':
continue
elif key == 'date_of_birth':
date_of_birth = date_format(user.date_of_birth, 'd/m/Y')
self.assertEqual(date_of_birth, data['date_of_birth'])
continue
self.assertEqual(getattr(user, key), data[key])
......@@ -2,20 +2,14 @@
from django.contrib.auth import get_user_model
from rest_framework import viewsets
from rest_framework.mixins import (
ListModelMixin, RetrieveModelMixin, CreateModelMixin,
)
from api.serializers.users import UserSerializer
from api.serializers.users import UserSerializer, UserCreateSerializer
# Create your views here.
User = get_user_model()
class UserViewSet(ListModelMixin,
RetrieveModelMixin,
CreateModelMixin,
viewsets.GenericViewSet):
class UserViewSet(viewsets.ModelViewSet):
"""API endpoint that allows users to be viewed or edited.
retrieve:
......@@ -29,4 +23,8 @@ class UserViewSet(ListModelMixin,
"""
queryset = User.objects.all()
serializer_class = UserSerializer
def get_serializer_class(self):
if self.action == 'create':
return UserCreateSerializer
return UserSerializer
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment