Вынес прогресс пользователя в отдельное приложение

feature/fix_generate_pass
Evgeniy Shabanov 8 years ago
parent d7c1f136c4
commit 2344b88cb2
  1. 3
      access/admin.py
  2. 41
      access/migrations/0009_auto_20180125_1643.py
  3. 2
      access/models/__init__.py
  4. 29
      access/models/other.py
  5. 32
      access/serializers.py
  6. 1
      access/urls.py
  7. 39
      access/views.py
  8. 3
      api_v1/urls.py
  9. 2
      csv/load_bills.py
  10. 2
      csv/load_perm.py
  11. 4
      lms/settings.py
  12. 0
      progress/__init__.py
  13. 6
      progress/admin.py
  14. 7
      progress/apps.py
  15. 58
      progress/migrations/0001_initial.py
  16. 0
      progress/migrations/__init__.py
  17. 35
      progress/models.py
  18. 32
      progress/serializers.py
  19. 3
      progress/tests.py
  20. 7
      progress/urls.py
  21. 46
      progress/views.py

@ -1,9 +1,8 @@
from django.contrib import admin from django.contrib import admin
from access.models.other import Invite, Account, Progress, ResetPassword from access.models.other import Invite, Account, ResetPassword
from access.models.user import User from access.models.user import User
admin.site.register(User) admin.site.register(User)
admin.site.register(Account) admin.site.register(Account)
admin.site.register(Progress)
admin.site.register(Invite) admin.site.register(Invite)
admin.site.register(ResetPassword) admin.site.register(ResetPassword)

@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-25 16:43
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('access', '0008_auto_20171220_1325'),
]
operations = [
migrations.RemoveField(
model_name='pivotprogressvertex',
name='progress',
),
migrations.RemoveField(
model_name='pivotprogressvertex',
name='teacher',
),
migrations.AlterUniqueTogether(
name='progress',
unique_together=set([]),
),
migrations.RemoveField(
model_name='progress',
name='teacher',
),
migrations.RemoveField(
model_name='progress',
name='user',
),
migrations.DeleteModel(
name='PivotProgressVertex',
),
migrations.DeleteModel(
name='Progress',
),
]

@ -1,6 +1,6 @@
# encoding=utf-8 # encoding=utf-8
from .other import Account, Progress, Invite from .other import Account, Invite
from .user import User from .user import User

@ -42,32 +42,3 @@ class Account(models.Model):
verbose_name = 'Дополнительная информация о пользователе' verbose_name = 'Дополнительная информация о пользователе'
verbose_name_plural = 'Дополнительная информация о пользователе' verbose_name_plural = 'Дополнительная информация о пользователе'
class Progress(models.Model):
teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь по умолчанию",
related_name='teacher_progress')
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент')
route = models.CharField(max_length=15, verbose_name='Токен прохождения', blank=True, null=True)
course = models.CharField(max_length=127, verbose_name='Слаг курса')
def __str__(self):
return '%s' % (self.user.email,)
class Meta:
verbose_name = 'Прогресс пользователя'
verbose_name_plural = 'Прогресс пользователя'
unique_together = (("user", "route"),)
class PivotProgressVertex(models.Model):
VERTEX_STATUS = (
(2, 'Выполненно'),
(1, 'Ожидание'),
(0, 'Не выполненно'),
)
teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь",)
progress = models.ForeignKey(to=Progress)
vertex = models.CharField(max_length=15, blank=True, verbose_name='Ссылки на узлы')
status = models.SmallIntegerField(choices=VERTEX_STATUS, default=0)
comment = ArrayField(models.CharField(max_length=15, verbose_name='Ссылки на комменты', unique=True), default=[])
date = models.DateTimeField(verbose_name='Дата зачтения задания', blank=True, null=True)

@ -1,37 +1,9 @@
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.other import Account, Progress, PivotProgressVertex from access.models.other import Account
from achievements.serialers import DiplomaSerializer, AchievementsSerializer from achievements.serialers import DiplomaSerializer, AchievementsSerializer
from progress.serializers import ProgressSerializer
class PivotProgressSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
teacher = serializers.SerializerMethodField()
class Meta:
model = PivotProgressVertex
exclude = ('id', 'progress')
@staticmethod
def get_status(self):
return self.get_status_display()
@staticmethod
def get_teacher(self):
return self.teacher.get_full_name()
class ProgressSerializer(serializers.ModelSerializer):
vertexes = serializers.SerializerMethodField()
class Meta:
model = Progress
fields = ('route', 'vertexes', 'course')
@staticmethod
def get_vertexes(self):
return [PivotProgressSerializer(i).data for i in self.pivotprogressvertex_set.all()]
class AccountSerializer(serializers.ModelSerializer): class AccountSerializer(serializers.ModelSerializer):

@ -12,5 +12,4 @@ urlpatterns = [
url(r'login/$', views.LoginView.as_view()), url(r'login/$', views.LoginView.as_view()),
url(r'logout/$', views.LogoutView.as_view()), url(r'logout/$', views.LogoutView.as_view()),
url(r'reset/$', views.ResetPasswordView.as_view()), url(r'reset/$', views.ResetPasswordView.as_view()),
url(r'progress/$', views.UpdateProgress.as_view()),
] ]

@ -12,8 +12,8 @@ from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from access.models.other import Invite, Progress, ResetPassword, PivotProgressVertex from access.models.other import Invite, ResetPassword
from access.serializers import UserSelfSerializer, UserSearchSerializer, PivotProgressSerializer from access.serializers import UserSelfSerializer, UserSearchSerializer
class TeacherListView(APIView): class TeacherListView(APIView):
@ -229,41 +229,6 @@ class LogoutView(APIView):
return Response(status=204) return Response(status=204)
class UpdateProgress(APIView):
renderer_classes = (JSONRenderer,)
@staticmethod
def post(request):
"""
На вход обязательно передаётся параметр id (id узла).
"""
token = request.JSON.get('token', None)
course = request.JSON.get('slug', None)
if token is None or course is None:
return Response('Не передан слаг курса или токен урока', status=400)
try:
p = Progress.objects.get(user=request.user, course=course)
try:
pv = PivotProgressVertex.objects.get(
progress=p,
vertex=token,
)
except PivotProgressVertex.DoesNotExist:
pv = PivotProgressVertex.objects.create(
date=datetime.datetime.now(),
teacher=p.teacher,
progress=p,
vertex=token,
)
pv.status = 2
pv.save()
return Response(PivotProgressSerializer(pv).data, status=200)
except Progress.DoesNotExist:
return Response('Не найден прогресс по заданным параметрам', status=404)
class UserGuardView(APIView): class UserGuardView(APIView):
renderer_classes = (JSONRenderer,) renderer_classes = (JSONRenderer,)
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)

@ -4,6 +4,7 @@ urlpatterns = [
url(r'courses/', include('course_service.courses.urls')), url(r'courses/', include('course_service.courses.urls')),
url(r'users/', include('access.urls')), url(r'users/', include('access.urls')),
url(r'library/', include('library.urls')), url(r'library/', include('library.urls')),
url(r'finance/', include('finance.urls')), # url(r'finance/', include('finance.urls')),
url(r'storage/', include('storage.urls')), url(r'storage/', include('storage.urls')),
url(r'progress/', include('progress.urls')),
] ]

@ -15,7 +15,7 @@ django.setup()
from yandex_money.models import Payment from yandex_money.models import Payment
from finance.models import Bill, Invoice from finance.models import Bill, Invoice
from access.models.other import Progress from progress.models import Progress
from course_service.courses.models import Course from course_service.courses.models import Course
if __name__ == '__main__': if __name__ == '__main__':

@ -12,7 +12,7 @@ django.setup()
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from access.models.other import Progress, PivotProgressVertex from progress.models import Progress, PivotProgressVertex
from course_service.courses.models import Vertex, Course from course_service.courses.models import Vertex, Course
from course_service.maps.api import OutApiRoute from course_service.maps.api import OutApiRoute

@ -114,6 +114,7 @@ apps = (
'library', 'library',
'achievements', 'achievements',
'config_app', 'config_app',
'progress',
) )
INSTALLED_APPS = libs + apps INSTALLED_APPS = libs + apps
@ -185,3 +186,6 @@ STATIC_URL = '/static/'
RAVEN_CONFIG = { RAVEN_CONFIG = {
'dsn': 'http://caaea487274f4e23a9107862484c79f3:3d463ad4717942508536f7a659921950@sentry.skillbox.ru/3' 'dsn': 'http://caaea487274f4e23a9107862484c79f3:3d463ad4717942508536f7a659921950@sentry.skillbox.ru/3'
} }
DEBUG = env('DEBUG')

@ -0,0 +1,6 @@
from django.contrib import admin
# Register your models here.
from progress.models import Progress
admin.site.register(Progress)

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
from django.apps import AppConfig
class ProgressConfig(AppConfig):
name = 'progress'
verbose_name = 'Прогресс'

@ -0,0 +1,58 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2018-01-25 16:41
from __future__ import unicode_literals
from django.conf import settings
import django.contrib.postgres.fields
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='PivotProgressVertex',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('vertex', models.CharField(blank=True, max_length=15, verbose_name='Ссылки на узлы')),
('status', models.SmallIntegerField(choices=[(2, 'Выполненно'), (1, 'Ожидание'), (0, 'Не выполненно')], default=0)),
('comment', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=15, unique=True, verbose_name='Ссылки на комменты'), default=[], size=None)),
('date', models.DateTimeField(blank=True, null=True, verbose_name='Дата зачтения задания')),
],
),
migrations.CreateModel(
name='Progress',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('route', models.CharField(blank=True, max_length=15, null=True, verbose_name='Токен прохождения')),
('course', models.CharField(max_length=127, verbose_name='Слаг курса')),
('teacher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teacher_progress', to=settings.AUTH_USER_MODEL, verbose_name='Преподователь по умолчанию')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Студент')),
],
options={
'verbose_name_plural': 'Прогресс пользователя',
'verbose_name': 'Прогресс пользователя',
},
),
migrations.AddField(
model_name='pivotprogressvertex',
name='progress',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='progress.Progress'),
),
migrations.AddField(
model_name='pivotprogressvertex',
name='teacher',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Преподователь'),
),
migrations.AlterUniqueTogether(
name='progress',
unique_together=set([('user', 'route')]),
),
]

@ -0,0 +1,35 @@
from django.conf import settings
from django.contrib.postgres.fields import ArrayField
from django.db import models
# Create your models here.
class Progress(models.Model):
teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь по умолчанию",
related_name='teacher_progress')
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='Студент')
route = models.CharField(max_length=15, verbose_name='Токен прохождения', blank=True, null=True)
course = models.CharField(max_length=127, verbose_name='Слаг курса')
def __str__(self):
return '%s' % (self.user.email,)
class Meta:
verbose_name = 'Прогресс пользователя'
verbose_name_plural = 'Прогресс пользователя'
unique_together = (("user", "route"),)
class PivotProgressVertex(models.Model):
VERTEX_STATUS = (
(2, 'Выполненно'),
(1, 'Ожидание'),
(0, 'Не выполненно'),
)
teacher = models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name="Преподователь",)
progress = models.ForeignKey(to=Progress)
vertex = models.CharField(max_length=15, blank=True, verbose_name='Ссылки на узлы')
status = models.SmallIntegerField(choices=VERTEX_STATUS, default=0)
comment = ArrayField(models.CharField(max_length=15, verbose_name='Ссылки на комменты', unique=True), default=[])
date = models.DateTimeField(verbose_name='Дата зачтения задания', blank=True, null=True)

@ -0,0 +1,32 @@
from rest_framework import serializers
from .models import PivotProgressVertex, Progress
class PivotProgressSerializer(serializers.ModelSerializer):
status = serializers.SerializerMethodField()
teacher = serializers.SerializerMethodField()
class Meta:
model = PivotProgressVertex
exclude = ('id', 'progress')
@staticmethod
def get_status(self):
return self.get_status_display()
@staticmethod
def get_teacher(self):
return self.teacher.get_full_name()
class ProgressSerializer(serializers.ModelSerializer):
vertexes = serializers.SerializerMethodField()
class Meta:
model = Progress
fields = ('route', 'vertexes', 'course')
@staticmethod
def get_vertexes(self):
return [PivotProgressSerializer(i).data for i in self.pivotprogressvertex_set.all()]

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,7 @@
from django.conf.urls import url
from progress import views
urlpatterns = [
url(r'$', views.UpdateProgress.as_view()),
]

@ -0,0 +1,46 @@
import datetime
from django.shortcuts import render
# Create your views here.
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Progress, PivotProgressVertex
from .serializers import PivotProgressSerializer
class UpdateProgress(APIView):
renderer_classes = (JSONRenderer,)
@staticmethod
def post(request):
"""
На вход обязательно передаётся параметр id (id узла).
"""
token = request.JSON.get('token', None)
course = request.JSON.get('slug', None)
if token is None or course is None:
return Response('Не передан слаг курса или токен урока', status=400)
try:
p = Progress.objects.get(user=request.user, course=course)
try:
pv = PivotProgressVertex.objects.get(
progress=p,
vertex=token,
)
except PivotProgressVertex.DoesNotExist:
pv = PivotProgressVertex.objects.create(
date=datetime.datetime.now(),
teacher=p.teacher,
progress=p,
vertex=token,
)
pv.status = 2
pv.save()
return Response(PivotProgressSerializer(pv).data, status=200)
except Progress.DoesNotExist:
return Response('Не найден прогресс по заданным параметрам', status=404)
Loading…
Cancel
Save