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.
86 lines
2.9 KiB
86 lines
2.9 KiB
from django.core.management.base import BaseCommand
|
|
from django.db.models import Q
|
|
from apps.quiz.models import Quiz
|
|
from apps.course.models import CourseLesson
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = "Sync lesson_number for all quizzes connected to a lesson."
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
'--dry-run',
|
|
action='store_true',
|
|
help='Preview updates without saving changes.',
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
dry_run = options['dry_run']
|
|
updated_quizzes = 0
|
|
|
|
# We filter quizzes that have a lesson assigned
|
|
quizzes = Quiz.objects.filter(lesson__isnull=False)
|
|
|
|
for quiz in quizzes:
|
|
lesson = quiz.lesson
|
|
course = quiz.course or lesson.course
|
|
|
|
if not course:
|
|
self.stdout.write(
|
|
self.style.WARNING(f"Quiz {quiz.id} has lesson {lesson.id} but no associated course found.")
|
|
)
|
|
continue
|
|
|
|
# Find all active lessons for this course to calculate position
|
|
lessons_list = list(CourseLesson.objects.filter(
|
|
course=course,
|
|
is_active=True
|
|
).filter(
|
|
Q(chapter__isnull=True) | Q(chapter__is_active=True)
|
|
).order_by('chapter__priority', 'priority'))
|
|
|
|
try:
|
|
pos = lessons_list.index(lesson) + 1
|
|
except ValueError:
|
|
# Lesson might not be active, or not in the course's active list
|
|
self.stdout.write(
|
|
self.style.WARNING(
|
|
f"Quiz {quiz.id}: Lesson {lesson.id} is not active or not in course active list. Skipping."
|
|
)
|
|
)
|
|
continue
|
|
|
|
needs_update = False
|
|
update_fields = []
|
|
|
|
if quiz.lesson_number != pos:
|
|
self.stdout.write(
|
|
f"Quiz {quiz.id}: lesson_number {quiz.lesson_number} -> {pos}"
|
|
)
|
|
quiz.lesson_number = pos
|
|
needs_update = True
|
|
update_fields.append('lesson_number')
|
|
|
|
if not quiz.course:
|
|
self.stdout.write(f"Quiz {quiz.id}: setting course to {course.id}")
|
|
quiz.course = course
|
|
needs_update = True
|
|
update_fields.append('course')
|
|
|
|
if needs_update:
|
|
updated_quizzes += 1
|
|
if not dry_run:
|
|
quiz.save(update_fields=update_fields)
|
|
|
|
if dry_run:
|
|
self.stdout.write(
|
|
self.style.WARNING(
|
|
f"Dry run complete. {updated_quizzes} quiz(zes) would be updated."
|
|
)
|
|
)
|
|
else:
|
|
self.stdout.write(
|
|
self.style.SUCCESS(
|
|
f"Sync complete. {updated_quizzes} quiz(zes) updated."
|
|
)
|
|
)
|