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