diff --git a/services/backend/apps/achievement/migrations/0001_initial.py b/services/backend/apps/achievement/migrations/0001_initial.py index 03300ea..82a5079 100644 --- a/services/backend/apps/achievement/migrations/0001_initial.py +++ b/services/backend/apps/achievement/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import apps.achievement.models import django.db.models.deletion diff --git a/services/backend/apps/achievement/migrations/0002_initial.py b/services/backend/apps/achievement/migrations/0002_initial.py index 1d03338..19f8cc3 100644 --- a/services/backend/apps/achievement/migrations/0002_initial.py +++ b/services/backend/apps/achievement/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import django.db.models.deletion from django.db import migrations, models diff --git a/services/backend/apps/competition/migrations/0001_initial.py b/services/backend/apps/competition/migrations/0001_initial.py index 428a78a..1d11125 100644 --- a/services/backend/apps/competition/migrations/0001_initial.py +++ b/services/backend/apps/competition/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import apps.competition.models import datetime diff --git a/services/backend/apps/review/migrations/0001_initial.py b/services/backend/apps/review/migrations/0001_initial.py index afe281e..d4c9ece 100644 --- a/services/backend/apps/review/migrations/0001_initial.py +++ b/services/backend/apps/review/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import uuid from django.db import migrations, models diff --git a/services/backend/apps/review/migrations/0002_initial.py b/services/backend/apps/review/migrations/0002_initial.py index 5a5d3cc..61347c5 100644 --- a/services/backend/apps/review/migrations/0002_initial.py +++ b/services/backend/apps/review/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import django.db.models.deletion from django.db import migrations, models diff --git a/services/backend/apps/task/migrations/0001_initial.py b/services/backend/apps/task/migrations/0001_initial.py index 9cfeeae..943b9ca 100644 --- a/services/backend/apps/task/migrations/0001_initial.py +++ b/services/backend/apps/task/migrations/0001_initial.py @@ -1,8 +1,8 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import apps.task.models import django.db.models.deletion -import martor.models +import mdeditor.fields import uuid from django.db import migrations, models @@ -22,17 +22,17 @@ class Migration(migrations.Migration): name='CompetitionTask', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), - ('in_competition_position', models.PositiveSmallIntegerField()), + ('in_competition_position', models.PositiveSmallIntegerField(verbose_name='позиция в соревновании')), ('title', models.CharField(max_length=50, verbose_name='заголовок')), - ('description', martor.models.MartorField(verbose_name='описание')), - ('max_attempts', models.PositiveSmallIntegerField(blank=True, null=True)), + ('description', mdeditor.fields.MDTextField(verbose_name='описание')), + ('max_attempts', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='максимальное кол-во попыток')), ('type', models.CharField(choices=[('input', 'Ввод правильного ответа'), ('checker', 'Ввод кода'), ('review', 'Ручная')], max_length=8, verbose_name='тип проверки')), - ('correct_answer_file', models.FileField(blank=True, null=True, upload_to=apps.task.models.CompetitionTask.answer_file_upload_to, verbose_name='файл с правильным ответом')), - ('points', models.IntegerField(blank=True, null=True, verbose_name='баллы за задание')), - ('answer_file_path', models.TextField(blank=True, default='stdout', help_text='Путь до файла в котором ожидается результат. Пример: stdout или ./output.txt', null=True, verbose_name='куда сделать вывод программы участнику')), - ('submission_reviewers_count', models.PositiveSmallIntegerField(blank=True, default=1, null=True)), - ('competition', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='competition.competition')), - ('reviewers', models.ManyToManyField(blank=True, help_text='Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему', to='review.reviewer', verbose_name='ревьюверы')), + ('correct_answer_file', models.FileField(blank=True, help_text='Имеет смысл только при автоматической (ввод ответа или кода) проверке.', null=True, upload_to=apps.task.models.CompetitionTask.answer_file_upload_to, verbose_name='файл с правильным ответом')), + ('points', models.IntegerField(blank=True, null=True, verbose_name='общий балл за задание')), + ('answer_file_path', models.TextField(blank=True, default='stdout', help_text='Путь до файла в котором ожидается результат. Пример: stdout или ./output.txt. Имеет смысл только при автоматическом типе проверки.', null=True, verbose_name='куда сделать вывод программы участнику')), + ('submission_reviewers_count', models.PositiveSmallIntegerField(blank=True, default=1, null=True, verbose_name='кол-во проверяющих для зачета задачи')), + ('competition', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='competition.competition', verbose_name='привязанное соревнование')), + ('reviewers', models.ManyToManyField(blank=True, help_text='Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему. Имеет смысл только при ручном типе проверки.', to='review.reviewer', verbose_name='ревьюверы')), ], options={ 'verbose_name': 'задание', @@ -57,14 +57,15 @@ class Migration(migrations.Migration): name='CompetitionTaskCriteria', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), - ('name', models.TextField()), - ('slug', models.SlugField()), - ('description', models.TextField()), - ('max_value', models.PositiveSmallIntegerField()), + ('name', models.TextField(verbose_name='название')), + ('slug', models.SlugField(verbose_name='техническое название')), + ('description', models.TextField(verbose_name='описание критерии')), + ('max_value', models.PositiveSmallIntegerField(verbose_name='максимальное кол-во баллов')), ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='criteries', to='task.competitiontask')), ], options={ - 'abstract': False, + 'verbose_name': 'критерий', + 'verbose_name_plural': 'критерии', }, ), migrations.CreateModel( diff --git a/services/backend/apps/team/migrations/0001_initial.py b/services/backend/apps/team/migrations/0001_initial.py index 1924dc3..94cacb2 100644 --- a/services/backend/apps/team/migrations/0001_initial.py +++ b/services/backend/apps/team/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import django.db.models.deletion import uuid diff --git a/services/backend/apps/user/migrations/0001_initial.py b/services/backend/apps/user/migrations/0001_initial.py index 4ade297..d6ee060 100644 --- a/services/backend/apps/user/migrations/0001_initial.py +++ b/services/backend/apps/user/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.6 on 2025-03-03 07:20 +# Generated by Django 5.1.6 on 2025-03-03 09:41 import uuid from django.db import migrations, models @@ -17,11 +17,12 @@ class Migration(migrations.Migration): name='User', fields=[ ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('avatar', models.ImageField(blank=True, null=True, upload_to='', verbose_name='аватар')), ('email', models.EmailField(max_length=254, unique=True, verbose_name='почта')), ('username', models.SlugField(unique=True, verbose_name='юзернейм')), ('password', models.TextField(verbose_name='пароль')), - ('created_at', models.DateTimeField(auto_now=True)), - ('status', models.CharField(choices=[('student', 'Student'), ('metodist', 'Metodist')], default='student', max_length=10)), + ('created_at', models.DateTimeField(auto_now=True, verbose_name='дата создания')), + ('status', models.CharField(choices=[('student', 'Участник соревнований'), ('metodist', 'Методист (составитель заданий)')], default='student', max_length=10, verbose_name='роль участника')), ('achievements', models.ManyToManyField(blank=True, to='achievement.achievement', verbose_name='ачивки пользователя')), ], options={ diff --git a/services/backend/apps/user/models.py b/services/backend/apps/user/models.py index e324bcb..6a7a0c5 100644 --- a/services/backend/apps/user/models.py +++ b/services/backend/apps/user/models.py @@ -11,7 +11,7 @@ class UserRole(models.TextChoices): class User(BaseModel): - avatar = models.ImageField(verbose_name="аватар") + avatar = models.ImageField(verbose_name="аватар", null=True, blank=True) email = models.EmailField(unique=True, verbose_name="почта") username = models.SlugField(unique=True, verbose_name="юзернейм") password = models.TextField(verbose_name="пароль") diff --git a/services/backend/config/urls.py b/services/backend/config/urls.py index 423dfe6..73e9ec2 100644 --- a/services/backend/config/urls.py +++ b/services/backend/config/urls.py @@ -13,7 +13,7 @@ admin.site.index_title = "DataRush" urlpatterns = [ # mdeditor - path(r'mdeditor/', include('mdeditor.urls')), + path(r"mdeditor/", include("mdeditor.urls")), # Admin urls path("admin/", admin.site.urls), # API urls