From 2e938e53e7403a38963f656136c60005e31a4ed0 Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 17 Oct 2017 15:51:18 +0300 Subject: [PATCH] hj --- access/admin.py | 4 +- access/load_users.py | 24 +++++++-- access/migrations/0014_auto_20171017_1450.py | 29 +++++++++++ access/migrations/0015_auto_20171017_1514.py | 51 ++++++++++++++++++++ access/models.py | 33 +++++++++---- access/views.py | 1 - courses/models.py | 8 --- courses/views.py | 10 ++-- 8 files changed, 132 insertions(+), 28 deletions(-) create mode 100644 access/migrations/0014_auto_20171017_1450.py create mode 100644 access/migrations/0015_auto_20171017_1514.py diff --git a/access/admin.py b/access/admin.py index a88d298..b9dc6ca 100755 --- a/access/admin.py +++ b/access/admin.py @@ -1,8 +1,8 @@ from django.contrib import admin -from access.models import ActiveObject, ExtraPrivilege, User, Account, Invite +from access.models import Progress, ExtraPrivilege, User, Account, Invite admin.site.register(User) admin.site.register(Account) admin.site.register(ExtraPrivilege) -admin.site.register(ActiveObject) +admin.site.register(Progress) admin.site.register(Invite) \ No newline at end of file diff --git a/access/load_users.py b/access/load_users.py index a27166c..f779d35 100644 --- a/access/load_users.py +++ b/access/load_users.py @@ -5,6 +5,7 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings") django.setup() from django.contrib.auth import get_user_model +from access.models import Account if __name__ == '__main__': with open('../csv/access/users.csv') as user_csv: @@ -12,11 +13,28 @@ if __name__ == '__main__': for row in user_reader: try: row = dict(row) - print(row['role_list']) - row['role_list'] = json.loads(row['role_list']) + try: + row['role_list'] = [row['role_list'].split("\'")[1]] + except IndexError: + row['role_list'] = [] + get_user_model().objects.get_or_create(**row) except ValueError as e: - if e == 'The given email must be set': + if str(e) == 'The given email must be set': print(e) else: raise e + + with open('../csv/access/account.csv') as account_csv: + account_reader = csv.DictReader(account_csv) + for row in account_reader: + row = dict(row) + try: + acc = Account.objects.get(owner=get_user_model().objects.get(id=row['owner'])) + acc.phone = row['phone'] if row['phone'] and len(row['phone']) < 16 else None + acc.city = row['city'] if row['city'] else None + acc.photo = row['photo'] + acc.d_day = row['d_day'] if row['d_day'] else None + acc.save() + except (Account.DoesNotExist, get_user_model().DoesNotExist): + pass diff --git a/access/migrations/0014_auto_20171017_1450.py b/access/migrations/0014_auto_20171017_1450.py new file mode 100644 index 0000000..e91489e --- /dev/null +++ b/access/migrations/0014_auto_20171017_1450.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-17 14:50 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0013_auto_20171017_0933'), + ] + + operations = [ + migrations.RenameModel( + old_name='ActiveObject', + new_name='Progress', + ), + 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='lQNTPwtkiSKGcAk', max_length=15), + ), + ] diff --git a/access/migrations/0015_auto_20171017_1514.py b/access/migrations/0015_auto_20171017_1514.py new file mode 100644 index 0000000..f0d426c --- /dev/null +++ b/access/migrations/0015_auto_20171017_1514.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-17 15:14 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('access', '0014_auto_20171017_1450'), + ] + + operations = [ + migrations.AlterModelOptions( + name='account', + options={'verbose_name': 'Дополнительная информация о пользователе', 'verbose_name_plural': 'Дополнительная информация о пользователе'}, + ), + migrations.AlterModelOptions( + name='extraprivilege', + options={'verbose_name': 'Доп право', 'verbose_name_plural': 'Доп права пользователя'}, + ), + migrations.AlterModelOptions( + name='invite', + options={'verbose_name': 'Приглошение в систему', 'verbose_name_plural': 'Приглошения в систему'}, + ), + migrations.AlterModelOptions( + name='progress', + options={'verbose_name': 'Прогресс пользователя', 'verbose_name_plural': 'Прогресс пользователя'}, + ), + migrations.AlterField( + model_name='account', + name='city', + field=models.CharField(blank=True, max_length=63, null=True), + ), + migrations.AlterField( + model_name='account', + name='gender', + field=models.SmallIntegerField(choices=[(2, 'female'), (1, 'male'), (0, 'undefined')], default=0), + ), + migrations.AlterField( + model_name='account', + name='phone', + field=models.CharField(blank=True, max_length=15, null=True), + ), + migrations.AlterField( + model_name='invite', + name='hash', + field=models.CharField(default='EwxzlFyTLohcDNa', max_length=15), + ), + ] diff --git a/access/models.py b/access/models.py index e0b12f6..0dc16c4 100755 --- a/access/models.py +++ b/access/models.py @@ -1,12 +1,11 @@ # encoding=utf-8 import random import string -import json from courses.models import Vertex, Course from storage.models import Storage from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager -from django.contrib.auth.models import PermissionsMixin +from django.contrib.auth.models import PermissionsMixin, Group from django.db import models @@ -14,7 +13,6 @@ from django.conf import settings from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from lms.global_decorators import transaction_decorator -from django.contrib.auth.models import Group class Invite(models.Model): @@ -24,6 +22,10 @@ class Invite(models.Model): ) date = models.DateTimeField(null=True, blank=True) + class Meta: + verbose_name = 'Приглошение в систему' + verbose_name_plural = 'Приглошения в систему' + class Account(models.Model): GENDER_CHOICES = { @@ -32,22 +34,27 @@ class Account(models.Model): (2, 'female'), } b_day = models.DateField(blank=True, null=True) - city = models.CharField(max_length=63, null=True) + city = models.CharField(max_length=63, null=True, blank=True) gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0) owner = models.OneToOneField(to=settings.AUTH_USER_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) + phone = models.CharField(max_length=15, null=True, blank=True) def __str__(self): return self.owner.email + class Meta: + verbose_name = 'Дополнительная информация о пользователе' + verbose_name_plural = 'Дополнительная информация о пользователе' + + class CustomUserManager(BaseUserManager): use_in_migrations = True def get_or_create(self, email=None, password=None, **kwargs): if not email: - raise ValueError('email not set') + raise ValueError('The given email must be set') if password: kwargs["hash_password"] = password @@ -90,7 +97,7 @@ class CustomUserManager(BaseUserManager): if role_list: for group in role_list: - user.groups.add(group) + user.groups.add(Group.objects.get(name=group)) if is_send: pass @@ -142,7 +149,7 @@ class User(AbstractBaseUser, PermissionsMixin): verbose_name_plural = _('users') -class ActiveObject(models.Model): +class Progress(models.Model): user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Студент') course = models.ForeignKey(to=Course, verbose_name=u'Курс') active_obj = models.ForeignKey(to=Vertex, verbose_name=u'Активный объект', blank=True, null=True) @@ -158,8 +165,16 @@ class ActiveObject(models.Model): def is_access(self, vertex): return not vertex.is_more(self.active_obj) + class Meta: + verbose_name = 'Прогресс пользователя' + verbose_name_plural = 'Прогресс пользователя' + class ExtraPrivilege(models.Model): user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Правообладатель') is_done = models.BooleanField(default=False, verbose_name=u'Выполнено?') - subject = models.ForeignKey(to=Vertex, verbose_name=u'Объект') \ No newline at end of file + subject = models.ForeignKey(to=Vertex, verbose_name=u'Объект') + + class Meta: + verbose_name = 'Доп право' + verbose_name_plural = 'Доп права пользователя' diff --git a/access/views.py b/access/views.py index 16517d9..e64d328 100644 --- a/access/views.py +++ b/access/views.py @@ -5,7 +5,6 @@ from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from access.serializers import UserInitSerializer -from courses.models import Course class TeacherListView(APIView): diff --git a/courses/models.py b/courses/models.py index 10aaee2..b4c450e 100755 --- a/courses/models.py +++ b/courses/models.py @@ -34,7 +34,6 @@ class Course(models.Model): hidden = models.BooleanField(verbose_name=u'Видно только оплатившим', default=False) level = models.CharField(verbose_name=u'Уровень', choices=COURSE_LEVEL, default='B', max_length=3) slug = models.SlugField(max_length=255, editable=False, blank=True, default='', unique=True) - icon = models.ImageField(verbose_name=u'Иконка курса', blank=True, null=True, upload_to='course') direction = models.ForeignKey(MaterialDirection, verbose_name=u'Направление', null=True) mentors = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Кураторы', blank=True, related_name='course_mentors') @@ -45,15 +44,8 @@ class Course(models.Model): big_image = models.ImageField(verbose_name=u'Большое изображение', upload_to='course', blank=True) big_mobile_image = models.ImageField(verbose_name=u'Под мобилку', upload_to='course', blank=True, null=True, help_text=u'Большая картинка для мобильной версии') - preview = models.CharField(verbose_name=u'Трэйл', blank=True, default='', max_length=255) teachers = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Преподаватели', related_name='course_teachers') - sort = models.IntegerField(verbose_name=u'Порядок сортировки', default=0) - min_price = models.IntegerField(verbose_name=u'Цена от', default=0) - buy_icon = models.ImageField(verbose_name=u'Картинка покупки', upload_to='course', blank=True, null=True) - keywords = models.ManyToManyField(Tags, verbose_name=u'Ключевые слова', blank=True) - recommend = models.ManyToManyField('self', verbose_name=u'Связанные курсы', blank=True, - help_text=u'Курсы, которые стоит порекомендовать вместе с этим') def __str__(self): return self.title diff --git a/courses/views.py b/courses/views.py index 3449812..6311ef3 100644 --- a/courses/views.py +++ b/courses/views.py @@ -4,7 +4,7 @@ from rest_framework.response import Response from access.serializers import ExtraPrivilegeSerializer from courses.models import Course, MaterialDirection, Vertex -from access.models import ActiveObject, ExtraPrivilege +from access.models import Progress, ExtraPrivilege from courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer, CourseTreeSerializer from finance.models import Bill @@ -34,8 +34,8 @@ class TreeView(APIView): res = CourseTreeSerializer(course).data try: - res['active_id'] = ActiveObject.objects.get(course=course, user=request.user).active_obj.id - except ActiveObject.DoesNotExist: + res['active_id'] = Progress.objects.get(course=course, user=request.user).active_obj.id + except Progress.DoesNotExist: res['active_id'] = False res['extra_privilege'] = [ @@ -105,10 +105,10 @@ class VertexDetail(APIView): return res_a try: - if not ActiveObject.objects.get(course=vertex.course, user=request.user).is_access(vertex): + if not Progress.objects.get(course=vertex.course, user=request.user).is_access(vertex): return Response("permission denied", status=403) - except ActiveObject.DoesNotExist: + except Progress.DoesNotExist: return Response("permission denied", status=403) return res_a