diff --git a/access/admin.py b/access/admin.py index 5526ca6..63048a7 100755 --- a/access/admin.py +++ b/access/admin.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) \ No newline at end of file +admin.site.register(ResetPassword) diff --git a/access/migrations/0009_auto_20180125_1643.py b/access/migrations/0009_auto_20180125_1643.py new file mode 100644 index 0000000..338f94d --- /dev/null +++ b/access/migrations/0009_auto_20180125_1643.py @@ -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', + ), + ] diff --git a/access/models/__init__.py b/access/models/__init__.py index b2288a5..ae43d1e 100755 --- a/access/models/__init__.py +++ b/access/models/__init__.py @@ -1,6 +1,6 @@ # encoding=utf-8 -from .other import Account, Progress, Invite +from .other import Account, Invite from .user import User diff --git a/access/models/other.py b/access/models/other.py index d586dc7..cebafcf 100644 --- a/access/models/other.py +++ b/access/models/other.py @@ -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) \ No newline at end of file diff --git a/access/serializers.py b/access/serializers.py index e62c2f6..347f470 100644 --- a/access/serializers.py +++ b/access/serializers.py @@ -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): diff --git a/access/urls.py b/access/urls.py index d2600ec..a86e891 100644 --- a/access/urls.py +++ b/access/urls.py @@ -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()), -] \ No newline at end of file +] diff --git a/access/views.py b/access/views.py index b72f3de..5afe24b 100644 --- a/access/views.py +++ b/access/views.py @@ -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,) diff --git a/api_v1/urls.py b/api_v1/urls.py index 3ec2478..85876c9 100644 --- a/api_v1/urls.py +++ b/api_v1/urls.py @@ -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')), -] \ No newline at end of file + url(r'progress/', include('progress.urls')), +] diff --git a/csv/load_bills.py b/csv/load_bills.py index e5c7427..db4bd87 100644 --- a/csv/load_bills.py +++ b/csv/load_bills.py @@ -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__': diff --git a/csv/load_perm.py b/csv/load_perm.py index c53136c..04df859 100644 --- a/csv/load_perm.py +++ b/csv/load_perm.py @@ -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 diff --git a/lms/settings.py b/lms/settings.py index 5d5e3e2..38572f8 100644 --- a/lms/settings.py +++ b/lms/settings.py @@ -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') diff --git a/progress/__init__.py b/progress/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/progress/admin.py b/progress/admin.py new file mode 100644 index 0000000..0e07352 --- /dev/null +++ b/progress/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +# Register your models here. +from progress.models import Progress + +admin.site.register(Progress) diff --git a/progress/apps.py b/progress/apps.py new file mode 100644 index 0000000..07fee92 --- /dev/null +++ b/progress/apps.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +from django.apps import AppConfig + + +class ProgressConfig(AppConfig): + name = 'progress' + verbose_name = 'Прогресс' diff --git a/progress/migrations/0001_initial.py b/progress/migrations/0001_initial.py new file mode 100644 index 0000000..f023e24 --- /dev/null +++ b/progress/migrations/0001_initial.py @@ -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')]), + ), + ] diff --git a/progress/migrations/__init__.py b/progress/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/progress/models.py b/progress/models.py new file mode 100644 index 0000000..adb61a1 --- /dev/null +++ b/progress/models.py @@ -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) \ No newline at end of file diff --git a/progress/serializers.py b/progress/serializers.py new file mode 100644 index 0000000..17e7a8d --- /dev/null +++ b/progress/serializers.py @@ -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()] \ No newline at end of file diff --git a/progress/tests.py b/progress/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/progress/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/progress/urls.py b/progress/urls.py new file mode 100644 index 0000000..949cf8f --- /dev/null +++ b/progress/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url + +from progress import views + +urlpatterns = [ + url(r'$', views.UpdateProgress.as_view()), +] diff --git a/progress/views.py b/progress/views.py new file mode 100644 index 0000000..bf3a196 --- /dev/null +++ b/progress/views.py @@ -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) \ No newline at end of file