From 6371b3202f14062eab42701afc5ace22cdbbd636 Mon Sep 17 00:00:00 2001 From: Dmitry Belan Date: Mon, 28 Sep 2026 21:13:19 +0300 Subject: [PATCH] Enhance task numbers, enable late submissions with badges, and fix overdue badges --- lmsege/lms/admin.py | 4 +-- lmsege/lms/models.py | 4 ++- .../lms/templates/lms/assignment_detail.html | 12 +++++++- lmsege/lms/templates/lms/dashboard.html | 29 +++++++++++++------ lmsege/lms/views.py | 13 +++++---- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/lmsege/lms/admin.py b/lmsege/lms/admin.py index a325913..34ef588 100644 --- a/lmsege/lms/admin.py +++ b/lmsege/lms/admin.py @@ -102,8 +102,8 @@ class AnswerInline(StackedInline): @admin.register(Submission) class SubmissionAdmin(ModelAdmin): change_list_template = "admin/lms/submission/change_list.html" - list_display = ('assignment', 'student', 'status', 'is_time_expired', 'grade', 'submitted_at') - list_filter = ('status', 'assignment__subject', 'student', 'is_time_expired') + list_display = ('assignment', 'student', 'status', 'is_time_expired', 'is_late', 'grade', 'submitted_at') + list_filter = ('status', 'assignment__subject', 'student', 'is_time_expired', 'is_late') search_fields = ('student__username', 'assignment__title') inlines = [AnswerInline] diff --git a/lmsege/lms/models.py b/lmsege/lms/models.py index 701a17d..ab1114e 100644 --- a/lmsege/lms/models.py +++ b/lmsege/lms/models.py @@ -52,7 +52,8 @@ class Question(models.Model): ordering = ['order', 'id'] def __str__(self): - return f"Задача {self.id} к {self.assignment.title}" + number = self.order if self.order else self.id + return f"Задача {number} к {self.assignment.title}" class Submission(models.Model): STATUS_CHOICES = ( @@ -68,6 +69,7 @@ class Submission(models.Model): started_at = models.DateTimeField('Время начала', blank=True, null=True) submitted_at = models.DateTimeField('Дата отправки', auto_now_add=True) is_time_expired = models.BooleanField('Время вышло', default=False) + is_late = models.BooleanField('Сдано после дедлайна', default=False) class Meta: verbose_name = 'Ответ ученика' diff --git a/lmsege/lms/templates/lms/assignment_detail.html b/lmsege/lms/templates/lms/assignment_detail.html index 1462d00..f1d0d87 100644 --- a/lmsege/lms/templates/lms/assignment_detail.html +++ b/lmsege/lms/templates/lms/assignment_detail.html @@ -166,10 +166,20 @@ Прием ответов завершен -

Вы больше не можете отправлять ответы, так как дедлайн истек или время на выполнение закончилось.

+

Вы больше не можете отправлять ответы, так как время на выполнение закончилось.

{% else %} + {% if is_late %} +
+ +
+

Дедлайн прошел

+

Вы выполняете это задание после дедлайна (дорешивание).

+
+
+ {% endif %} + {% if time_left_seconds is not None %}
diff --git a/lmsege/lms/templates/lms/dashboard.html b/lmsege/lms/templates/lms/dashboard.html index 2a771b4..49b2518 100644 --- a/lmsege/lms/templates/lms/dashboard.html +++ b/lmsege/lms/templates/lms/dashboard.html @@ -22,29 +22,40 @@ {% if sub %} + {% if sub.is_late %} + + После дедлайна + + {% endif %} {% if sub.status == 'GRADED' %} - - + + Принято ({{ sub.grade|default:"-" }}) {% elif sub.status == 'IN_PROGRESS' %} - + В процессе {% else %} - - + + Ожидает проверки {% endif %} {% else %} - - - Требует сдачи - + {% if assignment.deadline and now > assignment.deadline %} + + Дедлайн прошел + + {% else %} + + + Требует сдачи + + {% endif %} {% endif %}
diff --git a/lmsege/lms/views.py b/lmsege/lms/views.py index 3833ff9..229023f 100644 --- a/lmsege/lms/views.py +++ b/lmsege/lms/views.py @@ -68,9 +68,11 @@ def assignment_detail(request, pk): can_submit = True time_left_seconds = None needs_start = False + is_late = False if assignment.deadline and now > assignment.deadline: - can_submit = False + is_late = True + # can_submit = False # Allow late submissions if assignment.time_limit: if not submission: @@ -85,11 +87,10 @@ def assignment_detail(request, pk): if request.method == 'POST': # Allow saving this final POST, but mark it as expired submission.is_time_expired = True - # We don't set can_submit = False here so the POST is processed else: can_submit = False submission.is_time_expired = True - submission.status = 'PENDING' # Or graded with 0 + submission.status = 'PENDING' submission.save() else: time_left_seconds = int(allowed - elapsed) @@ -104,7 +105,8 @@ def assignment_detail(request, pk): assignment=assignment, student=request.user, status='IN_PROGRESS', - started_at=now + started_at=now, + is_late=is_late ) return redirect('lms:assignment_detail', pk=pk) @@ -115,7 +117,7 @@ def assignment_detail(request, pk): form = AnswersForm(request.POST, request.FILES, questions=questions) if form.is_valid(): if not submission: - submission = Submission.objects.create(assignment=assignment, student=request.user) + submission = Submission.objects.create(assignment=assignment, student=request.user, is_late=is_late) all_auto = True total_points = 0 @@ -211,4 +213,5 @@ def assignment_detail(request, pk): 'can_submit': can_submit, 'needs_start': needs_start, 'time_left_seconds': time_left_seconds, + 'is_late': is_late, })