You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
4.7 KiB
114 lines
4.7 KiB
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:
|
|
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']) |