mod: squash web migrations

This commit is contained in:
2026-04-09 14:35:23 +03:00
parent 8986592e55
commit 35a681cce5
8 changed files with 15 additions and 99 deletions

View File

@@ -3,8 +3,8 @@
Сайт с новостями (блог о 3D-печать и Систем Автоматизированного Проектирования) на Django со Сайт с новостями (блог о 3D-печать и Систем Автоматизированного Проектирования) на Django со
встроенными свистелками-перделками: встроенными свистелками-перделками:
* медиа-библиотека (filer); * медиа-библиотека (filer);
* WYSIWYG-редактор (ckeditor) в админке; * HTML-редактор на обычной textarea в админке;
* типограф (по API или встроенный «типограф Муравьева», с костылями под ckeditor); * типограф (по API или встроенный «типограф Муравьева»);
* теги новостей (taggit). * теги новостей (taggit).
[Инструкция по развертыванию на хостинге DreamHost.com](deploy_to_dreamhost.md) [Инструкция по развертыванию на хостинге DreamHost.com](deploy_to_dreamhost.md)

View File

@@ -60,8 +60,6 @@ INSTALLED_APPS = [
'easy_thumbnails', 'easy_thumbnails',
'filer.apps.FilerConfig', 'filer.apps.FilerConfig',
'mptt.apps.MpttConfig', 'mptt.apps.MpttConfig',
# # 'ckeditor_uploader',
'ckeditor',
'taggit.apps.TaggitAppConfig', 'taggit.apps.TaggitAppConfig',
# 'fontawesome-free' # 'fontawesome-free'
'web.apps.WebConfig', 'web.apps.WebConfig',
@@ -143,50 +141,6 @@ THUMBNAIL_TRANSPARENCY_EXTENSION = 'png'
THUMBNAIL_WIDGET_OPTIONS = {'size': (64, 64)} 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_SUBJECT_LOCATION_IMAGE_DEBUG = True
FILER_CANONICAL_URL = 'sharing/' FILER_CANONICAL_URL = 'sharing/'

View File

@@ -17,7 +17,7 @@ class AdminContent(admin.ModelAdmin):
# настройка длины поля TextInput в админке # настройка длины поля TextInput в админке
formfield_overrides = { formfield_overrides = {
models.CharField: {'widget': TextInput(attrs={'size': '100%'})}, 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 = [ fieldsets = [

View File

@@ -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 from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone import django.utils.timezone
import filer.fields.file import filer.fields.file
import taggit.managers import taggit.managers
@@ -9,13 +9,13 @@ import taggit.managers
class Migration(migrations.Migration): class Migration(migrations.Migration):
replaces = [('web', '0001_initial'), ('web', '0002_alter_tbcontent_szcontentbody_and_more')]
initial = True initial = True
dependencies = [ 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'), ('filer', '0013_image_width_height_to_float'),
('taggit', '0003_taggeditem_add_unique_index'),
] ]
operations = [ operations = [
@@ -49,8 +49,8 @@ class Migration(migrations.Migration):
('tdContentPublishUp', models.DateTimeField(db_index=True, default=django.utils.timezone.now, help_text='Дата публикации, с её момента новость появится на сайте.', verbose_name='Начало публикации')), ('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='Окончания публикации')), ('tdContentPublishDown', models.DateTimeField(blank=True, db_index=True, help_text='Дата окончания публикации, с её момента новость исчезнет с сайта.', null=True, verbose_name='Окончания публикации')),
('szContentHead', models.CharField(default='', help_text='Заголовок контента <small>(допустим HTML-код, будет обработан типографом, если его включить, максимальная длинна <b>512 символов</b>)</small>', max_length=512, verbose_name='Заголовок')), ('szContentHead', models.CharField(default='', help_text='Заголовок контента <small>(допустим HTML-код, будет обработан типографом, если его включить, максимальная длинна <b>512 символов</b>)</small>', max_length=512, verbose_name='Заголовок')),
('szContentIntro', ckeditor.fields.RichTextField(default='', help_text='Анонс <small>(допустим HTML-код, будет обработан типографом, если его включить)</small>', verbose_name='Анонс')), ('szContentIntro', models.TextField(default='', help_text='Анонс <small>(допустим HTML-код, будет обработан типографом, если его включить)</small>', verbose_name='Анонс')),
('szContentBody', ckeditor.fields.RichTextField(default='', help_text='Содержание <b>БЕЗ АНОНСА</b> <small>(допустим HTML-код, будет обработан типографом, если его включить)</small>', verbose_name='Содержание')), ('szContentBody', models.TextField(default='', help_text='Содержание <b>БЕЗ АНОНСА</b> <small>(допустим HTML-код, будет обработан типографом, если его включить)</small>', verbose_name='Содержание')),
('szContentSlug', models.CharField(blank=True, default='', help_text='Слуг… 128 символов.<br /><small><b>Если оставить пустым, то slug сформируется автоматически</b></small>', max_length=128, null=True, verbose_name='Slug')), ('szContentSlug', models.CharField(blank=True, default='', help_text='Слуг… 128 символов.<br /><small><b>Если оставить пустым, то slug сформируется автоматически</b></small>', max_length=128, null=True, verbose_name='Slug')),
('iContentHits', models.PositiveIntegerField(db_index=True, default=0, help_text='Число просмотров', verbose_name='')), ('iContentHits', models.PositiveIntegerField(db_index=True, default=0, help_text='Число просмотров', verbose_name='')),
('bTypograf', models.BooleanField(default=False, help_text='Обработать через <a href="https://www.typograf.ru" target="_blank">Типограф 2.0</a><br /><small><b>НОРМАЛЬНЫЙ ТИПОГРАФ, ХОРОШИЙ HTML, РЕКОМЕНДУЕМ</b> &laquo;приклеивает&raquo; союзы, поддерживает неразрывные конструкции, замена тире, кавычек и дефисов, расстановка &laquo;мягких переносов&raquo; в словах длиннее 12 символов, убирает &laquo;вдовы&raquo; &laquo;сироты&raquo; (кроме заголовков), расставляет абзацы (кроме заголовков), расшифровывает аббревиатуры (те, что знает и кроме заголовков), висячая пунктуация (только в заголовках) и т.п.</small>', verbose_name='Типограф Стандарт')), ('bTypograf', models.BooleanField(default=False, help_text='Обработать через <a href="https://www.typograf.ru" target="_blank">Типограф 2.0</a><br /><small><b>НОРМАЛЬНЫЙ ТИПОГРАФ, ХОРОШИЙ HTML, РЕКОМЕНДУЕМ</b> &laquo;приклеивает&raquo; союзы, поддерживает неразрывные конструкции, замена тире, кавычек и дефисов, расстановка &laquo;мягких переносов&raquo; в словах длиннее 12 символов, убирает &laquo;вдовы&raquo; &laquo;сироты&raquo; (кроме заголовков), расставляет абзацы (кроме заголовков), расшифровывает аббревиатуры (те, что знает и кроме заголовков), висячая пунктуация (только в заголовках) и т.п.</small>', verbose_name='Типограф Стандарт')),

View File

@@ -3,12 +3,10 @@
from django.db import models from django.db import models
from django.utils.timezone import now from django.utils.timezone import now
from filer.fields.image import FilerFileField from filer.fields.image import FilerFileField
from ckeditor.fields import RichTextField
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
from taggit.models import Tag, TaggedItem from taggit.models import Tag, TaggedItem
from web.add_function import safe_html_special_symbols, post_processing_html from web.add_function import safe_html_special_symbols, post_processing_html
import urllib3 import urllib3
import re
import pytils import pytils
import random import random
import datetime import datetime
@@ -90,15 +88,13 @@ class TbContent(models.Model):
verbose_name="Превью", verbose_name="Превью",
help_text="Картинка-превью" help_text="Картинка-превью"
) )
szContentIntro = RichTextField( szContentIntro = models.TextField(
config_name='fine',
default="", default="",
verbose_name="Анонс", verbose_name="Анонс",
help_text="Анонс <small>(допустим HTML-код, будет обработан типографом," help_text="Анонс <small>(допустим HTML-код, будет обработан типографом,"
" если его включить)</small>" " если его включить)</small>"
) )
szContentBody = RichTextField( szContentBody = models.TextField(
config_name='fine',
default="", default="",
verbose_name="Содержание", verbose_name="Содержание",
help_text="Содержание <b>БЕЗ АНОНСА</b> <small>(допустим HTML-код, будет обработан типографом," help_text="Содержание <b>БЕЗ АНОНСА</b> <small>(допустим HTML-код, будет обработан типографом,"

View File

@@ -836,11 +836,10 @@ pip -V
| django | 3.2.15 | Фреймворк Django | притащит с собой пакеты: __asgiref__, __pytz__ и __sqlparse__ | django | 3.2.15 | Фреймворк Django | притащит с собой пакеты: __asgiref__, __pytz__ и __sqlparse__
| mysqlclient | 2.1.1 | Коннектор MySQL | нет | mysqlclient | 2.1.1 | Коннектор MySQL | нет
| django-filer | 2.2.2 | Система управления медиа-файлами с фишками подготовки ресайз-картинок, превьюшек и прочими плюшками | притащит с собой пакеты: __Unidecode__, __django-js-asset__, __django-mptt__, __django-polymorphic__, __easy-thumbnails__ и __pillow__ | 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 | Ситема управления тегами | нет | django-taggit | 3.0.0 | Ситема управления тегами | нет
| pytils | 0.4.4 | Пакет рускоязычной транслитерации, работы с числительными, склонениями числительных и временными диаппазонами (для Python 3.x) | нет | pytils | 0.4.4 | Пакет рускоязычной транслитерации, работы с числительными, склонениями числительных и временными диаппазонами (для Python 3.x) | нет
| urllib3 | 1.26.11 | пакет для работы с web-запросами (проекту этот пакет нужен для работы с API внешний HTML-типографов) | нет | urllib3 | 1.26.11 | пакет для работы с web-запросами (проекту этот пакет нужен для работы с API внешний HTML-типографов) | нет
| django-ckeditor-filebrowser-filer | 0.3.0 | Плугин для дружбы Wysiwyg-редквтора (ckeditor) и django-filer | нет, все зависимости уже притащил django-filer
Все эти пакеты устанавливаются в виртуальное окружение с помощью пакетного Все эти пакеты устанавливаются в виртуальное окружение с помощью пакетного
менеджера `pip` в последовательности: менеджера `pip` в последовательности:
@@ -849,9 +848,7 @@ pip -V
pip install Django==3.2.15 pip install Django==3.2.15
pip install mysqlclient==2.1.1 pip install mysqlclient==2.1.1
pip install django-filer==2.2.2 pip install django-filer==2.2.2
pip install django-ckeditor==6.4.2
pip install django-taggit==3.0.0 pip install django-taggit==3.0.0
pip install django-ckeditor-filebrowser-filer
pip install pytils==0.4.4 pip install pytils==0.4.4
pip install urllib3==1.26.11 pip install urllib3==1.26.11
``` ```
@@ -922,22 +919,7 @@ from django.conf.urls import include
from django.urls import re_path as url from django.urls import re_path as url
``` ```
Подобные изменения следует сделать так же в файле __urls.py__ батарейки __ckeditor_filebrowser_filer__ Редактор в админке теперь обычный, поэтому отдельные правки для стороннего WYSIWYG-пакета больше не нужны.
`/home/<ssh_user>/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
```
Теперь можно произвести перенос статических файлов админки и батареек в папку для web-статики: Теперь можно произвести перенос статических файлов админки и батареек в папку для web-статики:
```shell ```shell

17
poetry.lock generated
View File

@@ -191,21 +191,6 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""}
argon2 = ["argon2-cffi (>=19.1.0)"] argon2 = ["argon2-cffi (>=19.1.0)"]
bcrypt = ["bcrypt"] 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]] [[package]]
name = "django-debug-toolbar" name = "django-debug-toolbar"
version = "6.3.0" version = "6.3.0"
@@ -758,4 +743,4 @@ files = [
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = ">=3.12,<3.13" python-versions = ">=3.12,<3.13"
content-hash = "66d107c777ecea4c961db8372d47d8761fbcba828907ca62ddfcb08b11a6a185" content-hash = "cf13db3bf3b15a2f88dfb865ab7a5a0507c76d1c8c1f0c66b63b17d27893cdf5"

View File

@@ -13,7 +13,6 @@ packages = [
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.12,<3.13" python = ">=3.12,<3.13"
Django = "^4.2" Django = "^4.2"
django-ckeditor = "^6.7"
django-filer = "^3.4" django-filer = "^3.4"
easy-thumbnails = "^2.10" easy-thumbnails = "^2.10"
django-taggit = "^6.1" django-taggit = "^6.1"