def change_language_menu(self): if self.toolbar.edit_mode and self.page: language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) if not language_menu: return None languages = get_language_dict(self.current_site.pk) remove = [(code, languages.get(code, code)) for code in self.page.get_languages() if code in languages] add = [l for l in languages.items() if l not in remove] copy = [(code, name) for code, name in languages.items() if code != self.current_lang and (code, name) in remove] if add or remove or copy: language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK) if add: add_plugins_menu = language_menu.get_or_create_menu( '{0}-add'.format(LANGUAGE_MENU_IDENTIFIER), _('Add Translation')) page_change_url = admin_reverse('cms_page_change', args=(self.page.pk, )) for code, name in add: url = add_url_parameters(page_change_url, language=code) add_plugins_menu.add_modal_item(name, url=url) if remove: remove_plugins_menu = language_menu.get_or_create_menu( '{0}-del'.format(LANGUAGE_MENU_IDENTIFIER), _('Delete Translation')) translation_delete_url = admin_reverse( 'cms_page_delete_translation', args=(self.page.pk, )) disabled = len(remove) == 1 for code, name in remove: url = add_url_parameters(translation_delete_url, language=code) remove_plugins_menu.add_modal_item(name, url=url, disabled=disabled) if copy: copy_plugins_menu = language_menu.get_or_create_menu( '{0}-copy'.format(LANGUAGE_MENU_IDENTIFIER), _('Copy all plugins')) title = _('from %s') question = _('Are you sure you want copy all plugins from %s?') page_copy_url = admin_reverse('cms_page_copy_language', args=(self.page.pk, )) for code, name in copy: copy_plugins_menu.add_ajax_item( title % name, action=page_copy_url, data={ 'source_language': code, 'target_language': self.current_lang }, question=question % name, on_success=self.toolbar.REFRESH_PAGE)
def change_language_menu(self): if self.toolbar.edit_mode and self.page: language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) if not language_menu: return None languages = get_language_tuple(self.current_site.pk) languages_dict = dict(languages) remove = [(code, languages_dict.get(code, code)) for code in self.page.get_languages()] add = [l for l in languages if l not in remove] copy = [(code, name) for code, name in languages if code != self.current_lang and (code, name) in remove] if add: language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK) page_change_url = admin_reverse('cms_page_change', args=(self.page.pk, )) title = _('Add %(language)s Translation') for code, name in add: url = add_url_parameters(page_change_url, language=code) language_menu.add_modal_item(title % {'language': name}, url=url) if remove: language_menu.add_break(REMOVE_PAGE_LANGUAGE_BREAK) translation_delete_url = admin_reverse( 'cms_page_delete_translation', args=(self.page.pk, )) title = _('Delete %(language)s Translation') disabled = len(remove) == 1 for code, name in remove: url = add_url_parameters(translation_delete_url, language=code) language_menu.add_modal_item(title % {'language': name}, url=url, disabled=disabled) if copy: language_menu.add_break(COPY_PAGE_LANGUAGE_BREAK) page_copy_url = admin_reverse('cms_page_copy_language', args=(self.page.pk, )) title = _('Copy all plugins from %s') question = _('Are you sure you want copy all plugins from %s?') for code, name in copy: language_menu.add_ajax_item( title % name, action=page_copy_url, data={ 'source_language': code, 'target_language': self.current_lang }, question=question % name, on_success=self.toolbar.REFRESH_PAGE)
def post_template_populate(self): if (self.toolbar.edit_mode and self.article and self.article.has_publish_permission(self.request) and self.article.is_dirty(self.current_lang)): classes = [ 'cms-btn-action', 'cms-btn-publish', 'cms-btn-publish-active', 'cms-publish-article' ] title = _('Publish article now') params = {} params['redirect'] = self.request.path_info with force_language(self.current_lang): url = admin_reverse('cms_articles_article_publish_article', args=(self.article.pk, self.current_lang)) url = add_url_parameters(url, params) self.toolbar.add_button(title, url=url, extra_classes=classes, side=self.toolbar.RIGHT, disabled=False)
def change_language_menu(self): if self.toolbar.edit_mode_active and self.page: can_change = page_permissions.user_can_change_page( user=self.request.user, page=self.page, site=self.current_site, ) else: can_change = False if can_change: language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) if not language_menu: return None languages = get_language_dict(self.current_site.pk) remove = [(code, languages.get(code, code)) for code in self.page.get_languages() if code in languages] add = [l for l in languages.items() if l not in remove] if add: language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK) add_plugins_menu = language_menu.get_or_create_menu( '{0}-add'.format(LANGUAGE_MENU_IDENTIFIER), _('Add Translation')) page_add_url = admin_reverse('cms_pagecontent_add') for code, name in add: url = add_url_parameters(page_add_url, cms_page=self.page.pk, language=code) add_plugins_menu.add_modal_item(name, url=url)
def add_publish_button(self, classes=('cms_btn-action', 'cms_btn-publish',)): # only do dirty lookups if publish permission is granted else button isn't added anyway if self.toolbar.edit_mode and self.has_publish_permission(): classes = list(classes or []) pk = self.page.pk if self.page else 0 dirty = (bool(self.dirty_statics) or (self.page and (self.page.is_dirty(self.current_lang) or self.page_is_pending(self.page, self.current_lang)))) if dirty: classes.append('cms_btn-publish-active') if self.dirty_statics or (self.page and self.page.is_published(self.current_lang)): title = _('Publish changes') else: title = _('Publish page now') classes.append('cms_publish-page') params = {} if self.dirty_statics: params['statics'] = ','.join(str(sp.pk) for sp in self.dirty_statics) if self.in_apphook(): params['redirect'] = self.request.path_info with force_language(self.current_lang): url = admin_reverse('cms_page_publish_page', args=(pk, self.current_lang)) url = add_url_parameters(url, params) self.toolbar.add_button(title, url=url, extra_classes=classes, side=self.toolbar.RIGHT, disabled=not dirty)
def _version_list_url(versionable, **params): proxy = versionable.version_model_proxy return add_url_parameters( admin_reverse('{app}_{model}_changelist'.format( app=proxy._meta.app_label, model=proxy._meta.model_name, )), **params)
def compare_view(self, request, object_id): """Compares two versions """ # Get version 1 (the version we're comparing against) v1 = self.get_object(request, unquote(object_id)) if v1 is None: return self._get_obj_does_not_exist_redirect( request, self.model._meta, object_id) persist_params = { get_cms_setting('CMS_TOOLBAR_URL__DISABLE'): 1, get_cms_setting('CMS_TOOLBAR_URL__PERSIST'): 0, } v1_preview_url = add_url_parameters( reverse( 'admin:cms_placeholder_render_object_preview', args=(v1.content_type_id, v1.object_id), ), **persist_params ) # Get the list of versions for the grouper. This is for use # in the dropdown to choose a version. version_list = Version.objects.filter_by_grouper(v1.grouper) # Add the above to context context = { 'version_list': version_list, 'v1': v1, 'v1_preview_url': v1_preview_url, } # Now check if version 2 has been specified and add to context # if yes if 'compare_to' in request.GET: v2 = self.get_object(request, unquote(request.GET['compare_to'])) if v2 is None: return self._get_obj_does_not_exist_redirect( request, self.model._meta, request.GET['compare_to']) else: context['v2'] = v2 context['v2_preview_url'] = add_url_parameters( reverse( 'admin:cms_placeholder_render_object_preview', args=(v2.content_type_id, v2.object_id), ), **persist_params ) return TemplateResponse( request, 'djangocms_versioning/admin/compare.html', context)
def change_language_menu(self): if self.toolbar.edit_mode_active and self.page: can_change = page_permissions.user_can_change_page( user=self.request.user, page=self.page, site=self.current_site) else: can_change = False if can_change: language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) if not language_menu: return None languages = get_language_dict(self.current_site.pk) remove = [(code, languages.get(code, code)) for code in self.page.get_languages() if code in languages] add = [code for code in languages.items() if code not in remove] copy = [(code, name) for code, name in languages.items() if code != self.current_lang and (code, name) in remove] if add: language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK) add_plugins_menu = language_menu.get_or_create_menu( "{0}-add".format(LANGUAGE_MENU_IDENTIFIER), _("Add Translation")) page_add_url = admin_reverse("cms_pagecontent_add") for code, name in add: url = add_url_parameters(page_add_url, cms_page=self.page.pk, language=code) add_plugins_menu.add_modal_item(name, url=url) if copy: copy_plugins_menu = language_menu.get_or_create_menu( '{0}-copy'.format(LANGUAGE_MENU_IDENTIFIER), _('Copy all plugins')) title = _('from %s') question = _( 'Are you sure you want to copy all plugins from %s?') for code, name in copy: # Get the Draft or Published PageContent. page_content = self.get_page_content(language=code) page_copy_url = admin_reverse( 'cms_pagecontent_copy_language', args=(page_content.pk, )) copy_plugins_menu.add_ajax_item( title % name, action=page_copy_url, data={ 'source_language': code, 'target_language': self.current_lang }, question=question % name, on_success=self.toolbar.REFRESH_PAGE)
def dispatch(self, request, *args, **kwargs): user = request.user self.page_id = args[0] self.language = args[1] self.page = get_page_or_404(self.page_id, self.language) self.workflow = None self.active_request = get_active_moderation_request(self.page, self.language) if self.active_request: self.workflow = self.active_request.workflow needs_ongoing = self.action in (constants.ACTION_APPROVED, constants.ACTION_REJECTED) if self.action == constants.ACTION_STARTED: # Can't start new request if there's one already. return HttpResponseBadRequest('Page already has an active moderation request.') elif self.active_request.is_approved() and needs_ongoing: # Can't reject or approve a moderation request whose steps have all # already been approved. return HttpResponseBadRequest('Moderation request has already been approved.') elif needs_ongoing and not self.active_request.user_can_take_moderation_action(user): # User can't approve or reject a request where he's not part of the workflow return HttpResponseForbidden('User is not allowed to update request.') elif self.action == constants.ACTION_APPROVED: next_step = self.active_request.user_get_step(self.request.user) confirmation_is_valid = True if next_step and next_step.role: confirmation_page_instance = next_step.role.confirmation_page else: confirmation_page_instance = None if confirmation_page_instance: confirmation_is_valid = confirmation_page_instance.is_valid( active_request=self.active_request, for_step=next_step, is_reviewed=request.GET.get('reviewed'), ) if not confirmation_is_valid: redirect_url = add_url_parameters( confirmation_page_instance.get_absolute_url(), content_view=True, page=self.page_id, language=self.language, ) return HttpResponseRedirect(redirect_url) elif self.action != constants.ACTION_STARTED: # All except for the new request endpoint require an active moderation request return HttpResponseBadRequest('Page does not have an active moderation request.') elif request.GET.get('workflow'): self.workflow = get_workflow_or_none(request.GET.get('workflow')) else: self.workflow = get_page_moderation_workflow(self.page) if not self.workflow: return HttpResponseBadRequest('No moderation workflow exists for page.') return super(ModerationRequestView, self).dispatch(request, *args, **kwargs)
def compare_view(self, request, object_id): """Compares two versions """ # Get version 1 (the version we're comparing against) v1 = self.get_object(request, unquote(object_id)) if v1 is None: return self._get_obj_does_not_exist_redirect( request, self.model._meta, object_id) persist_params = { get_cms_setting("CMS_TOOLBAR_URL__DISABLE"): 1, get_cms_setting("CMS_TOOLBAR_URL__PERSIST"): 0, } v1_preview_url = add_url_parameters( reverse( "admin:cms_placeholder_render_object_preview", args=(v1.content_type_id, v1.object_id), ), **persist_params) # Get the list of versions for the grouper. This is for use # in the dropdown to choose a version. version_list = Version.objects.filter_by_content_grouping_values( v1.content).order_by("-number") # Add the above to context context = { "version_list": version_list, "v1": v1, "v1_preview_url": v1_preview_url, "return_url": version_list_url(v1.content), } # Now check if version 2 has been specified and add to context # if yes if "compare_to" in request.GET: v2 = self.get_object(request, unquote(request.GET["compare_to"])) if v2 is None: return self._get_obj_does_not_exist_redirect( request, self.model._meta, request.GET["compare_to"]) else: context["v2"] = v2 context["v2_preview_url"] = add_url_parameters( reverse( "admin:cms_placeholder_render_object_preview", args=(v2.content_type_id, v2.object_id), ), **persist_params) return TemplateResponse(request, "djangocms_versioning/admin/compare.html", context)
def change_admin_menu(self): if self.has_page_change_permission(): admin_menu = self.toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER) url = admin_reverse('cms_page_changelist') # cms page admin params = {'language': self.toolbar.language} if self.page: params['page_id'] = self.page.pk url = add_url_parameters(url, params) admin_menu.add_sideframe_item(_('Pages'), url=url, position=0)
def form_valid(self, form): selected_workflow = form.cleaned_data['workflow'] redirect_url = add_url_parameters( get_admin_url( name='cms_moderation_new_request', language=self.current_lang, args=(self.page_id, self.current_lang), ), workflow=selected_workflow.pk ) return HttpResponseRedirect(redirect_url)
def change_language_menu(self): if self.toolbar.edit_mode and self.page: language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) if not language_menu: return None languages = get_language_dict(self.current_site.pk) remove = [(code, languages.get(code, code)) for code in self.page.get_languages() if code in languages] add = [l for l in languages.items() if l not in remove] copy = [(code, name) for code, name in languages.items() if code != self.current_lang and (code, name) in remove] if add or remove or copy: language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK) if add: add_plugins_menu = language_menu.get_or_create_menu('{0}-add'.format(LANGUAGE_MENU_IDENTIFIER), _('Add Translation')) page_change_url = admin_reverse('cms_page_change', args=(self.page.pk,)) for code, name in add: url = add_url_parameters(page_change_url, language=code) add_plugins_menu.add_modal_item(name, url=url) if remove: remove_plugins_menu = language_menu.get_or_create_menu('{0}-del'.format(LANGUAGE_MENU_IDENTIFIER), _('Delete Translation')) translation_delete_url = admin_reverse('cms_page_delete_translation', args=(self.page.pk,)) disabled = len(remove) == 1 for code, name in remove: url = add_url_parameters(translation_delete_url, language=code) remove_plugins_menu.add_modal_item(name, url=url, disabled=disabled) if copy: copy_plugins_menu = language_menu.get_or_create_menu('{0}-copy'.format(LANGUAGE_MENU_IDENTIFIER), _('Copy all plugins')) title = _('from %s') question = _('Are you sure you want to copy all plugins from %s?') page_copy_url = admin_reverse('cms_page_copy_language', args=(self.page.pk,)) for code, name in copy: copy_plugins_menu.add_ajax_item( title % name, action=page_copy_url, data={'source_language': code, 'target_language': self.current_lang}, question=question % name, on_success=self.toolbar.REFRESH_PAGE )
def test_renders_content_view(self): response = self.client.get( add_url_parameters( self.cp.get_absolute_url(), content_view=True, page=self.pg1.pk, language='en', )) self.assertEqual(response.status_code, 200) self.assertEqual(response.templates[0].name, self.cp.template) self.assertEqual(response.context['CONFIRMATION_BASE_TEMPLATE'], 'djangocms_moderation/base_confirmation.html')
def get_publish_url(self): pk = self.page.pk if self.page else 0 params = {} if self.dirty_statics: params['statics'] = ','.join(str(sp.pk) for sp in self.dirty_statics) if self.in_apphook(): params['redirect'] = self.toolbar.request_path with force_language(self.current_lang): url = admin_reverse('cms_page_publish_page', args=(pk, self.current_lang)) return add_url_parameters(url, params)
def get_publish_url(self): pk = self.page.pk if self.page else 0 params = {} if self.dirty_statics: params['statics'] = ','.join(str(sp.pk) for sp in self.dirty_statics) if self.in_apphook(): params['redirect'] = self.request.path_info with force_language(self.current_lang): url = admin_reverse('cms_page_publish_page', args=(pk, self.current_lang)) return add_url_parameters(url, params)
def test_renders_post_view(self): response = self.client.post( add_url_parameters( self.cp.get_absolute_url(), content_view=True, page=self.pg1.pk, language='en', )) self.assertEqual(response.status_code, 200) self.assertEqual(response.templates[0].name, self.cp.template) self.assertEqual(response.context['CONFIRMATION_BASE_TEMPLATE'], 'djangocms_moderation/base_confirmation.html') self.assertTrue(response.context['submitted']) redirect_url = add_url_parameters( get_admin_url( name='cms_moderation_approve_request', language='en', args=(self.pg1.pk, 'en'), ), reviewed=True, ) self.assertEqual(response.context['redirect_url'], redirect_url)
def change_language_menu(self): if self.toolbar.edit_mode and self.page: language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) if not language_menu: return None languages = get_language_tuple(self.current_site.pk) languages_dict = dict(languages) remove = [(code, languages_dict.get(code, code)) for code in self.page.get_languages()] add = [l for l in languages if l not in remove] copy = [(code, name) for code, name in languages if code != self.current_lang and (code, name) in remove] if add: language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK) page_change_url = admin_reverse('cms_page_change', args=(self.page.pk,)) title = _('Add %(language)s Translation') for code, name in add: url = add_url_parameters(page_change_url, language=code) language_menu.add_modal_item(title % {'language': name}, url=url) if remove: language_menu.add_break(REMOVE_PAGE_LANGUAGE_BREAK) translation_delete_url = admin_reverse('cms_page_delete_translation', args=(self.page.pk,)) title = _('Delete %(language)s Translation') disabled = len(remove) == 1 for code, name in remove: url = add_url_parameters(translation_delete_url, language=code) language_menu.add_modal_item(title % {'language': name}, url=url, disabled=disabled) if copy: language_menu.add_break(COPY_PAGE_LANGUAGE_BREAK) page_copy_url = admin_reverse('cms_page_copy_language', args=(self.page.pk,)) title = _('Copy all plugins from %s') question = _('Are you sure you want copy all plugins from %s?') for code, name in copy: language_menu.add_ajax_item(title % name, action=page_copy_url, data={'source_language': code, 'target_language': self.current_lang}, question=question % name, on_success=self.toolbar.REFRESH_PAGE)
def test_redirects_to_confirmation_page_if_invalid_check(self): self._create_confirmation_page(self.moderation_request1) response = self.client.get( get_admin_url(name='cms_moderation_approve_request', language='en', args=(self.pg1.pk, 'en'))) redirect_url = add_url_parameters( self.cp.get_absolute_url(), content_view=True, page=self.pg1.pk, language='en', ) self.assertEqual(response.status_code, 302) # redirection self.assertEqual(response.url, redirect_url)
def post_template_populate(self): if (self.toolbar.edit_mode and self.article and self.article.has_publish_permission(self.request) and self.article.is_dirty(self.current_lang)): classes = ['cms-btn-action', 'cms-btn-publish', 'cms-btn-publish-active', 'cms-publish-article'] title = _('Publish article now') params = {} params['redirect'] = self.request.path_info with force_language(self.current_lang): url = admin_reverse('cms_articles_article_publish_article', args=(self.article.pk, self.current_lang)) url = add_url_parameters(url, params) self.toolbar.add_button(title, url=url, extra_classes=classes, side=self.toolbar.RIGHT, disabled=False)
def get_extra_placeholder_menu_items(cls, request, placeholder): data = { 'placeholder': placeholder.pk, 'language': get_language_from_request(request, check_path=True), } endpoint = add_url_parameters(admin_reverse(CREATE_ALIAS_URL_NAME), **data) menu_items = [ PluginMenuItem( _('Create Alias'), endpoint, action='modal', attributes={'icon': 'alias'}, ), ] return menu_items
def get_extra_plugin_menu_items(cls, request, plugin): if plugin.plugin_type == cls.__name__: edit_endpoint = plugin.alias.get_absolute_url() detach_endpoint = admin_reverse( DETACH_ALIAS_PLUGIN_URL_NAME, args=[plugin.pk], ) plugin_menu_items = [ PluginMenuItem( _('Edit Alias'), edit_endpoint, action='', attributes={'icon': 'alias'}, ), ] if cls.can_detach( request.user, plugin.placeholder, plugin.alias.get_plugins(), ): plugin_menu_items.append( PluginMenuItem( _('Detach Alias'), detach_endpoint, action='modal', attributes={'icon': 'alias'}, )) return plugin_menu_items data = { 'plugin': plugin.pk, 'language': get_language_from_request(request, check_path=True), } endpoint = add_url_parameters(admin_reverse(CREATE_ALIAS_URL_NAME), **data) return [ PluginMenuItem( _('Create Alias'), endpoint, action='modal', attributes={'icon': 'alias'}, ), ]
def moderation_confirmation_page(request, confirmation_id): """ This is an implementation of Aldryn-forms to provide a review confirmation page """ confirmation_page_instance = get_object_or_404(ConfirmationPage, pk=confirmation_id) content_view = bool(request.GET.get("content_view")) page_id = request.GET.get("page") language = request.GET.get("language") # Get the correct base template depending on content/build view if content_view: base_template = "djangocms_moderation/base_confirmation.html" else: base_template = "djangocms_moderation/base_confirmation_build.html" context = { "opts": ConfirmationPage._meta, "app_label": ConfirmationPage._meta.app_label, "change": True, "add": False, "is_popup": True, "save_as": False, "has_delete_permission": False, "has_add_permission": False, "has_change_permission": True, "instance": confirmation_page_instance, "is_form_type": confirmation_page_instance.content_type == constants.CONTENT_TYPE_FORM, "content_view": content_view, "CONFIRMATION_BASE_TEMPLATE": base_template, } if request.method == "POST" and page_id and language: context["submitted"] = True context["redirect_url"] = add_url_parameters( get_admin_url( name="cms_moderation_approve_request", language=language, args=(page_id, language), ), reviewed=True, ) return render(request, confirmation_page_instance.template, context)
def test_resubmitted_for_review_signal(self): """Test that re-submitting for review emits a signal """ user = self.get_superuser() reviewer = factories.UserFactory() moderation_request = factories.ModerationRequestFactory( collection__status=constants.COLLECTING, author=user ) moderation_request.collection.author = user moderation_request.collection.save() self.root = factories.RootModerationRequestTreeNodeFactory( moderation_request=moderation_request ) moderation_request.collection.workflow.steps.create( role=Role.objects.create(name="Role 1", user=reviewer), order=1 ) moderation_request.update_status( action=constants.ACTION_REJECTED, by_user=reviewer, to_user=user ) with signal_tester(submitted_for_review) as env: self.client.force_login(user) self.client.post( add_url_parameters( reverse( "admin:djangocms_moderation_moderationrequest_resubmit" ), collection_id=moderation_request.collection_id, ids=self.root.pk, ) ) self.assertEqual(env.call_count, 1) signal = env.calls[0][1] self.assertEqual(signal["sender"], ModerationCollection) self.assertEqual(signal["collection"], moderation_request.collection) self.assertEqual(len(signal["moderation_requests"]), 1) self.assertEqual(signal["moderation_requests"][0], moderation_request) self.assertEqual(signal["user"], user) self.assertTrue(signal["rework"])
def change_admin_menu(self): can_change_page = self.has_page_change_permission() if not can_change_page: # Check if the user has permissions to change at least one page can_change_page = page_permissions.user_can_change_at_least_one_page( user=self.request.user, site=self.current_site, ) if not self._changed_admin_menu and can_change_page: admin_menu = self.toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER) url = admin_reverse('cms_page_changelist') # cms page admin params = {'language': self.toolbar.request_language} if self.page: params['page_id'] = self.page.pk url = add_url_parameters(url, params) admin_menu.add_sideframe_item(_('Pages'), url=url, position=0) # Used to prevent duplicates self._changed_admin_menu = True
def change_admin_menu(self): can_change_page = self.has_page_change_permission() if not can_change_page: # Check if the user has permissions to change at least one page can_change_page = page_permissions.user_can_change_at_least_one_page( user=self.request.user, site=self.current_site, ) if not self._changed_admin_menu and can_change_page: admin_menu = self.toolbar.get_or_create_menu(ADMIN_MENU_IDENTIFIER) url = admin_reverse('cms_page_changelist') # cms page admin params = {'language': self.toolbar.language} if self.page: params['page_id'] = self.page.pk url = add_url_parameters(url, params) admin_menu.add_sideframe_item(_('Pages'), url=url, position=0) # Used to prevent duplicates self._changed_admin_menu = True
def add_items_to_collection(modeladmin, request, queryset): """Action to add queryset to moderation collection.""" version_ids = convert_queryset_to_version_queryset(queryset).values_list( "pk", flat=True) version_ids = [str(x) for x in version_ids] if version_ids: admin_url = add_url_parameters( get_admin_url( name="cms_moderation_items_to_collection", language=request.GET.get("language"), args=(), ), version_ids=",".join(version_ids), return_to_url=request.META.get("HTTP_REFERER", ""), ) return HttpResponseRedirect(admin_url) else: modeladmin.message_user( request, _("No suitable items found to add to moderation collection")) return HttpResponseRedirect(request.META.get("HTTP_REFERER", ""))
def _add_moderation_buttons(self): """ Add submit for moderation button if we can moderate content object and toolbar is in edit mode Display the collection name when object is in moderation """ if not helpers.is_registered_for_moderation(self.toolbar.obj): return if self._is_versioned() and self.toolbar.edit_mode_active: moderation_request = helpers.get_active_moderation_request( self.toolbar.obj) if moderation_request: title, url = helpers.get_moderation_button_title_and_url( moderation_request) self.toolbar.add_sideframe_button(name=title, url=url, side=self.toolbar.RIGHT) # Check if the object is not version locked to someone else elif helpers.is_obj_version_unlocked(self.toolbar.obj, self.request.user): opts = ModerationRequest._meta codename = get_permission_codename("add", opts) if not self.request.user.has_perm( "{app_label}.{codename}".format( app_label=opts.app_label, codename=codename)): return version = Version.objects.get_for_content(self.toolbar.obj) url = add_url_parameters( get_admin_url( name="cms_moderation_items_to_collection", language=self.current_lang, args=(), ), version_ids=version.pk, ) self.toolbar.add_modal_button(name=_("Submit for moderation"), url=url, side=self.toolbar.RIGHT)
def moderation_confirmation_page(request, confirmation_id): confirmation_page_instance = get_object_or_404(ConfirmationPage, pk=confirmation_id) content_view = bool(request.GET.get('content_view')) page_id = request.GET.get('page') language = request.GET.get('language') # Get the correct base template depending on content/build view if content_view: base_template = 'djangocms_moderation/base_confirmation.html' else: base_template = 'djangocms_moderation/base_confirmation_build.html' context = { 'opts': ConfirmationPage._meta, 'app_label': ConfirmationPage._meta.app_label, 'change': True, 'add': False, 'is_popup': True, 'save_as': False, 'has_delete_permission': False, 'has_add_permission': False, 'has_change_permission': True, 'instance': confirmation_page_instance, 'is_form_type': confirmation_page_instance.content_type == constants.CONTENT_TYPE_FORM, 'content_view': content_view, 'CONFIRMATION_BASE_TEMPLATE': base_template, } if request.method == 'POST' and page_id and language: context['submitted'] = True context['redirect_url'] = add_url_parameters( get_admin_url( name='cms_moderation_approve_request', language=language, args=(page_id, language), ), reviewed=True, ) return render(request, confirmation_page_instance.template, context)
def _get_moderation_link(self, version, request): if not is_registered_for_moderation(version.content): return "" if version.state != DRAFT: return "" content_object = version.content moderation_request = get_active_moderation_request(content_object) if moderation_request: title, url = get_moderation_button_title_and_url(moderation_request) return format_html('<a href="{}">{}</a>', url, title) elif is_obj_version_unlocked(content_object, request.user): url = add_url_parameters( get_admin_url(name="cms_moderation_items_to_collection", language="en", args=()), version_ids=version.pk, return_to_url=version_list_url(version.content), ) # TODO use a fancy icon as for the rest of the actions? return format_html('<a href="{}">{}</a>', url, _("Submit for moderation")) return ""
def add_page_menu(self): if self.page and self.has_page_change_permission(): edit_mode = self.toolbar.edit_mode refresh = self.toolbar.REFRESH_PAGE # menu for current page # NOTE: disabled if the current path is "deeper" into the # application's url patterns than its root. This is because # when the Content Manager is at the root of the app-hook, # some of the page options still make sense. current_page_menu = self.toolbar.get_or_create_menu( PAGE_MENU_IDENTIFIER, _('Page'), position=1, disabled=self.in_apphook() and not self.in_apphook_root()) new_page_params = {'edit': 1, 'position': 'last-child'} new_sub_page_params = {'edit': 1, 'position': 'last-child', 'target': self.page.pk} if self.page.parent_id: new_page_params['target'] = self.page.parent_id can_add_sibling_page = page_permissions.user_can_add_subpage( user=self.request.user, target=self.page.parent, ) else: can_add_sibling_page = page_permissions.user_can_add_page( user=self.request.user, site=self.current_site, ) can_add_sub_page = page_permissions.user_can_add_subpage( user=self.request.user, target=self.page, ) # page operations menu add_page_menu = current_page_menu.get_or_create_menu( PAGE_MENU_ADD_IDENTIFIER, _('Create Page'), ) app_page_url = admin_reverse('cms_page_add') add_page_menu_modal_items = ( (_('New Page'), new_page_params, can_add_sibling_page), (_('New Sub Page'), new_sub_page_params, can_add_sub_page), (_('Duplicate this Page'), {'copy_target': self.page.pk}, can_add_sibling_page) ) for title, params, has_perm in add_page_menu_modal_items: params.update(language=self.toolbar.language) add_page_menu.add_modal_item( title, url=add_url_parameters(app_page_url, params), disabled=not has_perm, ) # first break current_page_menu.add_break(PAGE_MENU_FIRST_BREAK) # page edit page_edit_url = '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON') current_page_menu.add_link_item(_('Edit this Page'), disabled=edit_mode, url=page_edit_url) # page settings page_settings_url = admin_reverse('cms_page_change', args=(self.page.pk,)) page_settings_url = add_url_parameters(page_settings_url, language=self.toolbar.language) current_page_menu.add_modal_item(_('Page settings'), url=page_settings_url, disabled=not edit_mode, on_close=refresh) # advanced settings advanced_url = admin_reverse('cms_page_advanced', args=(self.page.pk,)) advanced_url = add_url_parameters(advanced_url, language=self.toolbar.language) advanced_disabled = not edit_mode or not self.page.has_advanced_settings_permission(self.request.user) current_page_menu.add_modal_item(_('Advanced settings'), url=advanced_url, disabled=advanced_disabled) # templates menu if self.toolbar.build_mode or edit_mode: templates_menu = current_page_menu.get_or_create_menu('templates', _('Templates')) action = admin_reverse('cms_page_change_template', args=(self.page.pk,)) for path, name in get_cms_setting('TEMPLATES'): active = self.page.template == path if path == TEMPLATE_INHERITANCE_MAGIC: templates_menu.add_break(TEMPLATE_MENU_BREAK) templates_menu.add_ajax_item(name, action=action, data={'template': path}, active=active, on_success=refresh) # page type page_type_url = admin_reverse('cms_page_add_page_type') page_type_url = add_url_parameters(page_type_url, copy_target=self.page.pk, language=self.toolbar.language) current_page_menu.add_modal_item(_('Save as Page Type'), page_type_url, disabled=not edit_mode) # second break current_page_menu.add_break(PAGE_MENU_SECOND_BREAK) # permissions if self.permissions_activated: permissions_url = admin_reverse('cms_page_permissions', args=(self.page.pk,)) permission_disabled = not edit_mode if not permission_disabled: permission_disabled = not page_permissions.user_can_change_page_permissions( user=self.request.user, page=self.page, ) current_page_menu.add_modal_item(_('Permissions'), url=permissions_url, disabled=permission_disabled) # dates settings dates_url = admin_reverse('cms_page_dates', args=(self.page.pk,)) current_page_menu.add_modal_item(_('Publishing dates'), url=dates_url, disabled=not edit_mode) # third break current_page_menu.add_break(PAGE_MENU_THIRD_BREAK) # navigation toggle nav_title = _('Hide in navigation') if self.page.in_navigation else _('Display in navigation') nav_action = admin_reverse('cms_page_change_innavigation', args=(self.page.pk,)) current_page_menu.add_ajax_item(nav_title, action=nav_action, disabled=not edit_mode, on_success=refresh) # publisher if self.title: if self.title.published: publish_title = _('Unpublish page') publish_url = admin_reverse('cms_page_unpublish', args=(self.page.pk, self.current_lang)) else: publish_title = _('Publish page') publish_url = admin_reverse('cms_page_publish_page', args=(self.page.pk, self.current_lang)) user_can_publish = user_can_publish_page(self.request.user, page=self.page) current_page_menu.add_ajax_item( publish_title, action=publish_url, disabled=not edit_mode or not user_can_publish, on_success=refresh, ) # revert to live current_page_menu.add_break(PAGE_MENU_FOURTH_BREAK) revert_action = admin_reverse('cms_page_revert_to_live', args=(self.page.pk, self.current_lang)) revert_question = _('Are you sure you want to revert to live?') # Only show this action if the page has pending changes and a public version is_enabled = self.page.is_dirty(self.current_lang) and self.page.publisher_public current_page_menu.add_ajax_item( _('Revert to live'), action=revert_action, question=revert_question, disabled=not is_enabled, on_success=refresh, extra_classes=('cms-toolbar-revert',), ) # last break current_page_menu.add_break(PAGE_MENU_LAST_BREAK) # delete delete_url = admin_reverse('cms_page_delete', args=(self.page.pk,)) delete_disabled = not edit_mode or not user_can_delete_page(self.request.user, page=self.page) on_delete_redirect_url = self.get_on_delete_redirect_url() current_page_menu.add_modal_item(_('Delete page'), url=delete_url, on_close=on_delete_redirect_url, disabled=delete_disabled)
def populate(self): # always use draft if we have a page self.page = get_page_draft(self.request.current_page) if not self.page: # Nothing to do return self.lang = get_language_from_request(self.request) try: self.title_page = self.page.title_set.get(language=self.lang) except: # Nothing to do return # # Remove default menu # #self.page_menu = self.toolbar.get_or_create_menu('page') #self.toolbar.remove_item(self.page_menu) # # check global permissions # if get_cms_setting('PERMISSION'): has_global_current_page_change_permission = has_page_change_permission(self.request) else: has_global_current_page_change_permission = False can_change = self.request.current_page and self.request.current_page.has_change_permission(self.request) if has_global_current_page_change_permission or can_change: # Page urls page_url = reverse(PAGE_MENU_ADD) delete_page_url = reverse(PAGE_MENU_DELETE, args=(self.page.pk,)) sub_page_params = {'edit': 1, 'position': 'last-child', 'target': self.page.pk} # Rich page urls rich_page_add_url = reverse(RICHPAGE_MENU_ADD) + '?extended_object=%s' % self.title_page.pk # Rich Slideshow rich_slideshow_add_url = reverse(RICHSLIDESHOW_MENU_ADD) + '?extended_object=%s' % self.page.pk # # build the Pages menu # menu = self.toolbar.get_or_create_menu('rich-page-new', _('Pages'), position=1) menu.add_modal_item(_('New Page'), url=page_url) menu.add_modal_item(_('New Sub Page'), url=add_url_parameters(page_url, sub_page_params)) menu.add_modal_item(_('Delete page'), url=delete_page_url) try: rich_page = RichPage.objects.get(extended_object_id=self.title_page.pk) except RichPage.DoesNotExist: rich_page = None try: rich_slideshow = RichSlideshow.objects.get(extended_object_id=self.page.id) except RichSlideshow.DoesNotExist: rich_slideshow = None if not rich_page: menu.add_break(PAGE_MENU_BREAK) menu.add_modal_item(_('Add article'), url=rich_page_add_url) # # Check if the page has rich content or rich collection # if rich_page: menu.add_break(PAGE_MENU_BREAK) # # Rich page urls # rich_page_change_url = reverse(RICHPAGE_MENU_CHANGE, args=(self.title_page.pk,)) + '?extended_object=%s' % self.title_page.pk rich_page_delete_url = reverse(RICHPAGE_MENU_DELETE, args=(self.title_page.pk,)) + '?extended_object=%s' % self.title_page.pk menu.add_modal_item(_('Edit article'), url=rich_page_change_url) menu.add_modal_item(_('Delete article'), url=rich_page_delete_url) menu.add_break(PAGE_MENU_BREAK) if rich_slideshow: rich_slideshow_change_url = reverse(RICHSLIDESHOW_MENU_CHANGE, args=(rich_slideshow.pk,)) + '?extended_object=%s' % self.page.pk menu.add_modal_item(_('Delete slideshow'), url=rich_slideshow_change_url) else: menu.add_modal_item(_('Add slideshow'), url=rich_slideshow_add_url)
def add_page_menu(self): if self.page and self.has_page_change_permission(): edit_mode = self.toolbar.edit_mode refresh = self.toolbar.REFRESH_PAGE # menu for current page # NOTE: disabled if the current path is "deeper" into the # application's url patterns than its root. This is because # when the Content Manager is at the root of the app-hook, # some of the page options still make sense. current_page_menu = self.toolbar.get_or_create_menu( PAGE_MENU_IDENTIFIER, _('Page'), position=1, disabled=self.in_apphook() and not self.in_apphook_root()) # page operations menu add_page_menu = current_page_menu.get_or_create_menu(PAGE_MENU_ADD_IDENTIFIER, _('Create Page')) app_page_url = admin_reverse('cms_page_add') new_page_params = {'edit': 1, 'position': 'last-child'} if self.page.parent_id: new_page_params['target'] = self.page.parent_id add_page_menu_modal_items = ( (_('New Page'), new_page_params), (_('New Sub Page'), {'edit': 1, 'position': 'last-child', 'target': self.page.pk}), (_('Duplicate this Page'), {'copy_target': self.page.pk}) ) for title, params in add_page_menu_modal_items: params.update(language=self.toolbar.language) add_page_menu.add_modal_item(title, url=add_url_parameters(app_page_url, params)) # first break current_page_menu.add_break(PAGE_MENU_FIRST_BREAK) # page edit page_edit_url = '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON') current_page_menu.add_link_item(_('Edit this Page'), disabled=edit_mode, url=page_edit_url) # page settings page_settings_url = admin_reverse('cms_page_change', args=(self.page.pk,)) page_settings_url = add_url_parameters(page_settings_url, language=self.toolbar.language) current_page_menu.add_modal_item(_('Page settings'), url=page_settings_url, disabled=not edit_mode, on_close=refresh) # advanced settings advanced_url = admin_reverse('cms_page_advanced', args=(self.page.pk,)) advanced_url = add_url_parameters(advanced_url, language=self.toolbar.language) advanced_disabled = not self.page.has_advanced_settings_permission(self.request) or not edit_mode current_page_menu.add_modal_item(_('Advanced settings'), url=advanced_url, disabled=advanced_disabled) # templates menu if self.toolbar.build_mode or edit_mode: templates_menu = current_page_menu.get_or_create_menu('templates', _('Templates')) action = admin_reverse('cms_page_change_template', args=(self.page.pk,)) for path, name in get_cms_setting('TEMPLATES'): active = self.page.template == path if path == TEMPLATE_INHERITANCE_MAGIC: templates_menu.add_break(TEMPLATE_MENU_BREAK) templates_menu.add_ajax_item(name, action=action, data={'template': path}, active=active, on_success=refresh) # page type page_type_url = admin_reverse('cms_page_add_page_type') page_type_url = add_url_parameters(page_type_url, copy_target=self.page.pk, language=self.toolbar.language) current_page_menu.add_modal_item(_('Save as Page Type'), page_type_url, disabled=not edit_mode) # second break current_page_menu.add_break(PAGE_MENU_SECOND_BREAK) # permissions if self.permissions_activated: permissions_url = admin_reverse('cms_page_permissions', args=(self.page.pk,)) permission_disabled = not edit_mode or not self.page.has_change_permissions_permission(self.request) current_page_menu.add_modal_item(_('Permissions'), url=permissions_url, disabled=permission_disabled) # dates settings dates_url = admin_reverse('cms_page_dates', args=(self.page.pk,)) current_page_menu.add_modal_item(_('Publishing dates'), url=dates_url, disabled=not edit_mode) # third break current_page_menu.add_break(PAGE_MENU_THIRD_BREAK) # navigation toggle nav_title = _('Hide in navigation') if self.page.in_navigation else _('Display in navigation') nav_action = admin_reverse('cms_page_change_innavigation', args=(self.page.pk,)) current_page_menu.add_ajax_item(nav_title, action=nav_action, disabled=not edit_mode, on_success=refresh) # publisher if self.title: if self.title.published: publish_title = _('Unpublish page') publish_url = admin_reverse('cms_page_unpublish', args=(self.page.pk, self.current_lang)) else: publish_title = _('Publish page') publish_url = admin_reverse('cms_page_publish_page', args=(self.page.pk, self.current_lang)) current_page_menu.add_ajax_item(publish_title, action=publish_url, disabled=not edit_mode, on_success=refresh) # fourth break current_page_menu.add_break(PAGE_MENU_FOURTH_BREAK) history_menu = current_page_menu.get_or_create_menu(HISTORY_MENU_IDENTIFIER, _('History')) if is_installed('reversion'): from cms.utils.reversion_hacks import reversion, Revision versions = reversion.get_for_object(self.page) if self.page.revision_id: current_revision = Revision.objects.get(pk=self.page.revision_id) has_undo = versions.filter(revision__pk__lt=current_revision.pk).exists() has_redo = versions.filter(revision__pk__gt=current_revision.pk).exists() else: has_redo = False has_undo = versions.count() > 1 undo_action = admin_reverse('cms_page_undo', args=(self.page.pk,)) redo_action = admin_reverse('cms_page_redo', args=(self.page.pk,)) history_menu.add_ajax_item(_('Undo'), action=undo_action, disabled=not has_undo, on_success=refresh) history_menu.add_ajax_item(_('Redo'), action=redo_action, disabled=not has_redo, on_success=refresh) history_menu.add_break(HISTORY_MENU_BREAK) revert_action = admin_reverse('cms_page_revert_page', args=(self.page.pk, self.current_lang)) revert_question = _('Are you sure you want to revert to live?') is_enabled = self.page.is_dirty(self.current_lang) and self.page.publisher_public history_menu.add_ajax_item(_('Revert to live'), action=revert_action, question=revert_question, disabled=not is_enabled, on_success=refresh, extra_classes=('cms-toolbar-revert',)) history_menu.add_modal_item(_('View history'), url=admin_reverse('cms_page_history', args=(self.page.pk,))) # last break current_page_menu.add_break(PAGE_MENU_LAST_BREAK) # delete delete_url = admin_reverse('cms_page_delete', args=(self.page.pk,)) on_delete_redirect_url = self.get_on_delete_redirect_url() current_page_menu.add_modal_item(_('Delete page'), url=delete_url, on_close=on_delete_redirect_url, disabled=not edit_mode)
def get_alias_usage_view_url(alias, **kwargs): url = admin_reverse(USAGE_ALIAS_URL_NAME, args=[alias.pk]) return add_url_parameters(url, **ChainMap(kwargs))
def add_page_menu(self): if self.page and self.has_page_change_permission(): edit_mode = self.toolbar.edit_mode refresh = self.toolbar.REFRESH_PAGE # menu for current page # NOTE: disabled if the current path is "deeper" into the # application's url patterns than its root. This is because # when the Content Manager is at the root of the app-hook, # some of the page options still make sense. current_page_menu = self.toolbar.get_or_create_menu( PAGE_MENU_IDENTIFIER, _('Page'), position=1, disabled=self.in_apphook() and not self.in_apphook_root()) new_page_params = {'edit': 1, 'position': 'last-child'} new_sub_page_params = { 'edit': 1, 'position': 'last-child', 'target': self.page.pk } if self.page.parent_id: new_page_params['target'] = self.page.parent_id can_add_sibling_page = page_permissions.user_can_add_subpage( user=self.request.user, target=self.page.parent, ) else: can_add_sibling_page = page_permissions.user_can_add_page( user=self.request.user, site=self.current_site, ) can_add_sub_page = page_permissions.user_can_add_subpage( user=self.request.user, target=self.page, ) # page operations menu add_page_menu = current_page_menu.get_or_create_menu( PAGE_MENU_ADD_IDENTIFIER, _('Create Page'), ) app_page_url = admin_reverse('cms_page_add') add_page_menu_modal_items = ((_('New Page'), new_page_params, can_add_sibling_page), (_('New Sub Page'), new_sub_page_params, can_add_sub_page), (_('Duplicate this Page'), { 'copy_target': self.page.pk }, can_add_sibling_page)) for title, params, has_perm in add_page_menu_modal_items: params.update(language=self.toolbar.language) add_page_menu.add_modal_item( title, url=add_url_parameters(app_page_url, params), disabled=not has_perm, ) # first break current_page_menu.add_break(PAGE_MENU_FIRST_BREAK) # page edit page_edit_url = '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON') current_page_menu.add_link_item(_('Edit this Page'), disabled=edit_mode, url=page_edit_url) # page settings page_settings_url = admin_reverse('cms_page_change', args=(self.page.pk, )) page_settings_url = add_url_parameters( page_settings_url, language=self.toolbar.language) current_page_menu.add_modal_item(_('Page settings'), url=page_settings_url, disabled=not edit_mode, on_close=refresh) # advanced settings advanced_url = admin_reverse('cms_page_advanced', args=(self.page.pk, )) advanced_url = add_url_parameters(advanced_url, language=self.toolbar.language) advanced_disabled = not edit_mode or not self.page.has_advanced_settings_permission( self.request.user) current_page_menu.add_modal_item(_('Advanced settings'), url=advanced_url, disabled=advanced_disabled) # templates menu if self.toolbar.build_mode or edit_mode: templates_menu = current_page_menu.get_or_create_menu( 'templates', _('Templates')) action = admin_reverse('cms_page_change_template', args=(self.page.pk, )) for path, name in get_cms_setting('TEMPLATES'): active = self.page.template == path if path == TEMPLATE_INHERITANCE_MAGIC: templates_menu.add_break(TEMPLATE_MENU_BREAK) templates_menu.add_ajax_item(name, action=action, data={'template': path}, active=active, on_success=refresh) # page type page_type_url = admin_reverse('cms_page_add_page_type') page_type_url = add_url_parameters(page_type_url, copy_target=self.page.pk, language=self.toolbar.language) current_page_menu.add_modal_item(_('Save as Page Type'), page_type_url, disabled=not edit_mode) # second break current_page_menu.add_break(PAGE_MENU_SECOND_BREAK) # permissions if self.permissions_activated: permissions_url = admin_reverse('cms_page_permissions', args=(self.page.pk, )) permission_disabled = not edit_mode if not permission_disabled: permission_disabled = not page_permissions.user_can_change_page_permissions( user=self.request.user, page=self.page, ) current_page_menu.add_modal_item(_('Permissions'), url=permissions_url, disabled=permission_disabled) # dates settings dates_url = admin_reverse('cms_page_dates', args=(self.page.pk, )) current_page_menu.add_modal_item(_('Publishing dates'), url=dates_url, disabled=not edit_mode) # third break current_page_menu.add_break(PAGE_MENU_THIRD_BREAK) # navigation toggle nav_title = _( 'Hide in navigation') if self.page.in_navigation else _( 'Display in navigation') nav_action = admin_reverse('cms_page_change_innavigation', args=(self.page.pk, )) current_page_menu.add_ajax_item(nav_title, action=nav_action, disabled=not edit_mode, on_success=refresh) # publisher if self.title: if self.title.published: publish_title = _('Unpublish page') publish_url = admin_reverse('cms_page_unpublish', args=(self.page.pk, self.current_lang)) else: publish_title = _('Publish page') publish_url = admin_reverse('cms_page_publish_page', args=(self.page.pk, self.current_lang)) user_can_publish = user_can_publish_page(self.request.user, page=self.page) current_page_menu.add_ajax_item( publish_title, action=publish_url, disabled=not edit_mode or not user_can_publish, on_success=refresh, ) # last break current_page_menu.add_break(PAGE_MENU_LAST_BREAK) # delete delete_url = admin_reverse('cms_page_delete', args=(self.page.pk, )) delete_disabled = not edit_mode or not user_can_delete_page( self.request.user, page=self.page) on_delete_redirect_url = self.get_on_delete_redirect_url() current_page_menu.add_modal_item(_('Delete page'), url=delete_url, on_close=on_delete_redirect_url, disabled=delete_disabled)
def add_page_menu(self): if self.page: edit_mode = self.toolbar.edit_mode_active refresh = self.toolbar.REFRESH_PAGE can_change = user_can_change_page( user=self.request.user, page=self.page, site=self.current_site, ) # menu for current page # NOTE: disabled if the current path is "deeper" into the # application's url patterns than its root. This is because # when the Content Manager is at the root of the app-hook, # some of the page options still make sense. current_page_menu = self.toolbar.get_or_create_menu( PAGE_MENU_IDENTIFIER, _('Page'), position=1, disabled=self.in_apphook() and not self.in_apphook_root()) new_page_params = {'edit': 1} new_sub_page_params = {'edit': 1, 'parent_node': self.page.node_id} if self.page.is_page_type: add_page_url = admin_reverse('cms_pagetype_add') advanced_url = admin_reverse('cms_pagetype_advanced', args=(self.page.pk, )) page_settings_url = admin_reverse('cms_pagetype_change', args=(self.page.pk, )) duplicate_page_url = admin_reverse('cms_pagetype_duplicate', args=[self.page.pk]) else: add_page_url = admin_reverse('cms_page_add') advanced_url = admin_reverse('cms_page_advanced', args=(self.page.pk, )) page_settings_url = admin_reverse('cms_page_change', args=(self.page.pk, )) duplicate_page_url = admin_reverse('cms_page_duplicate', args=[self.page.pk]) can_add_root_page = page_permissions.user_can_add_page( user=self.request.user, site=self.current_site, ) if self.page.parent_page: new_page_params['parent_node'] = self.page.parent_page.node_id can_add_sibling_page = page_permissions.user_can_add_subpage( user=self.request.user, target=self.page.parent_page, ) else: can_add_sibling_page = can_add_root_page can_add_sub_page = page_permissions.user_can_add_subpage( user=self.request.user, target=self.page, ) # page operations menu add_page_menu = current_page_menu.get_or_create_menu( PAGE_MENU_ADD_IDENTIFIER, _('Create Page'), ) add_page_menu_modal_items = ( (_('New Page'), new_page_params, can_add_sibling_page), (_('New Sub Page'), new_sub_page_params, can_add_sub_page), ) for title, params, has_perm in add_page_menu_modal_items: params.update(language=self.toolbar.request_language) add_page_menu.add_modal_item( title, url=add_url_parameters(add_page_url, params), disabled=not has_perm, ) add_page_menu.add_modal_item( _('Duplicate this Page'), url=add_url_parameters( duplicate_page_url, {'language': self.toolbar.request_language}), disabled=not can_add_sibling_page, ) # first break current_page_menu.add_break(PAGE_MENU_FIRST_BREAK) # page edit page_edit_url = '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON') current_page_menu.add_link_item(_('Edit this Page'), disabled=edit_mode, url=page_edit_url) # page settings page_settings_url = add_url_parameters( page_settings_url, language=self.toolbar.request_language) settings_disabled = not edit_mode or not can_change current_page_menu.add_modal_item(_('Page settings'), url=page_settings_url, disabled=settings_disabled, on_close=refresh) # advanced settings advanced_url = add_url_parameters( advanced_url, language=self.toolbar.request_language) can_change_advanced = self.page.has_advanced_settings_permission( self.request.user) advanced_disabled = not edit_mode or not can_change_advanced current_page_menu.add_modal_item(_('Advanced settings'), url=advanced_url, disabled=advanced_disabled) # templates menu if edit_mode: if self.page.is_page_type: action = admin_reverse('cms_pagetype_change_template', args=(self.page.pk, )) else: action = admin_reverse('cms_page_change_template', args=(self.page.pk, )) if can_change_advanced: templates_menu = current_page_menu.get_or_create_menu( 'templates', _('Templates'), disabled=not can_change, ) for path, name in get_cms_setting('TEMPLATES'): active = self.page.template == path if path == TEMPLATE_INHERITANCE_MAGIC: templates_menu.add_break(TEMPLATE_MENU_BREAK) templates_menu.add_ajax_item(name, action=action, data={'template': path}, active=active, on_success=refresh) # page type if not self.page.is_page_type: page_type_url = admin_reverse('cms_pagetype_add') page_type_url = add_url_parameters( page_type_url, source=self.page.pk, language=self.toolbar.request_language) page_type_disabled = not edit_mode or not can_add_root_page current_page_menu.add_modal_item(_('Save as Page Type'), page_type_url, disabled=page_type_disabled) # second break current_page_menu.add_break(PAGE_MENU_SECOND_BREAK) # permissions if self.permissions_activated: permissions_url = admin_reverse('cms_page_permissions', args=(self.page.pk, )) permission_disabled = not edit_mode if not permission_disabled: permission_disabled = not page_permissions.user_can_change_page_permissions( user=self.request.user, page=self.page, ) current_page_menu.add_modal_item(_('Permissions'), url=permissions_url, disabled=permission_disabled) if not self.page.is_page_type: # dates settings dates_url = admin_reverse('cms_page_dates', args=(self.page.pk, )) current_page_menu.add_modal_item( _('Publishing dates'), url=dates_url, disabled=(not edit_mode or not can_change), ) # third break current_page_menu.add_break(PAGE_MENU_THIRD_BREAK) # navigation toggle nav_title = _( 'Hide in navigation') if self.page.in_navigation else _( 'Display in navigation') nav_action = admin_reverse('cms_page_change_innavigation', args=(self.page.pk, )) current_page_menu.add_ajax_item( nav_title, action=nav_action, disabled=(not edit_mode or not can_change), on_success=refresh, ) # publisher if self.title and not self.page.is_page_type: if self.title.published: publish_title = _('Unpublish page') publish_url = admin_reverse('cms_page_unpublish', args=(self.page.pk, self.current_lang)) else: publish_title = _('Publish page') publish_url = admin_reverse('cms_page_publish_page', args=(self.page.pk, self.current_lang)) user_can_publish = user_can_publish_page(self.request.user, page=self.page) current_page_menu.add_ajax_item( publish_title, action=publish_url, disabled=not edit_mode or not user_can_publish, on_success=refresh, ) if self.current_lang and not self.page.is_page_type: # revert to live current_page_menu.add_break(PAGE_MENU_FOURTH_BREAK) revert_action = admin_reverse('cms_page_revert_to_live', args=(self.page.pk, self.current_lang)) revert_question = _('Are you sure you want to revert to live?') # Only show this action if the page has pending changes and a public version is_enabled = (edit_mode and can_change and self.page.is_dirty(self.current_lang) and self.page.publisher_public) current_page_menu.add_ajax_item( _('Revert to live'), action=revert_action, question=revert_question, disabled=not is_enabled, on_success=refresh, extra_classes=('cms-toolbar-revert', ), ) # last break current_page_menu.add_break(PAGE_MENU_LAST_BREAK) # delete if self.page.is_page_type: delete_url = admin_reverse('cms_pagetype_delete', args=(self.page.pk, )) else: delete_url = admin_reverse('cms_page_delete', args=(self.page.pk, )) delete_disabled = not edit_mode or not user_can_delete_page( self.request.user, page=self.page) on_delete_redirect_url = self.get_on_delete_redirect_url() current_page_menu.add_modal_item(_('Delete page'), url=delete_url, on_close=on_delete_redirect_url, disabled=delete_disabled)
def add_page_menu(self): if self.page and self.has_page_change_permission(): edit_mode = self.toolbar.edit_mode refresh = self.toolbar.REFRESH_PAGE # menu for current page current_page_menu = self.toolbar.get_or_create_menu( PAGE_MENU_IDENTIFIER, _('Page'), position=1) # page operations menu add_page_menu = current_page_menu.get_or_create_menu( PAGE_MENU_ADD_IDENTIFIER, _('Add Page')) app_page_url = admin_reverse('cms_page_add') add_page_menu_sideframe_items = ((_('New Page'), { 'edit': 1, 'position': 'last-child', 'target': self.page.parent_id or '' }), (_('New Sub Page'), { 'edit': 1, 'position': 'last-child', 'target': self.page.pk }), (_('Duplicate this Page'), { 'copy_target': self.page.pk })) for title, params in add_page_menu_sideframe_items: params.update(language=self.toolbar.language) add_page_menu.add_sideframe_item(title, url=add_url_parameters( app_page_url, params)) # first break current_page_menu.add_break(PAGE_MENU_FIRST_BREAK) # page edit page_edit_url = '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON') current_page_menu.add_link_item(_('Edit this Page'), disabled=edit_mode, url=page_edit_url) # page settings page_settings_url = admin_reverse('cms_page_change', args=(self.page.pk, )) page_settings_url = add_url_parameters( page_settings_url, language=self.toolbar.language) current_page_menu.add_modal_item(_('Page settings'), url=page_settings_url, disabled=not edit_mode, on_close=refresh) # templates menu if self.toolbar.build_mode or edit_mode: templates_menu = current_page_menu.get_or_create_menu( 'templates', _('Templates')) action = admin_reverse('cms_page_change_template', args=(self.page.pk, )) for path, name in get_cms_setting('TEMPLATES'): active = self.page.template == path if path == TEMPLATE_INHERITANCE_MAGIC: templates_menu.add_break(TEMPLATE_MENU_BREAK) templates_menu.add_ajax_item(name, action=action, data={'template': path}, active=active, on_success=refresh) # second break current_page_menu.add_break(PAGE_MENU_SECOND_BREAK) # advanced settings advanced_url = admin_reverse('cms_page_advanced', args=(self.page.pk, )) advanced_url = add_url_parameters(advanced_url, language=self.toolbar.language) advanced_disabled = not self.page.has_advanced_settings_permission( self.request) or not edit_mode current_page_menu.add_modal_item(_('Advanced settings'), url=advanced_url, disabled=advanced_disabled) # permissions if self.permissions_activated: permissions_url = admin_reverse('cms_page_permissions', args=(self.page.pk, )) permission_disabled = not edit_mode or not self.page.has_change_permissions_permission( self.request) current_page_menu.add_modal_item(_('Permissions'), url=permissions_url, disabled=permission_disabled) # dates settings dates_url = admin_reverse('cms_page_dates', args=(self.page.pk, )) current_page_menu.add_modal_item(_('Publishing dates'), url=dates_url, disabled=not edit_mode) # third break current_page_menu.add_break(PAGE_MENU_THIRD_BREAK) # navigation toggle nav_title = _( 'Hide in navigation') if self.page.in_navigation else _( 'Display in navigation') nav_action = admin_reverse('cms_page_change_innavigation', args=(self.page.pk, )) current_page_menu.add_ajax_item(nav_title, action=nav_action, disabled=not edit_mode, on_success=refresh) # publisher if self.title: if self.title.published: publish_title = _('Unpublish page') publish_url = admin_reverse('cms_page_unpublish', args=(self.page.pk, self.current_lang)) else: publish_title = _('Publish page') publish_url = admin_reverse('cms_page_publish_page', args=(self.page.pk, self.current_lang)) current_page_menu.add_ajax_item(publish_title, action=publish_url, disabled=not edit_mode, on_success=refresh) # fourth break current_page_menu.add_break(PAGE_MENU_FOURTH_BREAK) # delete delete_url = admin_reverse('cms_page_delete', args=(self.page.pk, )) on_delete_redirect_url = self.get_on_delete_redirect_url() current_page_menu.add_modal_item(_('Delete page'), url=delete_url, on_close=on_delete_redirect_url, disabled=not edit_mode) # last break current_page_menu.add_break(PAGE_MENU_LAST_BREAK) # page type page_type_url = admin_reverse('cms_page_add_page_type') page_type_url = add_url_parameters(page_type_url, copy_target=self.page.pk, language=self.toolbar.language) current_page_menu.add_modal_item(_('Save as Page Type'), page_type_url, disabled=not edit_mode)
def add_page_menu(self): if self.page and self.has_page_change_permission(): edit_mode = self.toolbar.edit_mode refresh = self.toolbar.REFRESH_PAGE # menu for current page current_page_menu = self.toolbar.get_or_create_menu(PAGE_MENU_IDENTIFIER, _('Page'), position=1) # page operations menu add_page_menu = current_page_menu.get_or_create_menu(PAGE_MENU_ADD_IDENTIFIER, _('Add Page')) app_page_url = admin_reverse('cms_page_add') add_page_menu_sideframe_items = ( (_('New Page'), {'edit': 1, 'position': 'last-child', 'target': self.page.parent_id or ''}), (_('New Sub Page'), {'edit': 1, 'position': 'last-child', 'target': self.page.pk}), (_('Duplicate this Page'), {'copy_target': self.page.pk}) ) for title, params in add_page_menu_sideframe_items: params.update(language=self.toolbar.language) add_page_menu.add_sideframe_item(title, url=add_url_parameters(app_page_url, params)) # first break current_page_menu.add_break(PAGE_MENU_FIRST_BREAK) # page edit page_edit_url = '?%s' % get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON') current_page_menu.add_link_item(_('Edit this Page'), disabled=edit_mode, url=page_edit_url) # page settings page_settings_url = admin_reverse('cms_page_change', args=(self.page.pk,)) page_settings_url = add_url_parameters(page_settings_url, language=self.toolbar.language) current_page_menu.add_modal_item(_('Page settings'), url=page_settings_url, disabled=not edit_mode, on_close=refresh) # templates menu if self.toolbar.build_mode or edit_mode: templates_menu = current_page_menu.get_or_create_menu('templates', _('Templates')) action = admin_reverse('cms_page_change_template', args=(self.page.pk,)) for path, name in get_cms_setting('TEMPLATES'): active = self.page.template == path if path == TEMPLATE_INHERITANCE_MAGIC: templates_menu.add_break(TEMPLATE_MENU_BREAK) templates_menu.add_ajax_item(name, action=action, data={'template': path}, active=active, on_success=refresh) # second break current_page_menu.add_break(PAGE_MENU_SECOND_BREAK) # advanced settings advanced_url = admin_reverse('cms_page_advanced', args=(self.page.pk,)) advanced_url = add_url_parameters(advanced_url, language=self.toolbar.language) advanced_disabled = not self.page.has_advanced_settings_permission(self.request) or not edit_mode current_page_menu.add_modal_item(_('Advanced settings'), url=advanced_url, disabled=advanced_disabled) # permissions if self.permissions_activated: permissions_url = admin_reverse('cms_page_permissions', args=(self.page.pk,)) permission_disabled = not edit_mode or not self.page.has_change_permissions_permission(self.request) current_page_menu.add_modal_item(_('Permissions'), url=permissions_url, disabled=permission_disabled) # dates settings dates_url = admin_reverse('cms_page_dates', args=(self.page.pk,)) current_page_menu.add_modal_item(_('Publishing dates'), url=dates_url, disabled=not edit_mode) # third break current_page_menu.add_break(PAGE_MENU_THIRD_BREAK) # navigation toggle nav_title = _('Hide in navigation') if self.page.in_navigation else _('Display in navigation') nav_action = admin_reverse('cms_page_change_innavigation', args=(self.page.pk,)) current_page_menu.add_ajax_item(nav_title, action=nav_action, disabled=not edit_mode, on_success=refresh) # publisher if self.title: if self.title.published: publish_title = _('Unpublish page') publish_url = admin_reverse('cms_page_unpublish', args=(self.page.pk, self.current_lang)) else: publish_title = _('Publish page') publish_url = admin_reverse('cms_page_publish_page', args=(self.page.pk, self.current_lang)) current_page_menu.add_ajax_item(publish_title, action=publish_url, disabled=not edit_mode, on_success=refresh) # fourth break current_page_menu.add_break(PAGE_MENU_FOURTH_BREAK) # delete delete_url = admin_reverse('cms_page_delete', args=(self.page.pk,)) on_delete_redirect_url = self.get_on_delete_redirect_url() current_page_menu.add_modal_item(_('Delete page'), url=delete_url, on_close=on_delete_redirect_url, disabled=not edit_mode) # last break current_page_menu.add_break(PAGE_MENU_LAST_BREAK) # page type page_type_url = admin_reverse('cms_page_add_page_type') page_type_url = add_url_parameters(page_type_url, copy_target=self.page.pk, language=self.toolbar.language) current_page_menu.add_modal_item(_('Save as Page Type'), page_type_url, disabled=not edit_mode)