/
tebo
/
BubblesCode
Обзор
Документация
Войти
/
tebo
/
BubblesCode
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
problems/admin.py
99 строк
4 KB
tebo
first_commit
03 июн 2026, 15:20
03 июн 2026, 15:20
e3a5c0b
Код
Авторство
О чём код?
from django.contrib import admin, messages from .models import Problem, Example, TestCase, Submission class ExampleInline(admin.TabularInline): model = Example extra = 1 classes = ['collapse'] verbose_name_plural = "Примеры для отображения на странице" class TestCaseInline(admin.TabularInline): model = TestCase extra = 2 classes = ['collapse'] verbose_name_plural = "Тест-кейсы для проверки кода" class SubmissionInline(admin.TabularInline): model = Submission extra = 0 fields = ('problem', 'passed_all_tests', 'timestamp') readonly_fields = fields can_delete = False verbose_name_plural = "История решений задач" def has_add_permission(self, request, obj=None): return False def has_change_permission(self, request, obj=None): return False @admin.register(Problem) class ProblemAdmin(admin.ModelAdmin): list_display = ('id', 'title', 'is_published', 'get_allowed_users_count', 'theory_article') list_filter = ('is_published', 'theory_article') search_fields = ('title', 'description') actions =['make_public_for_all', 'make_unpublished'] filter_horizontal = ('allowed_users',) fieldsets = ( ('Управление доступом', { 'fields': ('is_published', 'allowed_users'), 'description': 'Выберите пользователей для приватного доступа. Если пусто — задача публичная.' }), ('Основная информация', { 'fields': ('title', 'description') }), ('Материалы и решение', { 'fields': ('theory_article', 'solution_code', 'is_solution_interactive') }), ('Интерактивный пример от администратора', { 'classes': ('collapse',), 'fields': ('interactive_example_code',) }), ('Код для ученика', { 'classes': ('collapse',), 'fields': ('initial_code',) }), ('Тип задачи', { 'classes': ('collapse',), 'fields': ('use_interactive_runner',) }) ) inlines = [ExampleInline, TestCaseInline] def get_changeform_initial_data(self, request): initial = super().get_changeform_initial_data(request) initial.update({ 'is_published': True, 'use_interactive_runner': True, 'is_solution_interactive': True, }) return initial @admin.action(description="Опубликовать для ВСЕХ (убирает приватный доступ)") def make_public_for_all(self, request, queryset): for problem in queryset: problem.allowed_users.clear() updated_count = queryset.update(is_published=True) self.message_user(request, f"{updated_count} задач опубликовано для всех.", messages.SUCCESS) @admin.action(description="Скрыть выбранные задачи (снять с публикации)") def make_unpublished(self, request, queryset): updated_count = queryset.update(is_published=False) self.message_user(request, f"{updated_count} задач снято с публикации.", messages.SUCCESS) def get_allowed_users_count(self, obj): count = obj.allowed_users.count() return f"{count} чел. (приватный)" if count > 0 else "Нет (публичный)" get_allowed_users_count.short_description = 'Доступ' @admin.register(Submission) class SubmissionAdmin(admin.ModelAdmin): list_display = ('user', 'problem', 'passed_all_tests', 'timestamp') list_filter = ('user', 'problem', 'passed_all_tests') readonly_fields = ('id', 'user', 'problem', 'submitted_code', 'passed_all_tests', 'timestamp')