Initial commit
This commit is contained in:
0
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__init__.py
vendored
Normal file
0
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__init__.py
vendored
Normal file
BIN
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__pycache__/__init__.cpython-310.pyc
vendored
Normal file
BIN
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__pycache__/__init__.cpython-310.pyc
vendored
Normal file
Binary file not shown.
BIN
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__pycache__/test_sidebar.cpython-310.pyc
vendored
Normal file
BIN
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__pycache__/test_sidebar.cpython-310.pyc
vendored
Normal file
Binary file not shown.
BIN
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__pycache__/test_tables.cpython-310.pyc
vendored
Normal file
BIN
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/__pycache__/test_tables.cpython-310.pyc
vendored
Normal file
Binary file not shown.
290
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/test_sidebar.py
vendored
Normal file
290
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/test_sidebar.py
vendored
Normal file
@@ -0,0 +1,290 @@
|
||||
from unittest import TestCase
|
||||
|
||||
from django.test import TestCase as DjangoTestCase
|
||||
from django.urls import reverse
|
||||
|
||||
from wagtail.admin.search import SearchArea
|
||||
from wagtail.admin.ui.sidebar import (
|
||||
ActionMenuItem,
|
||||
LinkMenuItem,
|
||||
MainMenuModule,
|
||||
PageExplorerMenuItem,
|
||||
SearchModule,
|
||||
SubMenuItem,
|
||||
)
|
||||
from wagtail.telepath import JSContext
|
||||
from wagtail.test.utils import WagtailTestUtils
|
||||
from wagtail.utils.deprecation import RemovedInWagtail70Warning
|
||||
|
||||
|
||||
class TestAdaptLinkMenuItem(TestCase):
|
||||
def test_adapt(self):
|
||||
packed = JSContext().pack(LinkMenuItem("link", "Link", "/link/"))
|
||||
|
||||
self.assertEqual(
|
||||
packed,
|
||||
{
|
||||
"_type": "wagtail.sidebar.LinkMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"classname": "",
|
||||
"icon_name": "",
|
||||
"label": "Link",
|
||||
"name": "link",
|
||||
"url": "/link/",
|
||||
"attrs": {},
|
||||
}
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
def test_adapt_with_optional_parameters(self):
|
||||
packed = JSContext().pack(
|
||||
LinkMenuItem(
|
||||
"link",
|
||||
"Link",
|
||||
"/link/",
|
||||
icon_name="link-icon",
|
||||
classname="some classes",
|
||||
attrs={"data-is-custom": "true"},
|
||||
)
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
packed,
|
||||
{
|
||||
"_type": "wagtail.sidebar.LinkMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"classname": "some classes",
|
||||
"icon_name": "link-icon",
|
||||
"label": "Link",
|
||||
"name": "link",
|
||||
"url": "/link/",
|
||||
"attrs": {"data-is-custom": "true"},
|
||||
}
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
def test_adapt_with_deprecated_classnames(self):
|
||||
with self.assertWarnsRegex(
|
||||
RemovedInWagtail70Warning,
|
||||
"The `classnames` kwarg for sidebar LinkMenuItem is deprecated - use `classname` instead.",
|
||||
):
|
||||
packed = JSContext().pack(
|
||||
LinkMenuItem("link", "Link", "/link/", classnames="legacy-classes")
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
packed,
|
||||
{
|
||||
"_type": "wagtail.sidebar.LinkMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"classname": "legacy-classes", # mapped to new name but raises warning
|
||||
"icon_name": "",
|
||||
"label": "Link",
|
||||
"name": "link",
|
||||
"url": "/link/",
|
||||
"attrs": {},
|
||||
}
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
class TestAdaptSubMenuItem(TestCase):
|
||||
def test_adapt(self):
|
||||
packed = JSContext().pack(
|
||||
SubMenuItem(
|
||||
"sub-menu",
|
||||
"Sub menu",
|
||||
[
|
||||
LinkMenuItem("link", "Link", "/link/", icon_name="link-icon"),
|
||||
],
|
||||
footer_text="Footer text",
|
||||
)
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
packed,
|
||||
{
|
||||
"_type": "wagtail.sidebar.SubMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"name": "sub-menu",
|
||||
"label": "Sub menu",
|
||||
"icon_name": "",
|
||||
"classname": "",
|
||||
"footer_text": "Footer text",
|
||||
"attrs": {},
|
||||
},
|
||||
[
|
||||
{
|
||||
"_type": "wagtail.sidebar.LinkMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"name": "link",
|
||||
"label": "Link",
|
||||
"icon_name": "link-icon",
|
||||
"classname": "",
|
||||
"url": "/link/",
|
||||
"attrs": {},
|
||||
}
|
||||
],
|
||||
}
|
||||
],
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
def test_adapt_without_footer_text(self):
|
||||
packed = JSContext().pack(
|
||||
SubMenuItem(
|
||||
"sub-menu",
|
||||
"Sub menu",
|
||||
[
|
||||
LinkMenuItem("link", "Link", "/link/", icon_name="link-icon"),
|
||||
],
|
||||
)
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
packed,
|
||||
{
|
||||
"_type": "wagtail.sidebar.SubMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"name": "sub-menu",
|
||||
"label": "Sub menu",
|
||||
"icon_name": "",
|
||||
"classname": "",
|
||||
"footer_text": "",
|
||||
"attrs": {},
|
||||
},
|
||||
[
|
||||
{
|
||||
"_type": "wagtail.sidebar.LinkMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"name": "link",
|
||||
"label": "Link",
|
||||
"icon_name": "link-icon",
|
||||
"classname": "",
|
||||
"url": "/link/",
|
||||
"attrs": {},
|
||||
}
|
||||
],
|
||||
}
|
||||
],
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
class TestAdaptPageExplorerMenuItem(TestCase):
|
||||
def test_adapt(self):
|
||||
packed = JSContext().pack(PageExplorerMenuItem("pages", "Pages", "/pages/", 1))
|
||||
|
||||
self.assertEqual(
|
||||
packed,
|
||||
{
|
||||
"_type": "wagtail.sidebar.PageExplorerMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"attrs": {},
|
||||
"classname": "",
|
||||
"icon_name": "",
|
||||
"label": "Pages",
|
||||
"name": "pages",
|
||||
"url": "/pages/",
|
||||
},
|
||||
1,
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
class TestAdaptSearchModule(TestCase):
|
||||
def test_adapt(self):
|
||||
packed = JSContext().pack(SearchModule(SearchArea("Search", "/search/")))
|
||||
|
||||
self.assertEqual(
|
||||
packed, {"_type": "wagtail.sidebar.SearchModule", "_args": ["/search/"]}
|
||||
)
|
||||
|
||||
|
||||
class TestAdaptMainMenuModule(WagtailTestUtils, DjangoTestCase):
|
||||
def test_adapt(self):
|
||||
main_menu = [
|
||||
LinkMenuItem("pages", "Pages", "/pages/"),
|
||||
]
|
||||
account_menu = [
|
||||
LinkMenuItem(
|
||||
"account", "Account", reverse("wagtailadmin_account"), icon_name="user"
|
||||
),
|
||||
ActionMenuItem(
|
||||
"logout", "Logout", reverse("wagtailadmin_logout"), icon_name="logout"
|
||||
),
|
||||
]
|
||||
user = self.create_user(username="admin")
|
||||
|
||||
packed = JSContext().pack(MainMenuModule(main_menu, account_menu, user))
|
||||
|
||||
self.assertEqual(
|
||||
packed,
|
||||
{
|
||||
"_type": "wagtail.sidebar.MainMenuModule",
|
||||
"_args": [
|
||||
[
|
||||
{
|
||||
"_type": "wagtail.sidebar.LinkMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"name": "pages",
|
||||
"label": "Pages",
|
||||
"icon_name": "",
|
||||
"classname": "",
|
||||
"url": "/pages/",
|
||||
"attrs": {},
|
||||
}
|
||||
],
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"_type": "wagtail.sidebar.LinkMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"name": "account",
|
||||
"label": "Account",
|
||||
"icon_name": "user",
|
||||
"classname": "",
|
||||
"url": reverse("wagtailadmin_account"),
|
||||
"attrs": {},
|
||||
}
|
||||
],
|
||||
},
|
||||
{
|
||||
"_type": "wagtail.sidebar.ActionMenuItem",
|
||||
"_args": [
|
||||
{
|
||||
"name": "logout",
|
||||
"label": "Logout",
|
||||
"icon_name": "logout",
|
||||
"classname": "",
|
||||
"action": reverse("wagtailadmin_logout"),
|
||||
"method": "POST",
|
||||
"attrs": {},
|
||||
}
|
||||
],
|
||||
},
|
||||
],
|
||||
{
|
||||
"name": user.first_name or user.get_username(),
|
||||
"avatarUrl": "//www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=100&d=mm",
|
||||
},
|
||||
],
|
||||
},
|
||||
)
|
||||
371
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/test_tables.py
vendored
Normal file
371
env/lib/python3.10/site-packages/wagtail/admin/tests/ui/test_tables.py
vendored
Normal file
@@ -0,0 +1,371 @@
|
||||
from django.template import Context, Template
|
||||
from django.test import RequestFactory, TestCase
|
||||
from django.utils.html import format_html
|
||||
|
||||
from wagtail.admin.ui.tables import (
|
||||
BaseColumn,
|
||||
Column,
|
||||
RelatedObjectsColumn,
|
||||
Table,
|
||||
TitleColumn,
|
||||
)
|
||||
from wagtail.models import Page, Site
|
||||
|
||||
|
||||
class TestTable(TestCase):
|
||||
fixtures = ["test.json"]
|
||||
|
||||
def setUp(self):
|
||||
self.rf = RequestFactory()
|
||||
|
||||
def render_component(self, obj):
|
||||
request = self.rf.get("/")
|
||||
template = Template("{% load wagtailadmin_tags %}{% component obj %}")
|
||||
return template.render(Context({"request": request, "obj": obj}))
|
||||
|
||||
def test_table_render(self):
|
||||
data = [
|
||||
{"first_name": "Paul", "last_name": "Simon"},
|
||||
{"first_name": "Art", "last_name": "Garfunkel"},
|
||||
]
|
||||
|
||||
table = Table(
|
||||
[
|
||||
Column("first_name"),
|
||||
Column("last_name"),
|
||||
],
|
||||
data,
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
"""
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr><th>First name</th><th>Last name</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Paul</td><td>Simon</td></tr>
|
||||
<tr><td>Art</td><td>Garfunkel</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
""",
|
||||
)
|
||||
|
||||
def test_table_render_with_caption(self):
|
||||
data = [
|
||||
{"first_name": "Paul", "last_name": "Simon"},
|
||||
{"first_name": "Art", "last_name": "Garfunkel"},
|
||||
]
|
||||
|
||||
caption = "Test table"
|
||||
|
||||
table = Table(
|
||||
columns=[
|
||||
Column("first_name"),
|
||||
Column("last_name"),
|
||||
],
|
||||
data=data,
|
||||
caption=caption,
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
"""
|
||||
<table class="listing">
|
||||
<caption class="w-sr-only">Test table</caption>
|
||||
<thead>
|
||||
<tr><th>First name</th><th>Last name</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Paul</td><td>Simon</td></tr>
|
||||
<tr><td>Art</td><td>Garfunkel</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
""",
|
||||
)
|
||||
|
||||
def test_table_render_with_width(self):
|
||||
data = [
|
||||
{"first_name": "Paul", "last_name": "Simon"},
|
||||
{"first_name": "Art", "last_name": "Garfunkel"},
|
||||
]
|
||||
|
||||
table = Table(
|
||||
[
|
||||
Column("first_name"),
|
||||
Column("last_name", width="75%"),
|
||||
],
|
||||
data,
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
"""
|
||||
<table class="listing">
|
||||
<col />
|
||||
<col width="75%" />
|
||||
<thead>
|
||||
<tr><th>First name</th><th>Last name</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>Paul</td><td>Simon</td></tr>
|
||||
<tr><td>Art</td><td>Garfunkel</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
""",
|
||||
)
|
||||
|
||||
def test_title_column(self):
|
||||
root_page = Page.objects.filter(depth=2).first()
|
||||
blog = Site.objects.create(
|
||||
hostname="blog.example.com", site_name="My blog", root_page=root_page
|
||||
)
|
||||
gallery = Site.objects.create(
|
||||
hostname="gallery.example.com", site_name="My gallery", root_page=root_page
|
||||
)
|
||||
data = [blog, gallery]
|
||||
|
||||
table = Table(
|
||||
[
|
||||
TitleColumn(
|
||||
"hostname",
|
||||
url_name="wagtailsites:edit",
|
||||
link_classname="choose-site",
|
||||
link_attrs={"data-chooser": "yes"},
|
||||
),
|
||||
Column("site_name", label="Site name"),
|
||||
],
|
||||
data,
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
"""
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr><th>Hostname</th><th>Site name</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="title">
|
||||
<div class="title-wrapper">
|
||||
<a href="/admin/sites/edit/%d/" class="choose-site" data-chooser="yes">blog.example.com</a>
|
||||
</div>
|
||||
</td>
|
||||
<td>My blog</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="title">
|
||||
<div class="title-wrapper">
|
||||
<a href="/admin/sites/edit/%d/" class="choose-site" data-chooser="yes">gallery.example.com</a>
|
||||
</div>
|
||||
</td>
|
||||
<td>My gallery</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
"""
|
||||
% (blog.pk, gallery.pk),
|
||||
)
|
||||
|
||||
def test_column_media(self):
|
||||
class FancyColumn(Column):
|
||||
class Media:
|
||||
js = ["js/gradient-fill.js"]
|
||||
|
||||
data = [
|
||||
{"first_name": "Paul", "last_name": "Simon"},
|
||||
{"first_name": "Art", "last_name": "Garfunkel"},
|
||||
]
|
||||
|
||||
table = Table(
|
||||
[
|
||||
FancyColumn("first_name"),
|
||||
Column("last_name"),
|
||||
],
|
||||
data,
|
||||
)
|
||||
|
||||
self.assertIn('src="/static/js/gradient-fill.js"', str(table.media["js"]))
|
||||
|
||||
def test_row_classname(self):
|
||||
class SiteTable(Table):
|
||||
def get_row_classname(self, instance):
|
||||
return "default-site" if instance.is_default_site else ""
|
||||
|
||||
root_page = Page.objects.filter(depth=2).first()
|
||||
blog = Site.objects.create(
|
||||
hostname="blog.example.com",
|
||||
site_name="My blog",
|
||||
root_page=root_page,
|
||||
is_default_site=True,
|
||||
)
|
||||
gallery = Site.objects.create(
|
||||
hostname="gallery.example.com", site_name="My gallery", root_page=root_page
|
||||
)
|
||||
data = [blog, gallery]
|
||||
|
||||
table = SiteTable(
|
||||
[
|
||||
Column("hostname"),
|
||||
Column("site_name", label="Site name"),
|
||||
],
|
||||
data,
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
"""
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr><th>Hostname</th><th>Site name</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="default-site">
|
||||
<td>blog.example.com</td>
|
||||
<td>My blog</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>gallery.example.com</td>
|
||||
<td>My gallery</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
""",
|
||||
)
|
||||
|
||||
def test_row_attrs(self):
|
||||
class SiteTable(Table):
|
||||
def get_row_attrs(self, instance):
|
||||
attrs = super().get_row_attrs(instance)
|
||||
attrs["data-id"] = instance.pk
|
||||
return attrs
|
||||
|
||||
root_page = Page.objects.filter(depth=2).first()
|
||||
blog = Site.objects.create(
|
||||
hostname="blog.example.com",
|
||||
site_name="My blog",
|
||||
root_page=root_page,
|
||||
is_default_site=True,
|
||||
)
|
||||
gallery = Site.objects.create(
|
||||
hostname="gallery.example.com", site_name="My gallery", root_page=root_page
|
||||
)
|
||||
data = [blog, gallery]
|
||||
|
||||
table = SiteTable(
|
||||
[
|
||||
Column("hostname"),
|
||||
Column("site_name", label="Site name"),
|
||||
],
|
||||
data,
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
f"""
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr><th>Hostname</th><th>Site name</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr data-id="{blog.pk}">
|
||||
<td>blog.example.com</td>
|
||||
<td>My blog</td>
|
||||
</tr>
|
||||
<tr data-id="{gallery.pk}">
|
||||
<td>gallery.example.com</td>
|
||||
<td>My gallery</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
""",
|
||||
)
|
||||
|
||||
def test_table_and_row_in_context(self):
|
||||
data = [
|
||||
{"first_name": "Paul", "last_name": "Simon"},
|
||||
{"first_name": "Art", "last_name": "Garfunkel"},
|
||||
]
|
||||
|
||||
class CounterColumn(BaseColumn):
|
||||
def render_cell_html(self, instance, parent_context):
|
||||
context = self.get_cell_context_data(instance, parent_context)
|
||||
return format_html(
|
||||
"<td>{} of {}</td>",
|
||||
context["row"].index + 1,
|
||||
context["table"].row_count,
|
||||
)
|
||||
|
||||
table = Table(
|
||||
[
|
||||
CounterColumn("index"),
|
||||
Column("first_name"),
|
||||
Column("last_name"),
|
||||
],
|
||||
data,
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
"""
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr><th>Index</th><th>First name</th><th>Last name</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr><td>1 of 2</td><td>Paul</td><td>Simon</td></tr>
|
||||
<tr><td>2 of 2</td><td>Art</td><td>Garfunkel</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
""",
|
||||
)
|
||||
|
||||
|
||||
class TestRelatedObjectsColumn(TestCase):
|
||||
def setUp(self):
|
||||
self.rf = RequestFactory()
|
||||
|
||||
def render_component(self, obj):
|
||||
request = self.rf.get("/")
|
||||
template = Template("{% load wagtailadmin_tags %}{% component obj %}")
|
||||
return template.render(Context({"request": request, "obj": obj}))
|
||||
|
||||
def test_table_render(self):
|
||||
table = Table(
|
||||
[
|
||||
Column("title"),
|
||||
RelatedObjectsColumn("sites_rooted_here"),
|
||||
],
|
||||
Page.objects.all(),
|
||||
)
|
||||
|
||||
html = self.render_component(table)
|
||||
self.assertHTMLEqual(
|
||||
html,
|
||||
"""
|
||||
<table class="listing">
|
||||
<thead>
|
||||
<tr><th>Title</th><th>Sites rooted here</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Root</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Welcome to your new Wagtail site!</td>
|
||||
<td><ul><li>localhost [default]</li></ul></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
""",
|
||||
)
|
||||
Reference in New Issue
Block a user