Merge pull request #57 from danieldupriest/user-registration
User registration
This commit is contained in:
		
						commit
						830509e8d4
					
				
					 7 changed files with 149 additions and 4 deletions
				
			
		|  | @ -9,8 +9,9 @@ verify_ssl = true | ||||||
| django = "==2.1.5" | django = "==2.1.5" | ||||||
| django-cors-headers = "==2.4.0" | django-cors-headers = "==2.4.0" | ||||||
| djangorestframework = "==3.8.2" | djangorestframework = "==3.8.2" | ||||||
| gunicorn = "==19.6.0" |  | ||||||
| django-rest-auth = "==0.9.3" | django-rest-auth = "==0.9.3" | ||||||
|  | django-allauth = "==0.37.1" | ||||||
|  | gunicorn = "==19.6.0" | ||||||
| 
 | 
 | ||||||
| [requires] | [requires] | ||||||
| python_version = "3.5" | python_version = "3.5" | ||||||
|  |  | ||||||
							
								
								
									
										72
									
								
								back/Pipfile.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										72
									
								
								back/Pipfile.lock
									
										
									
										generated
									
									
									
								
							|  | @ -1,7 +1,7 @@ | ||||||
| { | { | ||||||
|     "_meta": { |     "_meta": { | ||||||
|         "hash": { |         "hash": { | ||||||
|             "sha256": "d3bf402a934e168cbdc04022effcdb9ff8d4fde5b83d79bb388ad2a4c547894a" |             "sha256": "b1fc6b06ec8daa4efd9573865bc6c1732ae9354309e036bfe3ce0ab76b1a3bcd" | ||||||
|         }, |         }, | ||||||
|         "pipfile-spec": 6, |         "pipfile-spec": 6, | ||||||
|         "requires": { |         "requires": { | ||||||
|  | @ -16,6 +16,27 @@ | ||||||
|         ] |         ] | ||||||
|     }, |     }, | ||||||
|     "default": { |     "default": { | ||||||
|  |         "certifi": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", | ||||||
|  |                 "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" | ||||||
|  |             ], | ||||||
|  |             "version": "==2018.11.29" | ||||||
|  |         }, | ||||||
|  |         "chardet": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", | ||||||
|  |                 "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" | ||||||
|  |             ], | ||||||
|  |             "version": "==3.0.4" | ||||||
|  |         }, | ||||||
|  |         "defusedxml": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:24d7f2f94f7f3cb6061acb215685e5125fbcdc40a857eff9de22518820b0a4f4", | ||||||
|  |                 "sha256:702a91ade2968a82beb0db1e0766a6a273f33d4616a6ce8cde475d8e09853b20" | ||||||
|  |             ], | ||||||
|  |             "version": "==0.5.0" | ||||||
|  |         }, | ||||||
|         "django": { |         "django": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:a32c22af23634e1d11425574dce756098e015a165be02e4690179889b207c7a8", |                 "sha256:a32c22af23634e1d11425574dce756098e015a165be02e4690179889b207c7a8", | ||||||
|  | @ -24,6 +45,13 @@ | ||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==2.1.5" |             "version": "==2.1.5" | ||||||
|         }, |         }, | ||||||
|  |         "django-allauth": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:02175aa1c2ddfd935a54011d1196d70c976647fc46f603f8b8758fc395b9d277" | ||||||
|  |             ], | ||||||
|  |             "index": "pypi", | ||||||
|  |             "version": "==0.37.1" | ||||||
|  |         }, | ||||||
|         "django-cors-headers": { |         "django-cors-headers": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:5545009c9b233ea7e70da7dbab7cb1c12afa01279895086f98ec243d7eab46fa", |                 "sha256:5545009c9b233ea7e70da7dbab7cb1c12afa01279895086f98ec243d7eab46fa", | ||||||
|  | @ -55,6 +83,27 @@ | ||||||
|             "index": "pypi", |             "index": "pypi", | ||||||
|             "version": "==19.6.0" |             "version": "==19.6.0" | ||||||
|         }, |         }, | ||||||
|  |         "idna": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", | ||||||
|  |                 "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" | ||||||
|  |             ], | ||||||
|  |             "version": "==2.8" | ||||||
|  |         }, | ||||||
|  |         "oauthlib": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:0ce32c5d989a1827e3f1148f98b9085ed2370fc939bf524c9c851d8714797298", | ||||||
|  |                 "sha256:3e1e14f6cde7e5475128d30e97edc3bfb4dc857cb884d8714ec161fdbb3b358e" | ||||||
|  |             ], | ||||||
|  |             "version": "==3.0.1" | ||||||
|  |         }, | ||||||
|  |         "python3-openid": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:0086da6b6ef3161cfe50fb1ee5cceaf2cda1700019fda03c2c5c440ca6abe4fa", | ||||||
|  |                 "sha256:628d365d687e12da12d02c6691170f4451db28d6d68d050007e4a40065868502" | ||||||
|  |             ], | ||||||
|  |             "version": "==3.1.0" | ||||||
|  |         }, | ||||||
|         "pytz": { |         "pytz": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", |                 "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", | ||||||
|  | @ -62,12 +111,33 @@ | ||||||
|             ], |             ], | ||||||
|             "version": "==2018.9" |             "version": "==2018.9" | ||||||
|         }, |         }, | ||||||
|  |         "requests": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", | ||||||
|  |                 "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" | ||||||
|  |             ], | ||||||
|  |             "version": "==2.21.0" | ||||||
|  |         }, | ||||||
|  |         "requests-oauthlib": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:bd6533330e8748e94bf0b214775fed487d309b8b8fe823dc45641ebcd9a32f57", | ||||||
|  |                 "sha256:d3ed0c8f2e3bbc6b344fa63d6f933745ab394469da38db16bdddb461c7e25140" | ||||||
|  |             ], | ||||||
|  |             "version": "==1.2.0" | ||||||
|  |         }, | ||||||
|         "six": { |         "six": { | ||||||
|             "hashes": [ |             "hashes": [ | ||||||
|                 "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", |                 "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", | ||||||
|                 "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" |                 "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" | ||||||
|             ], |             ], | ||||||
|             "version": "==1.12.0" |             "version": "==1.12.0" | ||||||
|  |         }, | ||||||
|  |         "urllib3": { | ||||||
|  |             "hashes": [ | ||||||
|  |                 "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", | ||||||
|  |                 "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" | ||||||
|  |             ], | ||||||
|  |             "version": "==1.24.1" | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|     "develop": {} |     "develop": {} | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								back/db.sqlite3
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								back/db.sqlite3
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -39,10 +39,15 @@ INSTALLED_APPS = [ | ||||||
|     'django.contrib.sessions', |     'django.contrib.sessions', | ||||||
|     'django.contrib.messages', |     'django.contrib.messages', | ||||||
|     'django.contrib.staticfiles', |     'django.contrib.staticfiles', | ||||||
|  |     'django.contrib.sites', | ||||||
| # 3rd party | # 3rd party | ||||||
|     'rest_framework', |     'rest_framework', | ||||||
|     'rest_framework.authtoken', |     'rest_framework.authtoken', | ||||||
|  |     'allauth', | ||||||
|  |     'allauth.account', | ||||||
|  |     'allauth.socialaccount', | ||||||
|     'rest_auth', |     'rest_auth', | ||||||
|  |     'rest_auth.registration', | ||||||
|     'corsheaders', |     'corsheaders', | ||||||
| # local | # local | ||||||
|     'users', |     'users', | ||||||
|  | @ -149,3 +154,25 @@ USE_TZ = True | ||||||
| # https://docs.djangoproject.com/en/2.1/howto/static-files/ | # https://docs.djangoproject.com/en/2.1/howto/static-files/ | ||||||
| 
 | 
 | ||||||
| STATIC_URL = '/static/' | STATIC_URL = '/static/' | ||||||
|  | 
 | ||||||
|  | # Email Config | ||||||
|  | 
 | ||||||
|  | EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' | ||||||
|  | 
 | ||||||
|  | SITE_ID = 1 | ||||||
|  | 
 | ||||||
|  | # Registration | ||||||
|  | 
 | ||||||
|  | #ACCOUNT_USER_MODEL_USERNAME_FIELD = 'email' | ||||||
|  | ACCOUNT_EMAIL_REQUIRED = True | ||||||
|  | ACCOUNT_USERNAME_REQUIRED = False | ||||||
|  | ACCOUNT_AUTHENTICATION_METHOD = 'email' | ||||||
|  | 
 | ||||||
|  | REST_AUTH_REGISTER_SERIALIZERS = { | ||||||
|  |     'REGISTER_SERIALIZER': 'users.serializers.RegisterSerializer', | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | AUTHENTICATION_BACKENDS = ( | ||||||
|  |     'django.contrib.auth.backends.ModelBackend', | ||||||
|  |     'allauth.account.auth_backends.AuthenticationBackend', | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | @ -13,5 +13,7 @@ urlpatterns = [ | ||||||
|     path('admin/', admin.site.urls), |     path('admin/', admin.site.urls), | ||||||
|     path('api/v1/', include("backend.urls")), |     path('api/v1/', include("backend.urls")), | ||||||
|     path('api/v1/account/', include('rest_auth.urls')), |     path('api/v1/account/', include('rest_auth.urls')), | ||||||
|  |     path('api/v1/account/register/', include('rest_auth.registration.urls')), | ||||||
|  |     # path('api/v1/account/register/', NameRegistrationView.as_view()), | ||||||
|     path('api-auth/', include('rest_framework.urls')), |     path('api-auth/', include('rest_framework.urls')), | ||||||
| ] | ] | ||||||
|  |  | ||||||
							
								
								
									
										47
									
								
								back/users/serializers.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								back/users/serializers.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | from rest_framework import serializers | ||||||
|  | from allauth.account import app_settings as allauth_settings | ||||||
|  | from allauth.utils import email_address_exists | ||||||
|  | from allauth.account.adapter import get_adapter | ||||||
|  | from allauth.account.utils import setup_user_email | ||||||
|  | from django.utils.translation import gettext as _ | ||||||
|  | 
 | ||||||
|  | class RegisterSerializer(serializers.Serializer): | ||||||
|  |     email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED) | ||||||
|  |     first_name = serializers.CharField(required=True, write_only=True) | ||||||
|  |     last_name = serializers.CharField(required=True, write_only=True) | ||||||
|  |     password1 = serializers.CharField(required=True, write_only=True) | ||||||
|  |     password2 = 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( | ||||||
|  |                     _("A user is already registered with this e-mail address.")) | ||||||
|  |         return email | ||||||
|  | 
 | ||||||
|  |     def validate_password1(self, password): | ||||||
|  |         return get_adapter().clean_password(password) | ||||||
|  | 
 | ||||||
|  |     def validate(self, data): | ||||||
|  |         if data['password1'] != data['password2']: | ||||||
|  |             raise serializers.ValidationError( | ||||||
|  |                 _("The two password fields didn't match.")) | ||||||
|  |         return data | ||||||
|  | 
 | ||||||
|  |     def get_cleaned_data(self): | ||||||
|  |         return { | ||||||
|  |             'first_name': self.validated_data.get('first_name', ''), | ||||||
|  |             'last_name': self.validated_data.get('last_name', ''), | ||||||
|  |             'password1': self.validated_data.get('password1', ''), | ||||||
|  |             '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 | ||||||
|  | @ -1,3 +1 @@ | ||||||
| from django.shortcuts import render | from django.shortcuts import render | ||||||
| 
 |  | ||||||
| # Create your views here. |  | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 rupikad
						rupikad