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 = """Заменить прогресс юзера""" 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'])