diff --git a/README.md b/README.md
index 6f310bb..e6a92ca 100644
--- a/README.md
+++ b/README.md
@@ -3,8 +3,8 @@
Сайт с новостями (блог о 3D-печать и Систем Автоматизированного Проектирования) на Django со
встроенными свистелками-перделками:
* медиа-библиотека (filer);
-* WYSIWYG-редактор (ckeditor) в админке;
-* типограф (по API или встроенный «типограф Муравьева», с костылями под ckeditor);
+* HTML-редактор на обычной textarea в админке;
+* типограф (по API или встроенный «типограф Муравьева»);
* теги новостей (taggit).
[Инструкция по развертыванию на хостинге DreamHost.com](deploy_to_dreamhost.md)
diff --git a/cadpoint/cadpoint/settings.py b/cadpoint/cadpoint/settings.py
index 2e9fbcd..52fcc70 100644
--- a/cadpoint/cadpoint/settings.py
+++ b/cadpoint/cadpoint/settings.py
@@ -60,8 +60,6 @@ INSTALLED_APPS = [
'easy_thumbnails',
'filer.apps.FilerConfig',
'mptt.apps.MpttConfig',
- # # 'ckeditor_uploader',
- 'ckeditor',
'taggit.apps.TaggitAppConfig',
# 'fontawesome-free'
'web.apps.WebConfig',
@@ -143,50 +141,6 @@ THUMBNAIL_TRANSPARENCY_EXTENSION = 'png'
THUMBNAIL_WIDGET_OPTIONS = {'size': (64, 64)}
-CKEDITOR_UPLOAD_PATH = "uploads/"
-CKEDITOR_BASEPATH = "/static/ckeditor/ckeditor/"
-CKEDITOR_FILENAME_GENERATOR = 'utils.get_filename'
-# конфигуратор ckeditor https://ckeditor.com/latest/samples/toolbarconfigurator/index.html#basic
-CKEDITOR_CONFIGS = {
- 'default': {
- 'toolbar_mini': [
- {'name': 'document', 'items': ['Source', '-', ]},
- {'name': 'basicstyles', 'items': ['Bold', 'Italic', 'Underline', 'NumberedList', 'BulletedList',
- 'Format', '-', 'RemoveFormat']},
- {'name': 'my_custom_tools', 'items': ['Preview', 'Maximize']},
- ],
- 'toolbar': 'mini', # put selected toolbar config here
- 'height': '110',
- 'toolbarCanCollapse': True,
- },
- 'fine': {
- 'toolbar_fine': [
- {'name': 'document', 'items': ['Source', '-' ]},
- {'name': 'clipboard', 'items': ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']},
- {'name': 'basicstyles',
- 'items': ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']},
- {'name': 'my_custom_tools', 'items': ['Preview', 'Maximize']},
- '/',
- {'name': 'paragraph',
- 'items': ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-',
- 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', 'Styles', 'Format', 'Iframe']},
- {'name': 'links', 'items': ['Link', 'Unlink', 'Anchor']},
- {'name': 'insert', 'items': ['Image', 'Table', 'HorizontalRule', 'SpecialChar']},
- ],
- 'toolbar': 'fine',
- # 'removeButtons': 'Save,NewPage,ExportPdf,Preview,Print,Templates,Find,Replace,SelectAll,Scayt,Form,'
- # 'Checkbox,Radio,TextField,Textarea,Select,Button,ImageButton,HiddenField,Format,'
- # 'Font,FontSize,Maximize,ShowBlocks,About,Styles,Flash,Smiley,PageBreak,Iframe,BidiLtr,'
- # 'BidiRtl,Language,JustifyBlock,JustifyRight,JustifyCenter,JustifyLeft,Indent,Outdent,'
- # 'Strike,TextColor,BGColor,
- 'toolbarCanCollapse': True,
- # 'extraPlugins': 'filer',
- # 'editor': [
- # {'name': 'filebrowserBrowseUrl', 'items': ''},
- # {'name': 'filebrowserUploadUrl', 'items': ''},
- # ],
- },
-}
FILER_SUBJECT_LOCATION_IMAGE_DEBUG = True
FILER_CANONICAL_URL = 'sharing/'
diff --git a/cadpoint/web/admin.py b/cadpoint/web/admin.py
index 6f96713..8864232 100644
--- a/cadpoint/web/admin.py
+++ b/cadpoint/web/admin.py
@@ -17,7 +17,7 @@ class AdminContent(admin.ModelAdmin):
# настройка длины поля TextInput в админке
formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size': '100%'})},
- # models.TextField: {'widget': Textarea(attrs={'rows': 4, 'cols': 40})},
+ models.TextField: {'widget': Textarea(attrs={'rows': 14, 'cols': 120})},
}
# Настройка страницы редактирования
fieldsets = [
diff --git a/cadpoint/web/migrations/0001_initial.py b/cadpoint/web/migrations/0001_squashed_0002_alter_tbcontent_szcontentbody_and_more.py
similarity index 86%
rename from cadpoint/web/migrations/0001_initial.py
rename to cadpoint/web/migrations/0001_squashed_0002_alter_tbcontent_szcontentbody_and_more.py
index 4e5b0b3..78c246d 100644
--- a/cadpoint/web/migrations/0001_initial.py
+++ b/cadpoint/web/migrations/0001_squashed_0002_alter_tbcontent_szcontentbody_and_more.py
@@ -1,7 +1,7 @@
-# Generated by Django 3.2.6 on 2022-12-14 19:11
+# Generated by Django 4.2.30 on 2026-04-09 11:26
-import ckeditor.fields
from django.db import migrations, models
+import django.db.models.deletion
import django.utils.timezone
import filer.fields.file
import taggit.managers
@@ -9,13 +9,13 @@ import taggit.managers
class Migration(migrations.Migration):
+ replaces = [('web', '0001_initial'), ('web', '0002_alter_tbcontent_szcontentbody_and_more')]
+
initial = True
dependencies = [
- ('taggit', '0003_taggeditem_add_unique_index'),
- # В установленной версии django-filer есть миграция 0013_image_width_height_to_float,
- # а ссылка на 0013_auto_20221214_2211 относится к другой/несуществующей версии пакета.
('filer', '0013_image_width_height_to_float'),
+ ('taggit', '0003_taggeditem_add_unique_index'),
]
operations = [
@@ -49,8 +49,8 @@ class Migration(migrations.Migration):
('tdContentPublishUp', models.DateTimeField(db_index=True, default=django.utils.timezone.now, help_text='Дата публикации, с её момента новость появится на сайте.', verbose_name='Начало публикации')),
('tdContentPublishDown', models.DateTimeField(blank=True, db_index=True, help_text='Дата окончания публикации, с её момента новость исчезнет с сайта.', null=True, verbose_name='Окончания публикации')),
('szContentHead', models.CharField(default='', help_text='Заголовок контента (допустим HTML-код, будет обработан типографом, если его включить, максимальная длинна 512 символов)', max_length=512, verbose_name='Заголовок')),
- ('szContentIntro', ckeditor.fields.RichTextField(default='', help_text='Анонс (допустим HTML-код, будет обработан типографом, если его включить)', verbose_name='Анонс')),
- ('szContentBody', ckeditor.fields.RichTextField(default='', help_text='Содержание БЕЗ АНОНСА (допустим HTML-код, будет обработан типографом, если его включить)', verbose_name='Содержание')),
+ ('szContentIntro', models.TextField(default='', help_text='Анонс (допустим HTML-код, будет обработан типографом, если его включить)', verbose_name='Анонс')),
+ ('szContentBody', models.TextField(default='', help_text='Содержание БЕЗ АНОНСА (допустим HTML-код, будет обработан типографом, если его включить)', verbose_name='Содержание')),
('szContentSlug', models.CharField(blank=True, default='', help_text='Слуг… 128 символов.
Если оставить пустым, то slug сформируется автоматически', max_length=128, null=True, verbose_name='Slug')),
('iContentHits', models.PositiveIntegerField(db_index=True, default=0, help_text='Число просмотров', verbose_name='◉')),
('bTypograf', models.BooleanField(default=False, help_text='Обработать через Типограф 2.0
НОРМАЛЬНЫЙ ТИПОГРАФ, ХОРОШИЙ HTML, РЕКОМЕНДУЕМ «приклеивает» союзы, поддерживает неразрывные конструкции, замена тире, кавычек и дефисов, расстановка «мягких переносов» в словах длиннее 12 символов, убирает «вдовы» «сироты» (кроме заголовков), расставляет абзацы (кроме заголовков), расшифровывает аббревиатуры (те, что знает и кроме заголовков), висячая пунктуация (только в заголовках) и т.п.', verbose_name='Типограф Стандарт')),
diff --git a/cadpoint/web/models.py b/cadpoint/web/models.py
index 5367fbd..bae9a2d 100644
--- a/cadpoint/web/models.py
+++ b/cadpoint/web/models.py
@@ -3,12 +3,10 @@
from django.db import models
from django.utils.timezone import now
from filer.fields.image import FilerFileField
-from ckeditor.fields import RichTextField
from taggit.managers import TaggableManager
from taggit.models import Tag, TaggedItem
from web.add_function import safe_html_special_symbols, post_processing_html
import urllib3
-import re
import pytils
import random
import datetime
@@ -90,15 +88,13 @@ class TbContent(models.Model):
verbose_name="Превью",
help_text="Картинка-превью"
)
- szContentIntro = RichTextField(
- config_name='fine',
+ szContentIntro = models.TextField(
default="",
verbose_name="Анонс",
help_text="Анонс (допустим HTML-код, будет обработан типографом,"
" если его включить)"
)
- szContentBody = RichTextField(
- config_name='fine',
+ szContentBody = models.TextField(
default="",
verbose_name="Содержание",
help_text="Содержание БЕЗ АНОНСА (допустим HTML-код, будет обработан типографом,"
diff --git a/deploy_to_masterhost-vm.md b/deploy_to_masterhost-vm.md
index f7884b0..7717b05 100644
--- a/deploy_to_masterhost-vm.md
+++ b/deploy_to_masterhost-vm.md
@@ -836,11 +836,10 @@ pip -V
| django | 3.2.15 | Фреймворк Django | притащит с собой пакеты: __asgiref__, __pytz__ и __sqlparse__
| mysqlclient | 2.1.1 | Коннектор MySQL | нет
| django-filer | 2.2.2 | Система управления медиа-файлами с фишками подготовки ресайз-картинок, превьюшек и прочими плюшками | притащит с собой пакеты: __Unidecode__, __django-js-asset__, __django-mptt__, __django-polymorphic__, __easy-thumbnails__ и __pillow__
-| django-ckeditor | 6.4.2 | Wysiwyg-редактор (ckeditor) для админки | нет
+| htmlarea | встроено | Обычная многострочная форма редактирования HTML в админке | нет
| django-taggit | 3.0.0 | Ситема управления тегами | нет
| pytils | 0.4.4 | Пакет рускоязычной транслитерации, работы с числительными, склонениями числительных и временными диаппазонами (для Python 3.x) | нет
| urllib3 | 1.26.11 | пакет для работы с web-запросами (проекту этот пакет нужен для работы с API внешний HTML-типографов) | нет
-| django-ckeditor-filebrowser-filer | 0.3.0 | Плугин для дружбы Wysiwyg-редквтора (ckeditor) и django-filer | нет, все зависимости уже притащил django-filer
Все эти пакеты устанавливаются в виртуальное окружение с помощью пакетного
менеджера `pip` в последовательности:
@@ -849,9 +848,7 @@ pip -V
pip install Django==3.2.15
pip install mysqlclient==2.1.1
pip install django-filer==2.2.2
-pip install django-ckeditor==6.4.2
pip install django-taggit==3.0.0
-pip install django-ckeditor-filebrowser-filer
pip install pytils==0.4.4
pip install urllib3==1.26.11
```
@@ -922,22 +919,7 @@ from django.conf.urls import include
from django.urls import re_path as url
```
-Подобные изменения следует сделать так же в файле __urls.py__ батарейки __ckeditor_filebrowser_filer__
-`/home//cadpoint/env/lib/python3.8/site-packages/ckeditor_filebrowser_filer/urls.py`. Вместо:
-```python
-from django.conf.urls import url
-```
-
-Следует написать:
-```python
-from django.urls import re_path as url
-```
-
-должно получиться:
-```python
-# from django.conf.urls import url
-from django.urls import re_path as url
-```
+Редактор в админке теперь обычный, поэтому отдельные правки для стороннего WYSIWYG-пакета больше не нужны.
Теперь можно произвести перенос статических файлов админки и батареек в папку для web-статики:
```shell
diff --git a/poetry.lock b/poetry.lock
index 17a6e95..27b2539 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -191,21 +191,6 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""}
argon2 = ["argon2-cffi (>=19.1.0)"]
bcrypt = ["bcrypt"]
-[[package]]
-name = "django-ckeditor"
-version = "6.7.3"
-description = "Django admin CKEditor integration."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "django_ckeditor-6.7.3-py3-none-any.whl", hash = "sha256:09771c9b8fb33b84bd2767dfc891a24b7fbdb0120910a7ec65b763a4ae6807bb"},
- {file = "django_ckeditor-6.7.3.tar.gz", hash = "sha256:889fd80ee7d368e3c5b828c8dabf8907d56bcad6bf5881f3898416df4f2adfe7"},
-]
-
-[package.dependencies]
-Django = ">=3.2"
-django-js-asset = ">=2.0"
-
[[package]]
name = "django-debug-toolbar"
version = "6.3.0"
@@ -758,4 +743,4 @@ files = [
[metadata]
lock-version = "2.0"
python-versions = ">=3.12,<3.13"
-content-hash = "66d107c777ecea4c961db8372d47d8761fbcba828907ca62ddfcb08b11a6a185"
+content-hash = "cf13db3bf3b15a2f88dfb865ab7a5a0507c76d1c8c1f0c66b63b17d27893cdf5"
diff --git a/pyproject.toml b/pyproject.toml
index 961207c..91bd8a0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -13,7 +13,6 @@ packages = [
[tool.poetry.dependencies]
python = ">=3.12,<3.13"
Django = "^4.2"
-django-ckeditor = "^6.7"
django-filer = "^3.4"
easy-thumbnails = "^2.10"
django-taggit = "^6.1"