diff --git a/lmsege/lms/admin.py b/lmsege/lms/admin.py index c569d08..a12fa88 100644 --- a/lmsege/lms/admin.py +++ b/lmsege/lms/admin.py @@ -18,9 +18,9 @@ class QuestionInline(StackedInline): @admin.register(Assignment) class AssignmentAdmin(ModelAdmin): - list_display = ('title', 'subject', 'is_published', 'created_at') + list_display = ('title', 'subject', 'is_published', 'is_closed', 'deadline', 'created_at') list_display_links = ('title',) - list_filter = ('subject', 'is_published') + list_filter = ('subject', 'is_published', 'is_closed') search_fields = ('title', 'description') exclude = ('created_by',) filter_horizontal = ('assigned_students',) diff --git a/lmsege/lms/models.py b/lmsege/lms/models.py index f65d264..f7593b3 100644 --- a/lmsege/lms/models.py +++ b/lmsege/lms/models.py @@ -22,6 +22,8 @@ class Assignment(models.Model): assigned_students = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='assigned_assignments', verbose_name='Назначенные ученики', blank=True, limit_choices_to={'role': 'STUDENT'}, help_text='Выберите учеников, если задание не для всех.') created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, limit_choices_to={'role__in': ['TEACHER', 'ADMIN']}, verbose_name='Кем создано') created_at = models.DateTimeField('Дата создания', auto_now_add=True) + deadline = models.DateTimeField('Дедлайн', blank=True, null=True, help_text='После этого времени ответы не принимаются.') + is_closed = models.BooleanField('Прием ответов закрыт', default=False, help_text='Включите, чтобы вручную закрыть прием ответов на задание.') class Meta: verbose_name = 'Задание' diff --git a/lmsege/lms/templates/lms/assignment_detail.html b/lmsege/lms/templates/lms/assignment_detail.html index c4991aa..be7c4e9 100644 --- a/lmsege/lms/templates/lms/assignment_detail.html +++ b/lmsege/lms/templates/lms/assignment_detail.html @@ -94,6 +94,11 @@ {% endfor %} + {% elif not can_submit %} +
+

Прием ответов завершен

+

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

+
{% else %}
{% csrf_token %} diff --git a/lmsege/lms/templates/lms/dashboard.html b/lmsege/lms/templates/lms/dashboard.html index 691555a..d698a83 100644 --- a/lmsege/lms/templates/lms/dashboard.html +++ b/lmsege/lms/templates/lms/dashboard.html @@ -51,6 +51,18 @@ event Добавлено: {{ assignment.created_at|date:"d M Y" }} + {% if assignment.deadline %} + + timer + Дедлайн: {{ assignment.deadline|date:"d M Y, H:i" }} + + {% endif %} + {% if assignment.is_closed %} + + lock + Прием ответов закрыт + + {% endif %}
diff --git a/lmsege/lms/views.py b/lmsege/lms/views.py index e210f47..bae142b 100644 --- a/lmsege/lms/views.py +++ b/lmsege/lms/views.py @@ -44,10 +44,12 @@ def dashboard(request): submissions = Submission.objects.filter(student=request.user) submitted_assignment_ids = submissions.values_list('assignment_id', flat=True) + from django.utils import timezone return render(request, 'lms/dashboard.html', { 'assignments': assignments, 'submitted_assignment_ids': submitted_assignment_ids, - 'submissions': {sub.assignment_id: sub for sub in submissions} + 'submissions': {sub.assignment_id: sub for sub in submissions}, + 'now': timezone.now() }) @login_required @@ -58,6 +60,13 @@ def assignment_detail(request, pk): # Try to get existing submission submission = Submission.objects.filter(assignment=assignment, student=request.user).first() + + from django.utils import timezone + can_submit = True + if assignment.is_closed: + can_submit = False + if assignment.deadline and timezone.now() > assignment.deadline: + can_submit = False if submission: if request.method == 'POST': @@ -65,7 +74,9 @@ def assignment_detail(request, pk): return redirect('lms:dashboard') form = None else: - if request.method == 'POST': + if not can_submit: + form = None + elif request.method == 'POST': form = AnswersForm(request.POST, request.FILES, questions=questions) if form.is_valid(): submission = Submission.objects.create(assignment=assignment, student=request.user) @@ -153,4 +164,5 @@ def assignment_detail(request, pk): 'submission': submission, 'questions': questions, 'question_fields': question_fields, + 'can_submit': can_submit, })