springload / madewithwagtail

A showcase of sites and apps made with Wagtail CMS, the easy to use, open source Django content management system
http://madewithwagtail.org
MIT License
85 stars 21 forks source link

Problem with signals adding many page types. #13

Closed SalahAdDin closed 8 years ago

SalahAdDin commented 9 years ago

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.

Thank's !

SalahAdDin commented 8 years ago

Why you close it?