From 5853ce29b833dfddeb05c8d05891ed0355073093 Mon Sep 17 00:00:00 2001 From: Sergey G Date: Mon, 15 Jan 2018 13:50:45 +0500 Subject: [PATCH] LIL-72 Save verification email or not --- apps/auth/tests/test_verification_email.py | 16 ++++++-- apps/auth/views.py | 3 ++ apps/user/__init__.py | 0 apps/user/admin.py | 3 ++ apps/user/apps.py | 6 +++ apps/user/migrations/0001_initial.py | 44 ++++++++++++++++++++++ apps/user/migrations/__init__.py | 0 apps/user/models.py | 26 +++++++++++++ apps/user/tests.py | 3 ++ apps/user/views.py | 3 ++ project/settings.py | 3 +- 11 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 apps/user/__init__.py create mode 100644 apps/user/admin.py create mode 100644 apps/user/apps.py create mode 100644 apps/user/migrations/0001_initial.py create mode 100644 apps/user/migrations/__init__.py create mode 100644 apps/user/models.py create mode 100644 apps/user/tests.py create mode 100644 apps/user/views.py diff --git a/apps/auth/tests/test_verification_email.py b/apps/auth/tests/test_verification_email.py index 055f8500..83704a26 100644 --- a/apps/auth/tests/test_verification_email.py +++ b/apps/auth/tests/test_verification_email.py @@ -1,16 +1,15 @@ -from django.contrib.auth import get_user_model from ..tokens import verification_email_token from django.test import TestCase, Client from django.urls import reverse -User = get_user_model() +from apps.user.models import LilcityUserProxy class VerificationEmailTest(TestCase): def setUp(self): self.client = Client() - self.user_1 = User.objects.create_user(username='user_1@example.com', password='1234') + self.user_1 = LilcityUserProxy.objects.create_user(username='user_1@example.com', password='1234') self.token_user_1 = verification_email_token.make_token(self.user_1) self.url = reverse('lilcity:verification-email', kwargs={"token": self.token_user_1}) @@ -21,13 +20,22 @@ class VerificationEmailTest(TestCase): response = self.client.get(f'{self.url}') self.assertEqual(response.status_code, 200) + def test_should_is_verification_email_for_user(self): + self.assertFalse(self.user_1.lilcity_user_settings.is_verification_email) + + self.client.login(username=self.user_1.username, password='1234') + self.client.get(f'{self.url}') + + self.user_1.refresh_from_db() + self.assertTrue(self.user_1.lilcity_user_settings.is_verification_email) + def test_should_anonymous_user(self): response = self.client.get(f'{self.url}') self.assertEqual(response.status_code, 400) def test_should_error_if_token_is_not_valid(self): - user_hacker = User.objects.create_user(username='hacker@example.com', password='1234') + user_hacker = LilcityUserProxy.objects.create_user(username='hacker@example.com', password='1234') self.client.login(username=user_hacker.username, password='1234') response = self.client.get(f'{self.url}') diff --git a/apps/auth/views.py b/apps/auth/views.py index 4e74e0cc..2f57c47f 100644 --- a/apps/auth/views.py +++ b/apps/auth/views.py @@ -58,6 +58,9 @@ class VerificationEmailView(View): is_valid_token = verification_email_token.check_token(request.user, kwargs.get('token')) if is_valid_token: + lilcity_user_settings = request.user.lilcity_user_settings + lilcity_user_settings.is_verification_email = True + lilcity_user_settings.save() return JsonResponse({"success": True}) else: return JsonResponse({"success": False}, status=400) diff --git a/apps/user/__init__.py b/apps/user/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/user/admin.py b/apps/user/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/apps/user/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/apps/user/apps.py b/apps/user/apps.py new file mode 100644 index 00000000..fb1e7335 --- /dev/null +++ b/apps/user/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class UserConfig(AppConfig): + name = 'apps.user' + label = 'lilcity_user' diff --git a/apps/user/migrations/0001_initial.py b/apps/user/migrations/0001_initial.py new file mode 100644 index 00000000..54aa1ab8 --- /dev/null +++ b/apps/user/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 2.0.1 on 2018-01-15 08:33 + +import apps.user.models +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='LilcityUserSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_verification_email', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='LilcityUserProxy', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('auth.user',), + managers=[ + ('objects', apps.user.models.LilcityUserManager()), + ], + ), + migrations.AddField( + model_name='lilcityusersettings', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='lilcity_user_settings', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/apps/user/migrations/__init__.py b/apps/user/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/user/models.py b/apps/user/models.py new file mode 100644 index 00000000..ecfa5fa5 --- /dev/null +++ b/apps/user/models.py @@ -0,0 +1,26 @@ +from django.db import models +from django.contrib.auth import get_user_model +from django.contrib.auth.models import AbstractUser, UserManager + + +User = get_user_model() + + +class LilcityUserManager(UserManager): + def create_user(self, username, email=None, password=None, **extra_fields): + user = super().create_user(username, email, password, **extra_fields) + LilcityUserSettings.objects.create(user=user) + return user + + +class LilcityUserProxy(User): + objects = LilcityUserManager() + + class Meta: + proxy = True + + +class LilcityUserSettings(models.Model): + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='lilcity_user_settings') + is_verification_email = models.BooleanField(default=False) + diff --git a/apps/user/tests.py b/apps/user/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/apps/user/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/user/views.py b/apps/user/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/apps/user/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/project/settings.py b/project/settings.py index 350a91ef..855b10b9 100644 --- a/project/settings.py +++ b/project/settings.py @@ -40,7 +40,8 @@ INSTALLED_APPS = [ ] + [ 'anymail', ] + [ - 'apps.auth.apps' + 'apps.auth.apps', + 'apps.user', ] MIDDLEWARE = [