kopia lustrzana https://github.com/wagtail/wagtail
Implement the page_url_path_changed signal
rodzic
361c3d5d54
commit
2f86eda372
|
@ -52,9 +52,9 @@ from wagtail.core.forms import TaskStateCommentForm
|
||||||
from wagtail.core.log_actions import log
|
from wagtail.core.log_actions import log
|
||||||
from wagtail.core.query import PageQuerySet
|
from wagtail.core.query import PageQuerySet
|
||||||
from wagtail.core.signals import (
|
from wagtail.core.signals import (
|
||||||
page_published, page_unpublished, post_page_move, pre_page_move, pre_validate_delete,
|
page_published, page_unpublished, page_url_path_changed, post_page_move, pre_page_move,
|
||||||
task_approved, task_cancelled, task_rejected, task_submitted, workflow_approved,
|
pre_validate_delete, task_approved, task_cancelled, task_rejected, task_submitted,
|
||||||
workflow_cancelled, workflow_rejected, workflow_submitted)
|
workflow_approved, workflow_cancelled, workflow_rejected, workflow_submitted)
|
||||||
from wagtail.core.treebeard import TreebeardPathFixMixin
|
from wagtail.core.treebeard import TreebeardPathFixMixin
|
||||||
from wagtail.core.url_routing import RouteResult
|
from wagtail.core.url_routing import RouteResult
|
||||||
from wagtail.core.utils import (
|
from wagtail.core.utils import (
|
||||||
|
@ -482,8 +482,8 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
if clean:
|
if clean:
|
||||||
self.full_clean()
|
self.full_clean()
|
||||||
|
|
||||||
update_descendant_url_paths = False
|
|
||||||
is_new = self.id is None
|
is_new = self.id is None
|
||||||
|
slug_changed = False
|
||||||
|
|
||||||
if is_new:
|
if is_new:
|
||||||
# we are creating a record. If we're doing things properly, this should happen
|
# we are creating a record. If we're doing things properly, this should happen
|
||||||
|
@ -499,18 +499,18 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
old_record = Page.objects.get(id=self.id)
|
old_record = Page.objects.get(id=self.id)
|
||||||
if old_record.slug != self.slug:
|
if old_record.slug != self.slug:
|
||||||
self.set_url_path(self.get_parent())
|
self.set_url_path(self.get_parent())
|
||||||
update_descendant_url_paths = True
|
slug_changed = True
|
||||||
old_url_path = old_record.url_path
|
old_url_path = old_record.url_path
|
||||||
new_url_path = self.url_path
|
new_url_path = self.url_path
|
||||||
|
|
||||||
result = super().save(**kwargs)
|
result = super().save(**kwargs)
|
||||||
|
|
||||||
if not is_new and update_descendant_url_paths:
|
if slug_changed:
|
||||||
self._update_descendant_url_paths(old_url_path, new_url_path)
|
self._update_descendant_url_paths(old_url_path, new_url_path)
|
||||||
|
|
||||||
# Check if this is a root page of any sites and clear the 'wagtail_site_root_paths' key if so
|
# Check if this is a root page of any sites and clear the 'wagtail_site_root_paths' key if so
|
||||||
# Note: New translations of existing site roots are considered site roots as well, so we must
|
# Note: New translations of existing site roots are considered site roots as well, so we must
|
||||||
# always check if this page is a site root, even if it's new.
|
# always check if this page is a site root, even if it's new.
|
||||||
if self.is_site_root():
|
if self.is_site_root():
|
||||||
cache.delete('wagtail_site_root_paths')
|
cache.delete('wagtail_site_root_paths')
|
||||||
|
|
||||||
|
@ -526,24 +526,35 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
self.url_path
|
self.url_path
|
||||||
)
|
)
|
||||||
|
|
||||||
|
log_entry = None
|
||||||
if log_action is not None:
|
if log_action is not None:
|
||||||
# The default for log_action is False. i.e. don't log unless specifically instructed
|
# The default for log_action is False. i.e. don't log unless specifically instructed
|
||||||
# Page creation is a special case that we want logged by default, but allow skipping it
|
# Page creation is a special case that we want logged by default, but allow skipping it
|
||||||
# explicitly by passing log_action=None
|
# explicitly by passing log_action=None
|
||||||
if is_new:
|
if is_new:
|
||||||
log(
|
log_entry = log(
|
||||||
instance=self,
|
instance=self,
|
||||||
action='wagtail.create',
|
action='wagtail.create',
|
||||||
user=user or self.owner,
|
user=user or self.owner,
|
||||||
content_changed=True,
|
content_changed=True,
|
||||||
)
|
)
|
||||||
elif log_action:
|
elif log_action:
|
||||||
log(
|
log_entry = log(
|
||||||
instance=self,
|
instance=self,
|
||||||
action=log_action,
|
action=log_action,
|
||||||
user=user
|
user=user
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if slug_changed:
|
||||||
|
# Emit page_url_path_changed signal only on successful commit
|
||||||
|
transaction.on_commit(lambda: page_url_path_changed.send(
|
||||||
|
sender=self.specific_class or self.__class__,
|
||||||
|
instance=self,
|
||||||
|
url_path_before=old_url_path,
|
||||||
|
url_path_after=new_url_path,
|
||||||
|
log_entry=log_entry,
|
||||||
|
))
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def delete(self, *args, **kwargs):
|
def delete(self, *args, **kwargs):
|
||||||
|
@ -1492,6 +1503,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
old_self = Page.objects.get(id=self.id)
|
old_self = Page.objects.get(id=self.id)
|
||||||
old_url_path = old_self.url_path
|
old_url_path = old_self.url_path
|
||||||
new_url_path = old_self.set_url_path(parent=parent_after)
|
new_url_path = old_self.set_url_path(parent=parent_after)
|
||||||
|
url_path_changed = old_url_path != new_url_path
|
||||||
|
|
||||||
# Emit pre_page_move signal
|
# Emit pre_page_move signal
|
||||||
pre_page_move.send(
|
pre_page_move.send(
|
||||||
|
@ -1515,7 +1527,7 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
new_self.save()
|
new_self.save()
|
||||||
|
|
||||||
# Update descendant paths if url_path has changed
|
# Update descendant paths if url_path has changed
|
||||||
if old_url_path != new_url_path:
|
if url_path_changed:
|
||||||
new_self._update_descendant_url_paths(old_url_path, new_url_path)
|
new_self._update_descendant_url_paths(old_url_path, new_url_path)
|
||||||
|
|
||||||
# Emit post_page_move signal
|
# Emit post_page_move signal
|
||||||
|
@ -1529,10 +1541,10 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
)
|
)
|
||||||
|
|
||||||
# Log
|
# Log
|
||||||
log(
|
log_entry = log(
|
||||||
instance=self,
|
instance=self,
|
||||||
# Check if page was reordered (reordering doesn't change the parent)
|
# Check if page was reordered (reordering doesn't change the parent)
|
||||||
action='wagtail.reorder' if parent_before.id == target.id else 'wagtail.move',
|
action='wagtail.move' if url_path_changed else 'wagtail.reorder',
|
||||||
user=user,
|
user=user,
|
||||||
data={
|
data={
|
||||||
'source': {
|
'source': {
|
||||||
|
@ -1547,6 +1559,16 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
)
|
)
|
||||||
logger.info("Page moved: \"%s\" id=%d path=%s", self.title, self.id, new_url_path)
|
logger.info("Page moved: \"%s\" id=%d path=%s", self.title, self.id, new_url_path)
|
||||||
|
|
||||||
|
if url_path_changed:
|
||||||
|
# Emit page_url_path_changed signal
|
||||||
|
page_url_path_changed.send(
|
||||||
|
sender=self.specific_class or self.__class__,
|
||||||
|
instance=self,
|
||||||
|
url_path_before=old_url_path,
|
||||||
|
url_path_after=new_url_path,
|
||||||
|
log_entry=log_entry,
|
||||||
|
)
|
||||||
|
|
||||||
def copy(self, recursive=False, to=None, update_attrs=None, copy_revisions=True, keep_live=True, user=None,
|
def copy(self, recursive=False, to=None, update_attrs=None, copy_revisions=True, keep_live=True, user=None,
|
||||||
process_child_object=None, exclude_fields=None, log_action='wagtail.copy', reset_translation_key=True):
|
process_child_object=None, exclude_fields=None, log_action='wagtail.copy', reset_translation_key=True):
|
||||||
"""
|
"""
|
||||||
|
@ -1973,7 +1995,10 @@ class Page(AbstractPage, index.Indexed, ClusterableModel, metaclass=PageBase):
|
||||||
|
|
||||||
def get_cached_paths(self):
|
def get_cached_paths(self):
|
||||||
"""
|
"""
|
||||||
This returns a list of paths to invalidate in a frontend cache
|
This returns a list of paths to invalidate in a frontend cache, or when
|
||||||
|
create redirects when the page's URL changes as a result of a slug
|
||||||
|
change or move. These values are automatically added to the page's
|
||||||
|
default URL to create full URLs.
|
||||||
"""
|
"""
|
||||||
return ['/']
|
return ['/']
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,9 @@ page_published = Signal()
|
||||||
# provides args: instance
|
# provides args: instance
|
||||||
page_unpublished = Signal()
|
page_unpublished = Signal()
|
||||||
|
|
||||||
|
# provides args: instance, url_path_before, url_path_after, log_entry
|
||||||
|
page_url_path_changed = Signal()
|
||||||
|
|
||||||
# provides args: instance, parent_page_before, parent_page_after, url_path_before, url_path_after
|
# provides args: instance, parent_page_before, parent_page_after, url_path_before, url_path_after
|
||||||
pre_page_move = Signal()
|
pre_page_move = Signal()
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue