This commit is contained in:
Dmitry Belan
2026-09-19 11:43:07 +03:00
commit 0e11a41d29
47 changed files with 1631 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# Generated by Django 5.1.1 on 2026-09-18 18:49
import lms.validators
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Assignment',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('description', models.TextField()),
('deadline', models.DateTimeField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
],
),
migrations.CreateModel(
name='Subject',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
],
),
migrations.CreateModel(
name='Submission',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text_answer', models.TextField(blank=True, null=True)),
('file_answer', models.FileField(blank=True, null=True, upload_to='submissions/%Y/%m/%d/', validators=[lms.validators.validate_file_extension])),
('grade', models.CharField(blank=True, max_length=10, null=True)),
('teacher_feedback', models.TextField(blank=True, null=True)),
('status', models.CharField(choices=[('PENDING', 'Pending'), ('GRADED', 'Graded')], default='PENDING', max_length=20)),
('submitted_at', models.DateTimeField(auto_now_add=True)),
],
),
]
+38
View File
@@ -0,0 +1,38 @@
# Generated by Django 5.1.1 on 2026-09-18 18:49
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('lms', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='assignment',
name='created_by',
field=models.ForeignKey(limit_choices_to={'role__in': ['TEACHER', 'ADMIN']}, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='assignment',
name='subject',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='lms.subject'),
),
migrations.AddField(
model_name='submission',
name='assignment',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submissions', to='lms.assignment'),
),
migrations.AddField(
model_name='submission',
name='student',
field=models.ForeignKey(limit_choices_to={'role': 'STUDENT'}, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
@@ -0,0 +1,104 @@
# Generated by Django 5.1.1 on 2026-09-18 18:59
import django.db.models.deletion
import lms.validators
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lms', '0002_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterModelOptions(
name='assignment',
options={'verbose_name': 'Задание', 'verbose_name_plural': 'Задания'},
),
migrations.AlterModelOptions(
name='subject',
options={'verbose_name': 'Предмет', 'verbose_name_plural': 'Предметы'},
),
migrations.AlterModelOptions(
name='submission',
options={'verbose_name': 'Ответ ученика', 'verbose_name_plural': 'Ответы учеников'},
),
migrations.AlterField(
model_name='assignment',
name='created_at',
field=models.DateTimeField(auto_now_add=True, verbose_name='Дата создания'),
),
migrations.AlterField(
model_name='assignment',
name='created_by',
field=models.ForeignKey(limit_choices_to={'role__in': ['TEACHER', 'ADMIN']}, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Кем создано'),
),
migrations.AlterField(
model_name='assignment',
name='deadline',
field=models.DateTimeField(blank=True, null=True, verbose_name='Срок сдачи (Дедлайн)'),
),
migrations.AlterField(
model_name='assignment',
name='description',
field=models.TextField(verbose_name='Описание задания'),
),
migrations.AlterField(
model_name='assignment',
name='subject',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='lms.subject', verbose_name='Предмет'),
),
migrations.AlterField(
model_name='assignment',
name='title',
field=models.CharField(max_length=255, verbose_name='Название задания'),
),
migrations.AlterField(
model_name='subject',
name='name',
field=models.CharField(max_length=100, verbose_name='Название предмета'),
),
migrations.AlterField(
model_name='submission',
name='assignment',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='submissions', to='lms.assignment', verbose_name='Задание'),
),
migrations.AlterField(
model_name='submission',
name='file_answer',
field=models.FileField(blank=True, null=True, upload_to='submissions/%Y/%m/%d/', validators=[lms.validators.validate_file_extension], verbose_name='Файл с ответом'),
),
migrations.AlterField(
model_name='submission',
name='grade',
field=models.CharField(blank=True, max_length=10, null=True, verbose_name='Оценка'),
),
migrations.AlterField(
model_name='submission',
name='status',
field=models.CharField(choices=[('PENDING', 'Ожидает проверки'), ('GRADED', 'Проверено')], default='PENDING', max_length=20, verbose_name='Статус'),
),
migrations.AlterField(
model_name='submission',
name='student',
field=models.ForeignKey(limit_choices_to={'role': 'STUDENT'}, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Ученик'),
),
migrations.AlterField(
model_name='submission',
name='submitted_at',
field=models.DateTimeField(auto_now_add=True, verbose_name='Дата отправки'),
),
migrations.AlterField(
model_name='submission',
name='teacher_feedback',
field=models.TextField(blank=True, null=True, verbose_name='Комментарий учителя'),
),
migrations.AlterField(
model_name='submission',
name='text_answer',
field=models.TextField(blank=True, null=True, verbose_name='Текстовый ответ'),
),
]
@@ -0,0 +1,24 @@
# Generated by Django 5.1.1 on 2026-09-18 20:40
import lms.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lms', '0003_alter_assignment_options_alter_subject_options_and_more'),
]
operations = [
migrations.AddField(
model_name='assignment',
name='attached_file',
field=models.FileField(blank=True, null=True, upload_to='assignments/', validators=[lms.validators.validate_file_extension], verbose_name='Файл с заданием'),
),
migrations.AddField(
model_name='assignment',
name='correct_answer',
field=models.TextField(blank=True, null=True, verbose_name='Правильный ответ'),
),
]
@@ -0,0 +1,63 @@
# Generated by Django 5.1.1 on 2026-09-18 20:47
import django.db.models.deletion
import lms.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lms', '0004_assignment_attached_file_assignment_correct_answer'),
]
operations = [
migrations.RemoveField(
model_name='assignment',
name='attached_file',
),
migrations.RemoveField(
model_name='assignment',
name='correct_answer',
),
migrations.RemoveField(
model_name='submission',
name='file_answer',
),
migrations.RemoveField(
model_name='submission',
name='text_answer',
),
migrations.CreateModel(
name='Question',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField(verbose_name='Текст задачи')),
('attached_file', models.FileField(blank=True, null=True, upload_to='questions/', validators=[lms.validators.validate_file_extension], verbose_name='Файл (опционально)')),
('question_type', models.CharField(choices=[('TEXT_AUTO', 'Краткий ответ (автопроверка)'), ('FILE_MANUAL', 'Файл/Развернутый ответ (ручная проверка)')], default='TEXT_AUTO', max_length=20, verbose_name='Тип ответа')),
('correct_answer', models.TextField(blank=True, help_text='Оставьте пустым, если проверка ручная', null=True, verbose_name='Правильный ответ (для автопроверки)')),
('order', models.PositiveIntegerField(default=0, verbose_name='Порядок')),
('assignment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='lms.assignment', verbose_name='Задание')),
],
options={
'verbose_name': 'Задача',
'verbose_name_plural': 'Задачи',
'ordering': ['order', 'id'],
},
),
migrations.CreateModel(
name='Answer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text_answer', models.TextField(blank=True, null=True, verbose_name='Текстовый ответ')),
('file_answer', models.FileField(blank=True, null=True, upload_to='answers/%Y/%m/%d/', validators=[lms.validators.validate_file_extension], verbose_name='Файл с ответом')),
('is_correct', models.BooleanField(blank=True, null=True, verbose_name='Правильно?')),
('submission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='lms.submission', verbose_name='Решение (Submission)')),
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='lms.question', verbose_name='Задача')),
],
options={
'verbose_name': 'Ответ на задачу',
'verbose_name_plural': 'Ответы на задачи',
},
),
]
@@ -0,0 +1,23 @@
# Generated by Django 5.1.1 on 2026-09-18 20:59
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lms', '0005_remove_assignment_attached_file_and_more'),
]
operations = [
migrations.AddField(
model_name='answer',
name='comment',
field=models.TextField(blank=True, null=True, verbose_name='Комментарий'),
),
migrations.AddField(
model_name='answer',
name='points',
field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Баллы'),
),
]
@@ -0,0 +1,29 @@
# Generated by Django 5.1.1 on 2026-09-19 07:29
import ckeditor_uploader.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('lms', '0006_answer_comment_answer_points'),
]
operations = [
migrations.AlterField(
model_name='assignment',
name='description',
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Описание задания'),
),
migrations.AlterField(
model_name='question',
name='correct_answer',
field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='Оставьте пустым, если проверка ручная', null=True, verbose_name='Правильный ответ (для автопроверки)'),
),
migrations.AlterField(
model_name='question',
name='text',
field=ckeditor_uploader.fields.RichTextUploadingField(verbose_name='Текст задачи'),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 5.1.1 on 2026-09-19 07:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lms', '0007_alter_assignment_description_and_more'),
]
operations = [
migrations.AlterField(
model_name='question',
name='correct_answer',
field=models.CharField(blank=True, help_text='Оставьте пустым, если проверка ручная', max_length=255, null=True, verbose_name='Правильный ответ (для автопроверки)'),
),
]
@@ -0,0 +1,17 @@
# Generated by Django 5.1.1 on 2026-09-19 07:38
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('lms', '0008_alter_question_correct_answer'),
]
operations = [
migrations.RemoveField(
model_name='assignment',
name='deadline',
),
]
+1
View File
@@ -0,0 +1 @@
# init