Skip to content

Commit

Permalink
Fix: Separate global HTMLField settings and specific field settings
Browse files Browse the repository at this point in the history
  • Loading branch information
fsbraun committed Sep 24, 2024
1 parent 821df76 commit c4054db
Show file tree
Hide file tree
Showing 15 changed files with 199 additions and 132 deletions.
32 changes: 25 additions & 7 deletions djangocms_text/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,18 @@ def ready(self):

from django.contrib.admin import site

registered_inline_fields = ["HTMLField", "CharField"]
registered_inline_fields = ["HTMLFormField", "CharField"]
inline_models = {}
blacklist_apps = ["auth", "admin", "sessions", "contenttypes", "sites", "cms", "djangocms_text", "djangocms_alias"]
blacklist_apps = [
"auth",
"admin",
"sessions",
"contenttypes",
"sites",
"cms",
"djangocms_text",
"djangocms_alias",
]
for model, modeladmin in site._registry.items():
if model._meta.app_label in blacklist_apps:
continue
Expand All @@ -24,19 +33,26 @@ def ready(self):
form = getattr(modeladmin, "form", None)
if form:
for field_name, field_instance in form.base_fields.items():
if field_instance.__class__.__name__ in registered_inline_fields:
if (
field_instance.__class__.__name__ in registered_inline_fields
and field_name in getattr(modeladmin, "frontend_editable_fields", [])
):
inline_models[
f"{model._meta.app_label}-{model._meta.model_name}-{field_name}"
] = field_instance.__class__.__name__

from cms.plugin_pool import plugin_pool

for plugin in plugin_pool.plugins.values():
model = plugin.model
if model._meta.app_label in blacklist_apps:
continue
form = plugin.form
for field_name, field_instance in form.base_fields.items():
if field_instance.__class__.__name__ in registered_inline_fields:
if (
field_instance.__class__.__name__ in registered_inline_fields
and field_name in getattr(plugin, "frontend_editable_fields", [])
):
inline_models[
f"{model._meta.app_label}-{model._meta.model_name}-{field_name}"
] = field_instance.__class__.__name__
Expand All @@ -47,8 +63,10 @@ def ready(self):
def check_ckeditor_settings(app_configs, **kwargs):
from django.conf import settings

change_msg = ("Please use the TEXT_ADDITIONAL_ATTRIBUTES setting with a dictionary instead. "
"Have an entry for each tag and specify allowed attributes for the tag as a set.")
change_msg = (
"Please use the TEXT_ADDITIONAL_ATTRIBUTES setting with a dictionary instead. "
"Have an entry for each tag and specify allowed attributes for the tag as a set."
)
warnings = []
if getattr(settings, "TEXT_ADDITIONAL_TAGS", None):
warnings.append(
Expand All @@ -65,7 +83,7 @@ def check_ckeditor_settings(app_configs, **kwargs):
warnings.append(
Warning(
f"The TEXT_ADDITIONAL_ATTRIBUTES setting has changed.\n{change_msg}",
f"TEXT_ADDITIONAL_ATTRIBUTES = {{\"*\": {set(settings.TEXT_ADDITIONAL_ATTRIBUTES)}}}",
f'TEXT_ADDITIONAL_ATTRIBUTES = {{"*": {set(settings.TEXT_ADDITIONAL_ATTRIBUTES)}}}',
id="text.W002",
obj="settings.TEXT_ADDITIONAL_ATTRIBUTES",
)
Expand Down
29 changes: 17 additions & 12 deletions djangocms_text/cms_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.apps import apps
from django.contrib.admin.utils import unquote
from django.core import signing
from django.core.exceptions import PermissionDenied, ValidationError
from django.core.exceptions import PermissionDenied, ValidationError, FieldError
from django.db import transaction
from django.forms.fields import CharField
from django.http import (
Expand Down Expand Up @@ -233,9 +233,6 @@ def get_editor_widget(self, request, plugins, plugin):
cancel_url_name = self.get_admin_url_name("revert_on_cancel")
cancel_url = reverse(f"admin:{cancel_url_name}")

url_endpoint_name = self.get_admin_url_name("get_available_urls")
url_endpoint = reverse(f"admin:{url_endpoint_name}")

render_plugin_url_name = self.get_admin_url_name("render_plugin")
render_plugin_url = reverse(f"admin:{render_plugin_url_name}")

Expand All @@ -251,7 +248,6 @@ def get_editor_widget(self, request, plugins, plugin):
configuration=self.editor_configuration,
render_plugin_url=render_plugin_url,
cancel_url=cancel_url,
url_endpoint=url_endpoint,
action_token=action_token,
revert_on_cancel=settings.TEXT_CHILDREN_ENABLED,
body_css_classes=self._get_body_css_classes_from_parent_plugins(plugin),
Expand All @@ -266,7 +262,6 @@ def get_editor_widget(self, request, plugins, plugin):
configuration=self.editor_configuration,
render_plugin_url=render_plugin_url,
cancel_url=cancel_url,
url_endpoint=url_endpoint,
action_token=action_token,
revert_on_cancel=False,
body_css_classes="",
Expand Down Expand Up @@ -525,9 +520,15 @@ def get_available_urls(self, request):

search = request.GET.get("q", "").strip("  ").lower()
language = get_language_from_request(request)
qs = (PageContent.admin_manager.filter(language=language, title__icontains=search)
.current_content()
.order_by("page__node__path"))
try:
qs = (PageContent.admin_manager.filter(language=language, title__icontains=search)
.current_content()
.order_by("page__path"))
except FieldError:
qs = (PageContent.admin_manager.filter(language=language, title__icontains=search)
.current_content()
.order_by("page__node__path"))

urls = {
"results": [
{
Expand Down Expand Up @@ -650,9 +651,11 @@ def render(self, context, instance, placeholder):
request = context.get("request")
if self.inline_editing_active(request):
with override(request.toolbar.toolbar_language):
editor_settings = self.get_editor_widget(
widget = self.get_editor_widget(
context["request"], self.get_plugins(instance), instance
).get_editor_settings(request.toolbar.toolbar_language.split("-")[0])
)
editor_settings = widget.get_editor_settings(request.toolbar.toolbar_language.split("-")[0])
global_settings = widget.get_global_settings(request.toolbar.toolbar_language.split("-")[0])

body = render_dynamic_attributes(
instance.body, admin_objects=True, remove_attr=False
Expand All @@ -664,7 +667,9 @@ def render(self, context, instance, placeholder):
"placeholder": placeholder,
"object": instance,
"editor_settings": editor_settings,
"editor_settings_id": "cms-cfg-" + str(instance.pk),
"editor_settings_id": widget.editor_settings_id,
"global_settings": global_settings,
"global_settings_id": widget.global_settings_id,
}
)
else:
Expand Down
10 changes: 5 additions & 5 deletions djangocms_text/cms_toolbars.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
from cms.toolbar_pool import toolbar_pool

from . import settings
from .widgets import rte_config
from .utils import get_url_endpoint
from .widgets import rte_config, TextEditorWidget


class IconButton(Button):
Expand Down Expand Up @@ -66,13 +67,12 @@ def populate(self):
)
self.toolbar.add_item(item)

config = settings.CKEDITOR_SETTINGS # TODO: Change to TEXT_EDITOR_SETTINGS
if "toolbar_HTMLField" in config:
config["toolbar"] = config["toolbar_HTMLField"]
widget = TextEditorWidget(url_endpoint=get_url_endpoint())
item = TemplateItem(
"cms/toolbar/config.html",
extra_context={
"html_field_config": config,
"global_config": widget.get_global_settings(self.current_lang),
"html_field_config": widget.get_editor_settings(self.current_lang),
"allowed_inlines": apps.get_app_config("djangocms_text").inline_models,
},
side=self.toolbar.RIGHT,
Expand Down
16 changes: 7 additions & 9 deletions djangocms_text/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.utils.safestring import mark_safe

from .html import clean_html, render_dynamic_attributes
from .utils import get_url_endpoint
from .widgets import TextEditorWidget


Expand All @@ -12,9 +13,9 @@ class HTMLFormField(CharField):

def __init__(self, *args, **kwargs):
conf = kwargs.pop("configuration", None)

url_endpoint = kwargs.pop("url_endpoint", None)
if conf:
widget = TextEditorWidget(configuration=conf)
widget = TextEditorWidget(configuration=conf, url_endpoint=url_endpoint)
else:
widget = None
kwargs.setdefault("widget", widget)
Expand All @@ -39,6 +40,7 @@ def __init__(self, *args, **kwargs):
# This allows widget configuration customization
# from the model definition
self.configuration = kwargs.pop("configuration", None)
self.url_endpoint = kwargs.pop("url_endpoint", None)
super().__init__(*args, **kwargs)

def from_db_value(self, value, expression, connection, context=None):
Expand All @@ -55,20 +57,16 @@ def to_python(self, value):
return value

def formfield(self, **kwargs):
if self.configuration:
widget = TextEditorWidget(configuration=self.configuration)
else:
widget = TextEditorWidget

defaults = {
"form_class": HTMLFormField,
"widget": widget,
"widget": TextEditorWidget(configuration=self.configuration) if self.configuration else TextEditorWidget,
}
defaults.update(kwargs)

# override the admin widget
if defaults["widget"] == admin_widgets.AdminTextareaWidget:
defaults["widget"] = widget
# In the admin the URL endpoint is available
defaults["widget"] = TextEditorWidget(configuration=self.configuration, url_endpoint=get_url_endpoint())
return super().formfield(**defaults)

def clean(self, value, model_instance):
Expand Down
2 changes: 1 addition & 1 deletion djangocms_text/static/djangocms_text/css/cms.text.css
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ dialog.cms-form-dialog {
cursor: unset; /* browser default */
}
z-index: 1001;
position: fixed;
position: absolute;
margin: unset;
left: auto;
transform: translate(-50%, -50%);
Expand Down
2 changes: 1 addition & 1 deletion djangocms_text/templates/cms/plugins/inline.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{% include "cms/plugins/text.html" %}{% if editor_settings %}{% load sekizai_tags %}{% addtoblock 'js' %}{{ editor_settings|json_script:editor_settings_id }}{% endaddtoblock %}{% endif %}
{% include "cms/plugins/text.html" %}{% if editor_settings %}{% load sekizai_tags %}{% addtoblock 'js' %}{{ editor_settings|json_script:editor_settings_id }}{% endaddtoblock %}{% endif %}
2 changes: 1 addition & 1 deletion djangocms_text/templates/cms/plugins/widgets/editor.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{% load i18n l10n static cms_static sekizai_tags %}{{ editor_settings|json_script:editor_settings_id }}
{% load i18n l10n static cms_static sekizai_tags %}{{ editor_settings|json_script:editor_settings_id }}{% if global_settings %}{{ global_settings|json_script:global_settings_id }}{% endif %}
5 changes: 3 additions & 2 deletions djangocms_text/templates/cms/toolbar/config.html
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
{% if html_field_config %}{{ html_field_config|json_script:"cms-cfg-htmlfield-inline-config" }}{% endif %}
{% if allowed_inlines %}{{ allowed_inlines|json_script:"cms-generic-inline-fields" }}{% endif %}
{% if allowed_inlines %}{{ allowed_inlines|json_script:"cms-generic-inline-fields" }}{% load sekizai_tags %}{% endif %}
{% if global_config %}{{ global_config|json_script:"cms-editor-cfg" }}{% endif %}
{% if html_field_config %}{{ html_field_config|json_script:"cms-cfg-htmlfield-inline" }}{% endif %}
5 changes: 5 additions & 0 deletions djangocms_text/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from collections import OrderedDict
from functools import WRAPPER_ASSIGNMENTS, wraps

from cms.utils.urlutils import admin_reverse
from django.template.defaultfilters import force_escape
from django.template.loader import render_to_string

Expand Down Expand Up @@ -169,3 +170,7 @@ def get_plugins_from_text(text, regex=OBJ_ADMIN_RE):
plugins = CMSPlugin.objects.filter(pk__in=plugin_ids).select_related("placeholder")
plugin_list = downcast_plugins(plugins, select_placeholder=True)
return {plugin.pk: plugin for plugin in plugin_list}


def get_url_endpoint():
return admin_reverse("djangocms_text_textplugin_get_available_urls")
Loading

0 comments on commit c4054db

Please sign in to comment.