diff --git a/access/urls.py b/access/urls.py index 5378687..4e8aef6 100644 --- a/access/urls.py +++ b/access/urls.py @@ -5,8 +5,8 @@ from access import views urlpatterns = [ url(r'teachers/$', views.TeacherListView.as_view()), + url(r'detail/(?P[0-9A-Fa-f-]+)/$', views.DetailUserView.as_view()), url(r'detail/$', views.DetailUserView.as_view()), - url(r'detail/([0-9]{1,99})/$', views.DetailUserView.as_view()), url(r'info/(?P[0-9A-Fa-f-]+)/$', views.MinUserView.as_view()), url(r'guard/(?P[0-9]{1,99})/(?P.+)/$', progress.views.UserGuardView.as_view()), url(r'find/$', views.FindUserView.as_view()), diff --git a/access/views.py b/access/views.py index 40543e5..e2ce5e2 100644 --- a/access/views.py +++ b/access/views.py @@ -12,8 +12,9 @@ from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from rest_framework.views import APIView -from access.models.other import Invite, ResetPassword +from access.models.other import Invite, ResetPassword, Account from access.serializers import UserSelfSerializer, UserSearchSerializer +from lms.tools import decode_base64 class TeacherListView(APIView): @@ -120,18 +121,35 @@ class DetailUserView(APIView): renderer_classes = (JSONRenderer,) @staticmethod - def post(request, pk=None): - if pk is None: + def post(request, out_key=None): + if out_key is None: return Response("out_key mast be set", status=400) - if not request.user.out_key == pk: - return Response("You can't change this profile", status=403) + # if not request.user.out_key == out_key: + # return Response("You can't change this profile", status=403) + + user = request.user f_n = request.JSON.get('first_name', None) l_n = request.JSON.get('last_name', None) + if not f_n is None: + user.first_name = f_n + + if not l_n is None: + user.first_name = l_n + + user.save() + acc = request.JSON.get('account', None) + acc['gender'] = 0 if acc['gender'] == "undefined" else 1 if acc['gender'] == "male" else 2 + + if acc['photo']: + acc['photo'] = decode_base64(acc['photo'], 'users/%s/ava.png' % user.out_key) + + Account.objects.filter(owner=user).update(**acc) + serialized_user = UserSelfSerializer(request.user).data serialized_user['is_i'] = True diff --git a/courses/models.py b/courses/models.py index 10cd8e0..c45ee96 100755 --- a/courses/models.py +++ b/courses/models.py @@ -124,6 +124,9 @@ class Course(models.Model): def __str__(self): return self.title + def get_teacher(self): + return self.teacher_tokens[0] + def get_statistic(self): return { 'topic_count': self.topic_set.all().count(), diff --git a/progress/management/__init__.py b/progress/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/progress/management/commands/set_progress.py b/progress/management/commands/set_progress.py new file mode 100644 index 0000000..9705933 --- /dev/null +++ b/progress/management/commands/set_progress.py @@ -0,0 +1,114 @@ +from django.contrib.auth import get_user_model +from django.core.management.base import BaseCommand, CommandError +from progress.models import Progress, ProgressLesson +from courses.models import Course +from django.db.models import Q +import datetime + + +class Command(BaseCommand): + help = 'Добавляет 1 или нескольких юзеров в указанные группы' + + def add_arguments(self, parser): + parser.add_argument( + '--u', + type=str, + dest='user_email', + help='Емейл пользователя' + ) + parser.add_argument( + '--c', + type=str, + dest='course_slug', + help='Слаг курса' + ) + parser.add_argument( + '--t', + type=int, + dest='topic_idx', + help='Порядковый номер темы' + ) + parser.add_argument( + '--l', + type=int, + dest='lesson_idx', + help='Порядковый номер урока' + ) + parser.add_argument( + '--f', + type=bool, + dest='force_start', + help='Игнорировать предупреждения' + ) + + def handle(self, *args, **options): + try: + student = get_user_model().objects.get(email=options['user_email']) + + try: + course = Course.objects.get(slug=options['course_slug']) + try: + progress = Progress.objects.get(course_token=course.token, user=student) + except Progress.DoesNotExist: + if not options['force_start']: + raise CommandError( + "Пользователь %s, не проходит курс %s" % (student.get_full_name(), course.title)) + + teacher = get_user_model().objects.get(out_key=course.get_teacher()) + progress = Progress.objects.create(course_token=course.token, user=student, teacher=teacher) + + token_list = [] + lesson_list = [] + for topic_idx, topic in enumerate(course.topic_set.all()): + topic_find = topic_idx == (options['topic_idx'] - 1) + for lesson_idx, lesson in enumerate(topic.lesson_set.all()): + token_list.append(lesson.token) + lesson_list.append(lesson) + if lesson_idx == (options['lesson_idx'] - 1) and topic_find: + break + + if topic_find: + break + + if progress.progresslesson_set.filter( + ~Q(lesson_token__in=token_list)).exists() and not options['force_start']: + raise CommandError( + "Пользователь %s, прошёл дальше по курсу %s" % (student.get_full_name(), course.title)) + + progress.progresslesson_set.filter(~Q(lesson_token__in=token_list)).delete() + + for lesson_idx, lesson_token in enumerate(token_list[:-1]): + try: + pl = ProgressLesson.objects.get(progress__user=student, lesson_token=lesson_token) + if pl.finish_date is None: + pl.finish_date = datetime.datetime.now() + pl.status = 'done' + pl.save() + except ProgressLesson.DoesNotExist: + ProgressLesson.objects.create( + progress=progress, + lesson_token=lesson_token, + checker=progress.teacher if lesson_list[lesson_idx].is_hm else student, + status="done", + finish_date=datetime.datetime.now() + ) + + try: + pl = ProgressLesson.objects.get(progress=progress, lesson_token=token_list[-1:][0]) + if pl.status == "done": + pl.status = "start" + + pl.finish_date = None + pl.save() + except ProgressLesson.DoesNotExist: + pl = ProgressLesson.objects.create( + progress=progress, + lesson_token=token_list[-1:][0], + checker=progress.teacher if lesson_list[-1:][0].is_hm else student + ) + + except Course.DoesNotExist: + print("""Course with slug "%s" doesn't exist""" % options['course_slug']) + + except get_user_model().DoesNotExist: + print("""user with email: "%s" not found""" % options['user_email']) \ No newline at end of file diff --git a/progress/views.py b/progress/views.py index fbc5f56..4941567 100644 --- a/progress/views.py +++ b/progress/views.py @@ -48,7 +48,7 @@ class CourseProgressDynamicView(APIView): progresses = Progress.objects.filter(course_token=token) res = {} for i in progresses: - key = i.progresslesson_set.filter(status="done").count() + key = i.progresslesson_set.filter(status="done").count() + 1 res[key] = 1 if not key in res.keys() else res[key] + 1 return Response(res, status=200) except ValidationError: