Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions requirements.lock
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
certifi==2018.8.24
chardet==3.0.4
defusedxml==0.5.0
Django==2.1.1
django-countries==5.3.2
django-countries==5.3.2
django-allauth==0.37.1
django-rest-auth==0.9.3
djangorestframework==3.8.2
idna==2.7
oauthlib==2.1.0
psycopg2==2.7.5
python3-openid==3.1.0
pytz==2018.5
PyYAML==3.13
PyYAML==3.13
requests==2.19.1
requests-oauthlib==1.0.0
six==1.11.0
urllib3==1.23
14 changes: 13 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
Django>=2.1,<2.2
certifi
chardet
defusedxml
Django => 2.1, < 2.2
django-countries
django-allauth
django-rest-auth
djangorestframework
idna
oauthlib
psycopg2
python3-openid
pytz
PyYAML
requests
requests-oauthlib
six
urllib3
27 changes: 27 additions & 0 deletions time_monkey/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@
'django_countries',
'users',
'rest_framework',
'rest_framework.authtoken',
'rest_auth',
'django.contrib.sites',
'allauth',
'allauth.account',
'rest_auth.registration',
'allauth.socialaccount',
'managers.apps.ManagersConfig',
]

Expand Down Expand Up @@ -131,6 +138,26 @@

AUTH_USER_MODEL = 'users.CustomUser'


ACCOUNT_USERNAME_REQUIRED = False

ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_AUTHENTICATION_METHOD = 'email'

ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_EMAIL_FIELD = 'email'
ACCOUNT_LOGOUT_ON_GET = True

REST_AUTH_REGISTER_SERIALIZERS = {
"REGISTER_SERIALIZER": "users.serializers.CustomRegisterSerializer",
}


EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

SITE_ID = 1
FIXTURE_DIRS = [
'users/fixtures/',
]
Expand Down
6 changes: 4 additions & 2 deletions time_monkey/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,13 @@
"""
from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include
from django.urls import include
from django.urls import path

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('users.urls')),
url(r'^api-auth/', include('rest_framework.urls')),
url(r'^managers/', include('managers.urls')),
path('rest-auth/', include('rest_framework.urls')),
path('rest-auth/registration/', include('rest_auth.registration.urls')),
]
2 changes: 2 additions & 0 deletions users/common/strings.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ class CustomUserModelText:
class CustomValidationErrorText:
VALIDATION_ERROR_EMAIL_MESSAGE = 'The given email must be set'
VALIDATION_ERROR_PASSWORD_MESSAGE = 'The given password must be set'
VALIDATION_ERROR_SIGNUP_EMAIL_MESSAGE = ugettext_lazy("A user is already registered with this e-mail address.")
VALIDATION_ERROR_SIGNUP_PASSWORD_MESSAGE = ugettext_lazy("The two password fields didn't match.")


class CustomUserCountryText:
Expand Down
51 changes: 49 additions & 2 deletions users/serializers.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
from allauth.account import app_settings as allauth_settings
from allauth.account.adapter import get_adapter as allauth_get_adapter
from allauth.account.utils import setup_user_email
from allauth.utils import email_address_exists

from django_countries.serializers import CountryFieldMixin
from django_countries.serializer_fields import CountryField

from rest_framework import serializers
Comment thread
TheCM marked this conversation as resolved.
from users.common.strings import CustomValidationErrorText
from users.models import CustomUser



class UserSerializer(CountryFieldMixin, serializers.ModelSerializer):
class Meta:
model = CustomUser
Expand Down Expand Up @@ -66,3 +71,45 @@ class Meta:
'is_superuser',
'is_active',
)


class CustomRegisterSerializer(serializers.Serializer):
email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
first_name = serializers.CharField(required=False, write_only=True)
last_name = serializers.CharField(required=False, write_only=True)
password = serializers.CharField(required=True, write_only=True)
password_confirmation = serializers.CharField(required=True, write_only=True)

def validate_email(self, email):
email = get_adapter().clean_email(email)
if allauth_settings.UNIQUE_EMAIL:
if email and email_address_exists(email):
raise serializers.ValidationError(
CustomValidationErrorText.VALIDATION_ERROR_SIGNUP_EMAIL_MESSAGE)
return email

def validate_password(self, password):
return get_adapter().clean_password(password)

def validate(self, data):
if data['password'] != data['password_confirmation']:
raise serializers.ValidationError(
CustomValidationErrorText.VALIDATION_ERROR_SIGNUP_PASSWORD_MESSAGE)
return data

def get_cleaned_data(self):
return {
'first_name': self.validated_data.get('first_name', ''),
'last_name': self.validated_data.get('last_name', ''),
'password': self.validated_data.get('password', ''),
'email': self.validated_data.get('email', ''),
}

def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data = self.get_cleaned_data()
adapter.save_user(request, user, self)
setup_user_email(request, user, [])
user.save()
return user
5 changes: 5 additions & 0 deletions users/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ def api_root(request, format=None):
})
else:
return Response({
'registration': reverse(
'rest_register',
request=request,
format=format,
),
})


Expand Down