Skip to content

Commit 2a3f1c5

Browse files
authored
Merge pull request #7216 from akatsoulas/members-leaders
Add leaders as members through admin
2 parents 49e34d9 + e21b2a8 commit 2a3f1c5

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

kitsune/groups/admin.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,12 @@ def get_form(self, request, obj=None, **kwargs):
4141

4242
return form
4343

44+
def save_related(self, request, form, formsets, change):
45+
"""Ensure all leaders are also members of the group."""
46+
super().save_related(request, form, formsets, change)
47+
for leader in form.instance.leaders.all():
48+
if not leader.groups.filter(pk=form.instance.group.pk).exists():
49+
leader.groups.add(form.instance.group)
50+
4451

4552
admin.site.register(GroupProfile, GroupProfileAdmin)

kitsune/groups/tests/test_admin.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from django.contrib.admin.sites import AdminSite
2+
from django.contrib.auth.models import Group
3+
from django.test import RequestFactory
4+
5+
from kitsune.groups.admin import GroupProfileAdmin
6+
from kitsune.groups.models import GroupProfile
7+
from kitsune.sumo.tests import TestCase
8+
from kitsune.users.tests import UserFactory
9+
10+
11+
class MockForm:
12+
"""Mock form for testing admin save_related."""
13+
14+
def __init__(self, instance):
15+
self.instance = instance
16+
17+
def save_m2m(self):
18+
"""Mock save_m2m method required by Django admin."""
19+
pass
20+
21+
22+
class GroupProfileAdminTests(TestCase):
23+
"""Tests for GroupProfile admin interface."""
24+
25+
def setUp(self):
26+
self.factory = RequestFactory()
27+
self.site = AdminSite()
28+
self.admin = GroupProfileAdmin(GroupProfile, self.site)
29+
30+
def test_leader_added_as_member_via_admin(self):
31+
"""Ensure leaders added via admin are automatically added as members."""
32+
group = Group.objects.create(name="Test Group")
33+
profile = GroupProfile.add_root(group=group, slug="test-group")
34+
35+
user = UserFactory()
36+
self.assertFalse(user.groups.filter(pk=group.pk).exists())
37+
38+
profile.leaders.add(user)
39+
40+
mock_request = self.factory.post("/admin/groups/groupprofile/")
41+
mock_form = MockForm(profile)
42+
43+
self.admin.save_related(mock_request, mock_form, [], change=True)
44+
45+
self.assertTrue(user.groups.filter(pk=group.pk).exists())
46+
47+
def test_existing_member_stays_member(self):
48+
"""Ensure existing members who become leaders remain members."""
49+
group = Group.objects.create(name="Test Group 2")
50+
profile = GroupProfile.add_root(group=group, slug="test-group-2")
51+
52+
user = UserFactory()
53+
user.groups.add(group)
54+
self.assertTrue(user.groups.filter(pk=group.pk).exists())
55+
56+
profile.leaders.add(user)
57+
58+
mock_request = self.factory.post("/admin/groups/groupprofile/")
59+
mock_form = MockForm(profile)
60+
61+
self.admin.save_related(mock_request, mock_form, [], change=True)
62+
63+
self.assertTrue(user.groups.filter(pk=group.pk).exists())
64+
self.assertEqual(user.groups.filter(pk=group.pk).count(), 1)

0 commit comments

Comments
 (0)