Пример #1
0
    def copy_page(self, page, target_page, position=0, target_site=None):
        from cms.utils.page import get_available_slug

        if target_site is None:
            target_site = target_page.node.site

        data = {
            'position': position,
            'target': target_page.pk,
            'source_site': page.node.site_id,
            'copy_permissions': 'on',
            'copy_moderation': 'on',
        }
        source_translation = page.title_set.all()[0]
        parent_translation = target_page.title_set.all()[0]
        language = source_translation.language
        copied_page_path = source_translation.get_path_for_base(
            parent_translation.path)
        new_page_slug = get_available_slug(target_site, copied_page_path,
                                           language)

        with self.settings(SITE_ID=target_site.pk):
            response = self.client.post(
                URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
        self.assertEqual(response.status_code, 200)
        response_data = json.loads(response.content.decode('utf8'))
        copied_page = self.assertObjectExist(
            Page.objects.all(),
            pk=response_data['id'],
        )
        self.assertObjectExist(copied_page.title_set.filter(language=language),
                               slug=new_page_slug)
        page._clear_node_cache()
        target_page._clear_node_cache()
        return copied_page
Пример #2
0
    def copy_page(self, page, target_page, position='last-child'):
        from cms.utils.page import get_available_slug

        data = {
            'position': position,
            'target': target_page.pk,
            'site': 1,
            'copy_permissions': 'on',
            'copy_moderation': 'on',
        }

        response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
        self.assertEqual(response.status_code, 200)
        # Altered to reflect the new django-js jsonified response messages
        expected = {"status": 200, "content": "ok"}
        self.assertEqual(json.loads(response.content.decode('utf8')), expected)

        title = page.title_set.all()[0]
        copied_slug = get_available_slug(title)
        if position in ('first-child', 'last-child'):
            parent = target_page
        else:
            parent = target_page.parent
        copied_page = self.assertObjectExist(Page.objects, title_set__slug=copied_slug, parent=parent)
        return copied_page
Пример #3
0
    def copy_page(self, page, target_page):
        from cms.utils.page import get_available_slug

        data = {
            'position': 'last-child',
            'target': target_page.pk,
            'site': 1,
            'copy_permissions': 'on',
            'copy_moderation': 'on',
        }

        response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk,
                                    data)
        self.assertEqual(response.status_code, 200)
        # Altered to reflect the new django-js jsonified response messages
        expected = {"status": 200, "content": "ok"}
        self.assertEqual(json.loads(response.content.decode('utf8')), expected)

        title = page.title_set.all()[0]
        copied_slug = get_available_slug(title)

        copied_page = self.assertObjectExist(Page.objects,
                                             title_set__slug=copied_slug,
                                             parent=target_page)
        return copied_page
Пример #4
0
    def clean(self):
        """
        Validates that either the slug is provided, or that slugification from
        `title` produces a valid slug.
        :return:
        """
        data = self.cleaned_data

        if self._errors:
            return data

        slug = data.get('slug') or slugify(data['title'])

        parent_node = data.get('parent_node')

        if parent_node:
            base = parent_node.item.get_path(self._language)
            path = u'%s/%s' % (base, slug) if base else slug
        else:
            base = ''
            path = slug

        data['slug'] = get_available_slug(self._site,
                                          path,
                                          self._language,
                                          suffix=None)
        data['path'] = '%s/%s' % (base, data['slug']) if base else data['slug']

        if not data['slug']:
            raise forms.ValidationError("Please provide a valid slug.")
        return data
Пример #5
0
 def test_get_available_slug_recursion(self):
     """ Checks cms.utils.page.get_available_slug for infinite recursion
     """
     for x in range(0, 12):
         page1 = create_page('test copy', 'nav_playground.html', 'en',
                             published=True)
     new_slug = get_available_slug(page1.get_title_obj('en'), 'test-copy')
     self.assertTrue(new_slug, 'test-copy-11')
Пример #6
0
 def test_get_available_slug_recursion(self):
     """ Checks cms.utils.page.get_available_slug for infinite recursion
     """
     for x in range(0, 12):
         page1 = create_page('test copy', 'nav_playground.html', 'en',
                             published=True)
     new_slug = get_available_slug(page1.get_title_obj('en'), 'test-copy')
     self.assertTrue(new_slug, 'test-copy-11')
Пример #7
0
def create_title(language,
                 title,
                 page,
                 menu_title=None,
                 slug=None,
                 redirect=None,
                 meta_description=None,
                 parent=None,
                 overwrite_url=None,
                 page_title=None,
                 path=None):
    """
    Create a title.

    Parent is only used if slug=None.

    See docs/extending_cms/api_reference.rst for more info
    """
    # validate page
    assert isinstance(page, Page)

    # validate language:
    assert language in get_language_list(page.node.site_id)

    # set default slug:
    if not slug:
        base = page.get_path_for_slug(slugify(title), language)
        slug = get_available_slug(page.node.site, base, language)

    if overwrite_url:
        path = overwrite_url.strip('/')
    elif path is None:
        path = page.get_path_for_slug(slug, language)

    title = Title.objects.create(
        language=language,
        title=title,
        menu_title=menu_title,
        page_title=page_title,
        slug=slug,
        path=path,
        redirect=redirect,
        meta_description=meta_description,
        page=page,
        has_url_overwrite=bool(overwrite_url),
    )

    page_languages = page.get_languages()

    if language not in page_languages:
        page.update_languages(page_languages + [language])
    return title
Пример #8
0
 def url(self, create, extracted, **kwargs):
     if not create:
         return
     base = self.page.get_path_for_slug(slugify(self.title), self.language)
     slug = get_available_slug(self.page.node.site, base, self.language)
     PageUrl.objects.get_or_create(
         page=self.page,
         language=self.language,
         defaults={
             'slug': slug,
             'path': self.page.get_path_for_slug(slug, self.language),
         },
     )
Пример #9
0
 def _copy_page(self, page, target_page):
     from cms.utils.page import get_available_slug
     
     data = {
         'position': 'first-child',
         'target': target_page.pk,
         'site': 1,
         'copy_permissions': 'on',
         'copy_moderation': 'on',
     }
     
     response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
     assert(response.status_code, 200)
     
     title = page.title_set.all()[0]
     
     copied_slug = get_available_slug(title)
     copied_page = self.assertObjectExist(Page.objects, title_set__slug=copied_slug, parent=target_page)
     return copied_page
Пример #10
0
    def copy_page(self, page, target_page):
        from cms.utils.page import get_available_slug

        data = {
            "position": "last-child",
            "target": target_page.pk,
            "site": 1,
            "copy_permissions": "on",
            "copy_moderation": "on",
        }

        response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(response.content, "ok")

        title = page.title_set.all()[0]
        copied_slug = get_available_slug(title)

        copied_page = self.assertObjectExist(Page.objects, title_set__slug=copied_slug, parent=target_page)
        return copied_page
Пример #11
0
 def copy_page(self, page, target_page):
     from cms.utils.page import get_available_slug
     
     data = {
         'position': 'last-child',
         'target': target_page.pk,
         'site': 1,
         'copy_permissions': 'on',
         'copy_moderation': 'on',
     }
     
     response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
     self.assertEquals(response.status_code, 200)
     self.assertEquals(response.content, "ok")
     
     title = page.title_set.all()[0] 
     copied_slug = get_available_slug(title)
     
     copied_page = self.assertObjectExist(Page.objects, title_set__slug=copied_slug, parent=target_page)
     return copied_page
Пример #12
0
    def copy_page(self, page, target_page):
        from cms.utils.page import get_available_slug

        data = {
            'position': 'last-child',
            'target': target_page.pk,
            'site': 1,
            'copy_permissions': 'on',
            'copy_moderation': 'on',
        }

        response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
        self.assertEquals(response.status_code, 200)
        # Altered to reflect the new django-js jsonified response messages
        self.assertEquals(response.content, '{"status": 200, "content": "ok"}')

        title = page.title_set.all()[0]
        copied_slug = get_available_slug(title)

        copied_page = self.assertObjectExist(Page.objects, title_set__slug=copied_slug, parent=target_page)
        return copied_page
Пример #13
0
    def copy_page(self, page, target_page, position=0):
        from cms.utils.page import get_available_slug

        data = {
            "position": position,
            "target": target_page.pk,
            "site": 1,
            "copy_permissions": "on",
            "copy_moderation": "on",
        }

        response = self.client.post(URL_CMS_PAGE + "%d/copy-page/" % page.pk, data)
        self.assertEqual(response.status_code, 200)
        title = page.title_set.all()[0]
        copied_slug = get_available_slug(title)
        parent = target_page
        copied_page = self.assertObjectExist(Page.objects, title_set__slug=copied_slug, parent=parent)
        # Altered to reflect the new django-js jsonified response messages
        expected = {"id": copied_page.pk}
        self.assertEqual(json.loads(response.content.decode("utf8")), expected)
        return copied_page
Пример #14
0
 def copy_page(self, target, site, position='first-child', copy_permissions=True, copy_moderation=True):
     """
     copy a page and all its descendants to a new location
     
     Doesn't checks for add page permissions anymore, this is done in PageAdmin.
     """
     from cms.utils.moderator import update_moderation_message
     
     descendants = [self] + list(self.get_descendants().order_by('-rght'))
     tree = [target]
     level_dif = self.level - target.level - 1
     first = True
     for page in descendants:
         new_level = page.level - level_dif
         dif = new_level - tree[-1].level 
         if dif < 0:
             tree = tree[:dif-1]
        
         titles = list(page.title_set.all())
         plugins = list(page.cmsplugin_set.all().order_by('tree_id', '-rght'))
         
         origin_id = page.id
         # IMPORTANT NOTE: self gets changed in next few lines to page!!
         
         page.pk = None
         page.level = None
         page.rght = None
         page.lft = None
         page.tree_id = None
         page.status = Page.MODERATOR_NEED_APPROVEMENT
         page.parent = tree[-1]
         page.public_id = None
         page.reverse_id = None
         page.save()
         
         update_moderation_message(page, _('Page was copied.'))
                     
         # copy moderation, permissions if necessary
         if settings.CMS_PERMISSION and copy_permissions:
             for permission in PagePermission.objects.filter(page__id=origin_id):
                 permission.pk = None
                 permission.page = page
                 permission.save()
         
         if settings.CMS_MODERATOR and copy_moderation:
             for moderator in PageModerator.objects.filter(page__id=origin_id):
                 moderator.pk = None
                 moderator.page = page
                 moderator.save()
         
         if first:
             first = False
             page.move_to(target, position)
         page.site = site
         page.save()
         for title in titles:
             title.pk = None
             title.public_id = None
             title.page = page
             title.slug = get_available_slug(title)
             title.save()
         ptree = []
         for p in plugins:
             plugin, cls = p.get_plugin_instance()
             p.page = page
             p.pk = None
             p.id = None
             p.tree_id = None
             p.lft = None
             p.rght = None
             p.public_id = None
             p.inherited_public_id = None
             
             if p.parent:
                 pdif = p.level - ptree[-1].level
                 if pdif < 0:
                     ptree = ptree[:pdif-1]
                 p.parent = ptree[-1]
                 if pdif != 0:
                     ptree.append(p)
             else:
                 ptree = [p]
             p.level = None
             p.save()
             if plugin:
                 plugin.pk = p.pk
                 plugin.id = p.pk
                 plugin.page = page
                 plugin.tree_id = p.tree_id
                 plugin.lft = p.lft
                 plugin.rght = p.rght
                 plugin.level = p.level
                 plugin.cmsplugin_ptr = p
                 plugin.inherited_public_id = p.inherited_public_id
                 plugin.public_id = p.pk
                 plugin.save()
         if dif != 0:
             tree.append(page)
Пример #15
0
    def copy_page(self,
                  target,
                  site,
                  position='first-child',
                  copy_permissions=True):
        """
        Copy a page [ and all its descendants to a new location ]
        Doesn't checks for add page permissions anymore, this is done in PageAdmin.

        Note: public_copy was added in order to enable the creation of a copy
        for creating the public page during the publish operation as it sets the
        publisher_is_draft=False.

        Note for issue #1166: when copying pages there is no need to check for
        conflicting URLs as pages are copied unpublished.
        """
        from cms.utils.moderator import update_moderation_message

        page_copy = None

        pages = [self] + list(self.get_descendants().order_by('-rght'))

        site_reverse_ids = Page.objects.filter(
            site=site, reverse_id__isnull=False).values_list('reverse_id',
                                                             flat=True)

        if target:
            target.old_pk = -1
            if position == "first-child":
                tree = [target]
            elif target.parent_id:
                tree = [target.parent]
            else:
                tree = []
        else:
            tree = []
        if tree:
            tree[0].old_pk = tree[0].pk

        first = True
        # loop over all affected pages (self is included in descendants)
        for page in pages:
            titles = list(page.title_set.all())
            # get all current placeholders (->plugins)
            placeholders = list(page.placeholders.all())
            origin_id = page.id
            # create a copy of this page by setting pk = None (=new instance)
            page.old_pk = page.pk
            page.pk = None
            page.level = None
            page.rght = None
            page.lft = None
            page.tree_id = None
            page.published = False
            page.publisher_public_id = None
            # only set reverse_id on standard copy
            if page.reverse_id in site_reverse_ids:
                page.reverse_id = None
            if first:
                first = False
                if tree:
                    page.parent = tree[0]
                else:
                    page.parent = None
                page.insert_at(target, position)
            else:
                count = 1
                found = False
                for prnt in tree:
                    if prnt.old_pk == page.parent_id:
                        page.parent = prnt
                        tree = tree[0:count]
                        found = True
                        break
                    count += 1
                if not found:
                    page.parent = None
            tree.append(page)
            page.site = site

            page.save()

            # copy permissions if necessary
            if get_cms_setting('PERMISSION') and copy_permissions:
                from cms.models.permissionmodels import PagePermission

                for permission in PagePermission.objects.filter(
                        page__id=origin_id):
                    permission.pk = None
                    permission.page = page
                    permission.save()

            update_moderation_message(page, unicode(_('Page was copied.')))

            # copy titles of this page
            for title in titles:
                title.pk = None  # setting pk = None creates a new instance
                title.page = page

                # create slug-copy for standard copy
                title.slug = page_utils.get_available_slug(title)
                title.save()

            # copy the placeholders (and plugins on those placeholders!)
            for ph in placeholders:
                plugins = ph.get_plugins_list()
                try:
                    ph = page.placeholders.get(slot=ph.slot)
                except Placeholder.DoesNotExist:
                    ph.pk = None  # make a new instance
                    ph.save()
                    page.placeholders.add(ph)
                    # update the page copy
                    page_copy = page
                if plugins:
                    copy_plugins_to(plugins, ph)

        # invalidate the menu for this site
        menu_pool.clear(site_id=site.pk)
        return page_copy  # return the page_copy or None
Пример #16
0
 def copy_page(self, target, site, position='first-child', copy_permissions=True, copy_moderation=True):
     """
     copy a page and all its descendants to a new location
     
     Doesn't checks for add page permissions anymore, this is done in PageAdmin.
     """
     from cms.utils.moderator import update_moderation_message
     
     descendants = [self] + list(self.get_descendants().order_by('-rght'))
     site_reverse_ids = [ x[0] for x in Page.objects.filter(site=site, reverse_id__isnull=False).values_list('reverse_id') ]
     if target:
         target.old_pk = -1
         if position == "first_child":
             tree = [target]
         elif target.parent_id:
             tree = [target.parent]
         else:
             tree = []
     else:
         tree = []
     if tree:
         tree[0].old_pk = tree[0].pk
     first = True
     for page in descendants:
        
         titles = list(page.title_set.all())
         plugins = list(page.cmsplugin_set.all().order_by('tree_id', '-rght'))
         origin_id = page.id
         page.old_pk = page.pk
         page.pk = None
         page.level = None
         page.rght = None
         page.lft = None
         page.tree_id = None
         page.published = False
         page.publisher_status = Page.MODERATOR_CHANGED
         page.publisher_public_id = None
         if page.reverse_id in site_reverse_ids:
             page.reverse_id = None
         if first:
             first = False
             if tree:
                 page.parent = tree[0]
             else:
                 page.parent = None
             page.insert_at(target, position)
         else:
             count = 1
             found = False
             for prnt in tree:
                 if prnt.old_pk == page.parent_id:
                     page.parent = prnt
                     tree = tree[0:count]
                     found = True
                     break
                 count += 1
             if not found:
                 page.parent = None
         tree.append(page)
         page.site = site
         page.save()
         # copy moderation, permissions if necessary
         if settings.CMS_PERMISSION and copy_permissions:
             from cms.models.permissionmodels import PagePermission
             for permission in PagePermission.objects.filter(page__id=origin_id):
                 permission.pk = None
                 permission.page = page
                 permission.save()
         if settings.CMS_MODERATOR and copy_moderation:
             from cms.models.moderatormodels import PageModerator
             for moderator in PageModerator.objects.filter(page__id=origin_id):
                 moderator.pk = None
                 moderator.page = page
                 moderator.save()
         update_moderation_message(page, unicode(_('Page was copied.')))
         for title in titles:
             title.pk = None
             title.publisher_public_id = None
             title.published = False
             title.page = page
             title.slug = get_available_slug(title)
             title.save()
         ptree = []
         for p in plugins:
             try:
                 plugin, cls = p.get_plugin_instance()
             except KeyError: #plugin type not found anymore
                 continue
             p.page = page
             p.pk = None
             p.id = None
             p.tree_id = None
             p.lft = None
             p.rght = None
             p.inherited_public_id = None
             p.publisher_public_id = None
             if p.parent:
                 pdif = p.level - ptree[-1].level
                 if pdif < 0:
                     ptree = ptree[:pdif-1]
                 p.parent = ptree[-1]
                 if pdif != 0:
                     ptree.append(p)
             else:
                 ptree = [p]
             p.level = None
             p.save()
             if plugin:
                 plugin.pk = p.pk
                 plugin.id = p.pk
                 plugin.page = page
                 plugin.tree_id = p.tree_id
                 plugin.lft = p.lft
                 plugin.rght = p.rght
                 plugin.level = p.level
                 plugin.cmsplugin_ptr = p
                 plugin.publisher_public_id = None
                 plugin.public_id = None
                 plugin.plubished = False
                 plugin.save()
Пример #17
0
 def copy_page(self, target, site, position='first-child', copy_permissions=True, copy_moderation=True):
     """
     copy a page and all its descendants to a new location
     
     Doesn't checks for add page permissions anymore, this is done in PageAdmin.
     """
     from cms.utils.moderator import update_moderation_message
     
     descendants = [self] + list(self.get_descendants().order_by('-rght'))
     site_reverse_ids = Page.objects.filter(site=site, reverse_id__isnull=False).values_list('reverse_id', flat=True)
     if target:
         target.old_pk = -1
         if position == "first-child":
             tree = [target]
         elif target.parent_id:
             tree = [target.parent]
         else:
             tree = []
     else:
         tree = []
     if tree:
         tree[0].old_pk = tree[0].pk
     first = True
     # loop over all affected pages (self is included in descendants)
     for page in descendants:
         titles = list(page.title_set.all())
         # get all current placeholders (->plugins)
         placeholders = list(page.placeholders.all())
         origin_id = page.id
         # create a copy of this page by setting pk = None (=new instance)
         page.old_pk = page.pk
         page.pk = None
         page.level = None
         page.rght = None
         page.lft = None
         page.tree_id = None
         page.published = False
         page.publisher_status = Page.MODERATOR_CHANGED
         page.publisher_public_id = None
         if page.reverse_id in site_reverse_ids:
             page.reverse_id = None
         if first:
             first = False
             if tree:
                 page.parent = tree[0]
             else:
                 page.parent = None
             page.insert_at(target, position)
         else:
             count = 1
             found = False
             for prnt in tree:
                 if prnt.old_pk == page.parent_id:
                     page.parent = prnt
                     tree = tree[0:count]
                     found = True
                     break
                 count += 1
             if not found:
                 page.parent = None
         tree.append(page)
         page.site = site
         page.save()
         # copy moderation, permissions if necessary
         if settings.CMS_PERMISSION and copy_permissions:
             from cms.models.permissionmodels import PagePermission
             for permission in PagePermission.objects.filter(page__id=origin_id):
                 permission.pk = None
                 permission.page = page
                 permission.save()
         if settings.CMS_MODERATOR and copy_moderation:
             from cms.models.moderatormodels import PageModerator
             for moderator in PageModerator.objects.filter(page__id=origin_id):
                 moderator.pk = None
                 moderator.page = page
                 moderator.save()
         update_moderation_message(page, unicode(_('Page was copied.')))
         # copy titles of this page
         for title in titles:
             title.pk = None # setting pk = None creates a new instance
             title.publisher_public_id = None
             title.published = False
             title.page = page
             title.slug = get_available_slug(title)
             title.save()
         # copy the placeholders (and plugins on those placeholders!)
         for ph in placeholders:
             plugins = list(ph.cmsplugin_set.all().order_by('tree_id', '-rght'))
             try:
                 ph = page.placeholders.get(slot=ph.slot)
             except Placeholder.DoesNotExist:
                 ph.pk = None # make a new instance
                 ph.save()
                 page.placeholders.add(ph)
             ptree = []
             for p in plugins:
                 p.copy_plugin(ph, p.language, ptree)
     # invalidate the menu for this site
     menu_pool.clear(site_id=site.pk)
Пример #18
0
    def copy_page(self,
                  target,
                  site,
                  position='first-child',
                  copy_permissions=True,
                  copy_moderation=True,
                  public_copy=False):
        """
        copy a page [ and all its descendants to a new location ]
        Doesn't checks for add page permissions anymore, this is done in PageAdmin.
        
        Note: public_copy was added in order to enable the creation of a copy for creating the public page during
        the publish operation as it sets the publisher_is_draft=False.
        """
        from cms.utils.moderator import update_moderation_message

        page_copy = None

        if public_copy:
            # create a copy of the draft page - existing code loops through pages so added it to a list
            pages = [copy.copy(self)]
        else:
            pages = [self] + list(self.get_descendants().order_by('-rght'))

        if not public_copy:
            site_reverse_ids = Page.objects.filter(
                site=site, reverse_id__isnull=False).values_list('reverse_id',
                                                                 flat=True)

            if target:
                target.old_pk = -1
                if position == "first-child":
                    tree = [target]
                elif target.parent_id:
                    tree = [target.parent]
                else:
                    tree = []
            else:
                tree = []
            if tree:
                tree[0].old_pk = tree[0].pk

        first = True
        # loop over all affected pages (self is included in descendants)
        for page in pages:
            titles = list(page.title_set.all())
            # get all current placeholders (->plugins)
            placeholders = list(page.placeholders.all())
            origin_id = page.id
            # create a copy of this page by setting pk = None (=new instance)
            page.old_pk = page.pk
            page.pk = None
            page.level = None
            page.rght = None
            page.lft = None
            page.tree_id = None
            page.published = False
            page.moderator_state = Page.MODERATOR_CHANGED
            page.publisher_public_id = None
            # only set reverse_id on standard copy
            if not public_copy:
                if page.reverse_id in site_reverse_ids:
                    page.reverse_id = None
                if first:
                    first = False
                    if tree:
                        page.parent = tree[0]
                    else:
                        page.parent = None
                    page.insert_at(target, position)
                else:
                    count = 1
                    found = False
                    for prnt in tree:
                        if prnt.old_pk == page.parent_id:
                            page.parent = prnt
                            tree = tree[0:count]
                            found = True
                            break
                        count += 1
                    if not found:
                        page.parent = None
                tree.append(page)
            page.site = site

            # override default page settings specific for public copy
            if public_copy:
                page.published = True
                page.publisher_is_draft = False
                page.moderator_state = Page.MODERATOR_APPROVED
                # we need to set relate this new public copy to its draft page (self)
                page.publisher_public = self

                # code taken from Publisher publish() overridden here as we need to save the page
                # before we are able to use the page object for titles, placeholders etc.. below
                # the method has been modified to return the object after saving the instance variable
                page = self._publisher_save_public(page)
                page_copy = page  # create a copy used in the return
            else:
                # only need to save the page if it isn't public since it is saved above otherwise
                page.save()

            # copy moderation, permissions if necessary
            if settings.CMS_PERMISSION and copy_permissions:
                from cms.models.permissionmodels import PagePermission
                for permission in PagePermission.objects.filter(
                        page__id=origin_id):
                    permission.pk = None
                    permission.page = page
                    permission.save()
            if settings.CMS_MODERATOR and copy_moderation:
                from cms.models.moderatormodels import PageModerator
                for moderator in PageModerator.objects.filter(
                        page__id=origin_id):
                    moderator.pk = None
                    moderator.page = page
                    moderator.save()

            # update moderation message for standard copy
            if not public_copy:
                update_moderation_message(page, unicode(_('Page was copied.')))

            # copy titles of this page
            for title in titles:
                title.pk = None  # setting pk = None creates a new instance
                title.publisher_public_id = None
                title.published = False
                title.page = page

                # create slug-copy for standard copy
                if not public_copy:
                    title.slug = page_utils.get_available_slug(title)
                title.save()

            # copy the placeholders (and plugins on those placeholders!)
            for ph in placeholders:
                plugins = list(ph.cmsplugin_set.all().order_by(
                    'tree_id', '-rght'))
                try:
                    ph = page.placeholders.get(slot=ph.slot)
                except Placeholder.DoesNotExist:
                    ph.pk = None  # make a new instance
                    ph.save()
                    page.placeholders.add(ph)
                if plugins:
                    copy_plugins_to(plugins, ph)

        # invalidate the menu for this site
        menu_pool.clear(site_id=site.pk)
        return page_copy  # return the page_copy or None
Пример #19
0
    def copy_page(self, target, site, position='first-child',
                  copy_permissions=True):
        """
        Copy a page [ and all its descendants to a new location ]
        Doesn't checks for add page permissions anymore, this is done in PageAdmin.

        Note: public_copy was added in order to enable the creation of a copy
        for creating the public page during the publish operation as it sets the
        publisher_is_draft=False.

        Note for issue #1166: when copying pages there is no need to check for
        conflicting URLs as pages are copied unpublished.
        """
        from cms.utils.moderator import update_moderation_message

        page_copy = None

        pages = [self] + list(self.get_descendants().order_by('-rght'))

        site_reverse_ids = Page.objects.filter(site=site, reverse_id__isnull=False).values_list('reverse_id', flat=True)

        if target:
            target.old_pk = -1
            if position == "first-child":
                tree = [target]
            elif target.parent_id:
                tree = [target.parent]
            else:
                tree = []
        else:
            tree = []
        if tree:
            tree[0].old_pk = tree[0].pk

        first = True
        # loop over all affected pages (self is included in descendants)
        for page in pages:
            titles = list(page.title_set.all())
            # get all current placeholders (->plugins)
            placeholders = list(page.placeholders.all())
            origin_id = page.id
            # create a copy of this page by setting pk = None (=new instance)
            page.old_pk = page.pk
            page.pk = None
            page.level = None
            page.rght = None
            page.lft = None
            page.tree_id = None
            page.published = False
            page.publisher_public_id = None
            # only set reverse_id on standard copy
            if page.reverse_id in site_reverse_ids:
                page.reverse_id = None
            if first:
                first = False
                if tree:
                    page.parent = tree[0]
                else:
                    page.parent = None
                page.insert_at(target, position)
            else:
                count = 1
                found = False
                for prnt in tree:
                    if prnt.old_pk == page.parent_id:
                        page.parent = prnt
                        tree = tree[0:count]
                        found = True
                        break
                    count += 1
                if not found:
                    page.parent = None
            tree.append(page)
            page.site = site

            page.save()

            # copy permissions if necessary
            if get_cms_setting('PERMISSION') and copy_permissions:
                from cms.models.permissionmodels import PagePermission

                for permission in PagePermission.objects.filter(page__id=origin_id):
                    permission.pk = None
                    permission.page = page
                    permission.save()

            update_moderation_message(page, unicode(_('Page was copied.')))

            # copy titles of this page
            for title in titles:
                title.pk = None  # setting pk = None creates a new instance
                title.page = page

                # create slug-copy for standard copy
                title.slug = page_utils.get_available_slug(title)
                title.save()

            # copy the placeholders (and plugins on those placeholders!)
            for ph in placeholders:
                plugins = ph.get_plugins_list()
                try:
                    ph = page.placeholders.get(slot=ph.slot)
                except Placeholder.DoesNotExist:
                    ph.pk = None  # make a new instance
                    ph.save()
                    page.placeholders.add(ph)
                    # update the page copy
                    page_copy = page
                if plugins:
                    copy_plugins_to(plugins, ph)

        # invalidate the menu for this site
        menu_pool.clear(site_id=site.pk)
        return page_copy  # return the page_copy or None
Пример #20
0
    def copy_page(self, target, site, position='first-child', copy_permissions=True, copy_moderation=True, public_copy=False):
        """
        copy a page [ and all its descendants to a new location ]
        Doesn't checks for add page permissions anymore, this is done in PageAdmin.
        
        Note: public_copy was added in order to enable the creation of a copy for creating the public page during
        the publish operation as it sets the publisher_is_draft=False.
        """
        from cms.utils.moderator import update_moderation_message
        
        page_copy = None
        
        if public_copy:
            # create a copy of the draft page - existing code loops through pages so added it to a list 
            pages = [copy.copy(self)]            
        else:
            pages = [self] + list(self.get_descendants().order_by('-rght'))
            
        if not public_copy:    
            site_reverse_ids = Page.objects.filter(site=site, reverse_id__isnull=False).values_list('reverse_id', flat=True)
        
            if target:
                target.old_pk = -1
                if position == "first-child":
                    tree = [target]
                elif target.parent_id:
                    tree = [target.parent]
                else:
                    tree = []
            else:
                tree = []
            if tree:
                tree[0].old_pk = tree[0].pk
            
        first = True
        # loop over all affected pages (self is included in descendants)
        for page in pages:
            titles = list(page.title_set.all())
            # get all current placeholders (->plugins)
            placeholders = list(page.placeholders.all())
            origin_id = page.id
            # create a copy of this page by setting pk = None (=new instance)
            page.old_pk = page.pk
            page.pk = None
            page.level = None
            page.rght = None
            page.lft = None
            page.tree_id = None
            page.published = False
            page.moderator_state = Page.MODERATOR_CHANGED
            page.publisher_public_id = None
            # only set reverse_id on standard copy
            if not public_copy:
                if page.reverse_id in site_reverse_ids:
                    page.reverse_id = None
                if first:
                    first = False
                    if tree:
                        page.parent = tree[0]
                    else:
                        page.parent = None
                    page.insert_at(target, position)
                else:
                    count = 1
                    found = False
                    for prnt in tree:
                        if prnt.old_pk == page.parent_id:
                            page.parent = prnt
                            tree = tree[0:count]
                            found = True
                            break
                        count += 1
                    if not found:
                        page.parent = None
                tree.append(page)
            page.site = site
             
            # override default page settings specific for public copy
            if public_copy:
                page.published = True
                page.publisher_is_draft=False
                page.moderator_state = Page.MODERATOR_APPROVED
                # we need to set relate this new public copy to its draft page (self)
                page.publisher_public = self
                
                # code taken from Publisher publish() overridden here as we need to save the page
                # before we are able to use the page object for titles, placeholders etc.. below
                # the method has been modified to return the object after saving the instance variable
                page = self._publisher_save_public(page)
                page_copy = page    # create a copy used in the return
            else:    
                # only need to save the page if it isn't public since it is saved above otherwise
                page.save()

            # copy moderation, permissions if necessary
            if settings.CMS_PERMISSION and copy_permissions:
                from cms.models.permissionmodels import PagePermission
                for permission in PagePermission.objects.filter(page__id=origin_id):
                    permission.pk = None
                    permission.page = page
                    permission.save()
            if settings.CMS_MODERATOR and copy_moderation:
                from cms.models.moderatormodels import PageModerator
                for moderator in PageModerator.objects.filter(page__id=origin_id):
                    moderator.pk = None
                    moderator.page = page
                    moderator.save()
                    
            # update moderation message for standard copy
            if not public_copy:
                update_moderation_message(page, unicode(_('Page was copied.')))
            
            # copy titles of this page
            for title in titles:
                title.pk = None # setting pk = None creates a new instance
                title.publisher_public_id = None
                title.published = False
                title.page = page
                
                # create slug-copy for standard copy
                if not public_copy:
                    title.slug = get_available_slug(title)
                title.save()
                
            # copy the placeholders (and plugins on those placeholders!)
            for ph in placeholders:
                plugins = list(ph.cmsplugin_set.all().order_by('tree_id', '-rght'))
                try:
                    ph = page.placeholders.get(slot=ph.slot)
                except Placeholder.DoesNotExist:
                    ph.pk = None # make a new instance
                    ph.save()
                    page.placeholders.add(ph)
                if plugins:
                    copy_plugins_to(plugins, ph)
                    
        # invalidate the menu for this site
        menu_pool.clear(site_id=site.pk)
        return page_copy   # return the page_copy or None
Пример #21
0
    def copy_page(self,
                  target,
                  site,
                  position='first-child',
                  copy_permissions=True,
                  copy_moderation=True):
        """
        copy a page and all its descendants to a new location
        
        Doesn't checks for add page permissions anymore, this is done in PageAdmin.
        """
        from cms.utils.moderator import update_moderation_message

        descendants = [self] + list(self.get_descendants().order_by('-rght'))
        site_reverse_ids = [
            x[0] for x in Page.objects.filter(
                site=site, reverse_id__isnull=False).values_list('reverse_id')
        ]
        if target:
            target.old_pk = -1
            if position == "first_child":
                tree = [target]
            elif target.parent_id:
                tree = [target.parent]
            else:
                tree = []
        else:
            tree = []
        if tree:
            tree[0].old_pk = tree[0].pk
        first = True
        for page in descendants:

            titles = list(page.title_set.all())
            plugins = list(page.cmsplugin_set.all().order_by(
                'tree_id', '-rght'))
            origin_id = page.id
            page.old_pk = page.pk
            page.pk = None
            page.level = None
            page.rght = None
            page.lft = None
            page.tree_id = None
            page.published = False
            page.publisher_status = Page.MODERATOR_CHANGED
            page.publisher_public_id = None
            if page.reverse_id in site_reverse_ids:
                page.reverse_id = None
            if first:
                first = False
                if tree:
                    page.parent = tree[0]
                else:
                    page.parent = None
                page.insert_at(target, position)
            else:
                count = 1
                found = False
                for prnt in tree:
                    if prnt.old_pk == page.parent_id:
                        page.parent = prnt
                        tree = tree[0:count]
                        found = True
                        break
                    count += 1
                if not found:
                    page.parent = None
            tree.append(page)
            page.site = site
            page.save()
            # copy moderation, permissions if necessary
            if settings.CMS_PERMISSION and copy_permissions:
                from cms.models.permissionmodels import PagePermission
                for permission in PagePermission.objects.filter(
                        page__id=origin_id):
                    permission.pk = None
                    permission.page = page
                    permission.save()
            if settings.CMS_MODERATOR and copy_moderation:
                from cms.models.moderatormodels import PageModerator
                for moderator in PageModerator.objects.filter(
                        page__id=origin_id):
                    moderator.pk = None
                    moderator.page = page
                    moderator.save()
            update_moderation_message(page, unicode(_('Page was copied.')))
            for title in titles:
                title.pk = None
                title.publisher_public_id = None
                title.published = False
                title.page = page
                title.slug = get_available_slug(title)
                title.save()
            ptree = []
            for p in plugins:
                try:
                    plugin, cls = p.get_plugin_instance()
                except KeyError:  #plugin type not found anymore
                    continue
                p.page = page
                p.pk = None
                p.id = None
                p.tree_id = None
                p.lft = None
                p.rght = None
                p.inherited_public_id = None
                p.publisher_public_id = None
                if p.parent:
                    pdif = p.level - ptree[-1].level
                    if pdif < 0:
                        ptree = ptree[:pdif - 1]
                    p.parent = ptree[-1]
                    if pdif != 0:
                        ptree.append(p)
                else:
                    ptree = [p]
                p.level = None
                p.save()
                if plugin:
                    plugin.pk = p.pk
                    plugin.id = p.pk
                    plugin.page = page
                    plugin.tree_id = p.tree_id
                    plugin.lft = p.lft
                    plugin.rght = p.rght
                    plugin.level = p.level
                    plugin.cmsplugin_ptr = p
                    plugin.publisher_public_id = None
                    plugin.public_id = None
                    plugin.plubished = False
                    plugin.save()