Example #1
0
    def test_apps_cloning_validation(self):
        """Checks that the target is properly validated when cloning"""
        home, blog = self._apps_validation_models()
        client = self.login()

        clone_url = reverse("admin:testapp_page_clone", args=(blog.pk, ))

        response = client.get(clone_url)
        self.assertContains(response, "_set_content")
        self.assertContains(response, "set_application")

        response = client.post(clone_url, {
            "target": home.pk,
            "set_application": True
        })
        self.assertContains(response,
                            "Apps may not have any descendants in the tree.")

        # The other way round works
        clone_url = reverse("admin:testapp_page_clone", args=(home.pk, ))

        response = client.post(clone_url, {
            "target": blog.pk,
            "set_application": True
        })
        self.assertRedirects(
            response, reverse("admin:testapp_page_change", args=(blog.pk, )))

        # No apps in tree anymore
        self.assertEqual(Page.objects.exclude(application="").count(), 0)
Example #2
0
    def test_invalid_move(self):
        root, p1, p2 = self.prepare_for_move()
        client = self.login()

        response = client.post(
            reverse("admin:testapp_page_move", args=(root.pk, )), {})
        self.assertContains(response, "This field is required.", 1)

        response = client.post(
            reverse("admin:testapp_page_move", args=(root.pk, )),
            {
                "move_to": "first",
                "of": p1.pk
            },
        )
        self.assertContains(
            response,
            "Select a valid choice. That choice is not one of the available choices.",  # noqa
        )

        response = client.post(
            reverse("admin:testapp_page_move", args=(root.pk, )),
            {
                "move_to": "first",
                "of": root.pk
            },
        )
        self.assertContains(
            response, "Cannot move node to a position relative to itself.")
Example #3
0
    def test_move_to_root_last(self):
        root, p1, p2 = self.prepare_for_move()
        client = self.login()

        response = client.get(
            reverse('admin:testapp_page_move', args=(p1.pk, )), )
        self.assertContains(response, '*** p1', 1)
        self.assertContains(response, '--- p2', 1)

        response = client.post(
            reverse('admin:testapp_page_move', args=(p1.pk, )),
            {
                'move_to': 'last',
                'of': '',
            },
        )

        self.assertEqual(
            [(p.pk, p.parent_id, p.position) for p in Page.objects.all()],
            [
                (root.pk, None, 10),
                (p2.pk, root.pk, 20),
                (p1.pk, None, 20),
            ],
        )
Example #4
0
    def test_content_cloning(self):
        """Test that cloning the content works and replaces everything"""

        home_en = Page.objects.create(
            title="home",
            slug="home",
            path="/en/",
            static_path=True,
            language_code="en",
            is_active=True,
            menu="main",
        )

        home_en.testapp_snippet_set.create(template_name="snippet.html",
                                           ordering=10,
                                           region="main")

        home_de = Page.objects.create(
            title="home",
            slug="home",
            path="/de/",
            static_path=True,
            language_code="de",
            is_active=True,
            menu="main",
        )

        home_de.testapp_snippet_set.create(template_name="snippet-33.html",
                                           ordering=10,
                                           region="main")

        client = self.login()
        response = client.post(
            reverse("admin:testapp_page_clone", args=(home_en.pk, )),
            {
                "target": home_de.pk,
                "_set_content": True
            },
        )
        print(response.content.decode("utf-8"))
        self.assertRedirects(
            response, reverse("admin:testapp_page_change",
                              args=(home_de.pk, )))

        self.assertEqual(
            list(
                home_de.testapp_snippet_set.values_list("template_name",
                                                        flat=True)),
            ["snippet.html"],
        )
Example #5
0
    def test_invalid_parent(self):
        root, p1, p2 = self.prepare_for_move()
        p1.application = "blog"
        p1.save()

        p2 = Page.objects.get(pk=p2.pk)
        p2.parent_id = p1.pk

        # Apps may not have descendants
        self.assertRaises(ValidationError, p2.full_clean)

        client = self.login()
        response = client.post(
            reverse("admin:testapp_page_move", args=(p2.pk, )),
            {
                "move_to": "first",
                "of": p1.pk
            },
        )

        self.assertContains(
            response,
            "<li>Invalid parent: Apps may not have any descendants.</li>",
            status_code=200,
        )
Example #6
0
    def test_reorder_siblings(self):
        root, p1, p2 = self.prepare_for_move()

        p3 = Page.objects.create(
            title='p3',
            slug='p3',
            parent=root,
        )
        client = self.login()

        client.post(
            reverse('admin:testapp_page_move', args=(p3.pk, )),
            {
                'move_to': 'right',
                'of': p1.pk,
            },
        )

        self.assertEqual(
            [(p.pk, p.parent_id, p.position) for p in Page.objects.all()],
            [
                (root.pk, None, 10),
                (p1.pk, root.pk, 10),
                (p3.pk, root.pk, 20),
                (p2.pk, root.pk, 30),
            ],
        )
Example #7
0
    def test_reorder_siblings(self):
        root, p1, p2 = self.prepare_for_move()

        p3 = Page.objects.create(title="p3", slug="p3", parent=root)
        client = self.login()

        client.post(
            reverse("admin:testapp_page_move", args=(p3.pk, )),
            {
                "move_to": "right",
                "of": p1.pk
            },
        )

        self.assertEqual(
            [(p.pk, p.parent_id, p.position) for p in Page.objects.all()],
            [
                (root.pk, None, 10),
                (p1.pk, root.pk, 10),
                (p3.pk, root.pk, 20),
                (p2.pk, root.pk, 30),
            ],
        )

        client.post(
            reverse("admin:testapp_page_move", args=(p3.pk, )),
            {
                "move_to": "left",
                "of": p1.pk
            },
        )

        self.assertEqual(
            [(p.pk, p.parent_id, p.position) for p in Page.objects.all()],
            [
                (root.pk, None, 10),
                (p3.pk, root.pk, 10),
                (p1.pk, root.pk, 20),
                (p2.pk, root.pk, 30),
            ],
        )
Example #8
0
    def test_move_to_root_last(self):
        root, p1, p2 = self.prepare_for_move()
        client = self.login()

        response = client.get(
            reverse("admin:testapp_page_move", args=(p1.pk, )))
        self.assertContains(response, "*** p1", 1)
        self.assertContains(response, "--- p2", 1)
        self.assertContains(response, 'name="_save"', 1)

        response = client.post(
            reverse("admin:testapp_page_move", args=(p1.pk, )),
            {
                "move_to": "last",
                "of": ""
            },
        )

        self.assertEqual(
            [(p.pk, p.parent_id, p.position) for p in Page.objects.all()],
            [(root.pk, None, 10), (p2.pk, root.pk, 20), (p1.pk, None, 20)],
        )
    def test_invalid_move(self):
        root, p1, p2 = self.prepare_for_move()
        client = self.login()

        response = client.post(
            reverse('admin:testapp_page_move', args=(root.pk, )), {
                'move_to': 'first',
                'of': p1.pk,
            })

        self.assertContains(
            response,
            'Select a valid choice. That choice is not one of the available choices.',  # noqa
        )
Example #10
0
    def test_move_to_child(self):
        root, p1, p2 = self.prepare_for_move()
        client = self.login()

        client.post(reverse('admin:testapp_page_move', args=(p2.pk, )), {
            'move_to': 'first',
            'of': p1.pk,
        })

        self.assertEqual([(p.pk, p.parent_id, p.position)
                          for p in Page.objects.all()], [
                              (root.pk, None, 10),
                              (p1.pk, root.pk, 10),
                              (p2.pk, p1.pk, 10),
                          ])
Example #11
0
    def test_move_to_child(self):
        root, p1, p2 = self.prepare_for_move()
        client = self.login()

        client.post(
            reverse("admin:testapp_page_move", args=(p2.pk, )),
            {
                "move_to": "first",
                "of": p1.pk
            },
        )

        self.assertEqual(
            [(p.pk, p.parent_id, p.position) for p in Page.objects.all()],
            [(root.pk, None, 10), (p1.pk, root.pk, 10), (p2.pk, p1.pk, 10)],
        )
Example #12
0
    def test_move_clean_and_save(self):
        """Test that a page move does the right thing (model state should be
        restored after clean() so that save() updates the MPTT attributes
        for real, without a ROLLBACK"""

        client = self.login()

        r1 = Page.objects.create(
            title='root 1',
            slug='root-1',
        )
        r2 = Page.objects.create(
            title='root 2',
            slug='root-2',
        )
        child = Page.objects.create(
            parent_id=r1.id,
            title='child',
            slug='child',
        )

        ContentType.objects.clear_cache()  # because of 13. below

        with self.assertNumQueries(15):
            # NOTE NOTE NOTE!
            # The exact count is not actually important. What IS important is
            # that the query count does not change without us having a chance
            # to inspect.
            #
            #  1. session
            #  2. AppsMiddleware / apps_urlconf
            #  3. request.user
            #  4. SAVEPOINT
            #  5. fetch child
            #  6. fetch root-2
            #  7. exists() new parent (root-2)
            #  8. fetch descendants (why?)
            #  9. path uniqueness check of descendants with (/root-2/child/)
            # 10. path uniqueness of self
            # 11. page.save()
            # 12. fetch descendants for looping
            # 13. get page Django content type
            # 14. insert into admin log
            # 15. RELEASE SAVEPOINT
            response = client.post(
                reverse('admin:testapp_page_change', args=(child.id, )),
                merge_dicts(
                    {
                        'title': 'child',
                        'slug': 'child',
                        'path': '/root-1/child/',
                        'static_path': '',
                        'language_code': 'en',
                        'application': '',
                        'is_active': 1,
                        'menu': 'main',
                        'template_key': 'standard',
                        'parent': r2.id,
                    },
                    zero_management_form_data('testapp_richtext_set'),
                    zero_management_form_data('testapp_image_set'),
                    zero_management_form_data('testapp_snippet_set'),
                    zero_management_form_data('testapp_external_set'),
                    zero_management_form_data('testapp_html_set'),
                ),
            )

        self.assertEqual(response.status_code, 302)

        self.assertEqual([(
            page.pk,
            page.parent_id,
            page.position,
        ) for page in Page.objects.all()], [
            (r1.pk, None, 10),
            (r2.pk, None, 20),
            (child.pk, r2.pk, 10),
        ])