From 97d0d14cd850d1d1dbe5b8ac1f46eb2247829316 Mon Sep 17 00:00:00 2001 From: Oliver Parker <46482091+ollz272@users.noreply.github.com> Date: Mon, 20 Jun 2022 14:10:18 +0100 Subject: [PATCH] Add add_to_admin_menu option for modeladmin (#8634) --- docs/reference/contrib/modeladmin/index.md | 1 + .../reference/contrib/modeladmin/menu_item.md | 6 ++++ wagtail/admin/tests/tests.py | 8 ++++- wagtail/contrib/modeladmin/options.py | 20 +++++++----- .../modeladmintest/migrations/0011_enemy.py | 31 +++++++++++++++++++ wagtail/test/modeladmintest/models.py | 9 ++++++ wagtail/test/modeladmintest/wagtail_hooks.py | 9 ++++++ 7 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 wagtail/test/modeladmintest/migrations/0011_enemy.py diff --git a/docs/reference/contrib/modeladmin/index.md b/docs/reference/contrib/modeladmin/index.md index 47f531ec28..4c77c6efb8 100644 --- a/docs/reference/contrib/modeladmin/index.md +++ b/docs/reference/contrib/modeladmin/index.md @@ -97,6 +97,7 @@ This lets you use Wagtail-specific layouts in an otherwise traditional Django mo menu_order = 200 # will put in 3rd place (000 being 1st, 100 2nd) add_to_settings_menu = False # or True to add your model to the Settings sub-menu exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view + add_to_admin_menu = True # or False to exclude your model from the menu list_display = ('title', 'author') list_filter = ('author',) search_fields = ('title', 'author') diff --git a/docs/reference/contrib/modeladmin/menu_item.md b/docs/reference/contrib/modeladmin/menu_item.md index c3b619a6ab..1f20bec56e 100644 --- a/docs/reference/contrib/modeladmin/menu_item.md +++ b/docs/reference/contrib/modeladmin/menu_item.md @@ -46,3 +46,9 @@ Wagtail's 'Explorer' menu item has an order value of `100`, so supply a value gr If you'd like the menu item for your model to appear in Wagtail's 'Settings' sub-menu instead of at the top level, add `add_to_settings_menu = True` to your `ModelAdmin` class. This will only work for individual `ModelAdmin` classes registered with their own `modeladmin_register` call. It won't work for members of a `ModelAdminGroup`. + +## `ModelAdmin.add_to_admin_menu` + +**Expected value**: `True` or `False` + +If you'd like this model admin to be excluded from the menu, set to `False`. diff --git a/wagtail/admin/tests/tests.py b/wagtail/admin/tests/tests.py index b6e5dfd060..3a2d8ff50a 100644 --- a/wagtail/admin/tests/tests.py +++ b/wagtail/admin/tests/tests.py @@ -43,9 +43,15 @@ class TestHome(TestCase, WagtailTestUtils): # Check that the explorer menu item is here, with the right start page. self.assertContains( response, - '{"name": "explorer", "label": "Pages", "icon_name": "folder-open-inverse", "classnames": "", "url": "/admin/pages/", "attrs": null}, 1]', + '[{"name": "explorer", "label": "Pages", "icon_name": "folder-open-inverse", "classnames": "", "url": "/admin/pages/", "attrs": null}, 1]', ) + # There should be a link to the friend admin in on the home page. + self.assertContains(response, '"url": "/admin/friendadmin/"') + + # Since we've marked this as not being shown, it shouldn't be shown. + self.assertNotContains(response, '"url": "/admin/enemyadmin/"') + # check that is_shown is respected on menu items response = self.client.get(reverse("wagtailadmin_home") + "?hide-kittens=true") self.assertNotContains( diff --git a/wagtail/contrib/modeladmin/options.py b/wagtail/contrib/modeladmin/options.py index 12695bd373..0da2ec861c 100644 --- a/wagtail/contrib/modeladmin/options.py +++ b/wagtail/contrib/modeladmin/options.py @@ -47,6 +47,7 @@ class WagtailRegisterable: """ add_to_settings_menu = False + add_to_admin_menu = True exclude_from_explorer = False def register_with_wagtail(self): @@ -58,15 +59,18 @@ class WagtailRegisterable: def register_admin_urls(): return self.get_admin_urls_for_registration() - menu_hook = ( - "register_settings_menu_item" - if self.add_to_settings_menu - else "register_admin_menu_item" - ) + if self.add_to_settings_menu: + menu_hook = "register_settings_menu_item" + elif self.add_to_admin_menu: + menu_hook = "register_admin_menu_item" + else: + menu_hook = None - @hooks.register(menu_hook) - def register_admin_menu_item(): - return self.get_menu_item() + if menu_hook: + + @hooks.register(menu_hook) + def register_admin_menu_item(): + return self.get_menu_item() # Overriding the explorer page queryset is a somewhat 'niche' / experimental # operation, so only attach that hook if we specifically opt into it diff --git a/wagtail/test/modeladmintest/migrations/0011_enemy.py b/wagtail/test/modeladmintest/migrations/0011_enemy.py new file mode 100644 index 0000000000..4a32dd6663 --- /dev/null +++ b/wagtail/test/modeladmintest/migrations/0011_enemy.py @@ -0,0 +1,31 @@ +# Generated by Django 4.0.4 on 2022-05-31 18:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("modeladmintest", "0010_translatablebook"), + ] + + operations = [ + migrations.CreateModel( + name="Enemy", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("first_name", models.CharField(max_length=255)), + ("last_name", models.CharField(max_length=255)), + ("phone_number", models.CharField(max_length=255)), + ("address", models.CharField(max_length=255)), + ], + ), + ] diff --git a/wagtail/test/modeladmintest/models.py b/wagtail/test/modeladmintest/models.py index 0160887e2d..74b992529e 100644 --- a/wagtail/test/modeladmintest/models.py +++ b/wagtail/test/modeladmintest/models.py @@ -156,6 +156,15 @@ class Friend(models.Model): return self.first_name +class Enemy(models.Model): + """model used to test add_to_admin_menu usage in ModelAdminMenuItem""" + + first_name = models.CharField(max_length=255) + last_name = models.CharField(max_length=255) + phone_number = models.CharField(max_length=255) + address = models.CharField(max_length=255) + + class RelatedLink(models.Model): title = models.CharField( max_length=255, diff --git a/wagtail/test/modeladmintest/wagtail_hooks.py b/wagtail/test/modeladmintest/wagtail_hooks.py index 29d97b61c2..06a0aa494a 100644 --- a/wagtail/test/modeladmintest/wagtail_hooks.py +++ b/wagtail/test/modeladmintest/wagtail_hooks.py @@ -15,6 +15,7 @@ from .models import ( Author, Book, Contributor, + Enemy, Friend, Person, Publisher, @@ -198,6 +199,13 @@ class PageAdmin(ModelAdmin): menu_label = "Page" +class EnemyAdmin(ModelAdmin): + model = Enemy + add_to_admin_menu = False + menu_icon = "snippet" + base_url_path = "enemyadmin" + + modeladmin_register(AuthorModelAdmin) modeladmin_register(BookModelAdmin) modeladmin_register(TranslatableBookModelAdmin) @@ -211,3 +219,4 @@ modeladmin_register(VisitorAdmin) modeladmin_register(ContributorAdmin) modeladmin_register(RelatedLinkAdmin) modeladmin_register(PageAdmin) +modeladmin_register(EnemyAdmin)