This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
djangocms-text-ckeditor/djangocms_text_ckeditor/models.py

135 lines
4.8 KiB
Python

import re
import sys
try:
from django.utils.encoding import force_text as force_unicode_or_text
except ImportError:
from django.utils.encoding import force_unicode as force_unicode_or_text
from django.db import models
from django.utils.html import strip_tags
from django.utils.text import Truncator
from django.utils.translation import ugettext_lazy as _
from cms.models import CMSPlugin
from .utils import plugin_tags_to_id_list, replace_plugin_tags, plugin_to_tag
from .html import clean_html, extract_images
class AbstractText(CMSPlugin):
"""Abstract Text Plugin Class"""
body = models.TextField(_("body"))
search_fields = ('body',)
disable_child_plugins = True
class Meta:
abstract = True
def __unicode__(self):
return Truncator(strip_tags(self.body)).words(3, truncate="...")
def __init__(self, *args, **kwargs):
super(AbstractText, self).__init__(*args, **kwargs)
self.body = force_unicode_or_text(self.body)
def save(self, *args, **kwargs):
body = self.body
body = extract_images(body, self)
body = clean_html(body, full=False)
self.body = body
super(AbstractText, self).save(*args, **kwargs)
def clean_plugins(self):
ids = plugin_tags_to_id_list(self.body)
plugins = CMSPlugin.objects.filter(parent=self)
for plugin in plugins:
if not plugin.pk in ids:
#delete plugins that are not referenced in the text anymore
plugin.delete()
def post_copy(self, old_instance, ziplist):
"""
Fix references to plugins
"""
replace_ids = {}
for new, old in ziplist:
replace_ids[old.pk] = new.pk
self.body = replace_plugin_tags(old_instance.get_plugin_instance()[0].body, replace_ids)
self.save()
def get_translatable_content(self):
translatable_content = super(AbstractText, self).get_translatable_content()
if not translatable_content:
return False
for field, value in translatable_content.items():
# Check for an embedded LinkPlugin
matches = re.findall(
r'(<img alt="(Link[^"]*)" id="plugin_obj_([\d]*)" src="([^"]*)" title="(Link[^"]*)">)', value
)
if matches:
for match in matches:
try:
link_plugin = CMSPlugin.objects.get(pk=match[2]).get_plugin_instance()[0]
except CMSPlugin.DoesNotExist:
sys.stderr.write("ERROR: Could not find plugin with pk %s!\n" % str(match[2]))
continue
text = '<a plugin="%s" href="%s" target="%s" alt="%s" title="%s" img_src="%s">%s</a>' % (
match[2], link_plugin.link(), link_plugin.target, match[1],
match[4], match[3], link_plugin.name
)
translatable_content[field] = value.replace(match[0], text)
return translatable_content
def set_translatable_content(self, fields):
for field, value in fields.items():
# Check for 'serialized' link plugin
exp = r'(<a plugin="([\d]*)" href="[^"]*" target="[^"]*" alt="([^"]*)" title="([^"]*)" ' \
'img_src="([^"]*)">(.*[^</a>])</a>)'
matches = re.findall(exp, value)
if matches:
for match in matches:
try:
linkplugin = CMSPlugin.objects.get(pk=match[1]).get_plugin_instance()[0]
except CMSPlugin.DoesNotExist:
sys.stderr.write("ERROR: Could not find plugin with pk %s\n" % str(match[0]))
# Save changes to linkplugin
linkplugin.name = match[5]
linkplugin.save()
# Save changes to parent text plugin
text = '<img alt="%s" id="plugin_obj_%s" src="%s" title="%s">' % (match[2], match[1], match[4], match[3])
value = value.replace(match[0], text)
setattr(self, field, value)
self.save()
return True
def notify_on_autoadd_children(self, request, conf, children):
"""
Method called when we auto add children to this plugin via
default_plugins/<plugin>/children in CMS_PLACEHOLDER_CONF.
we must replace some strings with child tag for the CKEDITOR.
Strings are "%(_tag_child_<order>)s" with the inserted order of chidren
"""
replacements = dict()
order = 1
for child in children:
replacements['_tag_child_'+str(order)] = plugin_to_tag(child)
order += 1
self.body = self.body % replacements
self.save()
class Text(AbstractText):
class Meta:
abstract = False