diff --git a/access/admin.py b/access/admin.py index d056aeb..a88d298 100755 --- a/access/admin.py +++ b/access/admin.py @@ -1,7 +1,8 @@ from django.contrib import admin -from access.models import ActiveObject, ExtraPrivilege, User, Account +from access.models import ActiveObject, ExtraPrivilege, User, Account, Invite admin.site.register(User) admin.site.register(Account) admin.site.register(ExtraPrivilege) admin.site.register(ActiveObject) +admin.site.register(Invite) \ No newline at end of file diff --git a/access/init_group.py b/access/init_group.py index d6a6b22..7063c00 100644 --- a/access/init_group.py +++ b/access/init_group.py @@ -9,4 +9,9 @@ from django.contrib.auth.models import Group if __name__ == '__main__': Group.objects.get_or_create(name='students') - Group.objects.get_or_create(name='teachers') \ No newline at end of file + Group.objects.get_or_create(name='teachers') + Group.objects.get_or_create(name='managers') + Group.objects.get_or_create(name='lead_managers') + Group.objects.get_or_create(name='curator') + Group.objects.get_or_create(name='partner') + Group.objects.get_or_create(name='project_manager') \ No newline at end of file diff --git a/access/load_users.py b/access/load_users.py new file mode 100644 index 0000000..0323910 --- /dev/null +++ b/access/load_users.py @@ -0,0 +1,16 @@ +import os, sys, django, csv + +sys.path.append("../") +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") +django.setup() + +from django.contrib.auth import get_user_model + +if __name__ == '__main__': + with open('../csv/access/users.csv') as user_csv: + user_reader = csv.DictReader(user_csv) + for row in user_reader: + try: + get_user_model().objects.get_or_create(**dict(row)) + except ValueError: + pass diff --git a/access/migrations/0010_auto_20171016_1709.py b/access/migrations/0010_auto_20171016_1709.py new file mode 100644 index 0000000..0533289 --- /dev/null +++ b/access/migrations/0010_auto_20171016_1709.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-16 17:09 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0009_auto_20171016_1634'), + ] + + operations = [ + migrations.AlterField( + model_name='account', + name='gender', + field=models.SmallIntegerField(choices=[(1, 'male'), (2, 'female'), (0, 'undefined')], default=0), + ), + migrations.AlterField( + model_name='invite', + name='hash', + field=models.CharField(default='QtrdrGbAnXtRHSL', max_length=15), + ), + migrations.AlterField( + model_name='user', + name='last_login', + field=models.DateTimeField(blank=True, null=True, verbose_name='last login'), + ), + ] diff --git a/access/migrations/0012_auto_20171017_0924.py b/access/migrations/0012_auto_20171017_0924.py new file mode 100644 index 0000000..ee986f4 --- /dev/null +++ b/access/migrations/0012_auto_20171017_0924.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-17 09:24 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0011_auto_20171017_0800'), + ] + + operations = [ + migrations.AddField( + model_name='invite', + name='date', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AlterField( + model_name='account', + name='gender', + field=models.SmallIntegerField(choices=[(0, 'undefined'), (2, 'female'), (1, 'male')], default=0), + ), + migrations.AlterField( + model_name='invite', + name='hash', + field=models.CharField(default='JnNSTfEkoDEclgp', max_length=15), + ), + ] diff --git a/access/migrations/0013_auto_20171017_0933.py b/access/migrations/0013_auto_20171017_0933.py new file mode 100644 index 0000000..7a59e4d --- /dev/null +++ b/access/migrations/0013_auto_20171017_0933.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-17 09:33 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0012_auto_20171017_0924'), + ] + + operations = [ + migrations.AlterField( + model_name='account', + name='gender', + field=models.SmallIntegerField(choices=[(0, 'undefined'), (1, 'male'), (2, 'female')], default=0), + ), + migrations.AlterField( + model_name='invite', + name='hash', + field=models.CharField(default='RGmRBoJxBvpmTzm', max_length=15), + ), + migrations.AlterField( + model_name='user', + name='first_name', + field=models.CharField(blank=True, default='Guest', max_length=63, verbose_name='first name'), + ), + migrations.AlterField( + model_name='user', + name='last_name', + field=models.CharField(blank=True, max_length=63, verbose_name='last name'), + ), + ] diff --git a/access/models.py b/access/models.py index c88c894..7ce1bc9 100755 --- a/access/models.py +++ b/access/models.py @@ -21,6 +21,7 @@ class Invite(models.Model): hash = models.CharField( max_length=15, default=''.join(random.choice(string.ascii_letters) for x in range(15)) ) + date = models.DateTimeField(null=True, blank=True) class Account(models.Model): @@ -36,15 +37,32 @@ class Account(models.Model): photo = models.ImageField(null=True, blank=True, default='user/photo/default_avatar.png', upload_to='user/photo/') phone = models.CharField(max_length=15, blank=True) + def __str__(self): + return self.owner.email + class CustomUserManager(BaseUserManager): use_in_migrations = True - @transaction_decorator - def _create_user(self, email, password=None, is_staff=False, is_superuser=False, is_active=False, - first_name='Guest', **extra_fields): + def get_or_create(self, email=None, password=None, **kwargs): + if not email: + raise ValueError('email not set') + + if password: + kwargs["hash_password"] = password + + kwargs['email'] = self.normalize_email(email) - now = timezone.now() + try: + return self.get(email=kwargs['email']) + + except self.model.DoesNotExist: + return self._create_user(**kwargs) + + @transaction_decorator + def _create_user(self, email, password=None, is_staff=False, is_superuser=False, + is_active=False, first_name='Guest', hash_password=None, is_send=False, + date_joined=timezone.now(), last_login=timezone.now(), **extra_fields): if not email: raise ValueError('The given email must be set') @@ -52,18 +70,23 @@ class CustomUserManager(BaseUserManager): email = self.normalize_email(email) user = self.model(email=email, is_staff=is_staff, is_active=is_active, first_name=first_name, - is_superuser=is_superuser, last_login=now, **extra_fields) + is_superuser=is_superuser, date_joined=date_joined, last_login=last_login, **extra_fields) if not password: password = ''.join(random.choice(string.ascii_letters) for x in range(8)) - user.set_password(password) + if not hash_password: + user.set_password(password) + else: + user.password = hash_password + user.save(using=self._db) - group = Group.objects.create(name=user.email) - user.groups.add(group) Account.objects.create(owner=user) - Invite.objects.create(owner=user) - # Должна идти отбивка + + if is_send: + pass + Invite.objects.create(owner=user) + # Должна идти отбивка return user def create_user(self, email, password, **extra_fields): @@ -73,7 +96,7 @@ class CustomUserManager(BaseUserManager): return self._create_user(email=email, password=password, is_superuser=True, is_staff=True, is_active=True) def create_student(self, email, password, **extra_fields): - user = self.create_user(email=email, password=password, **extra_fields) + user = self.create_user(email=email, password=password, is_send=True, **extra_fields) group = Group.objects.get(name='students') user.groups.add(group) return user @@ -81,10 +104,9 @@ class CustomUserManager(BaseUserManager): class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(_('email address'), unique=True) - first_name = models.CharField(_('first name'), max_length=30, blank=True, default='Guest') - last_name = models.CharField(_('last name'), max_length=30, blank=True) - date_joined = models.DateTimeField(_('date joined'), auto_now_add=True) - last_login = models.DateTimeField(_('last login'), auto_now_add=True) + first_name = models.CharField(_('first name'), max_length=63, blank=True, default='Guest') + last_name = models.CharField(_('last name'), max_length=63, blank=True) + date_joined = models.DateTimeField(_('date joined')) is_staff = models.BooleanField(verbose_name='флаг персонала', default=False, help_text='Определяет разрешение пользователя на вход в административную часть.') is_active = models.BooleanField(verbose_name='активен', default=False,