Skip to content

Commit

Permalink
use custom user model with UUID field
Browse files Browse the repository at this point in the history
  • Loading branch information
timini committed Mar 26, 2016
1 parent a64d119 commit 1034d00
Show file tree
Hide file tree
Showing 14 changed files with 91 additions and 46 deletions.
2 changes: 1 addition & 1 deletion client/app/authenticators/oauth2.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ import OAuth2PasswordGrant from 'ember-simple-auth/authenticators/oauth2-passwor

export default OAuth2PasswordGrant.extend({
serverTokenEndpoint: '/oauth/token/',
clientId: 'EReRvlymkeXgTXRf55HXRD1nZiQtcB9AizTwE0Ut',
clientId: 'zRDieLQI62Ts0j4BvQPIiS98DGCyD6Iis2Me0ToY',
});
2 changes: 2 additions & 0 deletions client/app/routes/application.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import Ember from 'ember';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';


export default Ember.Route.extend(ApplicationRouteMixin);
7 changes: 0 additions & 7 deletions client/app/routes/users.js

This file was deleted.

17 changes: 7 additions & 10 deletions server/api/chat/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-03-23 10:39
# Generated by Django 1.9.4 on 2016-03-26 12:33
from __future__ import unicode_literals

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid


class Migration(migrations.Migration):
Expand All @@ -17,20 +18,16 @@ class Migration(migrations.Migration):

operations = [
migrations.CreateModel(
name='DateMixin',
name='Comment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='Comment',
fields=[
('datemixin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='chat.DateMixin')),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('text', models.CharField(max_length=255)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
bases=('chat.datemixin',),
options={
'abstract': False,
},
),
]
7 changes: 5 additions & 2 deletions server/api/chat/models.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
from django.db import models
from django.contrib.auth.models import User
from users.models import User
import uuid


class DateMixin(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Meta:
abstract = True

class Comment(DateMixin):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
text = models.CharField(max_length=255)
user = models.ForeignKey(User)

Expand Down
11 changes: 9 additions & 2 deletions server/api/chat/serializers.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
from rest_framework_json_api import serializers, relations

from chat.models import Comment
from rest_framework import serializers
from users.models import User


class StringToIntPK(object):
def to_representation(key):
return int(key)

class CommentSerializer(serializers.HyperlinkedModelSerializer):
class CommentSerializer(serializers.ModelSerializer):
user = relations.ResourceRelatedField(queryset=User.objects.all(), pk_field=serializers.UUIDField(format='hex_verbose'), many=False, read_only=False)
class Meta:
model = Comment
fields = ('text', 'user', 'created_at', 'updated_at')
Binary file modified server/api/db.sqlite3
Binary file not shown.
4 changes: 4 additions & 0 deletions server/api/main/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@
},
]

AUTH_USER_MODEL = 'users.User'

# Internationalization
# https://docs.djangoproject.com/en/1.9/topics/i18n/
Expand Down Expand Up @@ -143,6 +144,9 @@
'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata',
}

JSON_API_FORMAT_RELATION_KEYS = 'dasherize'
JSON_API_PLURALIZE_RELATION_TYPE = True

OAUTH2_PROVIDER = {
# this is the list of available scopes
'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'}
Expand Down
1 change: 0 additions & 1 deletion server/api/main/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

router = routers.DefaultRouter(trailing_slash=False)
router.register(r'users', users_views.UserViewSet)
router.register(r'groups', users_views.GroupViewSet)
router.register(r'comments', chat_views.CommentViewSet)

# Wire up our API using automatic URL routing.
Expand Down
4 changes: 2 additions & 2 deletions server/api/users/apps.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.apps import AppConfig


class AuthConfig(AppConfig):
name = 'Auth'
class UsersConfig(AppConfig):
name = 'Users'
47 changes: 47 additions & 0 deletions server/api/users/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-03-26 12:33
from __future__ import unicode_literals

import django.contrib.auth.models
import django.core.validators
from django.db import migrations, models
import django.utils.timezone
import uuid


class Migration(migrations.Migration):

initial = True

dependencies = [
('auth', '0007_alter_validators_add_error_messages'),
]

operations = [
migrations.CreateModel(
name='User',
fields=[
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=30, unique=True, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.')], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
],
options={
'verbose_name_plural': 'users',
'verbose_name': 'user',
'abstract': False,
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
]
8 changes: 7 additions & 1 deletion server/api/users/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager
import uuid

# Create your models here.
class User(AbstractUser):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

class JSONAPIMeta:
resource_name = "users"
14 changes: 4 additions & 10 deletions server/api/users/serializers.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
from django.contrib.auth.models import User, Group
from rest_framework import serializers
from rest_framework_json_api import serializers

from .models import User

class UserSerializer(serializers.HyperlinkedModelSerializer):
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('url', 'username', 'email', 'groups')


class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = ('url', 'name')
fields = ('url', 'username', 'email')
13 changes: 3 additions & 10 deletions server/api/users/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework.decorators import api_view
from rest_framework.response import Response

from users.serializers import UserSerializer, GroupSerializer
from .models import User
from .serializers import UserSerializer

# Method the current user can use to find their user ID
@api_view(['GET'])
Expand All @@ -18,11 +18,4 @@ class UserViewSet(viewsets.ModelViewSet):
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer


class GroupViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Group.objects.all()
serializer_class = GroupSerializer
resource_name = 'users'

0 comments on commit 1034d00

Please sign in to comment.