Исходный код 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": "Отзыв",
        }