diff --git a/apps/blog/migrations/0005_fix_category_verbose_name_plural.py b/apps/blog/migrations/0005_fix_category_verbose_name_plural.py new file mode 100644 index 0000000..7279444 --- /dev/null +++ b/apps/blog/migrations/0005_fix_category_verbose_name_plural.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.12 on 2026-03-19 00:10 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('blog', '0004_backfill_published_date'), + ] + + operations = [ + migrations.AlterModelOptions( + name='category', + options={'ordering': ['sort_order', 'name'], 'verbose_name_plural': 'categories'}, + ), + ] diff --git a/apps/blog/models.py b/apps/blog/models.py index cbd4535..507c61a 100644 --- a/apps/blog/models.py +++ b/apps/blog/models.py @@ -168,6 +168,7 @@ class Category(models.Model): class Meta: ordering = ["sort_order", "name"] + verbose_name_plural = "categories" def __str__(self): return self.name diff --git a/apps/blog/tests/test_admin_experience.py b/apps/blog/tests/test_admin_experience.py index 6e69d46..791f067 100644 --- a/apps/blog/tests/test_admin_experience.py +++ b/apps/blog/tests/test_admin_experience.py @@ -386,6 +386,31 @@ def test_article_save_autogenerates_summary_when_missing(article_index): assert article.summary == "This should become the summary text." +@pytest.mark.django_db +def test_category_verbose_name_plural(): + """Category Meta should define verbose_name_plural as 'categories'.""" + assert Category._meta.verbose_name_plural == "categories" + + +@pytest.mark.django_db +@override_settings(ALLOWED_HOSTS=["testserver", "localhost", "127.0.0.1"]) +def test_snippet_category_listing_shows_categories(client, django_user_model): + """Categories created in the database should appear in the Snippets listing.""" + Category.objects.create(name="Reviews", slug="reviews") + Category.objects.create(name="Tutorials", slug="tutorials") + + admin = django_user_model.objects.create_superuser( + username="admin-cat", email="admin-cat@example.com", password="admin-pass" + ) + client.force_login(admin) + response = client.get("/cms/snippets/blog/category/") + content = response.content.decode() + + assert response.status_code == 200 + assert "Reviews" in content + assert "Tutorials" in content + + @pytest.mark.django_db def test_article_page_omits_admin_messages_on_frontend(article_page, rf): """Frontend templates should not render admin session messages.""" diff --git a/apps/core/tests/test_message_handling.py b/apps/core/tests/test_message_handling.py index db49de0..839018c 100644 --- a/apps/core/tests/test_message_handling.py +++ b/apps/core/tests/test_message_handling.py @@ -76,3 +76,21 @@ def test_wagtail_admin_template_deduplicates_consecutive_messages(client, django assert response.status_code == 200 assert content.count("has been updated.") == 1 assert content.count("has been published.") == 1 + + +@pytest.mark.django_db +@override_settings(ROOT_URLCONF="apps.core.tests.test_message_handling") +def test_admin_messages_have_auto_clear(client, django_user_model): + """The messages container must set auto-clear so messages dismiss themselves.""" + admin = django_user_model.objects.create_superuser( + username="admin-autoclear", + email="admin-autoclear@example.com", + password="admin-pass", + ) + client.force_login(admin) + + response = client.get("/cms/__tests__/admin-messages/") + content = response.content.decode() + + assert response.status_code == 200 + assert "data-w-messages-auto-clear-value" in content diff --git a/templates/wagtailadmin/base.html b/templates/wagtailadmin/base.html index 973d7df..e413fb8 100644 --- a/templates/wagtailadmin/base.html +++ b/templates/wagtailadmin/base.html @@ -8,7 +8,7 @@ {% keyboard_shortcuts_dialog %}
-
+
    {% if messages %} {% for message in messages %}