2 changed files with 135 additions and 0 deletions
@ -0,0 +1,86 @@ |
|||||
|
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." |
||||
|
) |
||||
|
) |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue