
Введение
Привет всем! Сегодня я расскажу вам о моей системе оценивания, которая создана для проведения экзаменов и оценки знаний студентов. Система построена на Django Rest Framework (DRF) для бэкенда и React с MaterialUI для фронтенда. Я добавил множество полезных функций, включая интеграцию с ISPmanager, которые делают систему удобной и эффективной.
Пару слов с чего начиналось всё
Всё началось с Демонстрационного экзамена – это форма итоговой аттестации, направленная на проверку практических знаний и умений студентов в реальных условиях. Он используется для оценки способности студентов применять теоретические знания на практике и справляться с профессиональными задачами. Такой экзамен особенно важен в профессиональном и техническом образовании, где практические навыки играют ключевую роль.
Пример оценки работ на Демонстрационном экзамене
Оценка работ на ДЭ проводится по нескольким критериям, которые могут включать:
1. Точность выполнения задания
2. Качество выполнения
4. Креативность и инновационность
5. Уровень профессиональных навыков
Пример задания: Создание функционального веб-сайта для онлайн-магазина.
Ниже приведён пример
Функциональность (50 баллов)
Сайт должен содержать главную страницу, страницу товаров, корзину и форму обратной связи.
Вся навигация должна быть рабочей, без ошибок.
Дизайн и пользовательский интерфейс (30 баллов)
Сайт должен быть визуально привлекательным и удобным для пользователей.
Использование HTML5 & CSS и JavaScript для улучшения интерфейса.
Код и структура (20 баллов)
Код должен быть чистым, хорошо структурированным и прокомментированным.
Использование современных технологий и фреймворков, таких как jQuery и Laravel/Yii2/Django.
Пример оценки работы студента
Функциональность: Студент создал все необходимые страницы, но форма обратной связи не работает (30/50 баллов).
Дизайн и пользовательский интерфейс: Сайт выглядит профессионально и удобно, но есть мелкие недочеты в верстке (25/30 баллов).
Код и структура: Код хорошо структурирован и прокомментирован, но использован устаревший фреймворк (15/20 баллов).
Итоговый балл: 70/100
Теперь, когда вы понимаете, что такое Демонстрационный экзамен и как он оценивается, давайте поговорим о нашей системе оценивания, которая была разработана для улучшения и упрощения этого процесса.
Исходя из данного экзамена в системе, которая представлена у них для оценки работ – захотелось создать такую же систему, только с большее обширным функционалом и интеграцией с системой ISPmanager.
Основные возможности системы
Модули и критерии оценки: В каждой группе студентов есть модули с установленными критериями оценки.
Интеграция с ISPmanager: Возможность загрузки раздаточного материала и данных для входа на сервер через ISPmanager.
Выгрузка итоговых отчетов: Итоговые отчеты можно выгрузить в нескольких форматах:
Отдельные листы для каждого студента в виде архива.
Раздаточный материал с данными для входа на сервер.
Общая ведомость, содержащая данные по всем модулям, критериям и итоговым баллам студентов.
Загрузка данных через Excel: Возможность загрузки групп, модулей и критериев с их описанием через Excel файлы с учётом перебора баллов.
Технические детали
Бэкенд: Django Rest Framework (DRF). DRF позволяет нам создавать надежные и масштабируемые API для взаимодействия с фронтендом. Я выбрал его за:
• Отличную поддержку сериализации данных.
• Удобные инструменты для аутентификации и авторизации.
• Простоту интеграции с различными базами данных и внешними сервисами.Фронтенд: React + MaterialUI. React обеспечивает высокую производительность и гибкость при разработке пользовательских интерфейсов, а MaterialUI добавляет современные и удобные компоненты. Я выбрал их для:
• Создания отзывчивых и интерактивных интерфейсов.
• Повышения скорости разработки благодаря компонентному подходу.
• Интуитивно понятного и привлекательного дизайна.
Примеры использования
Приведем несколько примеров использования нашей системы:
Управление модулями и группами: Преподаватель может легко создать новые модули, установить критерии оценки и прикрепить их к нужной группе студентов.
Загрузка данных через Excel: Преподаватель может быстро загрузить группы, модули и критерии из Excel файла, что значительно упрощает настройку системы.
Выгрузка отчетов: После проведения экзаменов преподаватель может выгрузить итоговые отчеты в нужном формате и проанализировать результаты студентов.
Преимущества для пользователей
Наша система предоставляет множество преимуществ для различных пользователей:
Преподаватели: Удобство управления экзаменами и оценками, быстрая выгрузка отчетов.
Студенты: Простой доступ к результатам и раздаточным материалам.
На странице модули, находятся модули – которые пользователь добавил, включая баллы и к какой группе относится данный модуль. Можно отфильтровать по группам.

На странице группы, находятся группы – в них находятся студенты, переходя в группу, можем добавить или удалить студента.


На странице критерии находиться фильтрация по названию, и баллу. Можно выбрать Группу или Модуль. Имеется смена оформления данной страницы.


На странице Студенты – можем распечатать данные, посмотреть данные студента, удалить/редактировать студента.


На странице Оценивание – выбираем Группу, Студента, Модуль. Критерии которые относятся к данному модулю, появятся на странице с возможностью оценить их на максимальный балл, либо самому вписать баллы и сохранить данные.

После оценки работы, можем скачать общую ведомость, с данными результатами:

Интеграция с ISPmanager 6
Исходя из документации (https://www.ispmanager.ru/docs/ispmanager/ispmanager-api): Создаём пользователя (функция user.add). Так как есть возможность создавать на пользователей на базе какого-то шаблона (WSR в нашем случае). То происходит асинхронное создание пользователя + сайта + бд.
def generate_random_string(length=6): # Рандомные строки для домена и пароля
characters = string.ascii_letters + string.digits
return ''.join(secrets.choice(characters) for i in range(length))
async def create_user(name, fullname, passwd):
url = f'{settings.ISP_API}?authinfo={settings.location_user}:{settings.location_password}&out=json&lang=ru' \
f'&func=user.add' \
f'&name={name}' \
f'&fullname={fullname}' \
f'&passwd={passwd}' \
f'&domain={name}.domain.ru' \
f'&preset={settings.preset}' \
f'&status=1&sok=ok'
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.json()
Система оценивания
Считается сумма всех баллов исходя из критериев.
@api_view(['GET', 'PUT'])
@permission_classes([IsAuthenticated])
def get_or_update_saved_results(request, student_id, module_id):
if request.method == 'GET':
saved_results = StudentResult.objects.filter(student_id=student_id, criterion__module_id=module_id)
serializer = StudentResultSerializer(saved_results, many=True)
return Response(serializer.data)
elif request.method == 'PUT':
existing_results = StudentResult.objects.filter(student_id=student_id, criterion__module_id=module_id)
existing_results_dict = {result.criterion_id: result for result in existing_results}
for result_data in request.data:
criterion_id = result_data['criterion']
if criterion_id in existing_results_dict:
result_instance = existing_results_dict[criterion_id]
previous_score = result_instance.score
result_serializer = StudentResultSerializer(result_instance, data=result_data)
else:
result_serializer = StudentResultSerializer(data=result_data)
if result_serializer.is_valid():
# Проверяем, что балл соответствует максимальному баллу для критерия
criterion = Criterion.objects.get(id=criterion_id)
max_score = criterion.weight
score = result_serializer.validated_data['score']
if score < 0 or score > max_score:
return Response(
{'message': f'Балл для критерия {criterion.title} должен быть в диапазоне от 0 до {max_score}'},
status=status.HTTP_400_BAD_REQUEST)
result_serializer.save()
if criterion_id in existing_results_dict:
result_instance.previous_score = previous_score
result_instance.save()
else:
return Response(result_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
updated_results = StudentResult.objects.filter(student_id=student_id, criterion__module_id=module_id)
updated_results_serializer = StudentResultSerializer(updated_results, many=True)
return Response(updated_results_serializer.data, status=status.HTTP_201_CREATED)
Видеообзор
Я рад рассказать о своей системой оценивания. Если у вас есть вопросы или предложения, не стесняйтесь обращаться.
Спасибо за внимание :)