feature/fix_generate_pass
Andrey 8 years ago
parent 55d02c579a
commit 2e938e53e7
  1. 4
      access/admin.py
  2. 24
      access/load_users.py
  3. 29
      access/migrations/0014_auto_20171017_1450.py
  4. 51
      access/migrations/0015_auto_20171017_1514.py
  5. 33
      access/models.py
  6. 1
      access/views.py
  7. 8
      courses/models.py
  8. 10
      courses/views.py

@ -1,8 +1,8 @@
from django.contrib import admin 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(User)
admin.site.register(Account) admin.site.register(Account)
admin.site.register(ExtraPrivilege) admin.site.register(ExtraPrivilege)
admin.site.register(ActiveObject) admin.site.register(Progress)
admin.site.register(Invite) admin.site.register(Invite)

@ -5,6 +5,7 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lms.settings")
django.setup() django.setup()
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from access.models import Account
if __name__ == '__main__': if __name__ == '__main__':
with open('../csv/access/users.csv') as user_csv: with open('../csv/access/users.csv') as user_csv:
@ -12,11 +13,28 @@ if __name__ == '__main__':
for row in user_reader: for row in user_reader:
try: try:
row = dict(row) row = dict(row)
print(row['role_list']) try:
row['role_list'] = json.loads(row['role_list']) row['role_list'] = [row['role_list'].split("\'")[1]]
except IndexError:
row['role_list'] = []
get_user_model().objects.get_or_create(**row) get_user_model().objects.get_or_create(**row)
except ValueError as e: except ValueError as e:
if e == 'The given email must be set': if str(e) == 'The given email must be set':
print(e) print(e)
else: else:
raise e 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

@ -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),
),
]

@ -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),
),
]

@ -1,12 +1,11 @@
# encoding=utf-8 # encoding=utf-8
import random import random
import string import string
import json
from courses.models import Vertex, Course from courses.models import Vertex, Course
from storage.models import Storage from storage.models import Storage
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager 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 from django.db import models
@ -14,7 +13,6 @@ from django.conf import settings
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from lms.global_decorators import transaction_decorator from lms.global_decorators import transaction_decorator
from django.contrib.auth.models import Group
class Invite(models.Model): class Invite(models.Model):
@ -24,6 +22,10 @@ class Invite(models.Model):
) )
date = models.DateTimeField(null=True, blank=True) date = models.DateTimeField(null=True, blank=True)
class Meta:
verbose_name = 'Приглошение в систему'
verbose_name_plural = 'Приглошения в систему'
class Account(models.Model): class Account(models.Model):
GENDER_CHOICES = { GENDER_CHOICES = {
@ -32,22 +34,27 @@ class Account(models.Model):
(2, 'female'), (2, 'female'),
} }
b_day = models.DateField(blank=True, null=True) 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) gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0)
owner = models.OneToOneField(to=settings.AUTH_USER_MODEL) 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/') 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): def __str__(self):
return self.owner.email return self.owner.email
class Meta:
verbose_name = 'Дополнительная информация о пользователе'
verbose_name_plural = 'Дополнительная информация о пользователе'
class CustomUserManager(BaseUserManager): class CustomUserManager(BaseUserManager):
use_in_migrations = True use_in_migrations = True
def get_or_create(self, email=None, password=None, **kwargs): def get_or_create(self, email=None, password=None, **kwargs):
if not email: if not email:
raise ValueError('email not set') raise ValueError('The given email must be set')
if password: if password:
kwargs["hash_password"] = password kwargs["hash_password"] = password
@ -90,7 +97,7 @@ class CustomUserManager(BaseUserManager):
if role_list: if role_list:
for group in role_list: for group in role_list:
user.groups.add(group) user.groups.add(Group.objects.get(name=group))
if is_send: if is_send:
pass pass
@ -142,7 +149,7 @@ class User(AbstractBaseUser, PermissionsMixin):
verbose_name_plural = _('users') verbose_name_plural = _('users')
class ActiveObject(models.Model): class Progress(models.Model):
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Студент') user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Студент')
course = models.ForeignKey(to=Course, verbose_name=u'Курс') course = models.ForeignKey(to=Course, verbose_name=u'Курс')
active_obj = models.ForeignKey(to=Vertex, verbose_name=u'Активный объект', blank=True, null=True) 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): def is_access(self, vertex):
return not vertex.is_more(self.active_obj) return not vertex.is_more(self.active_obj)
class Meta:
verbose_name = 'Прогресс пользователя'
verbose_name_plural = 'Прогресс пользователя'
class ExtraPrivilege(models.Model): class ExtraPrivilege(models.Model):
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Правообладатель') user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name=u'Правообладатель')
is_done = models.BooleanField(default=False, verbose_name=u'Выполнено?') is_done = models.BooleanField(default=False, verbose_name=u'Выполнено?')
subject = models.ForeignKey(to=Vertex, verbose_name=u'Объект') subject = models.ForeignKey(to=Vertex, verbose_name=u'Объект')
class Meta:
verbose_name = 'Доп право'
verbose_name_plural = 'Доп права пользователя'

@ -5,7 +5,6 @@ from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response from rest_framework.response import Response
from access.serializers import UserInitSerializer from access.serializers import UserInitSerializer
from courses.models import Course
class TeacherListView(APIView): class TeacherListView(APIView):

@ -34,7 +34,6 @@ class Course(models.Model):
hidden = models.BooleanField(verbose_name=u'Видно только оплатившим', default=False) hidden = models.BooleanField(verbose_name=u'Видно только оплатившим', default=False)
level = models.CharField(verbose_name=u'Уровень', choices=COURSE_LEVEL, default='B', max_length=3) 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) 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) direction = models.ForeignKey(MaterialDirection, verbose_name=u'Направление', null=True)
mentors = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Кураторы', blank=True, mentors = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Кураторы', blank=True,
related_name='course_mentors') 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_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, big_mobile_image = models.ImageField(verbose_name=u'Под мобилку', upload_to='course', blank=True, null=True,
help_text=u'Большая картинка для мобильной версии') 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'Преподаватели', teachers = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name=u'Преподаватели',
related_name='course_teachers') 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): def __str__(self):
return self.title return self.title

@ -4,7 +4,7 @@ from rest_framework.response import Response
from access.serializers import ExtraPrivilegeSerializer from access.serializers import ExtraPrivilegeSerializer
from courses.models import Course, MaterialDirection, Vertex 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 courses.serializers import CourseDetailSerializer, CourseListSerializer, VertexSerializer, CourseTreeSerializer
from finance.models import Bill from finance.models import Bill
@ -34,8 +34,8 @@ class TreeView(APIView):
res = CourseTreeSerializer(course).data res = CourseTreeSerializer(course).data
try: try:
res['active_id'] = ActiveObject.objects.get(course=course, user=request.user).active_obj.id res['active_id'] = Progress.objects.get(course=course, user=request.user).active_obj.id
except ActiveObject.DoesNotExist: except Progress.DoesNotExist:
res['active_id'] = False res['active_id'] = False
res['extra_privilege'] = [ res['extra_privilege'] = [
@ -105,10 +105,10 @@ class VertexDetail(APIView):
return res_a return res_a
try: 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) return Response("permission denied", status=403)
except ActiveObject.DoesNotExist: except Progress.DoesNotExist:
return Response("permission denied", status=403) return Response("permission denied", status=403)
return res_a return res_a

Loading…
Cancel
Save