mod: squash web migrations
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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/'
|
||||||
|
|||||||
@@ -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 = [
|
||||||
|
|||||||
@@ -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> «приклеивает» союзы, поддерживает неразрывные конструкции, замена тире, кавычек и дефисов, расстановка «мягких переносов» в словах длиннее 12 символов, убирает «вдовы» «сироты» (кроме заголовков), расставляет абзацы (кроме заголовков), расшифровывает аббревиатуры (те, что знает и кроме заголовков), висячая пунктуация (только в заголовках) и т.п.</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> «приклеивает» союзы, поддерживает неразрывные конструкции, замена тире, кавычек и дефисов, расстановка «мягких переносов» в словах длиннее 12 символов, убирает «вдовы» «сироты» (кроме заголовков), расставляет абзацы (кроме заголовков), расшифровывает аббревиатуры (те, что знает и кроме заголовков), висячая пунктуация (только в заголовках) и т.п.</small>', verbose_name='Типограф Стандарт')),
|
||||||
@@ -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-код, будет обработан типографом,"
|
||||||
|
|||||||
@@ -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
17
poetry.lock
generated
@@ -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"
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user