diff --git a/services/backend/apps/task/admin.py b/services/backend/apps/task/admin.py index 7b6fbfa..10f3c67 100644 --- a/services/backend/apps/task/admin.py +++ b/services/backend/apps/task/admin.py @@ -4,6 +4,7 @@ from apps.task.models import ( CompetitionTask, CompetitionTaskAttachment, CompetitionTaskSubmission, + CompetitionTaskCriteria ) @@ -12,12 +13,17 @@ class CompletionAttachmentInline(admin.StackedInline): extra = 0 +class CompetitionCriteriaInline(admin.StackedInline): + model = CompetitionTaskCriteria + extra = 0 + + @admin.register(CompetitionTask) class CompetitionTaskAdmin(admin.ModelAdmin): list_display = ("title", "type", "points") filter_horizontal = ("reviewers",) list_filter = ("type",) - inlines = (CompletionAttachmentInline,) + inlines = (CompletionAttachmentInline, CompetitionCriteriaInline,) @admin.register(CompetitionTaskSubmission) diff --git a/services/backend/apps/task/models.py b/services/backend/apps/task/models.py index a5e725b..9947fb3 100644 --- a/services/backend/apps/task/models.py +++ b/services/backend/apps/task/models.py @@ -3,6 +3,7 @@ from uuid import uuid4 from django.db import models from django.db.models import Count, Q from martor.models import MartorField +from mdeditor.fields import MDTextField from apps.competition.models import Competition from apps.core.models import BaseModel @@ -25,7 +26,7 @@ class CompetitionTask(BaseModel): competition = models.ForeignKey(Competition, on_delete=models.CASCADE, verbose_name="привязанное соревнование") title = models.CharField(verbose_name="заголовок", max_length=50) - description = MartorField(verbose_name="описание") + description = MDTextField(verbose_name="описание") max_attempts = models.PositiveSmallIntegerField(null=True, blank=True, verbose_name="максимальное кол-во попыток") type = models.CharField( @@ -89,6 +90,13 @@ class CompetitionTaskCriteria(BaseModel): verbose_name="максимальное кол-во баллов" ) + def __str__(self): + return self.name + + class Meta: + verbose_name = "критерий" + verbose_name_plural = "критерии" + class CompetitionTaskAttachment(BaseModel): def file_upload_at(instance, filename) -> str: diff --git a/services/backend/config/settings.py b/services/backend/config/settings.py index 3987361..da2215b 100644 --- a/services/backend/config/settings.py +++ b/services/backend/config/settings.py @@ -271,6 +271,8 @@ DEFAULT_CHARSET = "utf-8" FORCE_SCRIPT_NAME = None +X_FRAME_OPTIONS = "SAMEORIGIN" + INTERNAL_IPS = env( "DJANGO_INTERNAL_IPS", list, @@ -440,6 +442,7 @@ INSTALLED_APPS = [ "minio_storage", "tinymce", "martor", + "mdeditor", # Internal apps "apps.core", "apps.user", diff --git a/services/backend/config/urls.py b/services/backend/config/urls.py index 6fe96c2..0fb5044 100644 --- a/services/backend/config/urls.py +++ b/services/backend/config/urls.py @@ -16,6 +16,8 @@ urlpatterns = [ path("tinymce/", include("tinymce.urls")), # martor path("martor/", include("martor.urls")), + # mdeditor + path(r'mdeditor/', include('mdeditor.urls')), # Admin urls path("admin/", admin.site.urls), # API urls diff --git a/services/backend/pyproject.toml b/services/backend/pyproject.toml index d3b2371..bb39e9e 100644 --- a/services/backend/pyproject.toml +++ b/services/backend/pyproject.toml @@ -12,6 +12,7 @@ dependencies = [ "django-extensions>=3.2.3", "django-guid>=3.5.0", "django-health-check>=3.18.3", + "django-mdeditor>=0.1.20", "django-minio-storage>=0.5.7", "django-ninja>=1.3.0", "django-pagedown>=2.2.1",