Exemple #1
0
    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)
Exemple #2
0
    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)
Exemple #3
0
    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)
Exemple #6
0
    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)
Exemple #9
0
    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)
Exemple #12
0
 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)
Exemple #13
0
 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)
Exemple #15
0
    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
                    )
Exemple #16
0
 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')
Exemple #17
0
    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)
Exemple #18
0
    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)
Exemple #19
0
 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)
Exemple #20
0
    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)
Exemple #21
0
 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)
Exemple #23
0
    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
Exemple #24
0
    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)
Exemple #26
0
    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"])
Exemple #27
0
    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
Exemple #28
0
    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
Exemple #29
0
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", ""))
Exemple #30
0
    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 ""
Exemple #33
0
    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)
Exemple #35
0
    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))
Exemple #37
0
    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)
Exemple #38
0
    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)
Exemple #39
0
    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)
Exemple #40
0
    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)