Skip to content

Commit 463696a

Browse files
authored
Merge pull request #21 from caravancoop/release/v0.7
Release v0.7
2 parents 0d8688d + 8d72b5a commit 463696a

File tree

12 files changed

+147
-86
lines changed

12 files changed

+147
-86
lines changed

.gitignore

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
*.pyc
22
__pycache__
3-
db.sqlite3
3+
/demo/db.sqlite3
4+
/demo/.env
45

56
# Test artifacts
6-
.cache/
7-
.tox/
7+
/.cache/
8+
/.tox/
89

910
# Packaging litter
10-
*.egg-info
11-
build/
12-
dist/
11+
/*.egg-info
12+
/build/
13+
/dist/

demo/demo/accounts/admin.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
from django.contrib import admin
2-
from django.contrib.auth.admin import GroupAdmin, UserAdmin as BaseUserAdmin
2+
from django.contrib.auth.admin import GroupAdmin
3+
4+
from rest_auth_toolkit.admin import BaseEmailUserAdmin
35

46
from .models import APIToken, BaseGroup, Group, User, EmailConfirmation
57

68

7-
class UserAdmin(BaseUserAdmin):
8-
list_display = ('email', 'first_name', 'last_name', 'is_active', 'is_staff')
9-
add_form_template = None
10-
add_fieldsets = (
11-
(None, {
12-
'classes': ('wide',),
13-
'fields': ('email', 'password1', 'password2'),
14-
}),
15-
)
9+
class UserAdmin(BaseEmailUserAdmin):
1610
date_hierarchy = 'date_joined'
17-
readonly_fields = ('username', 'date_joined', 'last_login')
11+
readonly_fields = ('date_joined', 'last_login')
1812

1913

2014
class EmailConfirmationAdmin(admin.ModelAdmin):

demo/demo/accounts/authentication.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44

55

66
class APITokenAuthentication(TokenAuthentication):
7+
keyword = 'Bearer'
78
model = APIToken
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.10 on 2018-02-22 00:12
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('accounts', '0001_initial'),
12+
]
13+
14+
operations = [
15+
migrations.RemoveField(
16+
model_name='user',
17+
name='username',
18+
),
19+
migrations.AlterField(
20+
model_name='user',
21+
name='email',
22+
field=models.EmailField(max_length=255, unique=True, verbose_name='email address'),
23+
),
24+
]

demo/demo/accounts/models.py

Lines changed: 5 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,16 @@
1-
from django.contrib.auth.models import AbstractUser, BaseUserManager, Group as BaseGroup
1+
from django.contrib.auth.models import Group as BaseGroup
22
from django.db import models
33
from django.utils.translation import gettext_lazy as _
44

5-
import shortuuid
65
from model_utils.fields import AutoCreatedField
76
from model_utils.models import TimeStampedModel
87
from shortuuidfield import ShortUUIDField
98

10-
from rest_auth_toolkit.models import BaseAPIToken, BaseEmailConfirmation
9+
from rest_auth_toolkit.managers import BaseEmailUserManager
10+
from rest_auth_toolkit.models import BaseEmailUser, BaseAPIToken, BaseEmailConfirmation
1111

1212

13-
class UserManager(BaseUserManager):
14-
use_in_migrations = True
15-
16-
def get_by_natural_key(self, email):
17-
return self.get(email=email)
18-
19-
def _create_user(self, email, password, **extra_fields):
20-
email = self.normalize_email(email)
21-
user = self.model(email=email, **extra_fields)
22-
# XXX username is not automatically generated, don't understand why
23-
# (same model in another project works well!)
24-
if not user.username:
25-
user.username = str(shortuuid.uuid())
26-
user.set_password(password)
27-
user.save(using=self._db)
28-
return user
29-
30-
def create_user(self, email, password=None, **extra_fields):
31-
extra_fields.setdefault('is_staff', False)
32-
extra_fields.setdefault('is_superuser', False)
33-
return self._create_user(email, password, **extra_fields)
34-
35-
def create_superuser(self, email, password, **extra_fields):
36-
extra_fields.setdefault('is_staff', True)
37-
extra_fields.setdefault('is_superuser', True)
38-
39-
if not extra_fields['is_staff']:
40-
raise ValueError('Superuser must have is_staff=True.')
41-
if not extra_fields['is_superuser']:
42-
raise ValueError('Superuser must have is_superuser=True.')
43-
44-
return self._create_user(email, password, **extra_fields)
45-
13+
class UserManager(BaseEmailUserManager):
4614
def get_or_create_facebook_user(self, facebook_data, facebook_access_token):
4715
try:
4816
user = User.objects.get(email=facebook_data['email'])
@@ -62,31 +30,14 @@ def get_or_create_facebook_user(self, facebook_data, facebook_access_token):
6230
return user, False
6331

6432

65-
class User(AbstractUser):
66-
"""Custom user with email as login field."""
67-
USERNAME_FIELD = 'email'
68-
REQUIRED_FIELDS = []
69-
70-
# Admin doesn't work well without username field; shortuuid provides
71-
# a simple way to get unique string values at creation time.
72-
username = ShortUUIDField()
73-
email = models.EmailField(max_length=255, unique=True)
33+
class User(BaseEmailUser):
7434
facebook_id = models.CharField(
7535
max_length=255, null=True, blank=True, help_text=_('FB third-party ID'))
7636
facebook_access_token = models.CharField(
7737
max_length=255, null=True, blank=True, help_text=_('FB access token'))
7838

7939
objects = UserManager()
8040

81-
def __str__(self):
82-
return self.email
83-
84-
def get_short_name(self):
85-
return self.email
86-
87-
def natural_key(self):
88-
return self.email
89-
9041

9142
class Group(BaseGroup):
9243
"""Proxy model to have users and groups together in admin."""

demo/requirements.in

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pip-tools
22

3-
django
3+
django ~= 1.11
44
djangorestframework
55
django-debug-toolbar
66

@@ -9,3 +9,7 @@ django-debug-toolbar
99

1010
django-model-utils
1111
django-shortuuidfield
12+
13+
# for the browsable API
14+
markdown
15+
pygments

demo/requirements.txt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
# pip-compile --output-file requirements.txt requirements.in
66
#
77
click==6.7 # via pip-tools
8-
django-debug-toolbar==1.8
9-
django-model-utils==3.0.0
8+
django-debug-toolbar==1.9.1
9+
django-model-utils==3.1.1
1010
django-shortuuidfield==0.1.3
11-
django==1.11.6
12-
djangorestframework==3.7.1
11+
django==1.11.10
12+
djangorestframework==3.7.7
1313
first==2.0.1 # via pip-tools
14-
pip-tools==1.10.1
15-
pytz==2017.2 # via django
14+
markdown==2.6.11
15+
pip-tools==1.11.0
16+
pygments==2.2.0
17+
pytz==2018.3 # via django
1618
shortuuid==0.5.0 # via django-shortuuidfield
1719
six==1.11.0 # via django-shortuuidfield, pip-tools
1820
sqlparse==0.2.4 # via django-debug-toolbar

requirements.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
#
55
# pip-compile --output-file requirements.txt setup.py
66
#
7-
certifi==2017.7.27.1 # via requests
7+
certifi==2018.1.18 # via requests
88
chardet==3.0.4 # via requests
9-
django==1.11.6
10-
djangorestframework==3.7.1
9+
django==1.11.10
10+
djangorestframework==3.7.7
1111
facepy==1.0.9
1212
idna==2.6 # via requests
13-
pytz==2017.2 # via django
13+
pytz==2018.3 # via django
1414
requests==2.18.4 # via facepy
1515
six==1.11.0 # via facepy
1616
urllib3==1.22 # via requests

rest_auth_toolkit/admin.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from django.contrib.auth.admin import UserAdmin
2+
from django.utils.translation import gettext_lazy as _
3+
4+
5+
class BaseEmailUserAdmin(UserAdmin):
6+
list_display = ('email', 'first_name', 'last_name', 'is_active', 'is_staff')
7+
fieldsets = (
8+
(None, {'fields': ('email', 'password')}),
9+
(_('Personal info'), {'fields': ('first_name', 'last_name')}),
10+
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
11+
'groups', 'user_permissions')}),
12+
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
13+
)
14+
# add_form_template = None
15+
add_fieldsets = (
16+
(None, {
17+
'classes': ('wide',),
18+
'fields': ('email', 'password1', 'password2'),
19+
}),
20+
)
21+
search_fields = ('first_name', 'last_name', 'email')
22+
ordering = ('email',)

rest_auth_toolkit/managers.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,37 @@
1+
from django.contrib.auth.models import BaseUserManager
12
from django.db import models
23

34

5+
class BaseEmailUserManager(BaseUserManager):
6+
use_in_migrations = True
7+
8+
def get_by_natural_key(self, email):
9+
return self.get(email=email)
10+
11+
def _create_user(self, email, password, **extra_fields):
12+
email = self.normalize_email(email)
13+
user = self.model(email=email, **extra_fields)
14+
user.set_password(password)
15+
user.save(using=self._db)
16+
return user
17+
18+
def create_user(self, email, password=None, **extra_fields):
19+
extra_fields.setdefault('is_staff', False)
20+
extra_fields.setdefault('is_superuser', False)
21+
return self._create_user(email, password, **extra_fields)
22+
23+
def create_superuser(self, email, password, **extra_fields):
24+
extra_fields.setdefault('is_staff', True)
25+
extra_fields.setdefault('is_superuser', True)
26+
27+
if not extra_fields['is_staff']:
28+
raise ValueError('Superuser must have is_staff=True.')
29+
if not extra_fields['is_superuser']:
30+
raise ValueError('Superuser must have is_superuser=True.')
31+
32+
return self._create_user(email, password, **extra_fields)
33+
34+
435
class BaseAPITokenManager(models.Manager):
536
def create_token(self, user):
637
return self.create(user=user)

0 commit comments

Comments
 (0)