From 4ec85b85cbb73dc832e14e1f661f98856b399f27 Mon Sep 17 00:00:00 2001 From: SDE Date: Fri, 22 Sep 2023 14:58:06 +0300 Subject: [PATCH] 0.7.42 images in ckeditor --- ...alter_articlemodel_description_and_more.py | 104 +++++++++++++ ArticlesApp/models.py | 11 +- BaseModels/base_models.py | 9 +- ...ion_alter_block_description_en_and_more.py | 109 +++++++++++++ GeneralApp/models.py | 5 +- TWB/settings.py | 145 ++++++++++-------- 6 files changed, 304 insertions(+), 79 deletions(-) create mode 100644 ArticlesApp/migrations/0002_alter_articlemodel_description_and_more.py create mode 100644 GeneralApp/migrations/0004_alter_block_description_alter_block_description_en_and_more.py diff --git a/ArticlesApp/migrations/0002_alter_articlemodel_description_and_more.py b/ArticlesApp/migrations/0002_alter_articlemodel_description_and_more.py new file mode 100644 index 0000000..dacb3ee --- /dev/null +++ b/ArticlesApp/migrations/0002_alter_articlemodel_description_and_more.py @@ -0,0 +1,104 @@ +# Generated by Django 4.2.2 on 2023-09-22 13:29 + +import ckeditor_uploader.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ArticlesApp', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='articlemodel', + name='description', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='articlemodel', + name='description_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='articlemodel', + name='description_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='articlemodel', + name='seo_text', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='articlemodel', + name='seo_text_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='articlemodel', + name='seo_text_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='articlemodel', + name='text', + field=ckeditor_uploader.fields.RichTextUploadingField(verbose_name='Текст'), + ), + migrations.AlterField( + model_name='articlemodel', + name='text_en', + field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='Текст'), + ), + migrations.AlterField( + model_name='articlemodel', + name='text_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='Текст'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='description', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='description_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='description_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='seo_text', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='seo_text_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='seo_text_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='text', + field=ckeditor_uploader.fields.RichTextUploadingField(verbose_name='Текст'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='text_en', + field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='Текст'), + ), + migrations.AlterField( + model_name='userpagemodel', + name='text_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='Текст'), + ), + ] diff --git a/ArticlesApp/models.py b/ArticlesApp/models.py index 43d21a8..af96af7 100644 --- a/ArticlesApp/models.py +++ b/ArticlesApp/models.py @@ -5,7 +5,8 @@ __author__ = 'sync' from django.db import models from BaseModels.base_models import BaseModelViewPage, BaseModel -from ckeditor.fields import RichTextField +# from ckeditor.fields import RichTextField +from ckeditor_uploader.fields import RichTextUploadingField from django.utils.translation import gettext_lazy as _ @@ -18,7 +19,7 @@ from django.utils.translation import gettext_lazy as _ class UserPageModel(BaseModelViewPage): # pub_DT = models.DateTimeField(verbose_name=u'Дата и время публикации', auto_created=True) - text = RichTextField(verbose_name=u'Текст') + text = RichTextUploadingField(verbose_name=u'Текст') class Meta: verbose_name=u'Пользовательская страница' @@ -30,8 +31,8 @@ class UserPageModel(BaseModelViewPage): class ArticleModel(BaseModelViewPage): # pub_DT = models.DateTimeField(verbose_name=u'Дата и время публикации', auto_created=True) - text = RichTextField(verbose_name=u'Текст') + text = RichTextUploadingField(verbose_name=u'Текст') class Meta: - verbose_name=u'Статья' - verbose_name_plural =u'Статьи' \ No newline at end of file + verbose_name='Статья' + verbose_name_plural ='Статьи' \ No newline at end of file diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py index 3da4d34..f38b177 100644 --- a/BaseModels/base_models.py +++ b/BaseModels/base_models.py @@ -10,7 +10,8 @@ from django.utils.translation import gettext_lazy as _ from django.db.models.signals import post_save, pre_save from django.utils.text import slugify from django.contrib.postgres.fields import JSONField -from ckeditor.fields import RichTextField +# from ckeditor.fields import RichTextField +from ckeditor_uploader.fields import RichTextUploadingField from django.contrib.contenttypes.fields import GenericRelation @@ -86,9 +87,9 @@ class BaseModelViewPage(BaseModel): help_text=_( 'можно изменить адрес страницы (!!! ВНИМАНИЕ !!! поисковые системы потеряют страницу и найдут лишь спустя неделю...месяц)')) title = models.TextField(verbose_name=_('Заголовок'), null=True, blank=True) - description = RichTextField(verbose_name=_('Краткое описание'), null=True, blank=True, # max_length=240, + description = RichTextUploadingField(verbose_name=_('Краткое описание'), null=True, blank=True, # max_length=240, help_text=_('краткое описание страницы (до 240 символов)')) - text = RichTextField(verbose_name=_('Полное описание'), null=True, blank=True, ) + text = RichTextUploadingField(verbose_name=_('Полное описание'), null=True, blank=True, ) # help_text=_(u'краткое описание страницы (до 240 символов)')) picture = models.ImageField(upload_to='uploads/', verbose_name=_('Картинка'), null=True, blank=True, help_text=u'') @@ -102,7 +103,7 @@ class BaseModelViewPage(BaseModel): seo_description = models.CharField(max_length=250, verbose_name=_('Description (150 знаков)'), null=True, blank=True) seo_keywords = models.CharField(max_length=250, verbose_name=_('Keywords (200 знаков)'), null=True, blank=True) - seo_text = RichTextField(verbose_name=_(u'Текст SEO статьи'), null=True, blank=True) + seo_text = RichTextUploadingField(verbose_name=_(u'Текст SEO статьи'), null=True, blank=True) FAQ_title = models.CharField(max_length=250, verbose_name=_(u'FAQ Заголовок'), null=True, blank=True) FAQ_items = GenericRelation('GeneralApp.FAQitem', related_query_name='grel_%(class)s_for_faq_item') diff --git a/GeneralApp/migrations/0004_alter_block_description_alter_block_description_en_and_more.py b/GeneralApp/migrations/0004_alter_block_description_alter_block_description_en_and_more.py new file mode 100644 index 0000000..79d24c7 --- /dev/null +++ b/GeneralApp/migrations/0004_alter_block_description_alter_block_description_en_and_more.py @@ -0,0 +1,109 @@ +# Generated by Django 4.2.2 on 2023-09-22 13:29 + +import ckeditor_uploader.fields +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('GeneralApp', '0003_staticpage_seo_description_en_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='block', + name='description', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='block', + name='description_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='block', + name='description_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='block', + name='seo_text', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='block', + name='text', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'), + ), + migrations.AlterField( + model_name='block', + name='text_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'), + ), + migrations.AlterField( + model_name='block', + name='text_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'), + ), + migrations.AlterField( + model_name='faqitem', + name='answer', + field=ckeditor_uploader.fields.RichTextUploadingField(verbose_name='Ответ'), + ), + migrations.AlterField( + model_name='faqitem', + name='answer_en', + field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='Ответ'), + ), + migrations.AlterField( + model_name='faqitem', + name='answer_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(null=True, verbose_name='Ответ'), + ), + migrations.AlterField( + model_name='staticpage', + name='description', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='staticpage', + name='description_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='staticpage', + name='description_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, help_text='краткое описание страницы (до 240 символов)', null=True, verbose_name='Краткое описание'), + ), + migrations.AlterField( + model_name='staticpage', + name='seo_text', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='staticpage', + name='seo_text_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='staticpage', + name='seo_text_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Текст SEO статьи'), + ), + migrations.AlterField( + model_name='staticpage', + name='text', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'), + ), + migrations.AlterField( + model_name='staticpage', + name='text_en', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'), + ), + migrations.AlterField( + model_name='staticpage', + name='text_ru', + field=ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание'), + ), + ] diff --git a/GeneralApp/models.py b/GeneralApp/models.py index 085058a..5f04a1a 100644 --- a/GeneralApp/models.py +++ b/GeneralApp/models.py @@ -1,7 +1,8 @@ from django.db import models from BaseModels.base_models import BaseModelViewPage, BaseModel from django.utils.translation import gettext_lazy as _ -from ckeditor.fields import RichTextField +# from ckeditor.fields import RichTextField +from ckeditor_uploader.fields import RichTextUploadingField class StaticPage(BaseModelViewPage): promo_header = models.BooleanField(verbose_name='Промо-хэдер', default=False) @@ -36,7 +37,7 @@ class FAQitem(BaseModel): content_object = GenericForeignKey('content_type', 'object_id') question = models.TextField(verbose_name='Вопрос') - answer = RichTextField(verbose_name='Ответ') + answer = RichTextUploadingField(verbose_name='Ответ') def __str__(self): if self.question: diff --git a/TWB/settings.py b/TWB/settings.py index 6766476..c44982c 100644 --- a/TWB/settings.py +++ b/TWB/settings.py @@ -226,6 +226,15 @@ CKEDITOR_CONFIGS = { # 'filebrowserWindowWidth': "100%", 'toolbar': 'Custom', 'forcePasteAsPlainText': True, + # 'allowedContent': True, + 'disallowedContent': 'img{width,height};img[width,height]', + # 'extraPlugins': 'image2', + + 'enterMode': 2, + 'basicEntities' : False, + 'entities_additional': '', + 'entities' : False, + 'htmlEncodeOutput' : False, # 'toolbar_Custom': [ # ['Bold', 'Italic', 'Underline'], # ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'], @@ -254,74 +263,74 @@ CKEDITOR_CONFIGS = { } -CKEDITOR_OPTIONS = { - 'height': 291, - 'width': '95%', - 'filebrowserWindowHeight': 600, - 'filebrowserWindowWidth': "100%", - 'toolbar': 'YourCustomToolbarConfig', - - 'allowedContent': True, - - 'enterMode': 2, - 'basicEntities' : False, - 'entities_additional': '', - 'entities' : False, - 'htmlEncodeOutput' : False, - 'toolbar_Basic': [ - ['Source', '-', 'Bold', 'Italic'] - ], - 'toolbar_YourCustomToolbarConfig': [ - {'name': 'document', 'items': ['Source', '-', 'Save', 'NewPage', 'Preview', 'Print', '-', 'Templates']}, - {'name': 'clipboard', 'items': ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']}, - {'name': 'editing', 'items': ['Find', 'Replace', '-', 'SelectAll']}, - {'name': 'forms', - 'items': ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', - 'HiddenField']}, - '/', - {'name': 'basicstyles', - 'items': ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']}, - {'name': 'paragraph', - 'items': ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', - 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl', - 'Language']}, - {'name': 'links', 'items': ['Link', 'Unlink', 'Anchor']}, - {'name': 'insert', - 'items': ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']}, - '/', - {'name': 'styles', 'items': ['FontSize']}, - {'name': 'colors', 'items': ['TextColor', 'BGColor']}, - {'name': 'tools', 'items': ['Maximize', 'ShowBlocks']}, - # {'name': 'about', 'items': ['About']}, - '/', # put this to force next toolbar on new line - # {'name': 'yourcustomtools', 'items': [ - # # put the name of your editor.ui.addButton here - # 'Preview', - # 'Maximize', - # - # ]}, - ], - - 'tabSpaces': 4, - 'removePlugins': 'stylesheetparser', - # 'extraPlugins': ','.join([ - # 'uploadimage', # the upload image feature - # # your extra plugins here - # 'div', - # 'autolink', - # 'autoembed', - # 'embedsemantic', - # 'autogrow', - # # 'devtools', - # 'widget', - # 'lineutils', - # 'clipboard', - # 'dialog', - # 'dialogui', - # 'elementspath' - # ]), - -} +# CKEDITOR_OPTIONS = { +# 'height': 291, +# 'width': '95%', +# 'filebrowserWindowHeight': 600, +# 'filebrowserWindowWidth': "100%", +# 'toolbar': 'YourCustomToolbarConfig', +# +# 'allowedContent': True, +# +# 'enterMode': 2, +# 'basicEntities' : False, +# 'entities_additional': '', +# 'entities' : False, +# 'htmlEncodeOutput' : False, +# 'toolbar_Basic': [ +# ['Source', '-', 'Bold', 'Italic'] +# ], +# 'toolbar_YourCustomToolbarConfig': [ +# {'name': 'document', 'items': ['Source', '-', 'Save', 'NewPage', 'Preview', 'Print', '-', 'Templates']}, +# {'name': 'clipboard', 'items': ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']}, +# {'name': 'editing', 'items': ['Find', 'Replace', '-', 'SelectAll']}, +# {'name': 'forms', +# 'items': ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', +# 'HiddenField']}, +# '/', +# {'name': 'basicstyles', +# 'items': ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']}, +# {'name': 'paragraph', +# 'items': ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', +# 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl', +# 'Language']}, +# {'name': 'links', 'items': ['Link', 'Unlink', 'Anchor']}, +# {'name': 'insert', +# 'items': ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']}, +# '/', +# {'name': 'styles', 'items': ['FontSize']}, +# {'name': 'colors', 'items': ['TextColor', 'BGColor']}, +# {'name': 'tools', 'items': ['Maximize', 'ShowBlocks']}, +# # {'name': 'about', 'items': ['About']}, +# '/', # put this to force next toolbar on new line +# # {'name': 'yourcustomtools', 'items': [ +# # # put the name of your editor.ui.addButton here +# # 'Preview', +# # 'Maximize', +# # +# # ]}, +# ], +# +# 'tabSpaces': 4, +# 'removePlugins': 'stylesheetparser', +# # 'extraPlugins': ','.join([ +# # 'uploadimage', # the upload image feature +# # # your extra plugins here +# # 'div', +# # 'autolink', +# # 'autoembed', +# # 'embedsemantic', +# # 'autogrow', +# # # 'devtools', +# # 'widget', +# # 'lineutils', +# # 'clipboard', +# # 'dialog', +# # 'dialogui', +# # 'elementspath' +# # ]), +# +# } try: