refactor idUser to id_user
authorrougeronj
Wed, 10 Jun 2015 15:19:07 +0200
changeset 156 bf4ae7d9a517
parent 155 e7c887d93039
child 157 84677128ccc4
refactor idUser to id_user add custom serializer for authToken and User
server/ammicosrv/ammico/admin.py
server/ammicosrv/ammico/views.py
server/ammicosrv/authentication/migrations/0001_initial.py
server/ammicosrv/authentication/models.py
server/ammicosrv/authentication/serializers.py
server/ammicosrv/authentication/views.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',)
--- 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)
--- /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)),
+            ],
+        ),
+    ]
--- 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)
 
--- /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
--- 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