mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-09 20:40:17 +02:00
Merge branch 'fix_show_available_groups_for_user_only' into 'master'
Fix: Users can be assigned to groups depite not matching state restrictions See merge request allianceauth/allianceauth!1402
This commit is contained in:
commit
9af634d16a
@ -380,6 +380,7 @@ class UserAdmin(BaseUserAdmin):
|
|||||||
'username',
|
'username',
|
||||||
'character_ownerships__character__character_name'
|
'character_ownerships__character__character_name'
|
||||||
)
|
)
|
||||||
|
readonly_fields = ('date_joined', 'last_login')
|
||||||
|
|
||||||
def _characters(self, obj):
|
def _characters(self, obj):
|
||||||
character_ownerships = list(obj.character_ownerships.all())
|
character_ownerships = list(obj.character_ownerships.all())
|
||||||
@ -425,10 +426,19 @@ class UserAdmin(BaseUserAdmin):
|
|||||||
def has_delete_permission(self, request, obj=None):
|
def has_delete_permission(self, request, obj=None):
|
||||||
return request.user.has_perm('auth.delete_user')
|
return request.user.has_perm('auth.delete_user')
|
||||||
|
|
||||||
|
def get_object(self, *args , **kwargs):
|
||||||
|
obj = super().get_object(*args , **kwargs)
|
||||||
|
self.obj = obj # storing current object for use in formfield_for_manytomany
|
||||||
|
return obj
|
||||||
|
|
||||||
def formfield_for_manytomany(self, db_field, request, **kwargs):
|
def formfield_for_manytomany(self, db_field, request, **kwargs):
|
||||||
"""overriding this formfield to have sorted lists in the form"""
|
|
||||||
if db_field.name == "groups":
|
if db_field.name == "groups":
|
||||||
kwargs["queryset"] = Group.objects.all().order_by(Lower('name'))
|
groups_qs = Group.objects.filter(authgroup__states__isnull=True)
|
||||||
|
obj_state = self.obj.profile.state
|
||||||
|
if obj_state:
|
||||||
|
matching_groups_qs = Group.objects.filter(authgroup__states=obj_state)
|
||||||
|
groups_qs = groups_qs | matching_groups_qs
|
||||||
|
kwargs["queryset"] = groups_qs.order_by(Lower('name'))
|
||||||
return super().formfield_for_manytomany(db_field, request, **kwargs)
|
return super().formfield_for_manytomany(db_field, request, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from bs4 import BeautifulSoup
|
||||||
from urllib.parse import quote
|
from urllib.parse import quote
|
||||||
from unittest.mock import patch, MagicMock
|
from unittest.mock import patch, MagicMock
|
||||||
|
|
||||||
@ -542,6 +543,42 @@ class TestUserAdmin(TestCaseWithTestData):
|
|||||||
self.assertEqual(response.status_code, expected)
|
self.assertEqual(response.status_code, expected)
|
||||||
|
|
||||||
|
|
||||||
|
class TestUserAdminChangeForm(TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls) -> None:
|
||||||
|
super().setUpClass()
|
||||||
|
cls.modeladmin = UserAdmin(model=User, admin_site=AdminSite())
|
||||||
|
|
||||||
|
def test_should_show_groups_available_to_user_with_blue_state_only(self):
|
||||||
|
# given
|
||||||
|
superuser = User.objects.create_superuser("Super")
|
||||||
|
user = AuthUtils.create_user("Bruce Wayne")
|
||||||
|
character = AuthUtils.add_main_character_2(
|
||||||
|
user,
|
||||||
|
name="Bruce Wayne",
|
||||||
|
character_id=1001,
|
||||||
|
corp_id=2001,
|
||||||
|
corp_name="Wayne Technologies"
|
||||||
|
)
|
||||||
|
blue_state = State.objects.get(name="Blue")
|
||||||
|
blue_state.member_characters.add(character)
|
||||||
|
member_state = AuthUtils.get_member_state()
|
||||||
|
group_1 = Group.objects.create(name="Group 1")
|
||||||
|
group_2 = Group.objects.create(name="Group 2")
|
||||||
|
group_2.authgroup.states.add(blue_state)
|
||||||
|
group_3 = Group.objects.create(name="Group 3")
|
||||||
|
group_3.authgroup.states.add(member_state)
|
||||||
|
self.client.force_login(superuser)
|
||||||
|
# when
|
||||||
|
response = self.client.get(f"/admin/authentication/user/{user.pk}/change/")
|
||||||
|
# then
|
||||||
|
self.assertEqual(response.status_code, 200)
|
||||||
|
soup = BeautifulSoup(response.rendered_content, features="html.parser")
|
||||||
|
groups_select = soup.find("select", {"id": "id_groups"}).find_all('option')
|
||||||
|
group_ids = {int(option["value"]) for option in groups_select}
|
||||||
|
self.assertSetEqual(group_ids, {group_1.pk, group_2.pk})
|
||||||
|
|
||||||
|
|
||||||
class TestMakeServicesHooksActions(TestCaseWithTestData):
|
class TestMakeServicesHooksActions(TestCaseWithTestData):
|
||||||
|
|
||||||
class MyServicesHookTypeA(ServicesHook):
|
class MyServicesHookTypeA(ServicesHook):
|
||||||
|
@ -174,7 +174,7 @@ class AuthUtils:
|
|||||||
alliance_id=None,
|
alliance_id=None,
|
||||||
alliance_name='',
|
alliance_name='',
|
||||||
disconnect_signals=False
|
disconnect_signals=False
|
||||||
):
|
) -> EveCharacter:
|
||||||
"""new version that works in all cases"""
|
"""new version that works in all cases"""
|
||||||
if disconnect_signals:
|
if disconnect_signals:
|
||||||
cls.disconnect_signals()
|
cls.disconnect_signals()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user