From 8cf8e0d8696cacd4f201dc9271ed9f88bbf53f73 Mon Sep 17 00:00:00 2001 From: Dmitry Belan Date: Sat, 19 Sep 2026 15:38:50 +0300 Subject: [PATCH] feat: add is_published flag to assignments --- lmsege/lms/admin.py | 16 +++++++++++++--- lmsege/lms/models.py | 1 + lmsege/lms/views.py | 5 +++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lmsege/lms/admin.py b/lmsege/lms/admin.py index db64af9..4c3639f 100644 --- a/lmsege/lms/admin.py +++ b/lmsege/lms/admin.py @@ -18,14 +18,24 @@ class QuestionInline(StackedInline): @admin.register(Assignment) class AssignmentAdmin(ModelAdmin): - list_display = ('title', 'subject', 'created_at') + list_display = ('title', 'subject', 'is_published', 'created_at') list_display_links = ('title',) - list_filter = ('subject',) + list_filter = ('subject', 'is_published') search_fields = ('title', 'description') exclude = ('created_by',) filter_horizontal = ('assigned_students',) inlines = [QuestionInline] - actions = ['delete_selected_assignments'] + actions = ['make_published', 'make_unpublished', 'delete_selected_assignments'] + + @admin.action(description="Опубликовать выбранные задания") + def make_published(self, request, queryset): + updated = queryset.update(is_published=True) + self.message_user(request, f"Опубликовано {updated} заданий.") + + @admin.action(description="Скрыть выбранные задания (в черновик)") + def make_unpublished(self, request, queryset): + updated = queryset.update(is_published=False) + self.message_user(request, f"Скрыто {updated} заданий.") @admin.action(description="Удалить выбранные задания") def delete_selected_assignments(self, request, queryset): diff --git a/lmsege/lms/models.py b/lmsege/lms/models.py index d2d9e98..f65d264 100644 --- a/lmsege/lms/models.py +++ b/lmsege/lms/models.py @@ -17,6 +17,7 @@ class Assignment(models.Model): title = models.CharField('Название задания', max_length=255) description = RichTextUploadingField('Описание задания', blank=True, null=True) subject = models.ForeignKey(Subject, on_delete=models.CASCADE, verbose_name='Предмет') + is_published = models.BooleanField('Опубликовано', default=True, help_text='Снимите галочку, чтобы скрыть задание (как черновик).') assign_to_all = models.BooleanField('Назначить всем', default=True, help_text='Если включено, задание будет доступно всем ученикам.') 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='Кем создано') diff --git a/lmsege/lms/views.py b/lmsege/lms/views.py index 958da8e..e210f47 100644 --- a/lmsege/lms/views.py +++ b/lmsege/lms/views.py @@ -36,7 +36,8 @@ def home(request): @user_passes_test(is_student, login_url='/login/') def dashboard(request): assignments = Assignment.objects.filter( - Q(assign_to_all=True) | Q(assigned_students=request.user) + Q(assign_to_all=True) | Q(assigned_students=request.user), + is_published=True ).distinct().order_by('-created_at') # Check which ones the student has submitted @@ -52,7 +53,7 @@ def dashboard(request): @login_required @user_passes_test(is_student, login_url='/login/') def assignment_detail(request, pk): - assignment = get_object_or_404(Assignment, pk=pk) + assignment = get_object_or_404(Assignment, pk=pk, is_published=True) questions = assignment.questions.all() # Try to get existing submission