feature/fix_generate_pass
Andrey 8 years ago
parent 256db130dc
commit 514671b31f
  1. 0
      access/management/__init__.py
  2. 45
      access/management/commands/add_users_in_groups.py
  3. 20
      access/migrations/0008_auto_20171117_1113.py
  4. 7
      access/models.py
  5. 57
      access/serializers.py
  6. 4
      access/views.py
  7. 39
      courses/models.py
  8. 2
      finance/urls.py
  9. 18
      finance/views.py

@ -0,0 +1,45 @@
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.core.management.base import BaseCommand, CommandError
import os
import shutil
from django.conf import settings
class Command(BaseCommand):
help = 'Добавляет 1 или нескольких юзеров в указанные группы'
def add_arguments(self, parser):
parser.add_argument(
'--users',
type=str,
dest='users_emails',
help='Емейлы пользователей для добавления'
)
parser.add_argument(
'--groups',
type=str,
dest='groups_names',
help='Наименования групп для добавления'
)
def handle(self, *args, **options):
for email in options['users_emails'].split(', '):
try:
user = get_user_model().objects.get(email=email)
for name in options['groups_names'].split(', '):
try:
g = Group.objects.get(name=name)
except Group.DoesNotExist:
print("""Group with name "%s" doesn't exist""")
if name == "admin":
user.is_superuser = True
user.is_staff = True
if name != "students":
user.is_staff = True
g.user_set.add(user)
user.save()
except get_user_model().DoesNotExist:
print("""user with email: "%s" not found""" % email)

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-11-17 11:13
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('courses', '0007_auto_20171103_1627'),
('access', '0007_auto_20171106_1808'),
]
operations = [
migrations.AlterUniqueTogether(
name='progress',
unique_together=set([('user', 'course')]),
),
]

@ -181,12 +181,13 @@ class Progress(models.Model):
class Meta: class Meta:
verbose_name = 'Прогресс пользователя' verbose_name = 'Прогресс пользователя'
verbose_name_plural = 'Прогресс пользователя' verbose_name_plural = 'Прогресс пользователя'
unique_together = ("user", "course")
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='Правообладатель')
is_done = models.BooleanField(default=False, verbose_name=u'Выполнено?') is_done = models.BooleanField(default=False, verbose_name='Выполнено?')
subject = models.ForeignKey(to=Vertex, verbose_name=u'Объект') subject = models.ForeignKey(to=Vertex, verbose_name='Объект')
class Meta: class Meta:
verbose_name = 'Доп право' verbose_name = 'Доп право'

@ -1,6 +1,36 @@
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from rest_framework import serializers from rest_framework import serializers
from access.models import ExtraPrivilege, Account from access.models import ExtraPrivilege, Account, Progress
from courses.serializers import MiniVertexSerializer
class ProgressSerializer(serializers.ModelSerializer):
vertex = serializers.SerializerMethodField()
course = serializers.SerializerMethodField()
max = serializers.SerializerMethodField()
number = serializers.SerializerMethodField()
class Meta:
model = Progress
fields = ('course', 'vertex', 'number', 'max')
@staticmethod
def get_max(self):
return self.course.get_vertexes('topic').count()
@staticmethod
def get_number(self):
if self.success:
return self.get_max()
return self.active_obj.get_number('topic')
@staticmethod
def get_course(self):
return {'title': self.course.title, 'slug': self.course.slug}
@staticmethod
def get_vertex(self):
return MiniVertexSerializer(self.active_obj).data
class AccountSerializer(serializers.ModelSerializer): class AccountSerializer(serializers.ModelSerializer):
@ -32,6 +62,31 @@ class UserInitSerializer(serializers.ModelSerializer):
return [group.name for group in self.groups.all()] return [group.name for group in self.groups.all()]
class UserProfileSerializer(serializers.ModelSerializer):
account = serializers.SerializerMethodField()
groups = serializers.SerializerMethodField()
progress = serializers.SerializerMethodField()
class Meta:
model = get_user_model()
fields = (
'id', 'email', 'first_name', 'last_name','progress',
'account', 'groups', 'is_staff', 'is_superuser',
)
@staticmethod
def get_progress(self):
return [ProgressSerializer(i).data for i in self.progress_set.all()]
@staticmethod
def get_account(self):
return AccountSerializer(self.account).data
@staticmethod
def get_groups(self):
return [group.name for group in self.groups.all()]
class UserSearchSerializer(serializers.ModelSerializer): class UserSearchSerializer(serializers.ModelSerializer):
pay = serializers.SerializerMethodField() pay = serializers.SerializerMethodField()
phone = serializers.SerializerMethodField() phone = serializers.SerializerMethodField()

@ -7,7 +7,7 @@ from rest_framework.response import Response
from django.db.models import Q from django.db.models import Q
from access.models import Invite, Progress, ExtraPrivilege from access.models import Invite, Progress, ExtraPrivilege
from access.serializers import UserInitSerializer, UserSearchSerializer from access.serializers import UserInitSerializer, UserSearchSerializer, UserProfileSerializer
from courses.models import Vertex from courses.models import Vertex
@ -83,7 +83,7 @@ class DetailUserView(APIView):
except get_user_model().DoesNotExist: except get_user_model().DoesNotExist:
return Response("User doesn't exist", status=404) return Response("User doesn't exist", status=404)
return Response(UserInitSerializer(user).data, status=200) return Response(UserProfileSerializer(user).data, status=200)
return Response('Permission denied', status=403) return Response('Permission denied', status=403)

@ -86,7 +86,7 @@ class Course(models.Model):
image = models.URLField(verbose_name='Изображение', blank=True, max_length=255) image = models.URLField(verbose_name='Изображение', blank=True, max_length=255)
big_image = models.URLField(verbose_name='Большое изображение', blank=True, max_length=255) big_image = models.URLField(verbose_name='Большое изображение', blank=True, max_length=255)
big_mobile_image = models.URLField(verbose_name='Под мобилку', blank=True, null=True, big_mobile_image = models.URLField(verbose_name='Под мобилку', blank=True, null=True,
help_text='Большая картинка для мобильной версии', max_length=255) help_text='Большая картинка для мобильной версии', max_length=255)
teachers = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Преподаватели', teachers = models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='Преподаватели',
related_name='course_teachers') related_name='course_teachers')
@ -111,17 +111,24 @@ class Course(models.Model):
return helper(course_map) return helper(course_map)
def get_vertexes(self, vertex_type=None):
course_map = CourseMap.objects.get(course=self).map_to_list()
if vertex_type:
return self.vertex_set.filter(content_type__model=vertex_type, id__in=course_map)
return course_map
def get_statistic(self): def get_statistic(self):
""" """
Минималистичная статистика по уроку, Минималистичная статистика по уроку,
количество тем, уроков, домашек. количество тем, уроков, домашек.
""" """
topic_count = Vertex.objects.filter(course=self, content_type__model='topic').count() return {
task_count = Vertex.objects.filter(course=self, content_type__model='task').count() "topic_count": self.get_vertexes('topic').count(),
tutorial_count = Vertex.objects.filter(course=self, content_type__model='tutorial').count() "tutorial_count": self.get_vertexes('task').count(),
"task_count": self.get_vertexes('tutorial').count(),
return {"topic_count": topic_count, "tutorial_count": tutorial_count, "task_count": task_count} }
def get_first(self, vertex_model_list=None): def get_first(self, vertex_model_list=None):
if vertex_model_list is None: if vertex_model_list is None:
@ -171,8 +178,8 @@ class Skills(models.Model):
def __str__(self): return '%s' % self.title def __str__(self): return '%s' % self.title
class Meta: class Meta:
verbose_name = u'Навык' verbose_name = 'Навык'
verbose_name_plural = u'Навыки' verbose_name_plural = 'Навыки'
class SkillJ(models.Model): class SkillJ(models.Model):
@ -332,6 +339,22 @@ class Vertex(models.Model):
return progress.is_access(self) return progress.is_access(self)
def get_number(self, vertex_type=None):
"""
Возврощает порядковый номер узла с определённым типом.
Пример мы хотим определит какой по счёту теме принадлежит конкретно взятый урок.
"""
vertex_list = list(self.course.get_vertexes(vertex_type))
try:
res = vertex_list.index(self)
except ValueError:
parents = self.vertex_set.all()
if parents.count() == 1:
res = vertex_list.index(parents[0])
else:
res = None
return res
# Модели нового API со временем всё, что выше будет выпилено # Модели нового API со временем всё, что выше будет выпилено
class Tutorial(models.Model): class Tutorial(models.Model):

@ -5,5 +5,5 @@ urlpatterns = [
url(r'bills/([0-9]{1,99})/$', views.BillDetailView.as_view()), url(r'bills/([0-9]{1,99})/$', views.BillDetailView.as_view()),
url(r'payment/([0-9]{1,99})/$', views.YandexPay.as_view()), url(r'payment/([0-9]{1,99})/$', views.YandexPay.as_view()),
url(r'bills/$', views.BillListView.as_view()), url(r'bills/$', views.BillListView.as_view()),
url(r'invoices/$', views.get_invoices),
] ]

@ -131,7 +131,7 @@ def get_invoices(request):
file_name = file_name + "__from_%s" % date_from if date_from else file_name file_name = file_name + "__from_%s" % date_from if date_from else file_name
file_name = file_name + "__to_%s" % date_to if date_to else file_name file_name = file_name + "__to_%s" % date_to if date_to else file_name
invoices = Invoice.objects.filter() invoices = Invoice.objects.filter(method="Y", status="F")
invoices = invoices.filter(date__lt=date_to) if date_to else invoices invoices = invoices.filter(date__lt=date_to) if date_to else invoices
invoices = invoices.filter(date__gte=date_from) if date_from else invoices invoices = invoices.filter(date__gte=date_from) if date_from else invoices
@ -139,17 +139,17 @@ def get_invoices(request):
response['Content-Disposition'] = 'attachment; filename="%s"' % file_name response['Content-Disposition'] = 'attachment; filename="%s"' % file_name
writer = csv.writer(response) writer = csv.writer(response)
writer.writerow(['student_email', 'full_name', 'course', 'theme', 'task_id', 'date']) writer.writerow(['date', 'student_email', 'full_name', 'course', 'price', 'real_price', 'key'])
for i in invoices.order_by('-date'): for i in invoices.order_by('-date'):
student = get_user_model().objects.get(id=i.thread.key.split('user_')[1].split('__vertex')[0])
writer.writerow([ writer.writerow([
student.email, i.date,
student.get_full_name(), i.bill.user.email,
i.content_object.course.title, i.bill.user.get_full_name(),
i.content_object.vertex_set.all()[0].title, i.bill.course.title,
i.content_object.id, i.price,
i.date.date() i.real_price,
i.key,
]) ])
return response return response
Loading…
Cancel
Save