From f9ea04662b34fea06fe43919e25754bb7932349a Mon Sep 17 00:00:00 2001 From: Jaap Joris Vens Date: Thu, 2 Jan 2020 23:37:26 +0100 Subject: [PATCH] Replace CKEditor's RichTextField with MarkdownField Because you should not store raw HTML in database tables! --- cms/admin.py | 29 ----------- cms/migrations/0001_initial.py | 20 ++------ cms/models.py | 30 +++--------- cms/static/cms/cms.scss | 49 ++++++++++++++----- cms/static/cms/cms.scss.css | 38 ++++++++++---- cms/static/cms/cms.scss.css.map | 2 +- cms/templates/cms/edit.html | 7 ++- cms/templates/cms/sections/base.html | 4 +- cms/utils.py | 10 ---- cms/views.py | 5 +- examples/app/migrations/0001_initial.py | 9 ++-- .../templates/cms/sections/imagesection.html | 0 .../templates/cms/sections/textsection.html | 0 examples/project/settings.py | 28 ++--------- setup.py | 5 +- 15 files changed, 97 insertions(+), 139 deletions(-) delete mode 100644 cms/admin.py delete mode 100644 cms/utils.py rename {cms => examples/app}/templates/cms/sections/imagesection.html (100%) rename {cms => examples/app}/templates/cms/sections/textsection.html (100%) diff --git a/cms/admin.py b/cms/admin.py deleted file mode 100644 index 5cb1271..0000000 --- a/cms/admin.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.contrib import admin -from django.utils.text import Truncator -from django.utils.safestring import mark_safe -from django.utils.translation import gettext_lazy as _ -from .models import Config - -class BasePageAdmin(admin.ModelAdmin): - prepopulated_fields = {'slug': ('title',)} - -class BaseSectionAdmin(admin.ModelAdmin): - list_filter = [ - ('page', admin.RelatedOnlyFieldListFilter), - ] - list_display = ['__str__', 'get_type_display'] - -@admin.register(Config) -class ConfigAdmin(admin.ModelAdmin): - list_display = ['__str__', 'get_content'] - exclude = ['parameter'] - - def get_content(self, obj): - return mark_safe(Truncator(obj.content).words(50, html=True)) - get_content.short_description = _('content') - - def has_add_permission(self, request): - return False - - def has_delete_permission(self, *args, **kwargs): - return False diff --git a/cms/migrations/0001_initial.py b/cms/migrations/0001_initial.py index 0854b12..377fae7 100644 --- a/cms/migrations/0001_initial.py +++ b/cms/migrations/0001_initial.py @@ -1,11 +1,11 @@ -# Generated by Django 3.0.1 on 2020-01-02 18:31 +# Generated by Django 3.0.1 on 2020-01-02 20:41 -import ckeditor.fields import cms.models from django.conf import settings from django.db import migrations, models import django.db.models.deletion import embed_video.fields +import markdownfield.models class Migration(migrations.Migration): @@ -34,19 +34,6 @@ class Migration(migrations.Migration): 'swappable': 'CMS_PAGE_MODEL', }, ), - migrations.CreateModel( - name='Config', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('parameter', models.PositiveIntegerField(choices=[(10, 'Footer')], unique=True)), - ('content', ckeditor.fields.RichTextField(blank=True, verbose_name='content')), - ], - options={ - 'verbose_name': 'configuration parameter', - 'verbose_name_plural': 'configuration parameters', - 'ordering': ['parameter'], - }, - ), migrations.CreateModel( name='Section', fields=[ @@ -55,7 +42,8 @@ class Migration(migrations.Migration): ('position', models.PositiveIntegerField(blank=True, verbose_name='position')), ('title', cms.models.VarCharField(blank=True, verbose_name='title')), ('color', models.PositiveIntegerField(choices=[(1, 'Wit')], default=1, verbose_name='color')), - ('content', ckeditor.fields.RichTextField(blank=True, verbose_name='content')), + ('content', markdownfield.models.MarkdownField(blank=True, verbose_name='content')), + ('content_rendered', markdownfield.models.RenderedMarkdownField(editable=False)), ('image', models.ImageField(blank=True, upload_to='', verbose_name='image')), ('video', embed_video.fields.EmbedVideoField(blank=True, help_text='Paste a YouTube, Vimeo, or SoundCloud link', verbose_name='video')), ('button_text', cms.models.VarCharField(blank=True, verbose_name='button text')), diff --git a/cms/models.py b/cms/models.py index 31efe55..78c125f 100644 --- a/cms/models.py +++ b/cms/models.py @@ -7,9 +7,10 @@ from django.urls import reverse from django.conf import settings from django.forms import TextInput, Select from django.utils.translation import gettext_lazy as _ -from ckeditor.fields import RichTextField from embed_video.fields import EmbedVideoField from polymorphic.models import PolymorphicModel +from markdownfield.models import MarkdownField, RenderedMarkdownField +from markdownfield.validators import VALIDATOR_NULL from numberedmodel.models import NumberedModel @@ -27,9 +28,9 @@ class VarCharChoiceField(models.TextField): class BasePage(NumberedModel): '''Abstract base model for pages''' - position = models.PositiveIntegerField(_('position'), blank=True) - title = VarCharField(_('title')) slug = models.SlugField(_('slug'), help_text=_('A short identifier to use in URLs'), blank=True, unique=True) + title = VarCharField(_('title')) + position = models.PositiveIntegerField(_('position'), blank=True) menu = models.BooleanField(_('visible in menu'), default=True) def __str__(self): @@ -52,11 +53,12 @@ class BaseSection(NumberedModel, PolymorphicModel): '''Abstract base model for sections''' TYPES = [] page = models.ForeignKey(swapper.get_model_name('cms', 'Page'), verbose_name=_('page'), related_name='sections', on_delete=models.PROTECT) - type = VarCharChoiceField(_('section type'), default='', choices=TYPES) - position = models.PositiveIntegerField(_('position'), blank=True) + type = VarCharChoiceField(_('type'), default='', choices=TYPES) title = VarCharField(_('title'), blank=True) + position = models.PositiveIntegerField(_('position'), blank=True) color = models.PositiveIntegerField(_('color'), default=1, choices=settings.SECTION_COLORS) - content = RichTextField(_('content'), blank=True) + content = MarkdownField(_('content'), rendered_field='content_rendered', validator=VALIDATOR_NULL, use_admin_editor=False, blank=True) + content_rendered = RenderedMarkdownField() image = models.ImageField(_('image'), blank=True) video = EmbedVideoField(_('video'), blank=True, help_text=_('Paste a YouTube, Vimeo, or SoundCloud link')) button_text = VarCharField(_('button text'), blank=True) @@ -88,19 +90,3 @@ class Section(BaseSection): '''Swappable section model''' class Meta(BaseSection.Meta): swappable = swapper.swappable_setting('cms', 'Section') - -class Config(models.Model): - TYPES = [ - (10, _('Footer')), - ] - - parameter = models.PositiveIntegerField(choices=TYPES, unique=True) - content = RichTextField(_('content'), blank=True) - - def __str__(self): - return "{}. {}".format(self.parameter, self.get_parameter_display()) - - class Meta: - verbose_name = _('configuration parameter') - verbose_name_plural = _('configuration parameters') - ordering = ['parameter'] diff --git a/cms/static/cms/cms.scss b/cms/static/cms/cms.scss index b16b2b5..986f4b1 100644 --- a/cms/static/cms/cms.scss +++ b/cms/static/cms/cms.scss @@ -5,6 +5,7 @@ $blue: #3573a8; html, body { font-family: $font; + line-height: 1.33; margin: 0; padding: 0; } @@ -17,6 +18,16 @@ a { } } +table { + border-collapse: collapse; + th, td { + padding: 1em; + } + th { + border-bottom: 2px solid black; + } +} + a.button, button.button { cursor: pointer; font-family: sans-serif; @@ -248,6 +259,10 @@ section.contactsection { /* Form elements */ form.cms { + div.wrapper { + overflow: hidden; + } + div.global_error { border: 2px dotted red; padding: 10px; @@ -263,7 +278,6 @@ form.cms { border: 0.5px solid black; border-radius: 3px; - legend { font-size: 1.15em; } @@ -272,10 +286,26 @@ form.cms { div.formfield { margin: 5px 0; padding: 10px 0; - font-size: 0; - } - div.formfield > * { - font-size: 1rem; + clear: both; + box-sizing: border-box; + + &#type, &#position, &#title, &#slug { + padding: 0 1em; + clear: none; + float: left; + display: inline-block; + width: 33%; + } + &#type, &#slug { + padding-left: 0; + } + &#title { + padding: 0; + } + &#position { + float: right; + padding-right: 0; + } } div.formfield.error { border: 2px dotted red; @@ -323,13 +353,8 @@ form.cms { margin: 0; padding: 5px; } - - div.django-ckeditor-widget { - display: block !important; - } - div.cke_chrome { - box-sizing: border-box !important; - border: 1px solid #aaa !important; + textarea { + height: 25em; } input[type=checkbox] { diff --git a/cms/static/cms/cms.scss.css b/cms/static/cms/cms.scss.css index 29721b4..a36f42d 100644 --- a/cms/static/cms/cms.scss.css +++ b/cms/static/cms/cms.scss.css @@ -1,5 +1,6 @@ html, body { font-family: sans-serif; + line-height: 1.33; margin: 0; padding: 0; } @@ -9,6 +10,13 @@ a { a:hover { text-decoration: underline; } +table { + border-collapse: collapse; } + table th, table td { + padding: 1em; } + table th { + border-bottom: 2px solid black; } + a.button, button.button { cursor: pointer; font-family: sans-serif; @@ -174,6 +182,9 @@ section.contactsection textarea { font-family: inherit; } /* Form elements */ +form.cms div.wrapper { + overflow: hidden; } + form.cms div.global_error { border: 2px dotted red; padding: 10px; @@ -193,10 +204,21 @@ form.cms fieldset { form.cms div.formfield { margin: 5px 0; padding: 10px 0; - font-size: 0; } - -form.cms div.formfield > * { - font-size: 1rem; } + clear: both; + box-sizing: border-box; } + form.cms div.formfield#type, form.cms div.formfield#position, form.cms div.formfield#title, form.cms div.formfield#slug { + padding: 0 1em; + clear: none; + float: left; + display: inline-block; + width: 33%; } + form.cms div.formfield#type, form.cms div.formfield#slug { + padding-left: 0; } + form.cms div.formfield#title { + padding: 0; } + form.cms div.formfield#position { + float: right; + padding-right: 0; } form.cms div.formfield.error { border: 2px dotted red; @@ -237,12 +259,8 @@ form.cms input, form.cms select, form.cms textarea { margin: 0; padding: 5px; } -form.cms div.django-ckeditor-widget { - display: block !important; } - -form.cms div.cke_chrome { - box-sizing: border-box !important; - border: 1px solid #aaa !important; } +form.cms textarea { + height: 25em; } form.cms input[type=checkbox] { width: auto; } diff --git a/cms/static/cms/cms.scss.css.map b/cms/static/cms/cms.scss.css.map index e4a905b..1017311 100644 --- a/cms/static/cms/cms.scss.css.map +++ b/cms/static/cms/cms.scss.css.map @@ -5,5 +5,5 @@ "cms.scss" ], "names": [], - "mappings": "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" + "mappings": "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" } \ No newline at end of file diff --git a/cms/templates/cms/edit.html b/cms/templates/cms/edit.html index c050dce..caadfac 100644 --- a/cms/templates/cms/edit.html +++ b/cms/templates/cms/edit.html @@ -22,7 +22,7 @@ - {% block formset %} + {% if formset %} {{formset.management_form}} {% for form in formset %} {{form.media}} @@ -48,7 +48,7 @@ - {% endblock %} + {% endif %}
@@ -74,6 +74,9 @@ slugfield.value = URLify(titlefield.value); } }); + slugfield.addEventListener('input', function(event) { + virgin = false; + }); } } diff --git a/cms/templates/cms/sections/base.html b/cms/templates/cms/sections/base.html index 7ebce6c..3269e4a 100644 --- a/cms/templates/cms/sections/base.html +++ b/cms/templates/cms/sections/base.html @@ -17,9 +17,9 @@
{% endif %} - {% if section.content %} + {% if section.content_rendered %}
- {{section.content|safe}} + {{section.content_rendered|safe}}
{% endif %} diff --git a/cms/utils.py b/cms/utils.py deleted file mode 100644 index 2aa6325..0000000 --- a/cms/utils.py +++ /dev/null @@ -1,10 +0,0 @@ -from .models import Config - -def get_config(parameter): - '''Gets or creates the requested parameter. - - ''' - if parameter not in [t[0] for t in Config.TYPES]: - raise ValueError('Invalid configuration parameter requested') - (c, created) = Config.objects.get_or_create(parameter=parameter) - return c.content diff --git a/cms/views.py b/cms/views.py index 6772a3a..6107dd9 100644 --- a/cms/views.py +++ b/cms/views.py @@ -12,7 +12,6 @@ from django.http import HttpResponseRedirect, HttpResponseBadRequest from .decorators import register_view from .forms import PageForm, SectionForm -from .utils import get_config Page = swapper.load_model('cms', 'Page') Section = swapper.load_model('cms', 'Section') @@ -59,14 +58,12 @@ class SectionWithFormView(SectionView): return section class MenuMixin: - '''Add pages and footer to template context''' + '''Add pages to template context''' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) pages = Page.objects.filter(menu=True) - footer = get_config(10) context.update({ 'pages': pages, - 'footer': footer, }) return context diff --git a/examples/app/migrations/0001_initial.py b/examples/app/migrations/0001_initial.py index a421f03..fed6eee 100644 --- a/examples/app/migrations/0001_initial.py +++ b/examples/app/migrations/0001_initial.py @@ -1,11 +1,11 @@ -# Generated by Django 3.0.1 on 2020-01-02 18:31 +# Generated by Django 3.0.1 on 2020-01-02 20:42 -import ckeditor.fields import cms.models from django.conf import settings from django.db import migrations, models import django.db.models.deletion import embed_video.fields +import markdownfield.models class Migration(migrations.Migration): @@ -13,8 +13,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), migrations.swappable_dependency(settings.CMS_PAGE_MODEL), + ('contenttypes', '0002_remove_content_type_name'), ] operations = [ @@ -42,7 +42,8 @@ class Migration(migrations.Migration): ('position', models.PositiveIntegerField(blank=True, verbose_name='position')), ('title', cms.models.VarCharField(blank=True, verbose_name='title')), ('color', models.PositiveIntegerField(choices=[(1, 'Wit')], default=1, verbose_name='color')), - ('content', ckeditor.fields.RichTextField(blank=True, verbose_name='content')), + ('content', markdownfield.models.MarkdownField(blank=True, verbose_name='content')), + ('content_rendered', markdownfield.models.RenderedMarkdownField(editable=False)), ('image', models.ImageField(blank=True, upload_to='', verbose_name='image')), ('video', embed_video.fields.EmbedVideoField(blank=True, help_text='Paste a YouTube, Vimeo, or SoundCloud link', verbose_name='video')), ('button_text', cms.models.VarCharField(blank=True, verbose_name='button text')), diff --git a/cms/templates/cms/sections/imagesection.html b/examples/app/templates/cms/sections/imagesection.html similarity index 100% rename from cms/templates/cms/sections/imagesection.html rename to examples/app/templates/cms/sections/imagesection.html diff --git a/cms/templates/cms/sections/textsection.html b/examples/app/templates/cms/sections/textsection.html similarity index 100% rename from cms/templates/cms/sections/textsection.html rename to examples/app/templates/cms/sections/textsection.html diff --git a/examples/project/settings.py b/examples/project/settings.py index fe262b5..4bd415a 100644 --- a/examples/project/settings.py +++ b/examples/project/settings.py @@ -7,6 +7,7 @@ except ImportError: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' PROJECT_NAME = 'example' +SITE_URL = 'https://example.com/' KEYFILE = f'/tmp/{PROJECT_NAME}.secret' ADMINS = [('JJ Vens', 'jj@rtts.eu')] ALLOWED_HOSTS = ['*'] @@ -23,6 +24,8 @@ MEDIA_URL = '/media/' MEDIA_ROOT = '/srv/' + PROJECT_NAME + '/media' LOGIN_REDIRECT_URL = '/' CMS_SECTION_MODEL = 'app.Section' +MARKDOWN_EXTENSIONS = ['extra', 'smarty'] +MARKDOWN_EXTENSION_CONFIGS = {'extra': {}, 'smarty': {}} def read(file): with open(file) as f: @@ -36,34 +39,10 @@ except IOError: SECRET_KEY = ''.join(random.choice(string.printable) for x in range(50)) write(KEYFILE, SECRET_KEY) -SECTION_TYPES = [ - ('TextSection', 'Tekst'), - ('ImageSection', 'Afbeelding'), -] - SECTION_COLORS = [ (1, 'Wit'), ] -CKEDITOR_CONFIGS = { - 'default': { - 'removePlugins': 'elementspath', - 'extraPlugins': 'format', - 'width': '100%', - 'toolbar': 'Custom', - # 'contentsCss': STATIC_URL + 'ckeditor.css', - # 'allowedContent': True, # this allows iframes, embeds, scripts, etc... - 'toolbar_Custom': [ - ['Format'], - ['Bold', 'Italic', 'Underline', 'TextColor'], - ['NumberedList', 'BulletedList', 'Blockquote'], - ['JustifyLeft', 'JustifyCenter', 'JustifyRight'], - ['Link', 'Unlink'], - ['RemoveFormat', 'Source'], - ], - } -} - INSTALLED_APPS = [ 'app', 'django.contrib.admin', @@ -74,7 +53,6 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'cms', 'simplesass', - 'ckeditor', 'polymorphic', 'embed_video', 'easy_thumbnails', diff --git a/setup.py b/setup.py index 073ff90..1d89a22 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup( name = 'django-simplecms', - version = '2.1.0', + version = '2.2.0', url = 'https://github.com/rtts/django-simplecms', author = 'Jaap Joris Vens', author_email = 'jj@rtts.eu', @@ -13,12 +13,13 @@ setup( include_package_data = True, install_requires = [ 'django', - 'django-ckeditor', 'django-extensions', 'django-embed-video', 'django-polymorphic', + 'django-markdownfield', 'easy-thumbnails', 'psycopg2', + 'markdown', 'libsass', 'swapper', ],