parent
d7c1f136c4
commit
2344b88cb2
21 changed files with 252 additions and 106 deletions
@ -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 |
||||
|
||||
|
||||
|
||||
@ -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…
Reference in new issue