Ejemplo n.º 1
0
    def edit_redirect_view(self, request, object_id):
        """Redirects to the admin change view and creates a draft version
        if no draft exists yet.
        """
        # This view always changes data so only POST requests should work
        if request.method != 'POST':
            return HttpResponseNotAllowed(
                ['POST'], _('This view only supports POST method.'))

        version = self._get_edit_redirect_version(request, object_id)

        if version is None:
            raise Http404

        # Redirect
        # If the object is editable the cms editable view should be used, with the toolbar.
        if is_editable_model(version.content.__class__):
            url = get_object_edit_url(version.content)
        # Or else, the standard edit view should be used
        else:
            url = reverse('admin:{app}_{model}_change'.format(
                app=version.content._meta.app_label,
                model=version.content._meta.model_name,
            ),
                          args=(version.content.pk, ))
        return redirect(url)
    def test_edit_endpoint_with_draft_file(self):
        """Edit endpoint contains draft file"""
        self.add_plugin(self.draft_file_grouper.pk)

        response = self.client.get(get_object_edit_url(
            self.placeholder.source))
        self.assertContains(response, self.draft_file.url)
Ejemplo n.º 3
0
    def _get_instance_request(self,
                              instance,
                              user,
                              path=None,
                              edit=False,
                              preview=False,
                              structure=False,
                              lang_code='en',
                              disable=False):
        if not path:
            if edit:
                path = get_object_edit_url(instance)
            elif preview:
                path = get_object_preview_url(instance)
            elif structure:
                path = get_object_structure_url(instance)
            else:
                path = instance.get_absolute_url()

        request = RequestFactory().get(path)
        request.session = {}
        request.user = user
        request.LANGUAGE_CODE = lang_code
        request.GET = QueryDict('', mutable=True)
        if edit:
            request.GET['edit'] = None
        else:
            request.GET['edit_off'] = None
        if disable:
            request.GET[get_cms_setting('CMS_TOOLBAR_URL__DISABLE')] = None

        return request
 def test_add_aliases_submenu_to_admin_menu(self):
     user = self.get_staff_user_with_std_permissions()
     user.user_permissions.add(Permission.objects.get(
         content_type__app_label='djangocms_alias',
         codename='change_category'))
     page_url = get_object_edit_url(self.page.get_title_obj(self.language))
     with self.login_user_context(user):
         response = self.client.get(page_url)
     self.assertContains(response, '<span>Aliases')
Ejemplo n.º 5
0
    def test_edit_endpoint_draft_page_rendering_draft_url(self):
        add_plugin(
            self.draft_pagecontent.placeholders.get(slot="content"),
            "HtmlLink",
            language=self.language,
            url_grouper=self.url_grouper,
            label="Draft URL plugin",
        )

        request_url = get_object_edit_url(self.draft_pagecontent, self.language)
        with self.login_user_context(self.user):
            response = self.client.get(request_url)

        self.assertContains(response, "some/path/")
Ejemplo n.º 6
0
def get_editable_url(content_obj):
    """If the object is editable the cms editable view should be used, with the toolbar.
       This method is provides the URL for it.
    """
    if is_editable_model(content_obj.__class__):
        url = get_object_edit_url(content_obj)
    # Or else, the standard edit view should be used
    else:
        url = reverse('admin:{app}_{model}_change'.format(
            app=content_obj._meta.app_label,
            model=content_obj._meta.model_name,
        ),
                      args=(content_obj.pk, ))
    return url
Ejemplo n.º 7
0
    def test_change_language_menu_page_toolbar(self):
        """Check that patched PageToolbar.change_language_menu only provides
        Add Translation links.
        """
        version = PageVersionFactory(content__language="en")
        PageContentWithVersionFactory(page=version.content.page, language="de")
        PageContentWithVersionFactory(page=version.content.page, language="it")
        page = version.content.page
        page.update_languages(["en", "de", "it"])

        request = self.get_page_request(
            page=page,
            path=get_object_edit_url(version.content),
            user=self.get_superuser(),
        )
        request.toolbar.set_object(version.content)
        request.toolbar.populate()
        request.toolbar.post_template_populate()

        language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER)
        # 3 out of 4 populated languages, Break, Add Translation menu, Copy all plugins
        self.assertEqual(language_menu.get_item_count(), 6)

        language_menu_dict = {
            menu.name: [item for item in menu.items]
            for key, menu in language_menu.menus.items()
        }
        self.assertIn("Add Translation", language_menu_dict.keys())
        self.assertIn("Copy all plugins", language_menu_dict.keys())
        self.assertNotIn("Delete Translation", language_menu_dict.keys())

        self.assertEquals(
            set([lang.name for lang in language_menu_dict["Add Translation"]]),
            set(["Française..."]),
        )

        self.assertEquals(
            set([lang.name
                 for lang in language_menu_dict["Copy all plugins"]]),
            set(["from Italiano", "from Deutsche"]),
        )

        for item in language_menu_dict["Add Translation"]:
            self.assertIn(admin_reverse("cms_pagecontent_add"), item.url)
            self.assertIn("cms_page={}".format(page.pk), item.url)
            lang_code = "fr" if "Française" in item.name else "it"
            self.assertIn("language={}".format(lang_code), item.url)
    def test_edit_endpoint_with_published_file_and_draft(self):
        """Edit endpoint contains draft file when there is a published
        and a draft version."""
        self.assertEqual(self.file.versions.all().count(), 1)
        version = self.file.versions.all().first()
        v2 = version.copy(self.superuser)

        self.assertEqual(v2.state, DRAFT)
        self.assertEqual(v2.grouper.pk, self.file.grouper.pk)

        self.add_plugin(self.file_grouper.pk)

        response = self.client.get(get_object_edit_url(
            self.placeholder.source))
        self.assertContains(response, v2.content.url)

        # clean-up
        v2.delete()
Ejemplo n.º 9
0
    def test_default_cms_edit_button_is_used_for_non_versioned_model(self):
        """
        The default cms edit button is present for a default model
        """
        unversionedpoll = FancyPollFactory()
        url = get_object_preview_url(unversionedpoll)
        edit_url = get_object_edit_url(unversionedpoll)

        with self.login_user_context(self.get_superuser()):
            response = self.client.post(url)

        found_button_list = find_toolbar_buttons("Edit",
                                                 response.wsgi_request.toolbar)

        # Only one edit button exists
        self.assertEqual(len(found_button_list), 1)
        # The only edit button that exists is the standard cms button
        self.assertEqual(found_button_list[0].url, edit_url)
Ejemplo n.º 10
0
    def test_change_language_menu_page_toolbar(self):
        """Check that patched PageToolbar.change_language_menu only provide
        Add Translation links.
        """
        version = PageVersionFactory(content__language='en')
        PageContentFactory(page=version.content.page, language='de')
        page = version.content.page
        page.update_languages(['en', 'de'])

        request = self.get_page_request(
            page=page,
            path=get_object_edit_url(version.content),
            user=self.get_superuser(),
        )
        request.toolbar.set_object(version.content)
        request.toolbar.populate()
        request.toolbar.post_template_populate()

        language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER)
        # 4 languages, Break, Add Translation menu
        self.assertEqual(language_menu.get_item_count(), 6)

        language_menu_dict = {
            menu.name: [item for item in menu.items]
            for key, menu in language_menu.menus.items()
        }
        self.assertIn('Add Translation', language_menu_dict.keys())
        self.assertNotIn('Delete Translation', language_menu_dict.keys())
        self.assertNotIn('Copy all plugins', language_menu_dict.keys())

        self.assertEquals(
            set([l.name for l in language_menu_dict['Add Translation']]),
            set(['Française...', 'Italiano...']),
        )

        for item in language_menu_dict['Add Translation']:
            self.assertIn(admin_reverse('cms_pagecontent_add'), item.url)
            self.assertIn('cms_page={}'.format(page.pk), item.url)
            lang_code = 'fr' if 'Française' in item.name else 'it'
            self.assertIn('language={}'.format(lang_code), item.url)
Ejemplo n.º 11
0
    def test_change_language_menu_page_toolbar_language_selector_version_link(
            self):
        """
        Ensure that the correct version is navigated to in the language selector.

        A real world scenario / issue seen:
            - Version 3: Draft
            - Version 2: Published
            - Version 1: Archived

        Version 1 was returned in the toolbar language selector which is incorrect,
        the latest version 4 should be returned.
        """
        superuser = self.get_superuser()
        en_pagecontent_1 = PageContentWithVersionFactory(language="en")
        page = en_pagecontent_1.page
        de_pagecontent_1 = PageContentWithVersionFactory(page=page,
                                                         language="de")
        # Create remaining 3 versions for it
        it_pagecontent_1 = PageContentWithVersionFactory(
            page=page, language="it", version__state=ARCHIVED)
        it_pagecontent_1_version = it_pagecontent_1.versions.first()
        # Make version 1 archived by publishing the new version 2
        it_pagecontent_2 = PageContentWithVersionFactory(
            page=page, language="it", version__state=PUBLISHED)
        it_pagecontent_2_version = it_pagecontent_2.versions.first()
        # Create a new draft, which is what we expect to use
        it_pagecontent_3 = PageContentWithVersionFactory(page=page,
                                                         language="it",
                                                         version__state=DRAFT)
        it_pagecontent_3_version = it_pagecontent_3.versions.first()

        # Sanity check that all versions are int he state that we expect: Archived, Published, Draft
        self.assertEqual(it_pagecontent_1_version.state, ARCHIVED)
        self.assertEqual(it_pagecontent_2_version.state, PUBLISHED)
        self.assertEqual(it_pagecontent_3_version.state, DRAFT)

        page.update_languages(["en", "de", "it"])

        request = self.get_page_request(
            page=page,
            path=get_object_edit_url(en_pagecontent_1),
            user=superuser,
        )
        request.toolbar.set_object(en_pagecontent_1)
        request.toolbar.populate()
        request.toolbar.post_template_populate()

        language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER)
        language_menu_item_names = [
            item.name for item in language_menu.items if hasattr(item, "name")
        ]

        self.assertIn("English", language_menu_item_names)
        self.assertIn("Deutsche", language_menu_item_names)
        self.assertIn("Italiano", language_menu_item_names)

        en_item = self._get_toolbar_item_by_name(language_menu, "English")
        en_preview_url = get_object_preview_url(en_pagecontent_1, "en")
        de_item = self._get_toolbar_item_by_name(language_menu, "Deutsche")
        de_preview_url = get_object_preview_url(de_pagecontent_1, "de")
        it_item = self._get_toolbar_item_by_name(language_menu, "Italiano")
        it_preview_url = get_object_preview_url(it_pagecontent_3, "it")

        # Ensure that each menu item points to the correct url
        self.assertEqual(en_item.url, en_preview_url)
        self.assertEqual(de_item.url, de_preview_url)
        self.assertEqual(it_item.url, it_preview_url)
    def test_static_alias_shows_correct_content_for_versioning_states(self):
        """
        The correct contents are shown when viewing the static alias:
        - A draft page shows draft content
        - A published page shows published content or nothing at all
        """
        from djangocms_versioning.constants import PUBLISHED

        category = Category.objects.create(
            name=DEFAULT_STATIC_ALIAS_CATEGORY_NAME)
        alias = self._create_alias(
            plugins=None,
            name='test alias',
            category=category,
            published=True,
            static_code="template_example_global_alias_code")
        add_plugin(
            alias.get_placeholder(language='en'),
            'TextPlugin',
            language='en',
            body='Published content for: template_example_global_alias_code',
        )
        page = create_page(title="Static Code Test",
                           language='en',
                           template='static_alias.html',
                           limit_visibility_in_menu=None,
                           created_by=self.superuser)

        # Publish the page and create a draft alias
        self._publish(page, 'en')
        version = self._get_version(alias, PUBLISHED, 'en')
        draft = version.copy(self.superuser)

        # Add draft content to the draft version
        add_plugin(
            draft.content.placeholder,
            'TextPlugin',
            language='en',
            body=
            'Updated Draft content for: template_example_global_alias_code',
        )

        page_content = page.get_title_obj("en")
        page_live_url = page.get_absolute_url()
        page_edit_url = get_object_edit_url(page_content, "en")
        page_preview_url = get_object_preview_url(page_content, "en")

        # The live page should still contain the published contents
        live_response = self.client.get(page_live_url)

        self.assertContains(
            live_response,
            'Published content for: template_example_global_alias_code')
        self.assertNotContains(
            live_response,
            'Updated Draft content for: template_example_global_alias_code')

        # The edit and preview url should show the draft contents
        with self.login_user_context(self.superuser):
            edit_response = self.client.get(page_edit_url)
            preview_response = self.client.get(page_preview_url)

        self.assertContains(
            edit_response,
            'Updated Draft content for: template_example_global_alias_code')
        self.assertContains(
            preview_response,
            'Updated Draft content for: template_example_global_alias_code')