Merge branch 'kaedroho-unpublish_signal'

pull/473/head
Matt Westcott 2014-07-22 11:09:59 +01:00
commit dc62ebe3a1
6 zmienionych plików z 78 dodań i 6 usunięć

Wyświetl plik

@ -7,6 +7,7 @@ Changelog
* Explorer nav now rendered separately and fetched with AJAX when needed * Explorer nav now rendered separately and fetched with AJAX when needed
* Added decorator syntax for hooks * Added decorator syntax for hooks
* Replaced lxml dependency with html5lib, to simplify installation * Replaced lxml dependency with html5lib, to simplify installation
* Added page_unpublished signal
0.4.1 (14.07.2014) 0.4.1 (14.07.2014)
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~

Wyświetl plik

@ -35,6 +35,7 @@ Core
) )
* The lxml library (used for whitelisting and rewriting of rich text fields) has been replaced with the pure-python html5lib library, to simplify installation. * The lxml library (used for whitelisting and rewriting of rich text fields) has been replaced with the pure-python html5lib library, to simplify installation.
* A ``page_unpublished`` signal has been added.
Admin Admin

Wyświetl plik

@ -1,8 +1,7 @@
from django.db import models from django.db import models
from django.db.models.signals import post_delete
from wagtail.wagtailcore.models import Page from wagtail.wagtailcore.models import Page
from wagtail.wagtailcore.signals import page_published from wagtail.wagtailcore.signals import page_published, page_unpublished
from wagtail.contrib.wagtailfrontendcache.utils import purge_page_from_cache from wagtail.contrib.wagtailfrontendcache.utils import purge_page_from_cache
@ -11,7 +10,7 @@ def page_published_signal_handler(instance, **kwargs):
purge_page_from_cache(instance) purge_page_from_cache(instance)
def post_delete_signal_handler(instance, **kwargs): def page_unpublished_signal_handler(instance, **kwargs):
purge_page_from_cache(instance) purge_page_from_cache(instance)
@ -22,4 +21,4 @@ def register_signal_handlers():
# Loop through list and register signal handlers for each one # Loop through list and register signal handlers for each one
for model in indexed_models: for model in indexed_models:
page_published.connect(page_published_signal_handler, sender=model) page_published.connect(page_published_signal_handler, sender=model)
post_delete.connect(post_delete_signal_handler, sender=model) page_unpublished.connect(page_unpublished_signal_handler, sender=model)

Wyświetl plik

@ -10,7 +10,7 @@ from django.utils import timezone
from wagtail.tests.models import SimplePage, EventPage, EventPageCarouselItem, StandardIndex, BusinessIndex, BusinessChild, BusinessSubIndex from wagtail.tests.models import SimplePage, EventPage, EventPageCarouselItem, StandardIndex, BusinessIndex, BusinessChild, BusinessSubIndex
from wagtail.tests.utils import unittest, WagtailTestUtils from wagtail.tests.utils import unittest, WagtailTestUtils
from wagtail.wagtailcore.models import Page, PageRevision from wagtail.wagtailcore.models import Page, PageRevision
from wagtail.wagtailcore.signals import page_published from wagtail.wagtailcore.signals import page_published, page_unpublished
from wagtail.wagtailusers.models import UserProfile from wagtail.wagtailusers.models import UserProfile
@ -809,6 +809,15 @@ class TestPageDelete(TestCase, WagtailTestUtils):
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_page_delete_post(self): def test_page_delete_post(self):
# Connect a mock signal handler to page_unpublished signal
signal_fired = [False]
signal_page = [None]
def page_unpublished_handler(sender, instance, **kwargs):
signal_fired[0] = True
signal_page[0] = instance
page_unpublished.connect(page_unpublished_handler)
# Post
post_data = {'hello': 'world'} # For some reason, this test doesn't work without a bit of POST data post_data = {'hello': 'world'} # For some reason, this test doesn't work without a bit of POST data
response = self.client.post(reverse('wagtailadmin_pages_delete', args=(self.child_page.id, )), post_data) response = self.client.post(reverse('wagtailadmin_pages_delete', args=(self.child_page.id, )), post_data)
@ -818,6 +827,38 @@ class TestPageDelete(TestCase, WagtailTestUtils):
# Check that the page is gone # Check that the page is gone
self.assertEqual(Page.objects.filter(path__startswith=self.root_page.path, slug='hello-world').count(), 0) self.assertEqual(Page.objects.filter(path__startswith=self.root_page.path, slug='hello-world').count(), 0)
# Check that the page_unpublished signal was fired
self.assertTrue(signal_fired[0])
self.assertEqual(signal_page[0], self.child_page)
self.assertEqual(signal_page[0], signal_page[0].specific)
def test_page_delete_notlive_post(self):
# Same as above, but this makes sure the page_unpublished signal is not fired
# when if the page is not live when it is deleted
# Unpublish the page
self.child_page.live = False
self.child_page.save()
# Connect a mock signal handler to page_unpublished signal
signal_fired = [False]
def page_unpublished_handler(sender, instance, **kwargs):
signal_fired[0] = True
page_unpublished.connect(page_unpublished_handler)
# Post
post_data = {'hello': 'world'} # For some reason, this test doesn't work without a bit of POST data
response = self.client.post(reverse('wagtailadmin_pages_delete', args=(self.child_page.id, )), post_data)
# Should be redirected to explorer page
self.assertRedirects(response, reverse('wagtailadmin_explore', args=(self.root_page.id, )))
# Check that the page is gone
self.assertEqual(Page.objects.filter(path__startswith=self.root_page.path, slug='hello-world').count(), 0)
# Check that the page_unpublished signal was not fired
self.assertFalse(signal_fired[0])
class TestPageSearch(TestCase, WagtailTestUtils): class TestPageSearch(TestCase, WagtailTestUtils):
def setUp(self): def setUp(self):
@ -967,6 +1008,14 @@ class TestPageUnpublish(TestCase, WagtailTestUtils):
""" """
This posts to the unpublish view and checks that the page was unpublished This posts to the unpublish view and checks that the page was unpublished
""" """
# Connect a mock signal handler to page_unpublished signal
signal_fired = [False]
signal_page = [None]
def page_unpublished_handler(sender, instance, **kwargs):
signal_fired[0] = True
signal_page[0] = instance
page_unpublished.connect(page_unpublished_handler)
# Post to the unpublish page # Post to the unpublish page
response = self.client.post(reverse('wagtailadmin_pages_unpublish', args=(self.page.id, )), { response = self.client.post(reverse('wagtailadmin_pages_unpublish', args=(self.page.id, )), {
'foo': "Must post something or the view won't see this as a POST request", 'foo': "Must post something or the view won't see this as a POST request",
@ -978,6 +1027,11 @@ class TestPageUnpublish(TestCase, WagtailTestUtils):
# Check that the page was unpublished # Check that the page was unpublished
self.assertFalse(SimplePage.objects.get(id=self.page.id).live) self.assertFalse(SimplePage.objects.get(id=self.page.id).live)
# Check that the page_unpublished signal was fired
self.assertTrue(signal_fired[0])
self.assertEqual(signal_page[0], self.page)
self.assertEqual(signal_page[0], signal_page[0].specific)
class TestApproveRejectModeration(TestCase, WagtailTestUtils): class TestApproveRejectModeration(TestCase, WagtailTestUtils):
def setUp(self): def setUp(self):

Wyświetl plik

@ -18,7 +18,7 @@ from wagtail.wagtailadmin import tasks, signals
from wagtail.wagtailcore import hooks from wagtail.wagtailcore import hooks
from wagtail.wagtailcore.models import Page, PageRevision, get_navigation_menu_items from wagtail.wagtailcore.models import Page, PageRevision, get_navigation_menu_items
from wagtail.wagtailcore.signals import page_published from wagtail.wagtailcore.signals import page_published, page_unpublished
@permission_required('wagtailadmin.access_admin') @permission_required('wagtailadmin.access_admin')
@ -383,8 +383,19 @@ def delete(request, page_id):
raise PermissionDenied raise PermissionDenied
if request.POST: if request.POST:
if page.live:
# fetch params to pass to the page_unpublished_signal, before the
# deletion happens
specific_class = page.specific_class
specific_page = page.specific
parent_id = page.get_parent().id parent_id = page.get_parent().id
page.delete() page.delete()
# If the page is live, send the unpublished signal
if page.live:
page_unpublished.send(sender=specific_class, instance=specific_page)
messages.success(request, _("Page '{0}' deleted.").format(page.title)) messages.success(request, _("Page '{0}' deleted.").format(page.title))
for fn in hooks.get_hooks('after_delete_page'): for fn in hooks.get_hooks('after_delete_page'):
@ -545,9 +556,14 @@ def unpublish(request, page_id):
parent_id = page.get_parent().id parent_id = page.get_parent().id
page.live = False page.live = False
page.save() page.save()
# Since page is unpublished clear the approved_go_live_at of all revisions # Since page is unpublished clear the approved_go_live_at of all revisions
page.revisions.update(approved_go_live_at=None) page.revisions.update(approved_go_live_at=None)
page_unpublished.send(sender=page.specific_class, instance=page.specific)
messages.success(request, _("Page '{0}' unpublished.").format(page.title)) messages.success(request, _("Page '{0}' unpublished.").format(page.title))
return redirect('wagtailadmin_explore', parent_id) return redirect('wagtailadmin_explore', parent_id)
return render(request, 'wagtailadmin/pages/confirm_unpublish.html', { return render(request, 'wagtailadmin/pages/confirm_unpublish.html', {

Wyświetl plik

@ -2,3 +2,4 @@ from django.dispatch import Signal
page_published = Signal(providing_args=['instance']) page_published = Signal(providing_args=['instance'])
page_unpublished = Signal(providing_args=['instance'])