def save(self, **kwargs): from cms.api import create_page, add_plugin from cms.utils.permissions import has_page_add_permission # Check to see if this user has permissions to make this page. We've # already checked this when producing a list of wizard entries, but this # is to prevent people from possible form-hacking. if 'sub_page' in self.cleaned_data: sub_page = self.cleaned_data['sub_page'] else: sub_page = False if self.page: if sub_page: parent = self.page position = "last-child" else: parent = self.page.parent position = "right" else: parent = None position = "last-child" # Before we do this, verify this user has perms to do so. if not (self.user.is_superuser or has_page_add_permission(self.user, self.page, position=position, site=self.page.site)): raise NoPermissionsException( _(u"User does not have permission to add page.")) page = create_page( title=self.cleaned_data['title'], slug=self.cleaned_data['slug'], template=get_cms_setting('PAGE_WIZARD_DEFAULT_TEMPLATE'), language=self.language_code, created_by=smart_text(self.user), parent=parent, in_navigation=True, published=False ) page_type = self.cleaned_data.get("page_type") if page_type: copy_target = Page.objects.filter(pk=page_type).first() else: copy_target = None if copy_target: # If the user selected a page type, copy that. if not user_has_view_permission(self.user, copy_target): raise PermissionDenied() # Copy page attributes copy_target._copy_attributes(page, clean=True) page.save() # Copy contents (for each language) for lang in copy_target.get_languages(): copy_target._copy_contents(page, lang) # Copy extensions from cms.extensions import extension_pool extension_pool.copy_extensions(copy_target, page) else: # If the user provided content, then use that instead. content = self.cleaned_data.get('content') plugin_type = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN') plugin_body = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN_BODY') slot = get_cms_setting('PAGE_WIZARD_CONTENT_PLACEHOLDER') if plugin_type in plugin_pool.plugins and plugin_body: if content and permissions.has_plugin_permission( self.user, plugin_type, "add"): placeholder = self.get_placeholder(page, slot=slot) if placeholder: opts = { 'placeholder': placeholder, 'plugin_type': plugin_type, 'language': self.language_code, plugin_body: content, } add_plugin(**opts) # is it home? publish it right away if not self.page and page.is_home: page.publish(self.language_code) if is_installed('reversion'): from cms.utils.helpers import make_revision_with_plugins from cms.constants import REVISION_INITIAL_COMMENT from cms.utils.reversion_hacks import create_revision with create_revision(): make_revision_with_plugins( obj=page, user=self.user, message=ugettext(REVISION_INITIAL_COMMENT), ) return page
def duplicate_view(self, request, object_id): """Duplicate a specified PageContent. Create a new page with content copied from provided PageContent. :param request: Http request :param object_id: PageContent ID (as a string) """ obj = self.get_object(request, unquote(object_id)) if obj is None: return self._get_obj_does_not_exist_redirect( request, self.model._meta, object_id) form = DuplicateForm( user=request.user, page_content=obj, initial={ "site": obj.page.node.site, "slug": obj.page.get_slug(obj.language), }, ) info = (self.model._meta.app_label, self.model._meta.model_name) if request.method == "POST": form = DuplicateForm(request.POST, user=request.user, page_content=obj) if form.is_valid(): new_page = obj.page.copy( site=form.cleaned_data["site"], parent_node=obj.page.node.parent, translations=False, permissions=False, extensions=False, ) new_page_content = api.create_title( page=new_page, language=obj.language, slug=form.cleaned_data["slug"], path=form.cleaned_data["path"], title=obj.title, template=obj.template, created_by=request.user, ) new_page.title_cache[obj.language] = new_page_content extension_pool.copy_extensions(source_page=obj.page, target_page=new_page, languages=[obj.language]) placeholders = obj.get_placeholders() for source_placeholder in placeholders: # Keep all placeholders even if they are not in the template anymore to ensure the data is kept, # keeping only placeholders from rescanning the template would not keep any legacy content # which could in theory be remapped repaired at a later date target_placeholder, created = new_page_content.placeholders.get_or_create( slot=source_placeholder.slot) source_placeholder.copy_plugins(target_placeholder, language=obj.language) self.message_user(request, _("Page has been duplicated")) return redirect(reverse( "admin:{}_{}_changelist".format(*info))) context = dict( obj=obj, form=form, object_id=object_id, duplicate_url=reverse("admin:{}_{}_duplicate".format(*info), args=(obj.pk, )), back_url=reverse("admin:{}_{}_changelist".format(*info)), ) return render(request, "djangocms_pageadmin/admin/duplicate_confirmation.html", context)
def save(self, **kwargs): from cms.api import create_page, add_plugin from cms.cms_wizards import user_has_page_add_permission # Check to see if this user has permissions to make this page. We've # already checked this when producing a list of wizard entries, but this # is to prevent people from possible form-hacking. if 'sub_page' in self.cleaned_data: sub_page = self.cleaned_data['sub_page'] else: sub_page = False if self.page: if sub_page: parent = self.page position = "last-child" else: parent = self.page.parent position = "right" else: parent = None position = "last-child" # Before we do this, verify this user has perms to do so. if not (self.user.is_superuser or user_has_page_add_permission( self.user, self.page, position=position, site=self.page.site_id)): raise NoPermissionsException( _(u"User does not have permission to add page.")) title = self.cleaned_data['title'] page = create_page(title=title, template=get_cms_setting('WIZARD_DEFAULT_TEMPLATE'), language=self.language_code, created_by=smart_text(self.user), parent=parent, in_navigation=True, published=False) page_type = self.cleaned_data.get("page_type") if page_type: copy_target = Page.objects.filter(pk=page_type).first() else: copy_target = None if copy_target: # If the user selected a page type, copy that. if not user_has_view_permission(self.user, copy_target): raise PermissionDenied() # Copy page attributes copy_target._copy_attributes(page, clean=True) page.save() # Copy contents (for each language) for lang in copy_target.get_languages(): copy_target._copy_contents(page, lang) # Copy extensions from cms.extensions import extension_pool extension_pool.copy_extensions(copy_target, page) else: # If the user provided content, then use that instead. content = self.cleaned_data.get('content') if content and permissions.has_plugin_permission( self.user, get_cms_setting('WIZARD_CONTENT_PLUGIN'), "add"): placeholder = self.get_first_placeholder(page) if placeholder: add_plugin( **{ 'placeholder': placeholder, 'plugin_type': get_cms_setting( 'WIZARD_CONTENT_PLUGIN'), 'language': self.language_code, get_cms_setting('WIZARD_CONTENT_PLUGIN_BODY'): content }) return page
def save(self, **kwargs): from cms.api import create_page, add_plugin # Check to see if this user has permissions to make this page. We've # already checked this when producing a list of wizard entries, but this # is to prevent people from possible form-hacking. if 'sub_page' in self.cleaned_data: sub_page = self.cleaned_data['sub_page'] else: sub_page = False if self.page and sub_page: # User is adding a page which will be a direct # child of the current page. position = 'last-child' parent = self.page has_perm = user_can_add_subpage(self.user, target=parent) elif self.page and self.page.parent_id: # User is adding a page which will be a right # sibling to the current page. position = 'last-child' parent = self.page.parent has_perm = user_can_add_subpage(self.user, target=parent) else: parent = None position = 'last-child' has_perm = user_can_add_page(self.user) if not has_perm: raise NoPermissionsException( _(u"User does not have permission to add page.")) page = create_page( title=self.cleaned_data['title'], slug=self.cleaned_data['slug'], template=get_cms_setting('PAGE_WIZARD_DEFAULT_TEMPLATE'), language=self.language_code, created_by=smart_text(self.user), parent=parent, position=position, in_navigation=True, published=False ) page_type = self.cleaned_data.get("page_type") if page_type: copy_target = Page.objects.filter(pk=page_type).first() else: copy_target = None if copy_target: # If the user selected a page type, copy that. if not copy_target.has_view_permission(self.user): raise PermissionDenied() # Copy page attributes copy_target._copy_attributes(page, clean=True) page.save() # Copy contents (for each language) for lang in copy_target.get_languages(): copy_target._copy_contents(page, lang) # Copy extensions from cms.extensions import extension_pool extension_pool.copy_extensions(copy_target, page) else: # If the user provided content, then use that instead. content = self.cleaned_data.get('content') plugin_type = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN') plugin_body = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN_BODY') slot = get_cms_setting('PAGE_WIZARD_CONTENT_PLACEHOLDER') if plugin_type in plugin_pool.plugins and plugin_body: if content and permissions.has_plugin_permission( self.user, plugin_type, "add"): placeholder = self.get_placeholder(page, slot=slot) if placeholder: opts = { 'placeholder': placeholder, 'plugin_type': plugin_type, 'language': self.language_code, plugin_body: content, } add_plugin(**opts) # is it home? publish it right away if not self.page and page.is_home: page.publish(self.language_code) return page
def save(self, **kwargs): from cms.api import create_page, add_plugin from cms.utils.permissions import has_page_add_permission # Check to see if this user has permissions to make this page. We've # already checked this when producing a list of wizard entries, but this # is to prevent people from possible form-hacking. if 'sub_page' in self.cleaned_data: sub_page = self.cleaned_data['sub_page'] else: sub_page = False if self.page: if sub_page: parent = self.page position = "last-child" else: parent = self.page.parent position = "right" else: parent = None position = "last-child" # Before we do this, verify this user has perms to do so. if not (self.user.is_superuser or has_page_add_permission( self.user, self.page, position=position, site=self.page.site)): raise NoPermissionsException( _(u"User does not have permission to add page.")) page = create_page( title=self.cleaned_data['title'], slug=self.cleaned_data['slug'], template=get_cms_setting('PAGE_WIZARD_DEFAULT_TEMPLATE'), language=self.language_code, created_by=smart_text(self.user), parent=parent, in_navigation=True, published=False) page_type = self.cleaned_data.get("page_type") if page_type: copy_target = Page.objects.filter(pk=page_type).first() else: copy_target = None if copy_target: # If the user selected a page type, copy that. if not user_has_view_permission(self.user, copy_target): raise PermissionDenied() # Copy page attributes copy_target._copy_attributes(page, clean=True) page.save() # Copy contents (for each language) for lang in copy_target.get_languages(): copy_target._copy_contents(page, lang) # Copy extensions from cms.extensions import extension_pool extension_pool.copy_extensions(copy_target, page) else: # If the user provided content, then use that instead. content = self.cleaned_data.get('content') plugin_type = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN') plugin_body = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN_BODY') slot = get_cms_setting('PAGE_WIZARD_CONTENT_PLACEHOLDER') if plugin_type in plugin_pool.plugins and plugin_body: if content and permissions.has_plugin_permission( self.user, plugin_type, "add"): placeholder = self.get_placeholder(page, slot=slot) if placeholder: opts = { 'placeholder': placeholder, 'plugin_type': plugin_type, 'language': self.language_code, plugin_body: content, } add_plugin(**opts) # is it home? publish it right away if not self.page and page.is_home: page.publish(self.language_code) if is_installed('reversion'): from cms.utils.helpers import make_revision_with_plugins from cms.constants import REVISION_INITIAL_COMMENT from cms.utils.reversion_hacks import create_revision with create_revision(): make_revision_with_plugins( obj=page, user=self.user, message=ugettext(REVISION_INITIAL_COMMENT), ) return page
def save(self, **kwargs): from cms.api import create_page, add_plugin from cms.cms_wizards import user_has_page_add_permission # Check to see if this user has permissions to make this page. We've # already checked this when producing a list of wizard entries, but this # is to prevent people from possible form-hacking. if 'sub_page' in self.cleaned_data: sub_page = self.cleaned_data['sub_page'] else: sub_page = False if self.page: if sub_page: parent = self.page position = "last-child" else: parent = self.page.parent position = "right" else: parent = None position = "last-child" # Before we do this, verify this user has perms to do so. if not (self.user.is_superuser or user_has_page_add_permission(self.user, self.page, position=position, site=self.page.site_id)): raise NoPermissionsException( _(u"User does not have permission to add page.")) title = self.cleaned_data['title'] page = create_page( title=title, template=get_cms_setting('WIZARD_DEFAULT_TEMPLATE'), language=self.language_code, created_by=smart_text(self.user), parent=parent, in_navigation=True, published=False ) page_type = self.cleaned_data.get("page_type") if page_type: copy_target = Page.objects.filter(pk=page_type).first() else: copy_target = None if copy_target: # If the user selected a page type, copy that. if not user_has_view_permission(self.user, copy_target): raise PermissionDenied() # Copy page attributes copy_target._copy_attributes(page, clean=True) page.save() # Copy contents (for each language) for lang in copy_target.get_languages(): copy_target._copy_contents(page, lang) # Copy extensions from cms.extensions import extension_pool extension_pool.copy_extensions(copy_target, page) else: # If the user provided content, then use that instead. content = self.cleaned_data.get('content') if content and permissions.has_plugin_permission( self.user, get_cms_setting('WIZARD_CONTENT_PLUGIN'), "add"): placeholder = self.get_first_placeholder(page) if placeholder: add_plugin(**{ 'placeholder': placeholder, 'plugin_type': get_cms_setting('WIZARD_CONTENT_PLUGIN'), 'language': self.language_code, get_cms_setting('WIZARD_CONTENT_PLUGIN_BODY'): content }) return page
def save(self, **kwargs): from cms.api import create_page, add_plugin # Check to see if this user has permissions to make this page. We've # already checked this when producing a list of wizard entries, but this # is to prevent people from possible form-hacking. if 'sub_page' in self.cleaned_data: sub_page = self.cleaned_data['sub_page'] else: sub_page = False if self.page and sub_page: # User is adding a page which will be a direct # child of the current page. position = 'last-child' parent = self.page has_perm = user_can_add_subpage(self.user, target=parent) elif self.page and self.page.parent_id: # User is adding a page which will be a right # sibling to the current page. position = 'last-child' parent = self.page.parent has_perm = user_can_add_subpage(self.user, target=parent) else: parent = None position = 'last-child' has_perm = user_can_add_page(self.user) if not has_perm: raise NoPermissionsException( _(u"User does not have permission to add page.")) page = create_page( title=self.cleaned_data['title'], slug=self.cleaned_data['slug'], template=get_cms_setting('PAGE_WIZARD_DEFAULT_TEMPLATE'), language=self.language_code, created_by=smart_text(self.user), parent=parent, position=position, in_navigation=True, published=False ) page_type = self.cleaned_data.get("page_type") if page_type: copy_target = Page.objects.filter(pk=page_type).first() else: copy_target = None if copy_target: # If the user selected a page type, copy that. if not copy_target.has_view_permission(self.user): raise PermissionDenied() # Copy page attributes copy_target._copy_attributes(page, clean=True) page.save() # Copy contents (for each language) for lang in copy_target.get_languages(): copy_target._copy_contents(page, lang) # Copy extensions from cms.extensions import extension_pool extension_pool.copy_extensions(copy_target, page) else: # If the user provided content, then use that instead. content = self.cleaned_data.get('content') plugin_type = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN') plugin_body = get_cms_setting('PAGE_WIZARD_CONTENT_PLUGIN_BODY') slot = get_cms_setting('PAGE_WIZARD_CONTENT_PLACEHOLDER') if plugin_type in plugin_pool.plugins and plugin_body: if content and permissions.has_plugin_permission( self.user, plugin_type, "add"): placeholder = self.get_placeholder(page, slot=slot) if placeholder: opts = { 'placeholder': placeholder, 'plugin_type': plugin_type, 'language': self.language_code, plugin_body: content, } add_plugin(**opts) # is it the first page? publish it right away if not self.page and Page.objects.filter(site_id=page.site_id).count() == 1: page.publish(self.language_code) Page.set_homepage(page, user=self.user) return page
def revise_page(page, language): """ 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 for issue #1166: when copying pages there is no need to check for conflicting URLs as pages are copied unpublished. --> get_queryset_by_path(...).get() will fail """ if not page.publisher_is_draft: raise PublicIsUnmodifiable( "revise page is not allowed for public pages") # if the active version is not dirty -> do not create a revision if page.page_versions.filter(active=True, dirty=False, language=language).count() > 0: return None # avoid muting input param page = Page.objects.get(pk=page.pk) site = page.site version_page_root = get_version_page_root(site=site) origin_id = page.pk # still needed to retrieve titles, placeholders # create a copy of this page by setting pk = None (=new instance) new_page = _copy_model(page, parent=version_page_root) # copy titles of this page for title in Title.objects.filter(page=origin_id, language=language).iterator(): _copy_model(title, page=new_page) print(new_page.title_set.all()) # copy the placeholders (and plugins on those placeholders!) for ph in Placeholder.objects.filter(page=origin_id).iterator(): plugins = ph.get_plugins_list(language=language) try: # why might the placeholder already exist? ph = new_page.placeholders.get(slot=ph.slot) except Placeholder.DoesNotExist: ph = _copy_model(ph) page.placeholders.add(ph) if plugins: copy_plugins_to(plugins, ph, to_language=language) extension_pool.copy_extensions(Page.objects.get(pk=origin_id), new_page, languages=[language]) new_page = new_page.move(version_page_root, pos="last-child") # Copy the permissions from the old page and its parents to the new page # MAP the parent permission to new child permissions mapping = { ACCESS_DESCENDANTS: ACCESS_PAGE_AND_DESCENDANTS, ACCESS_CHILDREN: ACCESS_PAGE } # for_page sadly doesn't work as expected if get_cms_setting('PERMISSION'): origin_page = Page.objects.get(pk=origin_id) # store the new permissions new_permissions = [] # Copy page's permissions for perm in origin_page.pagepermission_set.all(): new_permissions.append(_copy_model(perm, page=new_page)) # the permission of all relevant parents perms = inherited_permissions(origin_page) for perm in perms: latest = _copy_model(perm, page=new_page) if latest.grant_on in mapping.keys(): new_permissions.append(latest) # apply the mapping (see some lines above) latest.grant_on = mapping[latest.grant_on] latest.save() # invalidate the menu for this site menu_pool.clear(site_id=site.pk) return new_page