'Move this page and all its children.'

def _move_tree(self, new_slug, user=None, title=None):

    self._move_conflicts(new_slug)
    if (user is None):
        user = self.current_revision.creator
    if (title is None):
        title = self.title
    review_tags = list(self.current_revision.review_tags.names())
    (redirect_doc, redirect_rev) = self._post_move_redirects(new_slug, user, title)
    new_parent = self._get_new_parent(new_slug)
    self.parent_topic = new_parent
    self.slug = new_slug
    self.save()
    moved_rev = self._moved_revision(new_slug, user, title)
    moved_rev.save(force_insert=True)
    moved_rev.review_tags.set(*review_tags)
    redirect_doc.save()
    redirect_rev.document = redirect_doc
    redirect_rev.save()
    for child in self.children.filter(locale=self.locale):
        (old_child_slug, old_child_locale) = (child.slug, child.locale)
        child_title = child.slug.split('/')[(-1)]
        try:
            child._move_tree('/'.join([new_slug, child_title]), user)
        except PageMoveError:
            raise
        except Exception as e:
            (exc_class, exc_message, exc_tb) = sys.exc_info()
            message = ('\nFailure    occurred    while    attempting    to    move    document\nwith    id    %(doc_id)s.\n\nThat    document    can    be    viewed    at:\n\nhttps://developer.mozilla.org/%(locale)s/docs/%(slug)s\n\nThe    exception    raised    was:\n\nException    type:    %(exc_class)s\n\nException    message:    %(exc_message)s\n\nFull    traceback:\n\n%(traceback)s\n                                                                ' % {'doc_id': child.id, 'locale': old_child_locale, 'slug': old_child_slug, 'exc_class': exc_class, 'exc_message': exc_message, 'traceback': traceback.format_exc(e)})
            raise PageMoveError(message)
