From b9ef367c6d35f75d7ec3650684839d3b135a3edb Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Sat, 27 Jan 2018 19:09:51 +0300 Subject: [PATCH] Migrate to new user model --- apps/auth/views.py | 14 +++---- apps/user/admin.py | 7 ---- apps/user/migrations/0001_initial.py | 57 ++++++++++++++++---------- apps/user/models.py | 60 ++++++++++++++++------------ project/settings.py | 3 +- 5 files changed, 78 insertions(+), 63 deletions(-) diff --git a/apps/auth/views.py b/apps/auth/views.py index d1fcc322..f2ebcf18 100644 --- a/apps/auth/views.py +++ b/apps/auth/views.py @@ -13,7 +13,6 @@ from django.views.generic import FormView, View from django.views.generic.edit import BaseFormView from apps.notification.utils import send_email -from apps.user.models import LilcityUserSettings, LilcityUserProxy from .forms import LearnerRegistrationForm from .tokens import verification_email_token @@ -120,9 +119,9 @@ class FacebookLoginOrRegistration(View): except FacepyError: return JsonResponse({"success": False}) - facebook_id = data.get('id') + fb_id = data.get('id') - lilcity_user_settings = LilcityUserSettings.objects.filter(facebook_id=facebook_id) + lilcity_user_settings = User.objects.filter(fb_id=fb_id) if lilcity_user_settings.count(): login(requests, user=lilcity_user_settings[0].user) return JsonResponse({"success": True}) @@ -136,9 +135,8 @@ class FacebookLoginOrRegistration(View): first_name = data.get('first_name', '') last_name = data.get('last_name', '') - user = LilcityUserProxy.objects.create_user(username=email, email=email, first_name=first_name, last_name=last_name, password=uuid4().hex) - - user.lilcity_user_settings.is_verification_email = True - user.lilcity_user_settings.facebook_id = facebook_id - user.lilcity_user_settings.save() + user = User.objects.create_user(username=email, email=email, first_name=first_name, last_name=last_name, password=uuid4().hex) + user.is_email_proved = True + user.fb_id = fb_id + user.save() return JsonResponse({"success": True}) diff --git a/apps/user/admin.py b/apps/user/admin.py index 92876bde..694323fa 100644 --- a/apps/user/admin.py +++ b/apps/user/admin.py @@ -1,8 +1 @@ from django.contrib import admin - -from .models import LilcityUserSettings - - -@admin.register(LilcityUserSettings) -class LilcityUserSettingsAdmin(admin.ModelAdmin): - pass diff --git a/apps/user/migrations/0001_initial.py b/apps/user/migrations/0001_initial.py index 54aa1ab8..a2ed6c65 100644 --- a/apps/user/migrations/0001_initial.py +++ b/apps/user/migrations/0001_initial.py @@ -1,9 +1,10 @@ -# Generated by Django 2.0.1 on 2018-01-15 08:33 +# Generated by Django 2.0.1 on 2018-01-27 16:03 -import apps.user.models -from django.conf import settings +import django.contrib.auth.models +import django.contrib.auth.validators +import django.contrib.postgres.fields.jsonb from django.db import migrations, models -import django.db.models.deletion +import django.utils.timezone class Migration(migrations.Migration): @@ -12,33 +13,47 @@ class Migration(migrations.Migration): dependencies = [ ('auth', '0009_alter_user_last_name_max_length'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( - name='LilcityUserSettings', + name='User', 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=[ + ('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. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('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')), + ('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')), + ('role', models.PositiveSmallIntegerField(choices=[(0, 'пользователь'), (1, 'автор'), (2, 'администратор')], default=0)), + ('gender', models.CharField(choices=[('n', 'не указан'), ('m', 'Мужчина'), ('f', 'Женщина')], max_length=1)), + ('country', models.CharField(default='', max_length=50)), + ('city', models.CharField(default='', max_length=85)), + ('about', models.CharField(default='', max_length=1000)), + ('instagram', models.URLField(default='')), + ('facebook', models.URLField(default='')), + ('twitter', models.URLField(default='')), + ('pinterest', models.URLField(default='')), + ('youtube', models.URLField(default='')), + ('vkontakte', models.URLField(default='')), + ('fb_id', models.PositiveIntegerField(blank=True, null=True, unique=True)), + ('fb_data', django.contrib.postgres.fields.jsonb.JSONField(default={})), + ('is_email_proved', models.BooleanField(default=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={ - 'proxy': True, - 'indexes': [], + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, }, - bases=('auth.user',), managers=[ - ('objects', apps.user.models.LilcityUserManager()), + ('objects', django.contrib.auth.models.UserManager()), ], ), - 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/models.py b/apps/user/models.py index 82ec3c6d..e568b7d9 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -1,27 +1,35 @@ 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) - facebook_id = models.PositiveIntegerField(null=True, blank=True, unique=True) - +from django.contrib.auth.models import AbstractUser +from django.contrib.postgres import fields as pgfields +from django.utils.translation import gettext_lazy as _ + + +class User(AbstractUser): + ROLE_CHOICES = ( + (0, 'пользователь'), + (1, 'автор'), + (2, 'администратор'), + ) + GENDER_CHOICES = ( + ('n', 'не указан'), + ('m', 'Мужчина'), + ('f', 'Женщина'), + ) + email = models.EmailField(_('email address'), unique=True) + role = models.PositiveSmallIntegerField(default=0, choices=ROLE_CHOICES) + gender = models.CharField(max_length=1, choices=GENDER_CHOICES) + country = models.CharField(max_length=50, default='') + city = models.CharField(max_length=85, default='') + about = models.CharField(max_length=1000, default='') + instagram = models.URLField(default='') + facebook = models.URLField(default='') + twitter = models.URLField(default='') + pinterest = models.URLField(default='') + youtube = models.URLField(default='') + vkontakte = models.URLField(default='') + fb_id = models.PositiveIntegerField(null=True, blank=True, unique=True) + fb_data = pgfields.JSONField(default={}) + is_email_proved = models.BooleanField(default=False) + + USERNAME_FIELD = 'email' + REQUIRED_FIELDS = [] diff --git a/project/settings.py b/project/settings.py index 10946d9e..8ad324da 100644 --- a/project/settings.py +++ b/project/settings.py @@ -27,7 +27,6 @@ DEBUG = True ALLOWED_HOSTS = ["*"] # fixme: production mode - # Application definition INSTALLED_APPS = [ @@ -110,6 +109,8 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +AUTH_USER_MODEL = 'user.User' + # Internationalization # https://docs.djangoproject.com/en/2.0/topics/i18n/