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
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)
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
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()
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)
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
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
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()