def lesson(request, lesson_pk=None): if lesson_pk is None: lesson = Lesson.objects.all(created_by=request.user) else: lesson = get_object_or_404(Lesson, pk=lesson_pk) enroll = get_enroll(request, lesson) data = LessonEnrollSerializer(enroll).data data.update(LessonSerializer(lesson).data) return Response(data)
def answers(request, enroll_pk=None): if not request.user.is_authenticated(): return Response([], status=status.HTTP_200_OK) if request.method == 'PUT' and request.user.is_authenticated( ) and enroll_pk and enroll_pk != '0': enroll = get_object_or_404(LessonEnroll, pk=enroll_pk) if enroll.learner == request.user: data = json.loads(request.body.decode("utf-8")) result = data.get('result') if result: success = result.get('success') if not enroll.success: enroll.success = success if success is True: enroll.date_success = timezone.now() enroll.number_of_attempt += 1 enroll.data = data enroll.save() return Response(LessonEnrollSerializer(enroll).data, status=status.HTTP_200_OK) if enroll_pk == '0': return Response(status=status.HTTP_200_OK) return Response(status=status.HTTP_400_BAD_REQUEST)
def mylessons(request): """ возвращает список назначеных на студента уроков """ if not request.user.is_authenticated(): return Response([], status=status.HTTP_200_OK) # проверяем есть ли старые пройденные уроки now = timezone.now() # + timedelta(days=1) for enroll in LessonEnroll.objects.filter(learner=request.user, date_success__lt=now - timedelta(days=14)): statistic, created = Statistic.objects.get_or_create( lesson=enroll.lesson, learner=request.user, number_of_attempt=enroll.number_of_attempt, success=enroll.success) if enroll.success is True: statistic.reason = 'success' elif enroll.success is False: statistic.reason = 'done_time' else: statistic.reason = 'not_done' statistic.save() enroll.delete() for enroll in LessonEnroll.objects.filter(learner=request.user, success=True, date_success__lt=now - timedelta(days=1)): Statistic.objects.get_or_create( lesson=enroll.lesson, learner=request.user, number_of_attempt=enroll.number_of_attempt, success=enroll.success, reason='success') enroll.delete() # Сериализуем и сортируем полученные уроки enrolls = [] lessonEnrolls = LessonEnroll.objects.filter(learner=request.user).extra( select={ 'null_success': 'CASE WHEN quizy_lessonenroll.success IS NULL THEN 0 ELSE 1 END' }).order_by('null_success', 'success', '-created_at') for enroll in lessonEnrolls: enrolls.append(LessonEnrollSerializer(enroll).data) index = 0 elements = [] for en in list(enrolls): if en.get('required_attention_by_pupil') is True: elements.append(enrolls.pop(index)) index += 1 sortedenrolls = elements + enrolls return Response(sortedenrolls, status=status.HTTP_200_OK)
def play(request, enroll_pk=None): if not request.user.is_authenticated(): return Response([], status=status.HTTP_200_OK) try: enroll = LessonEnroll.objects.get(pk=enroll_pk, learner=request.user) except LessonEnroll.DoesNotExist: return Response("enroll not found", status=status.HTTP_404_NOT_FOUND) return Response(LessonEnrollSerializer(instance=enroll).data, status=status.HTTP_200_OK)
def public_play(request, lesson_pk=None): """ Запуск публичного урока для демонстрации """ if request.user.is_authenticated(): try: raw_enroll = LessonEnroll.objects.filter(learner=request.user, lesson=lesson_pk)[:1] if raw_enroll: enroll = raw_enroll[0] data = LessonEnrollSerializer(instance=enroll).data data['type'] = 'enroll' return Response(data, status=status.HTTP_200_OK) except LessonEnroll.DoesNotExist: pass # если пользователь не авторизован или нет назначения на урок то возвращаем урок lesson = get_object_or_404(Lesson, pk=lesson_pk) data = LessonForEnrollSerializer(lesson).data data['type'] = 'lesson' return Response(data, status=status.HTTP_200_OK)
def demo_play(request, lesson_pk=None): """ Тестовый запуск урока в админке редактирования """ if not request.user.is_authenticated(): return Response([], status=status.HTTP_200_OK) lesson = Lesson.objects.filter(Q(created_by=request.user) | Q(teacher=request.user) | Q(course__teacher=request.user), pk=lesson_pk).distinct() if lesson: lesson = lesson[0] else: return Response(status=status.HTTP_400_BAD_REQUEST) if request.method == 'GET': enroll = LessonEnroll(lesson=lesson, learner=request.user, created_by=request.user) enroll = LessonEnrollSerializer(instance=enroll).data return Response(enroll, status=status.HTTP_200_OK)
def start_lessons(request, lesson_pk=None): """ Запуск урока выбранный через главную страницу """ if not request.user.is_authenticated(): return Response([], status=status.HTTP_200_OK) lesson = get_object_or_404(Lesson, pk=lesson_pk) enroll, created = LessonEnroll.objects.get_or_create( lesson=lesson, learner=request.user, created_by=request.user) if lesson.lesson_type == 'outside': # если урок внешний считываем деннаые по умолчанию и сохраняем их в назначение path = os.path.join(settings.BASE_DIR, 'app', 'assets', 'lessons', lesson.path_content) json_path = os.path.join(path, 'default.json') if os.path.exists(json_path): data = json.load(open(json_path)) enroll.data = data enroll.save() data = LessonEnrollSerializer(instance=enroll).data data['type'] = 'enroll' return Response(data, status=status.HTTP_200_OK)
def enroll_teacher(request, enroll_pk): """ возвращает данные назначения для внешнего урока для учителя сохраняет отзыа от учителя """ if not request.user.is_authenticated(): return Response([], status=status.HTTP_200_OK) if enroll_pk: enroll = LessonEnroll.objects.filter( Q(created_by=request.user) | Q(lesson__teacher=request.user) | Q(lesson__course__teacher=request.user), pk=enroll_pk).distinct() if enroll: enroll = enroll[0] else: return Response(status=status.HTTP_400_BAD_REQUEST) if request.method == 'PUT': data = json.loads(request.body.decode("utf-8")) # enroll.data = normalize(data) # проверяем на наличие новых завершенных шагов is_equal = is_enrolls_different(enroll.data, data) if is_equal is True: enroll.required_attention_by_pupil = True enroll.success = True enroll.data = data enroll.data['mode'] = 'wait_pupil' else: enroll.data = data enroll.required_attention_by_teacher = False enroll.save() if enroll.required_attention_by_pupil is True: email_topic = u'English with Experts: Ваш преподаватель проверил Вашу письменную работу.' email_from = settings.DEFAULT_FROM_EMAIL email_to = [enroll.learner.email] email_msg = u'Здравствуйте,\n' email_msg += u'Рады сообщить, что Ваш преподаватель проверил Вашу письменную работу. ' email_msg += u'Чтобы посмотреть Ваши оценки по шкале IELTS и комментарии преподавателя \n' email_msg += u'пожалуйста, пройдите по этой ссылке \n(Вам нужно быть зарегистрированым и авторизированым на сайте):\n' email_msg += u'http://ieltswriting.englishwithexperts.com/play/' + str( enroll.pk) + '/\n\n' email_msg += u'От себя хотим добавить, что IELTS Writing - это самая сложная часть для большинства сдающих (официальная статистика IELTS).' email_msg += u'Поэтому не теряйте мотивацию. Чем больше работ Вы напишите до сдачи экзамена, тем лучше. Keep up your good work! Мы верим в Вас!\n\n' email_msg += u'Пишите, если у Вас будут вопросы или пожелания к улучшению сервиса. Мы всегда рады конструктивным предложениям.\n\n' email_msg += u'Best wishes,\n' email_msg += u'English with Experts\n' if settings.MAIL is True: send_mail(email_topic, email_msg, email_from, email_to) elif settings.DEBUG is True: print email_topic print[enroll.learner.email] print email_msg enroll = LessonEnrollSerializer(instance=enroll).data return Response(enroll, status=status.HTTP_200_OK)
def enroll(request, enroll_pk): """ работа с назначениями со стороны преподователя """ if not request.user.is_authenticated(): return Response(status=status.HTTP_200_OK) if request.method == 'POST': data = json.loads(request.body.decode("utf-8")) course_id = data.get('course_id') auto_enroll = data.get('auto_enroll') lesson_id = data.get('lesson_id') email = data.get('email') if course_id is None and lesson_id is None: return Response("Неверный формат course или lesson", status=status.HTTP_400_BAD_REQUEST) if validateEmail(email) is False: return Response("Неверный формат email", status=status.HTTP_400_BAD_REQUEST) lesson = None course = None if lesson_id: lesson = get_object_or_404(Lesson, pk=lesson_id) if course_id: course = get_object_or_404(Course, pk=course_id) pupil = Account.objects.filter(email__iexact=email)[:1] if pupil: # проверяем являеться ли ученик учеников преподдователся # если нет то назначаем его на преподователя exists = request.user.pupils.filter(pk=pupil[0].pk).count() if not exists: request.user.pupils.add(pupil[0]) if pupil and lesson: try: enroll = LessonEnroll.objects.get(lesson=lesson, learner=pupil[0]) except LessonEnroll.DoesNotExist: enroll = LessonEnroll.objects.create(lesson=lesson, learner=pupil[0], created_by=request.user) enroll.teachers.add(request.user) email_topic = u'English with Experts: Вам назначено письменное задание.' email_from = settings.DEFAULT_FROM_EMAIL email_to = [pupil[0].email] email_msg = u'Здравствуйте,\n' email_msg += u'Ваш преподаватель назначила Вам новое задание. ' email_msg += u'Пожалуйста, пройдите по этой ссылке, чтобы выполнить это задание \n(Вам нужно быть зарегистрированым и авторизированым на сайте):\n' email_msg += u'http://ieltswriting.englishwithexperts.com/play/' + str( enroll.pk) + '/\n\n' email_msg += u'Пишите, если у Вас будут вопросы. Желаем Вам прогресса в написании работ!\n\n' email_msg += u'Best wishes,\n' email_msg += u'English with Experts\n' if settings.MAIL is True: send_mail(email_topic, email_msg, email_from, email_to) elif settings.DEBUG is True: print[pupil[0].email] print email_msg # если урок внешний считываем деннаые по умолчанию и сохраняем их в назначение if lesson.lesson_type == 'outside': path = os.path.join(settings.BASE_DIR, 'app', 'assets', 'lessons', lesson.path_content) json_path = os.path.join(path, 'default.json') if os.path.exists(json_path): data = json.load(open(json_path)) enroll.data = data enroll.save() return Response(LessonEnrollSerializer(enroll).data, status=status.HTTP_200_OK) elif pupil and course: try: enroll = CourseEnroll.objects.get(course=course, learner=pupil[0]) except CourseEnroll.DoesNotExist: enroll = CourseEnroll.create(course, pupil[0], request.user) if auto_enroll: enroll.auto_enroll = auto_enroll enroll.save() return Response(CourseEnrollSerializer(enroll).data, status=status.HTTP_200_OK) else: return Response({'code': 404}, status=status.HTTP_200_OK) if request.method == 'DELETE' and enroll_pk: if request.user.is_superuser: enroll = LessonEnroll.objects.filter(pk=enroll_pk).distinct() else: enroll = LessonEnroll.objects.filter( Q(lesson__created_by=request.user) | Q(lesson__teacher=request.user) | Q(lesson__course__teacher=request.user), pk=enroll_pk).distinct() if enroll: enroll = enroll[0] enroll.delete() else: return Response("", status=status.HTTP_400_BAD_REQUEST) return Response("", status=status.HTTP_200_OK) return Response(status=status.HTTP_200_OK)
def enroll_pupil(request, enroll_pk): """ Сохраняет данные для назначения со стороны ученика """ if not request.user.is_authenticated(): return Response([], status=status.HTTP_200_OK) if enroll_pk: try: enroll = LessonEnroll.objects.get(learner=request.user, pk=enroll_pk) except LessonEnroll.DoesNotExist: return Response(status=status.HTTP_400_BAD_REQUEST) if request.method == 'PUT': data = json.loads(request.body.decode("utf-8")) # enroll.data = normalize(data) enroll.required_attention_by_pupil = False # if data.get('active') is False: # enroll.required_attention_by_teacher = False # else: # enroll.required_attention_by_teacher = True is_equal = is_enrolls_different(enroll.data, data) if is_equal is True: enroll.required_attention_by_teacher = True enroll.data = data enroll.data['mode'] = 'wait_teacher' email_topic = u'from English with Experts' email_from = settings.DEFAULT_FROM_EMAIL email_to = [t.email for t in enroll.teachers.all()] email_msg = u'Dear,\n' email_msg += u'Please note that your student ' + request.user.email email_msg += u' has finished the writing task that you’ve assigned them.\n' email_msg += u'Please follow this link to see/mark their work ' email_msg += u'(You need to be registered and logged in).\n' email_msg += u'http://ieltswriting.englishwithexperts.com/pupils/\n\n' email_msg += u'Best wishes,\n' email_msg += u'English with Experts\n' if settings.MAIL is True: send_mail(email_topic, email_msg, email_from, email_to) elif settings.DEBUG is True: print email_topic print[t.email for t in enroll.teachers.all()] print email_msg else: enroll.data = data enroll.success = True enroll.save() # Делаем пометку в статистики raw_statistic = Statistic.objects.filter(lesson=enroll.lesson, learner=request.user) if not raw_statistic: statistic = Statistic.objects.create(lesson=enroll.lesson, learner=request.user) else: statistic = raw_statistic.latest('created_at') statistic.success = enroll.success = True statistic.save() enroll = LessonEnrollSerializer(instance=enroll).data return Response(enroll, status=status.HTTP_200_OK)