From c4d36dcf8bdeea713fc402f15308c7cc48b465ac Mon Sep 17 00:00:00 2001 From: Timur Date: Sun, 2 Mar 2025 15:39:23 +0300 Subject: [PATCH] change markdown editor to martor --- services/backend/apps/task/models.py | 3 ++- services/backend/config/settings.py | 37 +++++++++++++++++++++++++++- services/backend/config/urls.py | 2 ++ services/backend/pyproject.toml | 1 + 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/services/backend/apps/task/models.py b/services/backend/apps/task/models.py index 28cf455..14a892d 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 tinymce.models import HTMLField +from martor.models import MartorField from apps.competition.models import Competition from apps.core.models import BaseModel @@ -24,7 +25,7 @@ class CompetitionTask(BaseModel): ) competition = models.ForeignKey(Competition, on_delete=models.CASCADE) title = models.CharField(verbose_name="заголовок", max_length=50) - description = HTMLField(verbose_name="описание") + description = MartorField(verbose_name="описание") max_attempts = models.PositiveSmallIntegerField(null=True, blank=True) type = models.CharField( choices=CompetitionTaskType, max_length=8, verbose_name="тип проверки" diff --git a/services/backend/config/settings.py b/services/backend/config/settings.py index 63bc06a..266990b 100644 --- a/services/backend/config/settings.py +++ b/services/backend/config/settings.py @@ -442,6 +442,7 @@ INSTALLED_APPS = [ "ninja", "minio_storage", "tinymce", + "martor", # Internal apps "apps.core", "apps.user", @@ -459,15 +460,49 @@ TINYMCE_DEFAULT_CONFIG = { "menubar": False, "plugins": "advlist,autolink,lists,link,image,charmap,print,preview,anchor," "searchreplace,visualblocks,code,fullscreen,insertdatetime,media,table,paste," - "code,help,wordcount", + "code,help,wordcount,markdown", "toolbar": "undo redo | formatselect | " "bold italic backcolor | alignleft aligncenter " "alignright alignjustify | bullist numlist outdent indent | " "removeformat | help", "skin": "oxide-dark", "content_css": "dark", + "textpattern_patterns": [ + {"start": "*", "end": "*", "format": "italic"}, + {"start": "**", "end": "**", "format": "bold"}, + {"start": "#", "format": "h1"}, + {"start": "##", "format": "h2"}, + {"start": "###", "format": "h3"}, + {"start": "####", "format": "h4"}, + {"start": "#####", "format": "h5"}, + {"start": "######", "format": "h6"}, + {"start": "1. ", "cmd": "InsertOrderedList"}, + {"start": "* ", "cmd": "InsertUnorderedList"}, + {"start": "- ", "cmd": "InsertUnorderedList"} + ] } +# martor + +MARTOR_THEME = 'bootstrap' + +MARTOR_ENABLE_CONFIGS = { + 'emoji': 'true', # to enable/disable emoji icons. + 'imgur': 'true', # to enable/disable imgur/custom uploader. + 'mention': 'false', # to enable/disable mention + 'jquery': 'true', # to include/revoke jquery (require for admin default django) + 'living': 'false', # to enable/disable live updates in preview + 'spellcheck': 'false', # to enable/disable spellcheck in form textareas + 'hljs': 'true', # to enable/disable hljs highlighting in preview +} + +MARTOR_TOOLBAR_BUTTONS = [ + 'bold', 'italic', 'horizontal', 'heading', 'pre-code', + 'blockquote', 'unordered-list', 'ordered-list', + 'link', 'emoji', + 'direct-mention', 'toggle-maximize', 'help' +] + # GUID DJANGO_GUID = { diff --git a/services/backend/config/urls.py b/services/backend/config/urls.py index 27b279a..4e50a9a 100644 --- a/services/backend/config/urls.py +++ b/services/backend/config/urls.py @@ -14,6 +14,8 @@ admin.site.index_title = "DataRush" urlpatterns = [ # tinymce path("tinymce/", include("tinymce.urls")), + # martor + path('martor/', include('martor.urls')), # Admin urls path("admin/", admin.site.urls), # API urls diff --git a/services/backend/pyproject.toml b/services/backend/pyproject.toml index 20b218e..d3b2371 100644 --- a/services/backend/pyproject.toml +++ b/services/backend/pyproject.toml @@ -19,6 +19,7 @@ dependencies = [ "django-tinymce>=4.1.0", "gunicorn>=23.0.0", "httpx>=0.28.1", + "martor>=1.6.45", "pillow>=11.1.0", "psycopg2-binary>=2.9.10", "pydantic>=2.10.5",