I have the next problem when i put your signals.py code in my project:
TypeError at /admin/pages/6/edit/
isinstance() arg 2 must be a type or tuple of types
This is the traceback:
Traceback:
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/views/decorators/cache.py" in _cache_controlled
43. response = viewfunc(request, *args, **kw)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
22. return view_func(request, *args, **kwargs)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/wagtail/wagtailadmin/views/pages.py" in edit
247. submitted_for_moderation=is_submitting,
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/wagtail/wagtailcore/models.py" in save_revision
498. approved_go_live_at=approved_go_live_at,
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/db/models/fields/related.py" in create
758. return super(RelatedManager, self.db_manager(db)).create(**kwargs)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/db/models/manager.py" in manager_method
127. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/db/models/query.py" in create
348. obj.save(force_insert=True, using=self.db)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/wagtail/wagtailcore/models.py" in save
1095. super(PageRevision, self).save(*args, **kwargs)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/db/models/base.py" in save
710. force_update=force_update, update_fields=update_fields)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/db/models/base.py" in save_base
734. update_fields=update_fields)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/lib/python3.4/site-packages/django/dispatch/dispatcher.py" in send
201. response = receiver(signal=self, sender=sender, **named)
File "/media/tulipan/Datos/Proyectos/Trabajo/CCCT/ccct/core/signals.py" in pre_page_revision_save
52. if isinstance(instance.page, PAGE_CLASSES):
Exception Type: TypeError at /admin/pages/6/edit/
Exception Value: isinstance() arg 2 must be a type or tuple of types
And this is my code:
import re
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from django.core.cache import cache
from wagtail.wagtailcore.models import PageRevision
from .models import *
from .utils import replace_tags
# Signals for Models. Some for performing specific class tasks, some just for clearing the cache.
# Set your own classes
PAGE_CLASSES = [HomePage, StandardIndexPage, StandardPage, FormPage, BlogIndexPage, BlogIndexPage,
PersonPage, ContactPage, EventIndexPage, EventPage, NewIndexPage, NewPage]
@receiver(pre_save)
def pre_page_save(sender, instance, **kwargs):
"""
Strip empty <p> elements from any RichTextField and other stuff when saved instance is one of the following
classes: defined in PAGE_CLASSES
"""
if (kwargs.get('created', True) and not kwargs.get('raw', False)):
if (sender in PAGE_CLASSES):
for field in instance._meta.fields:
if sender._meta.get_field(field.name).__class__.__name__ == "RichTextField":
field_to_string = getattr(instance, field.name)
field_to_string = re.sub(r"\n", "", field_to_string)
# Clean empty paragraphs
field_to_string = re.sub(r"<p>(<br/>|<br>)*</p>", "", field_to_string)
# Wrap images and embeds into figures instead of paragraphs
field_to_string = re.sub(
r"<p>((<img.+/.[^>]+>)|(<embed.[^>]+embedtype=\"image\".[^>]+/>))+:?(<br>|<br/>)*</p>",
r"<figure>\1</figure>",
field_to_string
)
clean_field = replace_tags(
field_to_string, {"<b>": "<strong>", "<i>": "<em>", "</b>": "</strong>", "</i>": "</em>"}
)
# Replace content field
setattr(instance, field.name, clean_field)
@receiver(pre_save, sender=PageRevision)
def pre_page_revision_save(sender, instance, **kwargs):
"""
Strip empty <p> elements from any RichTextField only when related page is a WagtailPage
"""
if (kwargs.get('created', True) and not kwargs.get('raw', False)):
if isinstance(instance.page, PAGE_CLASSES):
mirror_page = instance.as_page_object()
for field in mirror_page._meta.fields:
if instance.page._meta.get_field(field.name).__class__.__name__ == "RichTextField":
field_to_string = getattr(mirror_page, field.name)
field_to_string = re.sub(r"\n", "", field_to_string)
# Clean empty paragraphs
field_to_string = re.sub(r"<p>(<br/>|<br>)*</p>", "", field_to_string)
# Wrap images and embeds into figures instead of paragraphs
field_to_string = re.sub(
r"<p>((<img.+/.[^>]+>)|(<embed.[^>]+embedtype=\"image\".[^>]+/>))+:?(<br>|<br/>)*</p>",
r"<figure>\1</figure>",
field_to_string
)
clean_field = replace_tags(
field_to_string, {"<b>": "<strong>", "<i>": "<em>", "</b>": "</strong>", "</i>": "</em>"}
)
# Replace content field
setattr(mirror_page, field.name, clean_field)
# To json again
instance.content_json = mirror_page.to_json()
@receiver(post_save)
def post_model_save(sender, instance, **kwargs):
"""
Clear cache when any kind of Model is saved
"""
cache.clear()
I have many type page and i want use your signals for each one of all.
I have the next problem when i put your signals.py code in my project:
This is the traceback:
And this is my code:
I have many type page and i want use your signals for each one of all.
Thank's !