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

feature/fix_generate_pass
Evgeniy Shabanov 8 years ago
parent d7c1f136c4
commit 2344b88cb2
  1. 5
      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. 3
      access/urls.py
  7. 39
      access/views.py
  8. 5
      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 access.models.other import Invite, Account, Progress, ResetPassword
from access.models.other import Invite, Account, ResetPassword
from access.models.user import User
admin.site.register(User)
admin.site.register(Account)
admin.site.register(Progress)
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
from .other import Account, Progress, Invite
from .other import Account, Invite
from .user import User

@ -42,32 +42,3 @@ class Account(models.Model):
verbose_name = 'Дополнительная информация о пользователе'
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 rest_framework import serializers
from access.models.other import Account, Progress, PivotProgressVertex
from access.models.other import Account
from achievements.serialers import DiplomaSerializer, AchievementsSerializer
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()]
from progress.serializers import ProgressSerializer
class AccountSerializer(serializers.ModelSerializer):

@ -12,5 +12,4 @@ urlpatterns = [
url(r'login/$', views.LoginView.as_view()),
url(r'logout/$', views.LogoutView.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.views import APIView
from access.models.other import Invite, Progress, ResetPassword, PivotProgressVertex
from access.serializers import UserSelfSerializer, UserSearchSerializer, PivotProgressSerializer
from access.models.other import Invite, ResetPassword
from access.serializers import UserSelfSerializer, UserSearchSerializer
class TeacherListView(APIView):
@ -229,41 +229,6 @@ class LogoutView(APIView):
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):
renderer_classes = (JSONRenderer,)
permission_classes = (IsAuthenticated,)

@ -4,6 +4,7 @@ urlpatterns = [
url(r'courses/', include('course_service.courses.urls')),
url(r'users/', include('access.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'progress/', include('progress.urls')),
]

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

@ -12,7 +12,7 @@ django.setup()
from django.contrib.auth.models import Group
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.maps.api import OutApiRoute

@ -114,6 +114,7 @@ apps = (
'library',
'achievements',
'config_app',
'progress',
)
INSTALLED_APPS = libs + apps
@ -185,3 +186,6 @@ STATIC_URL = '/static/'
RAVEN_CONFIG = {
'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