From 710b40dfe1acb6346ecdb2fdcd3dbda35740adf8 Mon Sep 17 00:00:00 2001 From: Timur Date: Sun, 2 Mar 2025 15:10:54 +0300 Subject: [PATCH] add achievement app --- services/backend/apps/achievement/__init__.py | 0 services/backend/apps/achievement/admin.py | 9 +++ services/backend/apps/achievement/apps.py | 7 ++ .../achievement/migrations/0001_initial.py | 29 ++++++++ .../apps/achievement/migrations/__init__.py | 0 services/backend/apps/achievement/models.py | 22 ++++++ ...petitiontasksubmission_options_and_more.py | 71 +++++++++++++++++++ services/backend/config/settings.py | 1 + 8 files changed, 139 insertions(+) create mode 100644 services/backend/apps/achievement/__init__.py create mode 100644 services/backend/apps/achievement/admin.py create mode 100644 services/backend/apps/achievement/apps.py create mode 100644 services/backend/apps/achievement/migrations/0001_initial.py create mode 100644 services/backend/apps/achievement/migrations/__init__.py create mode 100644 services/backend/apps/achievement/models.py create mode 100644 services/backend/apps/task/migrations/0002_alter_competitiontasksubmission_options_and_more.py diff --git a/services/backend/apps/achievement/__init__.py b/services/backend/apps/achievement/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/services/backend/apps/achievement/admin.py b/services/backend/apps/achievement/admin.py new file mode 100644 index 0000000..4657244 --- /dev/null +++ b/services/backend/apps/achievement/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +from apps.achievement.models import Achievement + + +@admin.register(Achievement) +class AchievementAdmin(admin.ModelAdmin): + list_display = ("id", "name",) + search_fields = ("name", "description",) diff --git a/services/backend/apps/achievement/apps.py b/services/backend/apps/achievement/apps.py new file mode 100644 index 0000000..2e3e606 --- /dev/null +++ b/services/backend/apps/achievement/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + +class AchievementConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.achievement' + verbose_name = "Ачивки" diff --git a/services/backend/apps/achievement/migrations/0001_initial.py b/services/backend/apps/achievement/migrations/0001_initial.py new file mode 100644 index 0000000..b20fb21 --- /dev/null +++ b/services/backend/apps/achievement/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.6 on 2025-03-02 12:09 + +import apps.achievement.models +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Achievement', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('name', models.CharField(max_length=30, unique=True, verbose_name='название')), + ('description', models.TextField(verbose_name='описание')), + ('icon', models.FileField(upload_to=apps.achievement.models.Achievement.image_url_upload_to, verbose_name='иконка достижения')), + ], + options={ + 'verbose_name': 'ачивка', + 'verbose_name_plural': 'ачивки', + }, + ), + ] diff --git a/services/backend/apps/achievement/migrations/__init__.py b/services/backend/apps/achievement/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/services/backend/apps/achievement/models.py b/services/backend/apps/achievement/models.py new file mode 100644 index 0000000..1e0460a --- /dev/null +++ b/services/backend/apps/achievement/models.py @@ -0,0 +1,22 @@ +from django.db import models + +from apps.core.models import BaseModel + +class Achievement(BaseModel): + def image_url_upload_to(instance, filename): + return f"/achievements/{instance.id}/icon" + + name = models.CharField(max_length=30, verbose_name="название", + unique=True) + description = models.TextField(verbose_name="описание") + icon = models.FileField( + verbose_name="иконка достижения", + upload_to=image_url_upload_to, + ) + + def __str__(self): + return self.name + + class Meta: + verbose_name = "ачивка" + verbose_name_plural = "ачивки" diff --git a/services/backend/apps/task/migrations/0002_alter_competitiontasksubmission_options_and_more.py b/services/backend/apps/task/migrations/0002_alter_competitiontasksubmission_options_and_more.py new file mode 100644 index 0000000..9cc1672 --- /dev/null +++ b/services/backend/apps/task/migrations/0002_alter_competitiontasksubmission_options_and_more.py @@ -0,0 +1,71 @@ +# Generated by Django 5.1.6 on 2025-03-02 12:09 + +import apps.task.models +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('review', '0002_initial'), + ('task', '0001_initial'), + ('user', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='competitiontasksubmission', + options={'verbose_name': 'посылка', 'verbose_name_plural': 'посылки'}, + ), + migrations.AlterField( + model_name='competitiontask', + name='reviewers', + field=models.ManyToManyField(blank=True, help_text='Справа отображаются действующие проверяющие, слева - доступные для выбора. Для перемещения можно кликнуть 2 раза по проверяющему', to='review.reviewer', verbose_name='ревьюверы'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='checked_at', + field=models.DateTimeField(blank=True, null=True, verbose_name='дата проверки'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='content', + field=models.FileField(upload_to=apps.task.models.CompetitionTaskSubmission.submission_content_upload_to, verbose_name='содержание посылки'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='earned_points', + field=models.IntegerField(blank=True, null=True, verbose_name='баллы за задание'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='plagiarism_checked', + field=models.BooleanField(default=False, verbose_name='проверено на плагиат'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='result', + field=models.JSONField(blank=True, default=None, null=True, verbose_name='результат проверки'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='stdout', + field=models.FileField(blank=True, help_text='Используется только при проверке чекером', null=True, upload_to=apps.task.models.CompetitionTaskSubmission.submission_stdout_upload_to, verbose_name='вывод программы'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='task', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='task.competitiontask', verbose_name='задание'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='timestamp', + field=models.DateTimeField(auto_now_add=True, verbose_name='дата отправки'), + ), + migrations.AlterField( + model_name='competitiontasksubmission', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='user.user', verbose_name='пользователь'), + ), + ] diff --git a/services/backend/config/settings.py b/services/backend/config/settings.py index 6bf014b..63bc06a 100644 --- a/services/backend/config/settings.py +++ b/services/backend/config/settings.py @@ -449,6 +449,7 @@ INSTALLED_APPS = [ "apps.review", "apps.task", "apps.team", + "apps.achievement", ] # tinymce