Не в коем случае не мёржить!!!

remotes/origin/dev2
Andrey 8 years ago
parent b12e0ef56e
commit bbbb8bb6f2
  1. 5
      access/serializers.py
  2. 6
      access/urls.py
  3. 2
      lms/settings.py
  4. 24
      progress/serializers.py
  5. 50
      progress/views.py

@ -1,10 +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 rest_framework.generics import get_object_or_404
from access.models.other import Account from access.models.other import Account
from achievements.serialers import DiplomaSerializer, AchievementsSerializer from achievements.serialers import DiplomaSerializer, AchievementsSerializer
from progress.serializers import ProgressSerializer from progress.serializers import SecureProgressSerializer
class AccountSerializer(serializers.ModelSerializer): class AccountSerializer(serializers.ModelSerializer):
@ -49,7 +48,7 @@ class UserSelfSerializer(serializers.ModelSerializer):
@staticmethod @staticmethod
def get_progress(self): def get_progress(self):
return [ProgressSerializer(i).data for i in self.progress_set.all()] return [SecureProgressSerializer(i).data for i in self.progress_set.all()]
class UserProfileSerializer(serializers.ModelSerializer): class UserProfileSerializer(serializers.ModelSerializer):

@ -18,10 +18,6 @@ urlpatterns = [
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_detail/upload/(?P<token>[0-9A-Fa-f-]+)/$', progress.views.UploadCourseProgressUserView.as_view()), url(r'progress_detail/upload/(?P<token>[0-9A-Fa-f-]+)/$', progress.views.UploadCourseProgressUserView.as_view()),
url( url(r'management/password/$', views.ManagementPassword.as_view(), name='management-password')
r'management/password/$',
views.ManagementPassword.as_view(),
name='management-password'
)
] ]

@ -68,6 +68,8 @@ DATABASES = {
'default': env.db(), 'default': env.db(),
} }
COURSE_PROGRESS_SECRET_KEY = "!gf?s3@4Hr5#J#&%Kfr@56s"
SESSION_ENGINE = 'redis_sessions.session' SESSION_ENGINE = 'redis_sessions.session'
CELERY_EMAIL_CHUNK_SIZE = 1 CELERY_EMAIL_CHUNK_SIZE = 1

@ -1,6 +1,8 @@
from rest_framework import serializers from rest_framework import serializers
from progress.models import Progress, ProgressLesson from progress.models import Progress, ProgressLesson
import jwt
from django.conf import settings
class ProgressSerializer(serializers.ModelSerializer): class ProgressSerializer(serializers.ModelSerializer):
@ -15,6 +17,24 @@ class ProgressSerializer(serializers.ModelSerializer):
return [ProgressLessonSerializer(i).data for i in self.progresslesson_set.all()] return [ProgressLessonSerializer(i).data for i in self.progresslesson_set.all()]
class SecureProgressSerializer(serializers.ModelSerializer):
jwt_token = serializers.SerializerMethodField()
class Meta:
model = Progress
fields = ('jwt_token', )
@staticmethod
def get_jwt_token(self):
payload = {
'lessons': [ProgressLessonSerializer(i).data for i in self.progresslesson_set.all()],
'course_token': str(self.course_token),
'only_watch': self.only_watch,
'is_finish': self.is_finish,
}
return jwt.encode(payload, settings.COURSE_PROGRESS_SECRET_KEY, algorithm='HS256')
class ProgressAnalyticSerializer(serializers.ModelSerializer): class ProgressAnalyticSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField() name = serializers.SerializerMethodField()
email = serializers.SerializerMethodField() email = serializers.SerializerMethodField()
@ -47,8 +67,8 @@ class ProgressLessonSerializer(serializers.ModelSerializer):
@staticmethod @staticmethod
def get_student(self): def get_student(self):
return {'name': self.progress.user.get_full_name(), "out_key": self.progress.user.out_key} return {'name': self.progress.user.get_full_name(), "out_key": str(self.progress.user.out_key)}
@staticmethod @staticmethod
def get_course_token(self): def get_course_token(self):
return self.progress.course_token return str(self.progress.course_token)

@ -175,47 +175,41 @@ class StudentUpdateProgress(APIView):
@staticmethod @staticmethod
def post(request): def post(request):
lesson_token = request.JSON.get('lesson_token', None) lesson_token = request.JSON.get('lesson_token', None)
course_token = request.JSON.get('course_token', None)
comment = request.JSON.get('comment', None) comment = request.JSON.get('comment', None)
if lesson_token is None or course_token is None: if lesson_token is None:
return Response('Не передан слаг курса или токен урока', status=400) return Response('Не передан токен урока', status=400)
try:
student = request.user
p = Progress.objects.get(user=student, course_token=course_token)
try:
pv = ProgressLesson.objects.get(
progress=p,
lesson_token=lesson_token,
)
if not pv.status == ProgressLesson.STATUSES.wait: student = request.user
if pv.checker == p.teacher and not comment is None:
pv.status = ProgressLesson.STATUSES.wait
pv.comment_tokens.append(comment)
elif pv.checker == p.user: try:
pv.status = ProgressLesson.STATUSES.done pv = ProgressLesson.objects.get(
pv.finish_date = datetime.datetime.now() progress__user=student,
lesson_token=lesson_token,
)
else: if not pv.status == ProgressLesson.STATUSES.wait:
raise ValueError("Этого никогда не должно происходить, но я уверен, что произойдёт") if pv.checker == pv.progress.teacher and not comment is None:
pv.status = ProgressLesson.STATUSES.wait
pv.comment_tokens.append(comment)
pv.save() elif pv.checker == pv.progress.user:
pv.status = ProgressLesson.STATUSES.done
pv.finish_date = datetime.datetime.now()
else: else:
return Response("Ошибка прав доступа", status=403) raise ValueError("Этого никогда не должно происходить, но я уверен, что произойдёт")
except ProgressLesson.DoesNotExist: pv.save()
return Response('Урок не проходится этим пользователем', status=403)
else:
return Response("Ошибка прав доступа", status=403)
if pv.status == ProgressLesson.STATUSES.done: if pv.status == ProgressLesson.STATUSES.done:
# TODO: Ассинхроннаязадача для celery # TODO: Ассинхроннаязадача для celery
add_next_lesson(p) add_next_lesson(pv.progress)
return Response(ProgressSerializer(p).data, status=200) return Response(ProgressSerializer(pv.progress).data, status=200)
except Progress.DoesNotExist: except Progress.DoesNotExist:
return Response('Не найден прогресс по заданным параметрам', status=404) return Response('Не найден прогресс по заданным параметрам', status=404)

Loading…
Cancel
Save