Исходный код assignments.forms

"""
Формы Django для системы проверки домашних заданий.

Содержит формы для:
- Регистрации пользователей с выбором роли
- Создания и редактирования домашних заданий
- Отправки работ студентами
- Выставления оценок преподавателями
"""

from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

from .models import Homework, Submission, UserProfile

User = get_user_model()


[документация] class RegisterForm(UserCreationForm): # pylint: disable=too-many-ancestors """Форма регистрации с выбором роли""" email = forms.EmailField(required=True, label="Email") first_name = forms.CharField(max_length=100, required=True, label="Имя") last_name = forms.CharField(max_length=100, required=True, label="Фамилия") role = forms.ChoiceField(choices=UserProfile.ROLE_CHOICES, required=True, label="Роль", widget=forms.RadioSelect)
[документация] class Meta: model = User fields = ["username", "first_name", "last_name", "email", "password1", "password2", "role"]
[документация] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Русификация полей self.fields["username"].label = "Логин" self.fields["password1"].label = "Пароль" self.fields["password2"].label = "Подтверждение пароля" # Добавляем Bootstrap классы for field_name, field in self.fields.items(): if field_name != "role": field.widget.attrs["class"] = "form-control" else: field.widget.attrs["class"] = "form-check-input"
[документация] def save(self, commit=True): user = super().save(commit=False) user.email = self.cleaned_data["email"] user.first_name = self.cleaned_data["first_name"] user.last_name = self.cleaned_data["last_name"] if commit: user.save() # Устанавливаем роль в профиле user.profile.role = self.cleaned_data["role"] user.profile.save() return user
[документация] class HomeworkForm(forms.ModelForm): """Форма создания домашнего задания"""
[документация] class Meta: model = Homework fields = ["title", "description", "due_date"] widgets = { "title": forms.TextInput(attrs={"class": "form-control", "placeholder": "Введите название задания"}), "description": forms.Textarea( attrs={"class": "form-control", "rows": 5, "placeholder": "Опишите задание подробно"} ), "due_date": forms.DateTimeInput(attrs={"class": "form-control", "type": "datetime-local"}), } labels = { "title": "Название задания", "description": "Описание", "due_date": "Срок сдачи", }
[документация] class SubmissionForm(forms.ModelForm): """Форма отправки работы студентом"""
[документация] class Meta: model = Submission fields = ["solution_file"] widgets = { "solution_file": forms.FileInput( attrs={ "class": "form-control", "accept": ".pdf,.doc,.docx,.txt,.py,.zip,.jpg,.jpeg,.png", } ), } labels = { "solution_file": "Файл с решением (макс. 10МБ)", } help_texts = { "solution_file": "Разрешенные форматы: PDF, DOC, DOCX, TXT, PY, ZIP, JPG, JPEG, PNG. Максимальный размер: 10МБ", }
[документация] class GradeForm(forms.ModelForm): """Форма для выставления оценки и отзыва"""
[документация] class Meta: model = Submission fields = ["grade", "feedback"] widgets = { "grade": forms.NumberInput( attrs={"class": "form-control", "min": 0, "max": 100, "placeholder": "Оценка от 0 до 100"} ), "feedback": forms.Textarea(attrs={"class": "form-control", "rows": 4, "placeholder": "Напишите отзыв о работе"}), } labels = { "grade": "Оценка", "feedback": "Отзыв", }