Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions core/admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
from django.contrib import admin
from django.db.models import QuerySet
from django.http import HttpRequest
from import_export import fields, resources, widgets
from import_export.admin import ImportExportModelAdmin

Expand Down Expand Up @@ -122,6 +124,30 @@ class UnitGroupAdmin(ImportExportModelAdmin):
list_per_page = 150
list_max_show_all = 400
inlines = (UnitInline,)
actions = ["set_default_artwork"]

@admin.action(description="Set default artwork paths based on slug")
def set_default_artwork(
self, request: HttpRequest, queryset: QuerySet[UnitGroup]
) -> None:
"""Set artwork fields to default values based on the unit group's slug."""
unit_groups_to_update = []
for unit_group in queryset:
unit_group.artwork = f"artwork/{unit_group.slug}.png"
unit_group.artwork_thumb_md = f"artwork-thumb-md/{unit_group.slug}.png"
unit_group.artwork_thumb_sm = f"artwork-thumb-sm/{unit_group.slug}.png"
unit_groups_to_update.append(unit_group)

updated_count = len(unit_groups_to_update)
UnitGroup.objects.bulk_update(
unit_groups_to_update,
["artwork", "artwork_thumb_md", "artwork_thumb_sm"],
)

self.message_user(
request,
f"Successfully set default artwork paths for {updated_count} unit group(s).",
)


@admin.register(UserProfile)
Expand Down
97 changes: 97 additions & 0 deletions core/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,3 +355,100 @@ def test_generate_reset_link(otis):
resp = otis.get_20x("user-info", target_user.pk)
otis.assert_has(resp, "Password reset link generated")
otis.assert_has(resp, "/core/reset/")


@pytest.mark.django_db
def test_set_default_artwork_action():
"""Test the set_default_artwork admin action for UnitGroup."""
from unittest.mock import Mock, patch

from core.admin import UnitGroupAdmin
from core.models import UnitGroup

# Create test unit groups with different slugs
ug1 = UnitGroupFactory.create(
slug="g6summit",
artwork="old/path1.png",
artwork_thumb_md="old/path2.png",
artwork_thumb_sm="old/path3.png",
)
ug2 = UnitGroupFactory.create(
slug="n7summit",
artwork="custom/artwork.png",
artwork_thumb_md="custom/thumb-md.png",
artwork_thumb_sm="custom/thumb-sm.png",
)
ug3 = UnitGroupFactory.create(
slug="c8summit",
artwork="",
artwork_thumb_md="",
artwork_thumb_sm="",
)

# Create admin instance and mock request
admin = UnitGroupAdmin(UnitGroup, None)
request = Mock()

# Create queryset with all unit groups
queryset = UnitGroup.objects.filter(pk__in=[ug1.pk, ug2.pk, ug3.pk])

# Mock the message_user method and call the admin action
with patch.object(admin, "message_user") as mock_message_user:
admin.set_default_artwork(request, queryset)
# Verify message_user was called
mock_message_user.assert_called_once()

# Refresh from database
ug1.refresh_from_db()
ug2.refresh_from_db()
ug3.refresh_from_db()

# Verify artwork fields are set correctly for ug1
assert ug1.artwork == "artwork/g6summit.png"
assert ug1.artwork_thumb_md == "artwork-thumb-md/g6summit.png"
assert ug1.artwork_thumb_sm == "artwork-thumb-sm/g6summit.png"

# Verify artwork fields are set correctly for ug2
assert ug2.artwork == "artwork/n7summit.png"
assert ug2.artwork_thumb_md == "artwork-thumb-md/n7summit.png"
assert ug2.artwork_thumb_sm == "artwork-thumb-sm/n7summit.png"

# Verify artwork fields are set correctly for ug3
assert ug3.artwork == "artwork/c8summit.png"
assert ug3.artwork_thumb_md == "artwork-thumb-md/c8summit.png"
assert ug3.artwork_thumb_sm == "artwork-thumb-sm/c8summit.png"


@pytest.mark.django_db
def test_set_default_artwork_action_single_unit_group():
"""Test the set_default_artwork admin action with a single unit group."""
from unittest.mock import Mock

from core.admin import UnitGroupAdmin
from core.models import UnitGroup

# Create a single unit group
ug = UnitGroupFactory.create(
slug="test-unit",
artwork="initial/artwork.png",
artwork_thumb_md="initial/thumb-md.png",
artwork_thumb_sm="initial/thumb-sm.png",
)

# Create admin instance and mock request
admin = UnitGroupAdmin(UnitGroup, None)
request = Mock()

# Create queryset with single unit group
queryset = UnitGroup.objects.filter(pk=ug.pk)

# Call the admin action
admin.set_default_artwork(request, queryset)

# Refresh from database
ug.refresh_from_db()

# Verify artwork fields are set correctly
assert ug.artwork == "artwork/test-unit.png"
assert ug.artwork_thumb_md == "artwork-thumb-md/test-unit.png"
assert ug.artwork_thumb_sm == "artwork-thumb-sm/test-unit.png"