# HG changeset patch # User rougeronj # Date 1433942347 -7200 # Node ID bf4ae7d9a517cde1ea490af5e7f5df946b4d40bf # Parent e7c887d9303958ab4a5b7c904da807b3d2225c98 refactor idUser to id_user add custom serializer for authToken and User diff -r e7c887d93039 -r bf4ae7d9a517 server/ammicosrv/ammico/admin.py --- a/server/ammicosrv/ammico/admin.py Wed Jun 10 15:15:41 2015 +0200 +++ b/server/ammicosrv/ammico/admin.py Wed Jun 10 15:19:07 2015 +0200 @@ -16,7 +16,7 @@ class Meta: model = get_user_model() - fields = ('email', 'idUser') + fields = ('email', 'id_user') def clean_password2(self): # Check that the two password entries match @@ -44,7 +44,7 @@ class Meta: model = get_user_model() - fields = ('email', 'password', 'idUser', 'is_active', 'is_admin') + fields = ('email', 'password', 'id_user', 'is_active', 'is_admin') def clean_password(self): # Regardless of what the user provides, return the initial value. @@ -61,11 +61,11 @@ # The fields to be used in displaying the User model. # These override the definitions on the base UserAdmin # that reference specific fields on auth.User. - list_display = ('email', 'idUser', 'is_admin') + list_display = ('email', 'id_user', 'is_admin') list_filter = ('is_admin',) fieldsets = ( (None, {'fields': ('email', 'password')}), - ('external id', {'fields': ('idUser',)}), + ('external id', {'fields': ('id_user',)}), ('Permissions', {'fields': ('is_admin',)}), ) # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin @@ -73,7 +73,7 @@ add_fieldsets = ( (None, { 'classes': ('wide',), - 'fields': ('email', 'idUser', 'password1', 'password2')} + 'fields': ('email', 'id_user', 'password1', 'password2')} ), ) search_fields = ('email',) diff -r e7c887d93039 -r bf4ae7d9a517 server/ammicosrv/ammico/views.py --- a/server/ammicosrv/ammico/views.py Wed Jun 10 15:15:41 2015 +0200 +++ b/server/ammicosrv/ammico/views.py Wed Jun 10 15:19:07 2015 +0200 @@ -32,7 +32,7 @@ #r = requests.get('http://fui-ammico.jamespot.pro/api/api.php?&k=6c8bfcea247e8a5841288269887d88f0&d=2016-01-31&m=EXT-IRI&v=2.0&f=get&o=article&idArticle=169') #simulate the request - params = {'o': 'article', 'f': 'list', 'idUser': user.idUser} + params = {'o': 'article', 'f': 'list', 'idUser': user.id_user} r = requests.get(settings.URL_JAMESPOT, params=params) visits = json.loads(r.content.decode('utf-8')) @@ -73,10 +73,10 @@ ) @api_view(('GET',)) -def api_root(request, format=None): +def api_root(request): return Response({ - 'books': reverse('books', request=request, format=format), - 'slides': reverse('slides', request=request, format=format) + 'books': reverse('books', request=request), + 'slides': reverse('slides', request=request) }) class AmmicoView(View): @@ -88,7 +88,7 @@ print(payload) if (('email' and 'idUser') in payload): print('here !'); - user, _ = User.objects.get_or_create(email = payload['email'], idUser = payload['idUser']) + user, _ = User.objects.get_or_create(email = payload['email'], id_user = payload['idUser']) populateVisit(user, idExpo) token, _ = Token.objects.get_or_create(user=user) key = str(token.key) diff -r e7c887d93039 -r bf4ae7d9a517 server/ammicosrv/authentication/migrations/0001_initial.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/ammicosrv/authentication/migrations/0001_initial.py Wed Jun 10 15:19:07 2015 +0200 @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='AmmicoUser', + fields=[ + ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, verbose_name='last login', null=True)), + ('email', models.EmailField(max_length=255, verbose_name='email address', unique=True)), + ('id_user', models.IntegerField(blank=True, verbose_name='identifiant utilisateur', null=True)), + ('is_active', models.BooleanField(default=True)), + ('is_admin', models.BooleanField(default=False)), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)), + ('image', models.URLField(max_length=2048, blank=True)), + ('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff -r e7c887d93039 -r bf4ae7d9a517 server/ammicosrv/authentication/models.py --- a/server/ammicosrv/authentication/models.py Wed Jun 10 15:15:41 2015 +0200 +++ b/server/ammicosrv/authentication/models.py Wed Jun 10 15:19:07 2015 +0200 @@ -9,7 +9,7 @@ class AmmicoUserManager(BaseUserManager): - def create_user(self, email, idUser=None, password=None): + def create_user(self, email, id_user=None, password=None): """ Creates and saves a User with the given email and password. """ @@ -18,20 +18,20 @@ user = self.model( email=self.normalize_email(email), - idUser=idUser, + id_user=id_user, ) user.set_password(password) user.save(using=self._db) return user - def create_superuser(self, email, password, idUser=None): + def create_superuser(self, email, password, id_user=None): """ Creates and saves a superuser with the given email and password. """ user = self.create_user(email, password=password, - idUser=idUser + id_user=id_user ) user.is_admin = True user.save(using=self._db) @@ -40,7 +40,7 @@ class AmmicoUser(AbstractBaseUser): email = models.EmailField(verbose_name='email address', max_length=255, unique=True) - idUser = models.IntegerField(_('identifiant utilisateur'), blank=True, null=True) + id_user = models.IntegerField(_('identifiant utilisateur'), blank=True, null=True) is_active = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) diff -r e7c887d93039 -r bf4ae7d9a517 server/ammicosrv/authentication/serializers.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/ammicosrv/authentication/serializers.py Wed Jun 10 15:19:07 2015 +0200 @@ -0,0 +1,35 @@ +from django.contrib.auth import authenticate, get_user_model +from django.utils.translation import ugettext_lazy as _ +from rest_framework import exceptions, serializers + + +class AuthTokenSerializer(serializers.Serializer): + email = serializers.CharField() + password = serializers.CharField(style={'input_type': 'password'}) + + def validate(self, attrs): + email = attrs.get('email') + password = attrs.get('password') + + if email and password: + user = authenticate(email=email, password=password) + + if user: + if not user.is_active: + msg = _('User account is disabled.') + raise exceptions.ValidationError(msg) + else: + msg = _('Unable to log in with provided credentials.') + raise exceptions.ValidationError(msg) + else: + msg = _('Must include "email" and "password".') + raise exceptions.ValidationError(msg) + + attrs['user'] = user + return attrs + +class UserSerializer(serializers.ModelSerializer): + + class Meta: + model = get_user_model() + fields = ('id', 'email', 'last_login', 'id_user') \ No newline at end of file diff -r e7c887d93039 -r bf4ae7d9a517 server/ammicosrv/authentication/views.py --- a/server/ammicosrv/authentication/views.py Wed Jun 10 15:15:41 2015 +0200 +++ b/server/ammicosrv/authentication/views.py Wed Jun 10 15:19:07 2015 +0200 @@ -1,6 +1,7 @@ import json +from django.conf import settings from django.contrib.auth import get_user_model import requests from rest_framework import serializers, status, permissions, parsers, renderers @@ -9,14 +10,11 @@ from rest_framework.views import APIView from ammicosrv.ammico.views import populateVisit -from django.conf import settings +from ammicosrv.authentication.serializers import AuthTokenSerializer, \ + UserSerializer #from ammico.views import populateVisit -class UserSerializer(serializers.ModelSerializer): - class Meta: - model = get_user_model() - class User(APIView): """ get list user or add user @@ -39,7 +37,7 @@ r = requests.get(settings.URL_JAMESPOT, params=params) infoUser = json.loads(r.content.decode('utf-8')) if ('idUser' in infoUser['VAL']): - user_data.update({"idUser":infoUser['VAL']['idUser']}) + user_data.update({"id_user":infoUser['VAL']['idUser']}) user = get_user_model().objects.create_user( **user_data ) @@ -54,8 +52,11 @@ renderer_classes = (renderers.JSONRenderer,) def post(self, request): - user = get_user_model().objects.get(email = request.data['email'], password = request.data['password']) - if (user.idUser and 'idExpo' in request.GET): - populateVisit(user, request.GET['idExpo']); - token, _ = Token.objects.get_or_create(user=user) - return Response({'token': token.key}) \ No newline at end of file + serializer = AuthTokenSerializer(data=request.data) + if serializer.is_valid(): + user = serializer.validated_data['user'] + if (user.id_user and 'idExpo' in request.GET): + populateVisit(user, request.GET['idExpo']) + token, _ = Token.objects.get_or_create(user=user) + return Response({'token': token.key}) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file