From 53b9a768489b7db941283c0ffe194e73f80ebe13 Mon Sep 17 00:00:00 2001 From: Dmitry Belan Date: Mon, 28 Sep 2026 23:47:49 +0300 Subject: [PATCH] Auto-calculate points and final grade when saving submission --- lmsege/lms/admin.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/lmsege/lms/admin.py b/lmsege/lms/admin.py index fca72e0..63ea60f 100644 --- a/lmsege/lms/admin.py +++ b/lmsege/lms/admin.py @@ -186,6 +186,31 @@ class SubmissionAdmin(ModelAdmin): error=str(e) ) + def save_formset(self, request, form, formset, change): + instances = formset.save(commit=False) + for instance in instances: + if isinstance(instance, Answer): + if instance.is_correct and instance.points is None: + instance.points = instance.question.points + elif instance.is_correct is False and instance.points is None: + instance.points = 0 + instance.save() + + for obj in formset.deleted_objects: + obj.delete() + + formset.save_m2m() + + if formset.model == Answer: + submission = formset.instance + total_earned = sum((ans.points or 0) for ans in submission.answers.all()) + total_max = sum((q.points or 1) for q in submission.assignment.questions.all()) + + new_grade = f"{total_earned}/{total_max}" + if submission.grade != new_grade: + submission.grade = new_grade + submission.save(update_fields=['grade']) + def get_queryset(self, request): qs = super().get_queryset(request) if request.user.is_superuser or request.user.role == 'ADMIN':