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
Exemple #2
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)
Exemple #3
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
Exemple #4
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()
Exemple #5
0
 def save_model(self, request, obj, form, change):
     """
     Move the page in the tree if neccesary and save every placeholder
     Content object.
     """
     target = request.GET.get('target', None)
     position = request.GET.get('position', None)
     
     if 'recover' in request.path:
         pk = obj.pk
         if obj.parent_id:
             parent = Page.objects.get(pk=obj.parent_id)
         else:
             parent = None
         obj.lft = 0
         obj.rght = 0
         obj.tree_id = 0
         obj.level = 0
         obj.pk = None
         obj.insert_at(parent, commit=False)
         obj.pk = pk
         obj.save(no_signals=True)
         obj.save()
     else:
         if 'revert' in request.path:
             old_obj = Page.objects.get(pk=obj.pk)
             obj.level = old_obj.level
             obj.parent_id = old_obj.parent_id
             obj.rght = old_obj.rght
             obj.lft = old_obj.lft
             obj.tree_id = old_obj.tree_id
         force_with_moderation = target is not None and position is not None and \
             will_require_moderation(target, position)
         
         obj.save(force_with_moderation=force_with_moderation)
     language = form.cleaned_data['language']
     
     if target is not None and position is not None:
         try:
             target = self.model.objects.get(pk=target)
         except self.model.DoesNotExist:
             pass
         else:
             obj.move_to(target, position)
             
     
     
     Title.objects.set_or_create(
         obj, 
         language, 
         slug=form.cleaned_data['slug'],
         title=form.cleaned_data['title'],
         application_urls=form.cleaned_data.get('application_urls', None),
         overwrite_url=form.cleaned_data.get('overwrite_url', None),
         redirect=form.cleaned_data.get('redirect', None),
         meta_description=form.cleaned_data.get('meta_description', None),
         meta_keywords=form.cleaned_data.get('meta_keywords', None),
         page_title=form.cleaned_data.get('page_title', None),
         menu_title=form.cleaned_data.get('menu_title', None),
     )
     
     # is there any moderation message? save/update state
     if settings.CMS_MODERATOR and 'moderator_message' in form.cleaned_data and \
         form.cleaned_data['moderator_message']:
         update_moderation_message(obj, form.cleaned_data['moderator_message'])
 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)
Exemple #7
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
Exemple #8
0
    def save_model(self, request, obj, form, change):
        """
        Move the page in the tree if neccesary and save every placeholder
        Content object.
        """
        target = request.GET.get('target', None)
        position = request.GET.get('position', None)

        if 'recover' in request.path:
            pk = obj.pk
            if obj.parent_id:
                parent = Page.objects.get(pk=obj.parent_id)
            else:
                parent = None
            obj.lft = 0
            obj.rght = 0
            obj.tree_id = 0
            obj.level = 0
            obj.pk = None
            obj.insert_at(parent, commit=False)
            obj.pk = pk
            obj.save(no_signals=True)
            obj.save()
        else:
            if 'revert' in request.path:
                old_obj = Page.objects.get(pk=obj.pk)
                obj.level = old_obj.level
                obj.parent_id = old_obj.parent_id
                obj.rght = old_obj.rght
                obj.lft = old_obj.lft
                obj.tree_id = old_obj.tree_id
            force_with_moderation = target is not None and position is not None and \
                will_require_moderation(target, position)

            obj.save(force_with_moderation=force_with_moderation)
        language = form.cleaned_data['language']

        if target is not None and position is not None:
            try:
                target = self.model.objects.get(pk=target)
            except self.model.DoesNotExist:
                pass
            else:
                obj.move_to(target, position)

        Title.objects.set_or_create(
            obj,
            language,
            slug=form.cleaned_data['slug'],
            title=form.cleaned_data['title'],
            application_urls=form.cleaned_data.get('application_urls', None),
            overwrite_url=form.cleaned_data.get('overwrite_url', None),
            redirect=form.cleaned_data.get('redirect', None),
            meta_description=form.cleaned_data.get('meta_description', None),
            meta_keywords=form.cleaned_data.get('meta_keywords', None),
            page_title=form.cleaned_data.get('page_title', None),
            menu_title=form.cleaned_data.get('menu_title', None),
        )

        # is there any moderation message? save/update state
        if settings.CMS_MODERATOR and 'moderator_message' in form.cleaned_data and \
            form.cleaned_data['moderator_message']:
            update_moderation_message(obj,
                                      form.cleaned_data['moderator_message'])
Exemple #9
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
Exemple #10
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()