From 39a40a8c43bfb2c019020d56d1829da186f11736 Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Fri, 2 Jul 2021 16:42:07 +0000 Subject: [PATCH 01/20] Limit Django-Celery-Beat to 2.2.0 for Celery 4.x --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a44aeb8e..ad43954a 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ install_requires = [ 'django-registration>=3.1', 'django-sortedm2m', 'django-redis-cache>=3.0.0', - 'django-celery-beat>=2.0.0', + 'django-celery-beat>=2.0.0,<2.2.1', 'openfire-restapi', 'sleekxmpp', From 6f2807cba275f2cc25e471dabd6c221555a3be3c Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Fri, 2 Jul 2021 16:47:06 +0000 Subject: [PATCH 02/20] Version Bump v2.8.6 --- allianceauth/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/__init__.py b/allianceauth/__init__.py index 79da9684..30bcaf07 100644 --- a/allianceauth/__init__.py +++ b/allianceauth/__init__.py @@ -1,7 +1,7 @@ # This will make sure the app is always imported when # Django starts so that shared_task will use this app. -__version__ = '2.8.5' +__version__ = '2.8.6' __title__ = 'Alliance Auth' __url__ = 'https://gitlab.com/allianceauth/allianceauth' NAME = '%s v%s' % (__title__, __version__) From 0f0f9b606248b17dd85ff611e68b7f75973f77f5 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 08:09:40 -0400 Subject: [PATCH 03/20] Fix group creation ignoring AuthGroup settings. (Fixes #1161) --- allianceauth/groupmanagement/admin.py | 10 +++++++--- allianceauth/groupmanagement/models.py | 21 ++------------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index 37fa1e37..14a1d569 100644 --- a/allianceauth/groupmanagement/admin.py +++ b/allianceauth/groupmanagement/admin.py @@ -40,9 +40,6 @@ class AuthGroupInlineAdmin(admin.StackedInline): kwargs["queryset"] = Group.objects.order_by(Lower('name')) return super().formfield_for_manytomany(db_field, request, **kwargs) - def has_add_permission(self, request, obj=None): - return False - def has_delete_permission(self, request, obj=None): return False @@ -173,6 +170,13 @@ class GroupAdmin(admin.ModelAdmin): kwargs["queryset"] = Permission.objects.select_related("content_type").all() return super().formfield_for_manytomany(db_field, request, **kwargs) + def save_formset(self, request, form, formset, change): + for inline_form in formset: + ag_instance = inline_form.save(commit=False) + ag_instance.group = form.instance + ag_instance.save() + formset.save() + class Group(BaseGroup): class Meta: diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index 861872ef..2388283b 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -55,7 +55,6 @@ class RequestLog(models.Model): return user.profile.main_character - class AuthGroup(models.Model): """ Extends Django Group model with a one-to-one field @@ -107,7 +106,8 @@ class AuthGroup(models.Model): help_text="States listed here will have the ability to join this group provided " "they have the proper permissions.") - description = models.TextField(max_length=512, blank=True, help_text="Short description (max. 512 characters) of the group shown to users.") + description = models.TextField(max_length=512, blank=True, help_text="Short description (max. 512 characters)" + " of the group shown to users.") def __str__(self): return self.group.name @@ -117,20 +117,3 @@ class AuthGroup(models.Model): ("request_groups", u"Can request non-public groups"), ) default_permissions = tuple() - - -@receiver(post_save, sender=Group) -def create_auth_group(sender, instance, created, **kwargs): - """ - Creates the AuthGroup model when a group is created - """ - if created: - AuthGroup.objects.create(group=instance) - - -@receiver(post_save, sender=Group) -def save_auth_group(sender, instance, **kwargs): - """ - Ensures AuthGroup model is saved automatically - """ - instance.authgroup.save() From 7c1d1074f9f6bb4d199c574d57cbd848d60704a8 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 08:41:25 -0400 Subject: [PATCH 04/20] Update tests. --- allianceauth/groupmanagement/tests/test_admin.py | 10 ++++++++-- .../groupmanagement/tests/test_managers.py | 16 ++++++++++++++-- .../groupmanagement/tests/test_models.py | 5 +++-- .../groupmanagement/tests/test_signals.py | 12 +++++++++--- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index b3916d7e..65ff908b 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -11,7 +11,7 @@ from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) -from ..admin import HasLeaderFilter, GroupAdmin, Group +from ..admin import HasLeaderFilter, GroupAdmin, Group, AuthGroup from . import get_admin_change_view_url if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: @@ -38,7 +38,8 @@ class TestGroupAdmin(TestCase): super().setUpClass() # group 1 - has leader - cls.group_1 = Group.objects.create(name='Group 1') + cls.group_1 = Group.objects.create(name='Group 1') + AuthGroup.objects.create(group=cls.group_1) cls.group_1.authgroup.description = 'Default Group' cls.group_1.authgroup.internal = False cls.group_1.authgroup.hidden = False @@ -46,12 +47,14 @@ class TestGroupAdmin(TestCase): # group 2 - no leader cls.group_2 = Group.objects.create(name='Group 2') + AuthGroup.objects.create(group=cls.group_2) cls.group_2.authgroup.description = 'Internal Group' cls.group_2.authgroup.internal = True cls.group_2.authgroup.save() # group 3 - has leader cls.group_3 = Group.objects.create(name='Group 3') + AuthGroup.objects.create(group=cls.group_3) cls.group_3.authgroup.description = 'Hidden Group' cls.group_3.authgroup.internal = False cls.group_3.authgroup.hidden = True @@ -59,6 +62,7 @@ class TestGroupAdmin(TestCase): # group 4 - no leader cls.group_4 = Group.objects.create(name='Group 4') + AuthGroup.objects.create(group=cls.group_4) cls.group_4.authgroup.description = 'Open Group' cls.group_4.authgroup.internal = False cls.group_4.authgroup.hidden = False @@ -67,6 +71,7 @@ class TestGroupAdmin(TestCase): # group 5 - no leader cls.group_5 = Group.objects.create(name='Group 5') + AuthGroup.objects.create(group=cls.group_5) cls.group_5.authgroup.description = 'Public Group' cls.group_5.authgroup.internal = False cls.group_5.authgroup.hidden = False @@ -75,6 +80,7 @@ class TestGroupAdmin(TestCase): # group 6 - no leader cls.group_6 = Group.objects.create(name='Group 6') + AuthGroup.objects.create(group=cls.group_6) cls.group_6.authgroup.description = 'Mixed Group' cls.group_6.authgroup.internal = False cls.group_6.authgroup.hidden = True diff --git a/allianceauth/groupmanagement/tests/test_managers.py b/allianceauth/groupmanagement/tests/test_managers.py index eb48490f..005d6d5d 100644 --- a/allianceauth/groupmanagement/tests/test_managers.py +++ b/allianceauth/groupmanagement/tests/test_managers.py @@ -7,7 +7,7 @@ from django.urls import reverse from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo from allianceauth.tests.auth_utils import AuthUtils -from ..models import GroupRequest +from ..models import GroupRequest, AuthGroup from ..managers import GroupManager @@ -29,8 +29,11 @@ class GroupManagementVisibilityTestCase(TestCase): corporation_id='2', corporation_name='test corp', corporation_ticker='TEST', alliance=cls.alliance, member_count=1 ) cls.group1 = Group.objects.create(name='group1') + AuthGroup.objects.create(group=cls.group1) cls.group2 = Group.objects.create(name='group2') + AuthGroup.objects.create(group=cls.group2) cls.group3 = Group.objects.create(name='group3') + AuthGroup.objects.create(group=cls.group3) def setUp(self): self.user.refresh_from_db() @@ -77,7 +80,8 @@ class TestGroupManager(TestCase): super().setUpClass() # group 1 - cls.group_default = Group.objects.create(name='default') + cls.group_default = Group.objects.create(name='default') + AuthGroup.objects.create(group=cls.group_default) cls.group_default.authgroup.description = 'Default Group' cls.group_default.authgroup.internal = False cls.group_default.authgroup.hidden = False @@ -85,12 +89,14 @@ class TestGroupManager(TestCase): # group 2 cls.group_internal = Group.objects.create(name='internal') + AuthGroup.objects.create(group=cls.group_internal) cls.group_internal.authgroup.description = 'Internal Group' cls.group_internal.authgroup.internal = True cls.group_internal.authgroup.save() # group 3 cls.group_hidden = Group.objects.create(name='hidden') + AuthGroup.objects.create(group=cls.group_hidden) cls.group_hidden.authgroup.description = 'Hidden Group' cls.group_hidden.authgroup.internal = False cls.group_hidden.authgroup.hidden = True @@ -98,6 +104,7 @@ class TestGroupManager(TestCase): # group 4 cls.group_open = Group.objects.create(name='open') + AuthGroup.objects.create(group=cls.group_open) cls.group_open.authgroup.description = 'Open Group' cls.group_open.authgroup.internal = False cls.group_open.authgroup.hidden = False @@ -106,6 +113,7 @@ class TestGroupManager(TestCase): # group 5 cls.group_public_1 = Group.objects.create(name='public 1') + AuthGroup.objects.create(group=cls.group_public_1) cls.group_public_1.authgroup.description = 'Public Group 1' cls.group_public_1.authgroup.internal = False cls.group_public_1.authgroup.hidden = False @@ -114,6 +122,7 @@ class TestGroupManager(TestCase): # group 6 cls.group_public_2 = Group.objects.create(name='public 2') + AuthGroup.objects.create(group=cls.group_public_2) cls.group_public_2.authgroup.description = 'Public Group 2' cls.group_public_2.authgroup.internal = False cls.group_public_2.authgroup.hidden = True @@ -123,6 +132,7 @@ class TestGroupManager(TestCase): # group 7 cls.group_default_member = Group.objects.create(name='default members') + AuthGroup.objects.create(group=cls.group_default_member) cls.group_default_member.authgroup.description = \ 'Default Group for members only' cls.group_default_member.authgroup.internal = False @@ -338,7 +348,9 @@ class TestPendingRequestsCountForUser(TestCase): def setUp(self) -> None: self.group_1 = Group.objects.create(name="Group 1") + AuthGroup.objects.create(group=self.group_1) self.group_2 = Group.objects.create(name="Group 2") + AuthGroup.objects.create(group=self.group_2) self.user_leader_1 = AuthUtils.create_member('Clark Kent') self.group_1.authgroup.group_leaders.add(self.user_leader_1) self.user_leader_2 = AuthUtils.create_member('Peter Parker') diff --git a/allianceauth/groupmanagement/tests/test_models.py b/allianceauth/groupmanagement/tests/test_models.py index 01511f97..869db671 100644 --- a/allianceauth/groupmanagement/tests/test_models.py +++ b/allianceauth/groupmanagement/tests/test_models.py @@ -8,7 +8,7 @@ from allianceauth.eveonline.models import ( EveCorporationInfo, EveAllianceInfo, EveCharacter ) -from ..models import GroupRequest, RequestLog +from ..models import GroupRequest, RequestLog, AuthGroup def create_testdata(): @@ -20,7 +20,8 @@ def create_testdata(): EveAllianceInfo.objects.all().delete() # group 1 - group = Group.objects.create(name='Superheros') + group = Group.objects.create(name='Superheros') + AuthGroup.objects.create(group=group) group.authgroup.description = 'Default Group' group.authgroup.internal = False group.authgroup.hidden = False diff --git a/allianceauth/groupmanagement/tests/test_signals.py b/allianceauth/groupmanagement/tests/test_signals.py index 18e94fde..3483fe5d 100644 --- a/allianceauth/groupmanagement/tests/test_signals.py +++ b/allianceauth/groupmanagement/tests/test_signals.py @@ -5,6 +5,8 @@ from allianceauth.eveonline.models import EveCorporationInfo from allianceauth.eveonline.autogroups.models import AutogroupsConfig from allianceauth.tests.auth_utils import AuthUtils +from ..models import AuthGroup + class TestCheckGroupsOnStateChange(TestCase): @@ -39,14 +41,17 @@ class TestCheckGroupsOnStateChange(TestCase): and remains member of normal group and auto group """ # setup - state_group = Group.objects.create(name='state_group') + state_group = Group.objects.create(name='state_group') + AuthGroup.objects.create(group=state_group) state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.internal = False state_group.save() normal_group = Group.objects.create(name='normal_group') + AuthGroup.objects.create(group=normal_group) normal_group.authgroup.internal = False normal_group.save() - internal_group = Group.objects.create(name='internal_group') + internal_group = Group.objects.create(name='internal_group') + AuthGroup.objects.create(group=internal_group) autogroup_config = AutogroupsConfig.objects.create(corp_groups=True) autogroup_config.states.add(self.test_state_1) autogroup_config.states.add(self.guest_state) @@ -79,7 +84,8 @@ class TestCheckGroupsOnStateChange(TestCase): then user remains member of that group """ # setup - state_group = Group.objects.create(name='state_group') + state_group = Group.objects.create(name='state_group') + AuthGroup.objects.create(group=state_group) state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.states.add(self.test_state_2) From eaa1cde01a1a73b9950161151f2d94b90fbaa6de Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 08:41:36 -0400 Subject: [PATCH 05/20] Update autogroups. --- allianceauth/eveonline/autogroups/models.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/allianceauth/eveonline/autogroups/models.py b/allianceauth/eveonline/autogroups/models.py index 23b7bf23..89a3f4db 100644 --- a/allianceauth/eveonline/autogroups/models.py +++ b/allianceauth/eveonline/autogroups/models.py @@ -6,6 +6,8 @@ from django.core.exceptions import ObjectDoesNotExist from allianceauth.authentication.models import State from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo +from allianceauth.groupmanagement.models import AuthGroup + logger = logging.getLogger(__name__) @@ -179,12 +181,16 @@ class AutogroupsConfig(models.Model): @transaction.atomic def create_alliance_group(self, alliance: EveAllianceInfo) -> Group: group, created = Group.objects.get_or_create(name=self.get_alliance_group_name(alliance)) + if created: + AuthGroup.objects.create(group=group) ManagedAllianceGroup.objects.get_or_create(group=group, config=self, alliance=alliance) return group @transaction.atomic def create_corp_group(self, corp: EveCorporationInfo) -> Group: group, created = Group.objects.get_or_create(name=self.get_corp_group_name(corp)) + if created: + AuthGroup.objects.create(group=group) ManagedCorpGroup.objects.get_or_create(group=group, config=self, corp=corp) return group @@ -241,6 +247,7 @@ class ManagedGroup(models.Model): def __str__(self): return "Managed Group: %s" % self.group.name + class ManagedCorpGroup(ManagedGroup): corp = models.ForeignKey(EveCorporationInfo, on_delete=models.CASCADE) From 15db817382d8c575e8190c87d11f07307b9d7b0a Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 09:13:17 -0400 Subject: [PATCH 06/20] Add authutil for creating groups with authgroups. --- allianceauth/tests/auth_utils.py | 23 +++++++++++++++++++++++ allianceauth/tests/test_auth_utils.py | 8 +++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/allianceauth/tests/auth_utils.py b/allianceauth/tests/auth_utils.py index d5642d08..7120c2de 100644 --- a/allianceauth/tests/auth_utils.py +++ b/allianceauth/tests/auth_utils.py @@ -25,6 +25,7 @@ from allianceauth.services.signals import ( process_main_character_change, process_main_character_update ) +from allianceauth.groupmanagement.models import AuthGroup class AuthUtils: @@ -69,6 +70,28 @@ class AuthUtils: cls.connect_signals() return state + @classmethod + def _create_group(cls, group_name): + group = Group.objects.create(name=group_name) + AuthGroup.objects.create(group=group) + return group + + @classmethod + def create_group(cls, group_name, disconnect_signals=False): + """ + Create a new group and its authgroup. + + Args: + group_name: name of the group + disconnect_signals: whether or not to run without signals. + """ + if disconnect_signals: + cls.disconnect_signals() + group = cls._create_group(group_name) + if disconnect_signals: + cls.connect_signals() + return group + @classmethod def get_member_state(cls): try: diff --git a/allianceauth/tests/test_auth_utils.py b/allianceauth/tests/test_auth_utils.py index 1eb5d4a5..d6c5644a 100644 --- a/allianceauth/tests/test_auth_utils.py +++ b/allianceauth/tests/test_auth_utils.py @@ -6,6 +6,7 @@ from django.test import TestCase from allianceauth.eveonline.models import ( EveCorporationInfo, EveAllianceInfo, EveCharacter ) +from allianceauth.groupmanagement.models import AuthGroup from .auth_utils import AuthUtils @@ -15,7 +16,12 @@ class TestAuthUtils(TestCase): def test_can_create_user(self): user = AuthUtils.create_user('Bruce Wayne') self.assertTrue(User.objects.filter(username='Bruce Wayne').exists()) - + + def test_can_create_group(self): + group = AuthUtils.create_group('Test Group') + self.assertTrue(Group.objects.filter(name='Test Group').exists()) + self.assertTrue(AuthGroup.objects.filter(group=group).exists()) + def test_can_add_main_character_2(self): user = AuthUtils.create_user('Bruce Wayne') character = AuthUtils.add_main_character_2( From 0897383e41bf401f9f7855b2b510cedcdd204de6 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 09:13:47 -0400 Subject: [PATCH 07/20] Update tests to use the create_group util. --- .../groupmanagement/tests/test_admin.py | 19 ++++------ .../groupmanagement/tests/test_managers.py | 36 +++++++------------ .../groupmanagement/tests/test_models.py | 3 +- .../groupmanagement/tests/test_signals.py | 12 +++---- .../modules/discord/tests/test_tasks.py | 4 +-- .../services/modules/teamspeak3/tests.py | 3 +- allianceauth/services/tests/test_signals.py | 4 +-- 7 files changed, 30 insertions(+), 51 deletions(-) diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index 65ff908b..72153460 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -10,6 +10,7 @@ from allianceauth.authentication.models import CharacterOwnership, State from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) +from allianceauth.tests.auth_utils import AuthUtils from ..admin import HasLeaderFilter, GroupAdmin, Group, AuthGroup from . import get_admin_change_view_url @@ -38,31 +39,27 @@ class TestGroupAdmin(TestCase): super().setUpClass() # group 1 - has leader - cls.group_1 = Group.objects.create(name='Group 1') - AuthGroup.objects.create(group=cls.group_1) + cls.group_1 = AuthUtils.create_group(group_name='Group 1') cls.group_1.authgroup.description = 'Default Group' cls.group_1.authgroup.internal = False cls.group_1.authgroup.hidden = False cls.group_1.authgroup.save() # group 2 - no leader - cls.group_2 = Group.objects.create(name='Group 2') - AuthGroup.objects.create(group=cls.group_2) + cls.group_2 = AuthUtils.create_group(group_name='Group 2') cls.group_2.authgroup.description = 'Internal Group' cls.group_2.authgroup.internal = True cls.group_2.authgroup.save() # group 3 - has leader - cls.group_3 = Group.objects.create(name='Group 3') - AuthGroup.objects.create(group=cls.group_3) + cls.group_3 = AuthUtils.create_group(group_name='Group 3') cls.group_3.authgroup.description = 'Hidden Group' cls.group_3.authgroup.internal = False cls.group_3.authgroup.hidden = True cls.group_3.authgroup.save() # group 4 - no leader - cls.group_4 = Group.objects.create(name='Group 4') - AuthGroup.objects.create(group=cls.group_4) + cls.group_4 = AuthUtils.create_group(group_name='Group 4') cls.group_4.authgroup.description = 'Open Group' cls.group_4.authgroup.internal = False cls.group_4.authgroup.hidden = False @@ -70,8 +67,7 @@ class TestGroupAdmin(TestCase): cls.group_4.authgroup.save() # group 5 - no leader - cls.group_5 = Group.objects.create(name='Group 5') - AuthGroup.objects.create(group=cls.group_5) + cls.group_5 = AuthUtils.create_group(group_name='Group 5') cls.group_5.authgroup.description = 'Public Group' cls.group_5.authgroup.internal = False cls.group_5.authgroup.hidden = False @@ -79,8 +75,7 @@ class TestGroupAdmin(TestCase): cls.group_5.authgroup.save() # group 6 - no leader - cls.group_6 = Group.objects.create(name='Group 6') - AuthGroup.objects.create(group=cls.group_6) + cls.group_6 = AuthUtils.create_group(group_name='Group 6') cls.group_6.authgroup.description = 'Mixed Group' cls.group_6.authgroup.internal = False cls.group_6.authgroup.hidden = True diff --git a/allianceauth/groupmanagement/tests/test_managers.py b/allianceauth/groupmanagement/tests/test_managers.py index 005d6d5d..0e47d91b 100644 --- a/allianceauth/groupmanagement/tests/test_managers.py +++ b/allianceauth/groupmanagement/tests/test_managers.py @@ -28,12 +28,9 @@ class GroupManagementVisibilityTestCase(TestCase): cls.corp = EveCorporationInfo.objects.create( corporation_id='2', corporation_name='test corp', corporation_ticker='TEST', alliance=cls.alliance, member_count=1 ) - cls.group1 = Group.objects.create(name='group1') - AuthGroup.objects.create(group=cls.group1) - cls.group2 = Group.objects.create(name='group2') - AuthGroup.objects.create(group=cls.group2) - cls.group3 = Group.objects.create(name='group3') - AuthGroup.objects.create(group=cls.group3) + cls.group1 = AuthUtils.create_group(group_name='group1') + cls.group2 = AuthUtils.create_group(group_name='group2') + cls.group3 = AuthUtils.create_group(group_name='group3') def setUp(self): self.user.refresh_from_db() @@ -80,31 +77,27 @@ class TestGroupManager(TestCase): super().setUpClass() # group 1 - cls.group_default = Group.objects.create(name='default') - AuthGroup.objects.create(group=cls.group_default) + cls.group_default = AuthUtils.create_group(group_name='default') cls.group_default.authgroup.description = 'Default Group' cls.group_default.authgroup.internal = False cls.group_default.authgroup.hidden = False cls.group_default.authgroup.save() # group 2 - cls.group_internal = Group.objects.create(name='internal') - AuthGroup.objects.create(group=cls.group_internal) + cls.group_internal = AuthUtils.create_group(group_name='internal') cls.group_internal.authgroup.description = 'Internal Group' cls.group_internal.authgroup.internal = True cls.group_internal.authgroup.save() # group 3 - cls.group_hidden = Group.objects.create(name='hidden') - AuthGroup.objects.create(group=cls.group_hidden) + cls.group_hidden = AuthUtils.create_group(group_name='hidden') cls.group_hidden.authgroup.description = 'Hidden Group' cls.group_hidden.authgroup.internal = False cls.group_hidden.authgroup.hidden = True cls.group_hidden.authgroup.save() # group 4 - cls.group_open = Group.objects.create(name='open') - AuthGroup.objects.create(group=cls.group_open) + cls.group_open = AuthUtils.create_group(group_name='open') cls.group_open.authgroup.description = 'Open Group' cls.group_open.authgroup.internal = False cls.group_open.authgroup.hidden = False @@ -112,8 +105,7 @@ class TestGroupManager(TestCase): cls.group_open.authgroup.save() # group 5 - cls.group_public_1 = Group.objects.create(name='public 1') - AuthGroup.objects.create(group=cls.group_public_1) + cls.group_public_1 = AuthUtils.create_group(group_name='public 1') cls.group_public_1.authgroup.description = 'Public Group 1' cls.group_public_1.authgroup.internal = False cls.group_public_1.authgroup.hidden = False @@ -121,8 +113,7 @@ class TestGroupManager(TestCase): cls.group_public_1.authgroup.save() # group 6 - cls.group_public_2 = Group.objects.create(name='public 2') - AuthGroup.objects.create(group=cls.group_public_2) + cls.group_public_2 = AuthUtils.create_group(group_name='public 2') cls.group_public_2.authgroup.description = 'Public Group 2' cls.group_public_2.authgroup.internal = False cls.group_public_2.authgroup.hidden = True @@ -131,8 +122,7 @@ class TestGroupManager(TestCase): cls.group_public_2.authgroup.save() # group 7 - cls.group_default_member = Group.objects.create(name='default members') - AuthGroup.objects.create(group=cls.group_default_member) + cls.group_default_member = AuthUtils.create_group(group_name='default members') cls.group_default_member.authgroup.description = \ 'Default Group for members only' cls.group_default_member.authgroup.internal = False @@ -347,10 +337,8 @@ class TestGroupManager(TestCase): class TestPendingRequestsCountForUser(TestCase): def setUp(self) -> None: - self.group_1 = Group.objects.create(name="Group 1") - AuthGroup.objects.create(group=self.group_1) - self.group_2 = Group.objects.create(name="Group 2") - AuthGroup.objects.create(group=self.group_2) + self.group_1 = AuthUtils.create_group(group_name="Group 1") + self.group_2 = AuthUtils.create_group(group_name="Group 2") self.user_leader_1 = AuthUtils.create_member('Clark Kent') self.group_1.authgroup.group_leaders.add(self.user_leader_1) self.user_leader_2 = AuthUtils.create_member('Peter Parker') diff --git a/allianceauth/groupmanagement/tests/test_models.py b/allianceauth/groupmanagement/tests/test_models.py index 869db671..65921918 100644 --- a/allianceauth/groupmanagement/tests/test_models.py +++ b/allianceauth/groupmanagement/tests/test_models.py @@ -20,8 +20,7 @@ def create_testdata(): EveAllianceInfo.objects.all().delete() # group 1 - group = Group.objects.create(name='Superheros') - AuthGroup.objects.create(group=group) + group = AuthUtils.create_group(group_name='Superheros') group.authgroup.description = 'Default Group' group.authgroup.internal = False group.authgroup.hidden = False diff --git a/allianceauth/groupmanagement/tests/test_signals.py b/allianceauth/groupmanagement/tests/test_signals.py index 3483fe5d..88fa37c2 100644 --- a/allianceauth/groupmanagement/tests/test_signals.py +++ b/allianceauth/groupmanagement/tests/test_signals.py @@ -41,17 +41,14 @@ class TestCheckGroupsOnStateChange(TestCase): and remains member of normal group and auto group """ # setup - state_group = Group.objects.create(name='state_group') - AuthGroup.objects.create(group=state_group) + state_group = AuthUtils.create_group(group_name='state_group') state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.internal = False state_group.save() - normal_group = Group.objects.create(name='normal_group') - AuthGroup.objects.create(group=normal_group) + normal_group = AuthUtils.create_group(group_name='normal_group') normal_group.authgroup.internal = False normal_group.save() - internal_group = Group.objects.create(name='internal_group') - AuthGroup.objects.create(group=internal_group) + internal_group = AuthUtils.create_group(group_name='internal_group') autogroup_config = AutogroupsConfig.objects.create(corp_groups=True) autogroup_config.states.add(self.test_state_1) autogroup_config.states.add(self.guest_state) @@ -84,8 +81,7 @@ class TestCheckGroupsOnStateChange(TestCase): then user remains member of that group """ # setup - state_group = Group.objects.create(name='state_group') - AuthGroup.objects.create(group=state_group) + state_group = AuthUtils.create_group(group_name='state_group') state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.states.add(self.test_state_2) diff --git a/allianceauth/services/modules/discord/tests/test_tasks.py b/allianceauth/services/modules/discord/tests/test_tasks.py index 4c33b012..75e71de2 100644 --- a/allianceauth/services/modules/discord/tests/test_tasks.py +++ b/allianceauth/services/modules/discord/tests/test_tasks.py @@ -28,8 +28,8 @@ class TestUpdateGroups(TestCase): def setUpClass(cls): super().setUpClass() cls.user = AuthUtils.create_member(TEST_USER_NAME) - cls.group_1 = Group.objects.create(name='Group 1') - cls.group_2 = Group.objects.create(name='Group 2') + cls.group_1 = AuthUtils.create_group(group_name='Group 1') + cls.group_2 = AuthUtils.create_group(group_name='Group 2') cls.group_1.user_set.add(cls.user) cls.group_2.user_set.add(cls.user) diff --git a/allianceauth/services/modules/teamspeak3/tests.py b/allianceauth/services/modules/teamspeak3/tests.py index 9584a34a..0c5118b2 100644 --- a/allianceauth/services/modules/teamspeak3/tests.py +++ b/allianceauth/services/modules/teamspeak3/tests.py @@ -287,7 +287,8 @@ class Teamspeak3SignalsTestCase(TestCase): # Overload transaction.on_commit so everything happens synchronously transaction.on_commit = lambda fn: fn() - AuthTS.objects.create(auth_group=Group.objects.create(name='Test Group')) # Trigger signal (AuthTS creation) + # Trigger signal (AuthTS creation) + AuthTS.objects.create(auth_group=AuthUtils.create_group(group_name='Test Group')) self.assertTrue(trigger_all_ts_update.called) diff --git a/allianceauth/services/tests/test_signals.py b/allianceauth/services/tests/test_signals.py index 65426c37..3e1a7999 100644 --- a/allianceauth/services/tests/test_signals.py +++ b/allianceauth/services/tests/test_signals.py @@ -32,7 +32,7 @@ class ServicesSignalsTestCase(TestCase): # Overload transaction.on_commit so everything happens synchronously transaction.on_commit = lambda fn: fn() - test_group = Group.objects.create(name="Test group") + test_group = AuthUtils.create_group(group_name="Test group") # Act, should trigger m2m change self.member.groups.add(test_group) @@ -97,7 +97,7 @@ class ServicesSignalsTestCase(TestCase): # Overload transaction.on_commit so everything happens synchronously transaction.on_commit = lambda fn: fn() - test_group = Group.objects.create(name="Test group") + test_group = AuthUtils.create_group(group_name="Test group") AuthUtils.disconnect_signals() self.member.groups.add(test_group) AuthUtils.connect_signals() From 37005b1c687182115ca49fa0d3a77b82d55231c2 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 09:18:53 -0400 Subject: [PATCH 08/20] Fix missed test. --- allianceauth/groupmanagement/tests/test_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/groupmanagement/tests/test_models.py b/allianceauth/groupmanagement/tests/test_models.py index 65921918..02a484b7 100644 --- a/allianceauth/groupmanagement/tests/test_models.py +++ b/allianceauth/groupmanagement/tests/test_models.py @@ -157,7 +157,7 @@ class TestRequestLog(TestCase): class TestAuthGroup(TestCase): def test_str(self): - group = Group.objects.create(name='Superheros') + group = AuthUtils.create_group(group_name='Superheros') group.authgroup.description = 'Default Group' group.authgroup.internal = False group.authgroup.hidden = False From 6c3650d9f2d4be92cc54f24cb431df8b0ee8bab1 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 09:28:31 -0400 Subject: [PATCH 09/20] More test fixes. --- allianceauth/authentication/tests/test_backend.py | 4 ++-- allianceauth/groupmanagement/tests/test_signals.py | 2 +- allianceauth/permissions_tool/tests.py | 4 ++-- .../services/modules/discord/tests/test_integration.py | 2 +- .../services/modules/discord/tests/test_managers.py | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/allianceauth/authentication/tests/test_backend.py b/allianceauth/authentication/tests/test_backend.py index 2a846c7c..ef28d978 100644 --- a/allianceauth/authentication/tests/test_backend.py +++ b/allianceauth/authentication/tests/test_backend.py @@ -23,8 +23,8 @@ class TestStatePermissions(TestCase): self.permission_2 = AuthUtils.get_permission_by_name(PERMISSION_2) # group - self.group_1 = Group.objects.create(name="Group 1") - self.group_2 = Group.objects.create(name="Group 2") + self.group_1 = AuthUtils.create_group(group_name="Group 1") + self.group_2 = AuthUtils.create_group(group_name="Group 2") # state self.state_1 = AuthUtils.get_member_state() diff --git a/allianceauth/groupmanagement/tests/test_signals.py b/allianceauth/groupmanagement/tests/test_signals.py index 88fa37c2..9d7f2d75 100644 --- a/allianceauth/groupmanagement/tests/test_signals.py +++ b/allianceauth/groupmanagement/tests/test_signals.py @@ -53,7 +53,7 @@ class TestCheckGroupsOnStateChange(TestCase): autogroup_config.states.add(self.test_state_1) autogroup_config.states.add(self.guest_state) auto_group = autogroup_config.corp_managed_groups.first() - internal_state_group = Group.objects.create(name='internal_state_group') + internal_state_group = AuthUtils.create_group(group_name='internal_state_group') internal_state_group.authgroup.states.add(self.test_state_1) self.test_state_1.member_corporations.add(self.corp_1) self.user.groups.add(normal_group) diff --git a/allianceauth/permissions_tool/tests.py b/allianceauth/permissions_tool/tests.py index 76573bbc..fb124892 100644 --- a/allianceauth/permissions_tool/tests.py +++ b/allianceauth/permissions_tool/tests.py @@ -18,9 +18,9 @@ class PermissionsToolViewsTestCase(WebTest): self.no_perm_user = AuthUtils.create_user('no_perm_user', disconnect_signals=True) AuthUtils.disconnect_signals() - self.no_perm_group = Group.objects.create(name="No Permission Group") + self.no_perm_group = AuthUtils.create_group(group_name="No Permission Group") - self.test_group = Group.objects.create(name="Test group") + self.test_group = AuthUtils.create_group(group_name="Test group") self.test_group.user_set.add(self.none_user) self.test_group.user_set.add(self.none_user2) diff --git a/allianceauth/services/modules/discord/tests/test_integration.py b/allianceauth/services/modules/discord/tests/test_integration.py index 2a6c65c2..7314168d 100644 --- a/allianceauth/services/modules/discord/tests/test_integration.py +++ b/allianceauth/services/modules/discord/tests/test_integration.py @@ -119,7 +119,7 @@ class TestServiceFeatures(TransactionTestCase): """ clear_cache() reset_testdata() - self.group_charlie = Group.objects.create(name='charlie') + self.group_charlie = AuthUtils.create_group(group_name='charlie') # States self.member_state = AuthUtils.get_member_state() diff --git a/allianceauth/services/modules/discord/tests/test_managers.py b/allianceauth/services/modules/discord/tests/test_managers.py index 9ea50c4c..b4033f1a 100644 --- a/allianceauth/services/modules/discord/tests/test_managers.py +++ b/allianceauth/services/modules/discord/tests/test_managers.py @@ -413,8 +413,8 @@ class TestUserGroupNames(TestCase): @classmethod def setUpClass(cls): super().setUpClass() - cls.group_1 = Group.objects.create(name='Group 1') - cls.group_2 = Group.objects.create(name='Group 2') + cls.group_1 = AuthUtils.create_group(group_name='Group 1') + cls.group_2 = AuthUtils.create_group(group_name='Group 2') def setUp(self): self.user = AuthUtils.create_member(TEST_USER_NAME) @@ -501,11 +501,11 @@ class TestRoleForGroup(TestCase): def test_return_role_if_found(self, mock_DiscordClient): mock_DiscordClient.return_value.match_role_from_name.return_value = ROLE_ALPHA - group = Group.objects.create(name='alpha') + group = AuthUtils.create_group(group_name='alpha') self.assertEqual(DiscordUser.objects.group_to_role(group), ROLE_ALPHA) def test_return_empty_dict_if_not_found(self, mock_DiscordClient): mock_DiscordClient.return_value.match_role_from_name.return_value = dict() - group = Group.objects.create(name='unknown') + group = AuthUtils.create_group(group_name='unknown') self.assertEqual(DiscordUser.objects.group_to_role(group), dict()) From 8318add6d5631fefe2b4d2539831837d993b6aaf Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 10:18:39 -0400 Subject: [PATCH 10/20] Update test_admin.py --- allianceauth/groupmanagement/tests/test_admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index 72153460..03d68a6e 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -39,7 +39,8 @@ class TestGroupAdmin(TestCase): super().setUpClass() # group 1 - has leader - cls.group_1 = AuthUtils.create_group(group_name='Group 1') + cls.group_1 = Group.objects.create(name='Group 1') + AuthGroup.objects.create(group=cls.group_1) cls.group_1.authgroup.description = 'Default Group' cls.group_1.authgroup.internal = False cls.group_1.authgroup.hidden = False From 122e389c3860ad10e479825924a3013d73d9c912 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 11:33:51 -0400 Subject: [PATCH 11/20] Add signals back. --- allianceauth/groupmanagement/models.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index 2388283b..dd331630 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -117,3 +117,20 @@ class AuthGroup(models.Model): ("request_groups", u"Can request non-public groups"), ) default_permissions = tuple() + + +@receiver(post_save, sender=Group) +def create_auth_group(sender, instance, created, **kwargs): + """ + Creates the AuthGroup model when a group is created + """ + if created: + AuthGroup.objects.create(group=instance) + + +@receiver(post_save, sender=Group) +def save_auth_group(sender, instance, **kwargs): + """ + Ensures AuthGroup model is saved automatically + """ + instance.authgroup.save() From 489a8456f7578a7051fface2049871ce096011b3 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 11:34:19 -0400 Subject: [PATCH 12/20] Revert "More test fixes." This reverts commit 6c3650d9f2d4be92cc54f24cb431df8b0ee8bab1. --- allianceauth/authentication/tests/test_backend.py | 4 ++-- allianceauth/groupmanagement/tests/test_signals.py | 2 +- allianceauth/permissions_tool/tests.py | 4 ++-- .../services/modules/discord/tests/test_integration.py | 2 +- .../services/modules/discord/tests/test_managers.py | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/allianceauth/authentication/tests/test_backend.py b/allianceauth/authentication/tests/test_backend.py index ef28d978..2a846c7c 100644 --- a/allianceauth/authentication/tests/test_backend.py +++ b/allianceauth/authentication/tests/test_backend.py @@ -23,8 +23,8 @@ class TestStatePermissions(TestCase): self.permission_2 = AuthUtils.get_permission_by_name(PERMISSION_2) # group - self.group_1 = AuthUtils.create_group(group_name="Group 1") - self.group_2 = AuthUtils.create_group(group_name="Group 2") + self.group_1 = Group.objects.create(name="Group 1") + self.group_2 = Group.objects.create(name="Group 2") # state self.state_1 = AuthUtils.get_member_state() diff --git a/allianceauth/groupmanagement/tests/test_signals.py b/allianceauth/groupmanagement/tests/test_signals.py index 9d7f2d75..88fa37c2 100644 --- a/allianceauth/groupmanagement/tests/test_signals.py +++ b/allianceauth/groupmanagement/tests/test_signals.py @@ -53,7 +53,7 @@ class TestCheckGroupsOnStateChange(TestCase): autogroup_config.states.add(self.test_state_1) autogroup_config.states.add(self.guest_state) auto_group = autogroup_config.corp_managed_groups.first() - internal_state_group = AuthUtils.create_group(group_name='internal_state_group') + internal_state_group = Group.objects.create(name='internal_state_group') internal_state_group.authgroup.states.add(self.test_state_1) self.test_state_1.member_corporations.add(self.corp_1) self.user.groups.add(normal_group) diff --git a/allianceauth/permissions_tool/tests.py b/allianceauth/permissions_tool/tests.py index fb124892..76573bbc 100644 --- a/allianceauth/permissions_tool/tests.py +++ b/allianceauth/permissions_tool/tests.py @@ -18,9 +18,9 @@ class PermissionsToolViewsTestCase(WebTest): self.no_perm_user = AuthUtils.create_user('no_perm_user', disconnect_signals=True) AuthUtils.disconnect_signals() - self.no_perm_group = AuthUtils.create_group(group_name="No Permission Group") + self.no_perm_group = Group.objects.create(name="No Permission Group") - self.test_group = AuthUtils.create_group(group_name="Test group") + self.test_group = Group.objects.create(name="Test group") self.test_group.user_set.add(self.none_user) self.test_group.user_set.add(self.none_user2) diff --git a/allianceauth/services/modules/discord/tests/test_integration.py b/allianceauth/services/modules/discord/tests/test_integration.py index 7314168d..2a6c65c2 100644 --- a/allianceauth/services/modules/discord/tests/test_integration.py +++ b/allianceauth/services/modules/discord/tests/test_integration.py @@ -119,7 +119,7 @@ class TestServiceFeatures(TransactionTestCase): """ clear_cache() reset_testdata() - self.group_charlie = AuthUtils.create_group(group_name='charlie') + self.group_charlie = Group.objects.create(name='charlie') # States self.member_state = AuthUtils.get_member_state() diff --git a/allianceauth/services/modules/discord/tests/test_managers.py b/allianceauth/services/modules/discord/tests/test_managers.py index b4033f1a..9ea50c4c 100644 --- a/allianceauth/services/modules/discord/tests/test_managers.py +++ b/allianceauth/services/modules/discord/tests/test_managers.py @@ -413,8 +413,8 @@ class TestUserGroupNames(TestCase): @classmethod def setUpClass(cls): super().setUpClass() - cls.group_1 = AuthUtils.create_group(group_name='Group 1') - cls.group_2 = AuthUtils.create_group(group_name='Group 2') + cls.group_1 = Group.objects.create(name='Group 1') + cls.group_2 = Group.objects.create(name='Group 2') def setUp(self): self.user = AuthUtils.create_member(TEST_USER_NAME) @@ -501,11 +501,11 @@ class TestRoleForGroup(TestCase): def test_return_role_if_found(self, mock_DiscordClient): mock_DiscordClient.return_value.match_role_from_name.return_value = ROLE_ALPHA - group = AuthUtils.create_group(group_name='alpha') + group = Group.objects.create(name='alpha') self.assertEqual(DiscordUser.objects.group_to_role(group), ROLE_ALPHA) def test_return_empty_dict_if_not_found(self, mock_DiscordClient): mock_DiscordClient.return_value.match_role_from_name.return_value = dict() - group = AuthUtils.create_group(group_name='unknown') + group = Group.objects.create(name='unknown') self.assertEqual(DiscordUser.objects.group_to_role(group), dict()) From ad92ea243de3aaea7d929af08bd9307c2ec0f2de Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 11:34:35 -0400 Subject: [PATCH 13/20] Revert "Fix missed test." This reverts commit 37005b1c687182115ca49fa0d3a77b82d55231c2. --- allianceauth/groupmanagement/tests/test_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/groupmanagement/tests/test_models.py b/allianceauth/groupmanagement/tests/test_models.py index 02a484b7..65921918 100644 --- a/allianceauth/groupmanagement/tests/test_models.py +++ b/allianceauth/groupmanagement/tests/test_models.py @@ -157,7 +157,7 @@ class TestRequestLog(TestCase): class TestAuthGroup(TestCase): def test_str(self): - group = AuthUtils.create_group(group_name='Superheros') + group = Group.objects.create(name='Superheros') group.authgroup.description = 'Default Group' group.authgroup.internal = False group.authgroup.hidden = False From b8b8e470f221d85e128040526b51c28041b2c385 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 11:34:46 -0400 Subject: [PATCH 14/20] Revert "Update tests to use the create_group util." This reverts commit 0897383e41bf401f9f7855b2b510cedcdd204de6. --- .../groupmanagement/tests/test_admin.py | 16 +++++---- .../groupmanagement/tests/test_managers.py | 36 ++++++++++++------- .../groupmanagement/tests/test_models.py | 3 +- .../groupmanagement/tests/test_signals.py | 12 ++++--- .../modules/discord/tests/test_tasks.py | 4 +-- .../services/modules/teamspeak3/tests.py | 3 +- allianceauth/services/tests/test_signals.py | 4 +-- 7 files changed, 49 insertions(+), 29 deletions(-) diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index 03d68a6e..65ff908b 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -10,7 +10,6 @@ from allianceauth.authentication.models import CharacterOwnership, State from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) -from allianceauth.tests.auth_utils import AuthUtils from ..admin import HasLeaderFilter, GroupAdmin, Group, AuthGroup from . import get_admin_change_view_url @@ -47,20 +46,23 @@ class TestGroupAdmin(TestCase): cls.group_1.authgroup.save() # group 2 - no leader - cls.group_2 = AuthUtils.create_group(group_name='Group 2') + cls.group_2 = Group.objects.create(name='Group 2') + AuthGroup.objects.create(group=cls.group_2) cls.group_2.authgroup.description = 'Internal Group' cls.group_2.authgroup.internal = True cls.group_2.authgroup.save() # group 3 - has leader - cls.group_3 = AuthUtils.create_group(group_name='Group 3') + cls.group_3 = Group.objects.create(name='Group 3') + AuthGroup.objects.create(group=cls.group_3) cls.group_3.authgroup.description = 'Hidden Group' cls.group_3.authgroup.internal = False cls.group_3.authgroup.hidden = True cls.group_3.authgroup.save() # group 4 - no leader - cls.group_4 = AuthUtils.create_group(group_name='Group 4') + cls.group_4 = Group.objects.create(name='Group 4') + AuthGroup.objects.create(group=cls.group_4) cls.group_4.authgroup.description = 'Open Group' cls.group_4.authgroup.internal = False cls.group_4.authgroup.hidden = False @@ -68,7 +70,8 @@ class TestGroupAdmin(TestCase): cls.group_4.authgroup.save() # group 5 - no leader - cls.group_5 = AuthUtils.create_group(group_name='Group 5') + cls.group_5 = Group.objects.create(name='Group 5') + AuthGroup.objects.create(group=cls.group_5) cls.group_5.authgroup.description = 'Public Group' cls.group_5.authgroup.internal = False cls.group_5.authgroup.hidden = False @@ -76,7 +79,8 @@ class TestGroupAdmin(TestCase): cls.group_5.authgroup.save() # group 6 - no leader - cls.group_6 = AuthUtils.create_group(group_name='Group 6') + cls.group_6 = Group.objects.create(name='Group 6') + AuthGroup.objects.create(group=cls.group_6) cls.group_6.authgroup.description = 'Mixed Group' cls.group_6.authgroup.internal = False cls.group_6.authgroup.hidden = True diff --git a/allianceauth/groupmanagement/tests/test_managers.py b/allianceauth/groupmanagement/tests/test_managers.py index 0e47d91b..005d6d5d 100644 --- a/allianceauth/groupmanagement/tests/test_managers.py +++ b/allianceauth/groupmanagement/tests/test_managers.py @@ -28,9 +28,12 @@ class GroupManagementVisibilityTestCase(TestCase): cls.corp = EveCorporationInfo.objects.create( corporation_id='2', corporation_name='test corp', corporation_ticker='TEST', alliance=cls.alliance, member_count=1 ) - cls.group1 = AuthUtils.create_group(group_name='group1') - cls.group2 = AuthUtils.create_group(group_name='group2') - cls.group3 = AuthUtils.create_group(group_name='group3') + cls.group1 = Group.objects.create(name='group1') + AuthGroup.objects.create(group=cls.group1) + cls.group2 = Group.objects.create(name='group2') + AuthGroup.objects.create(group=cls.group2) + cls.group3 = Group.objects.create(name='group3') + AuthGroup.objects.create(group=cls.group3) def setUp(self): self.user.refresh_from_db() @@ -77,27 +80,31 @@ class TestGroupManager(TestCase): super().setUpClass() # group 1 - cls.group_default = AuthUtils.create_group(group_name='default') + cls.group_default = Group.objects.create(name='default') + AuthGroup.objects.create(group=cls.group_default) cls.group_default.authgroup.description = 'Default Group' cls.group_default.authgroup.internal = False cls.group_default.authgroup.hidden = False cls.group_default.authgroup.save() # group 2 - cls.group_internal = AuthUtils.create_group(group_name='internal') + cls.group_internal = Group.objects.create(name='internal') + AuthGroup.objects.create(group=cls.group_internal) cls.group_internal.authgroup.description = 'Internal Group' cls.group_internal.authgroup.internal = True cls.group_internal.authgroup.save() # group 3 - cls.group_hidden = AuthUtils.create_group(group_name='hidden') + cls.group_hidden = Group.objects.create(name='hidden') + AuthGroup.objects.create(group=cls.group_hidden) cls.group_hidden.authgroup.description = 'Hidden Group' cls.group_hidden.authgroup.internal = False cls.group_hidden.authgroup.hidden = True cls.group_hidden.authgroup.save() # group 4 - cls.group_open = AuthUtils.create_group(group_name='open') + cls.group_open = Group.objects.create(name='open') + AuthGroup.objects.create(group=cls.group_open) cls.group_open.authgroup.description = 'Open Group' cls.group_open.authgroup.internal = False cls.group_open.authgroup.hidden = False @@ -105,7 +112,8 @@ class TestGroupManager(TestCase): cls.group_open.authgroup.save() # group 5 - cls.group_public_1 = AuthUtils.create_group(group_name='public 1') + cls.group_public_1 = Group.objects.create(name='public 1') + AuthGroup.objects.create(group=cls.group_public_1) cls.group_public_1.authgroup.description = 'Public Group 1' cls.group_public_1.authgroup.internal = False cls.group_public_1.authgroup.hidden = False @@ -113,7 +121,8 @@ class TestGroupManager(TestCase): cls.group_public_1.authgroup.save() # group 6 - cls.group_public_2 = AuthUtils.create_group(group_name='public 2') + cls.group_public_2 = Group.objects.create(name='public 2') + AuthGroup.objects.create(group=cls.group_public_2) cls.group_public_2.authgroup.description = 'Public Group 2' cls.group_public_2.authgroup.internal = False cls.group_public_2.authgroup.hidden = True @@ -122,7 +131,8 @@ class TestGroupManager(TestCase): cls.group_public_2.authgroup.save() # group 7 - cls.group_default_member = AuthUtils.create_group(group_name='default members') + cls.group_default_member = Group.objects.create(name='default members') + AuthGroup.objects.create(group=cls.group_default_member) cls.group_default_member.authgroup.description = \ 'Default Group for members only' cls.group_default_member.authgroup.internal = False @@ -337,8 +347,10 @@ class TestGroupManager(TestCase): class TestPendingRequestsCountForUser(TestCase): def setUp(self) -> None: - self.group_1 = AuthUtils.create_group(group_name="Group 1") - self.group_2 = AuthUtils.create_group(group_name="Group 2") + self.group_1 = Group.objects.create(name="Group 1") + AuthGroup.objects.create(group=self.group_1) + self.group_2 = Group.objects.create(name="Group 2") + AuthGroup.objects.create(group=self.group_2) self.user_leader_1 = AuthUtils.create_member('Clark Kent') self.group_1.authgroup.group_leaders.add(self.user_leader_1) self.user_leader_2 = AuthUtils.create_member('Peter Parker') diff --git a/allianceauth/groupmanagement/tests/test_models.py b/allianceauth/groupmanagement/tests/test_models.py index 65921918..869db671 100644 --- a/allianceauth/groupmanagement/tests/test_models.py +++ b/allianceauth/groupmanagement/tests/test_models.py @@ -20,7 +20,8 @@ def create_testdata(): EveAllianceInfo.objects.all().delete() # group 1 - group = AuthUtils.create_group(group_name='Superheros') + group = Group.objects.create(name='Superheros') + AuthGroup.objects.create(group=group) group.authgroup.description = 'Default Group' group.authgroup.internal = False group.authgroup.hidden = False diff --git a/allianceauth/groupmanagement/tests/test_signals.py b/allianceauth/groupmanagement/tests/test_signals.py index 88fa37c2..3483fe5d 100644 --- a/allianceauth/groupmanagement/tests/test_signals.py +++ b/allianceauth/groupmanagement/tests/test_signals.py @@ -41,14 +41,17 @@ class TestCheckGroupsOnStateChange(TestCase): and remains member of normal group and auto group """ # setup - state_group = AuthUtils.create_group(group_name='state_group') + state_group = Group.objects.create(name='state_group') + AuthGroup.objects.create(group=state_group) state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.internal = False state_group.save() - normal_group = AuthUtils.create_group(group_name='normal_group') + normal_group = Group.objects.create(name='normal_group') + AuthGroup.objects.create(group=normal_group) normal_group.authgroup.internal = False normal_group.save() - internal_group = AuthUtils.create_group(group_name='internal_group') + internal_group = Group.objects.create(name='internal_group') + AuthGroup.objects.create(group=internal_group) autogroup_config = AutogroupsConfig.objects.create(corp_groups=True) autogroup_config.states.add(self.test_state_1) autogroup_config.states.add(self.guest_state) @@ -81,7 +84,8 @@ class TestCheckGroupsOnStateChange(TestCase): then user remains member of that group """ # setup - state_group = AuthUtils.create_group(group_name='state_group') + state_group = Group.objects.create(name='state_group') + AuthGroup.objects.create(group=state_group) state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.states.add(self.test_state_2) diff --git a/allianceauth/services/modules/discord/tests/test_tasks.py b/allianceauth/services/modules/discord/tests/test_tasks.py index 75e71de2..4c33b012 100644 --- a/allianceauth/services/modules/discord/tests/test_tasks.py +++ b/allianceauth/services/modules/discord/tests/test_tasks.py @@ -28,8 +28,8 @@ class TestUpdateGroups(TestCase): def setUpClass(cls): super().setUpClass() cls.user = AuthUtils.create_member(TEST_USER_NAME) - cls.group_1 = AuthUtils.create_group(group_name='Group 1') - cls.group_2 = AuthUtils.create_group(group_name='Group 2') + cls.group_1 = Group.objects.create(name='Group 1') + cls.group_2 = Group.objects.create(name='Group 2') cls.group_1.user_set.add(cls.user) cls.group_2.user_set.add(cls.user) diff --git a/allianceauth/services/modules/teamspeak3/tests.py b/allianceauth/services/modules/teamspeak3/tests.py index 0c5118b2..9584a34a 100644 --- a/allianceauth/services/modules/teamspeak3/tests.py +++ b/allianceauth/services/modules/teamspeak3/tests.py @@ -287,8 +287,7 @@ class Teamspeak3SignalsTestCase(TestCase): # Overload transaction.on_commit so everything happens synchronously transaction.on_commit = lambda fn: fn() - # Trigger signal (AuthTS creation) - AuthTS.objects.create(auth_group=AuthUtils.create_group(group_name='Test Group')) + AuthTS.objects.create(auth_group=Group.objects.create(name='Test Group')) # Trigger signal (AuthTS creation) self.assertTrue(trigger_all_ts_update.called) diff --git a/allianceauth/services/tests/test_signals.py b/allianceauth/services/tests/test_signals.py index 3e1a7999..65426c37 100644 --- a/allianceauth/services/tests/test_signals.py +++ b/allianceauth/services/tests/test_signals.py @@ -32,7 +32,7 @@ class ServicesSignalsTestCase(TestCase): # Overload transaction.on_commit so everything happens synchronously transaction.on_commit = lambda fn: fn() - test_group = AuthUtils.create_group(group_name="Test group") + test_group = Group.objects.create(name="Test group") # Act, should trigger m2m change self.member.groups.add(test_group) @@ -97,7 +97,7 @@ class ServicesSignalsTestCase(TestCase): # Overload transaction.on_commit so everything happens synchronously transaction.on_commit = lambda fn: fn() - test_group = AuthUtils.create_group(group_name="Test group") + test_group = Group.objects.create(name="Test group") AuthUtils.disconnect_signals() self.member.groups.add(test_group) AuthUtils.connect_signals() From 7b77a6cd40c6d7e9c7a9fd49e658dc43014002e8 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 11:34:55 -0400 Subject: [PATCH 15/20] Revert "Add authutil for creating groups with authgroups." This reverts commit 15db817382d8c575e8190c87d11f07307b9d7b0a. --- allianceauth/tests/auth_utils.py | 23 ----------------------- allianceauth/tests/test_auth_utils.py | 8 +------- 2 files changed, 1 insertion(+), 30 deletions(-) diff --git a/allianceauth/tests/auth_utils.py b/allianceauth/tests/auth_utils.py index 7120c2de..d5642d08 100644 --- a/allianceauth/tests/auth_utils.py +++ b/allianceauth/tests/auth_utils.py @@ -25,7 +25,6 @@ from allianceauth.services.signals import ( process_main_character_change, process_main_character_update ) -from allianceauth.groupmanagement.models import AuthGroup class AuthUtils: @@ -70,28 +69,6 @@ class AuthUtils: cls.connect_signals() return state - @classmethod - def _create_group(cls, group_name): - group = Group.objects.create(name=group_name) - AuthGroup.objects.create(group=group) - return group - - @classmethod - def create_group(cls, group_name, disconnect_signals=False): - """ - Create a new group and its authgroup. - - Args: - group_name: name of the group - disconnect_signals: whether or not to run without signals. - """ - if disconnect_signals: - cls.disconnect_signals() - group = cls._create_group(group_name) - if disconnect_signals: - cls.connect_signals() - return group - @classmethod def get_member_state(cls): try: diff --git a/allianceauth/tests/test_auth_utils.py b/allianceauth/tests/test_auth_utils.py index d6c5644a..1eb5d4a5 100644 --- a/allianceauth/tests/test_auth_utils.py +++ b/allianceauth/tests/test_auth_utils.py @@ -6,7 +6,6 @@ from django.test import TestCase from allianceauth.eveonline.models import ( EveCorporationInfo, EveAllianceInfo, EveCharacter ) -from allianceauth.groupmanagement.models import AuthGroup from .auth_utils import AuthUtils @@ -16,12 +15,7 @@ class TestAuthUtils(TestCase): def test_can_create_user(self): user = AuthUtils.create_user('Bruce Wayne') self.assertTrue(User.objects.filter(username='Bruce Wayne').exists()) - - def test_can_create_group(self): - group = AuthUtils.create_group('Test Group') - self.assertTrue(Group.objects.filter(name='Test Group').exists()) - self.assertTrue(AuthGroup.objects.filter(group=group).exists()) - + def test_can_add_main_character_2(self): user = AuthUtils.create_user('Bruce Wayne') character = AuthUtils.add_main_character_2( From a8c0db3fd77927d5504fc60175a77944016cfca0 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 11:35:06 -0400 Subject: [PATCH 16/20] Revert "Update autogroups." This reverts commit eaa1cde01a1a73b9950161151f2d94b90fbaa6de. --- allianceauth/eveonline/autogroups/models.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/allianceauth/eveonline/autogroups/models.py b/allianceauth/eveonline/autogroups/models.py index 89a3f4db..23b7bf23 100644 --- a/allianceauth/eveonline/autogroups/models.py +++ b/allianceauth/eveonline/autogroups/models.py @@ -6,8 +6,6 @@ from django.core.exceptions import ObjectDoesNotExist from allianceauth.authentication.models import State from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo -from allianceauth.groupmanagement.models import AuthGroup - logger = logging.getLogger(__name__) @@ -181,16 +179,12 @@ class AutogroupsConfig(models.Model): @transaction.atomic def create_alliance_group(self, alliance: EveAllianceInfo) -> Group: group, created = Group.objects.get_or_create(name=self.get_alliance_group_name(alliance)) - if created: - AuthGroup.objects.create(group=group) ManagedAllianceGroup.objects.get_or_create(group=group, config=self, alliance=alliance) return group @transaction.atomic def create_corp_group(self, corp: EveCorporationInfo) -> Group: group, created = Group.objects.get_or_create(name=self.get_corp_group_name(corp)) - if created: - AuthGroup.objects.create(group=group) ManagedCorpGroup.objects.get_or_create(group=group, config=self, corp=corp) return group @@ -247,7 +241,6 @@ class ManagedGroup(models.Model): def __str__(self): return "Managed Group: %s" % self.group.name - class ManagedCorpGroup(ManagedGroup): corp = models.ForeignKey(EveCorporationInfo, on_delete=models.CASCADE) From e24bc2a05db63ff0ec8bc534a2e489d374822007 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 11:35:19 -0400 Subject: [PATCH 17/20] Revert "Update tests." This reverts commit 7c1d1074f9f6bb4d199c574d57cbd848d60704a8. --- allianceauth/groupmanagement/tests/test_admin.py | 10 ++-------- .../groupmanagement/tests/test_managers.py | 16 ++-------------- .../groupmanagement/tests/test_models.py | 5 ++--- .../groupmanagement/tests/test_signals.py | 12 +++--------- 4 files changed, 9 insertions(+), 34 deletions(-) diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index 65ff908b..b3916d7e 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -11,7 +11,7 @@ from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) -from ..admin import HasLeaderFilter, GroupAdmin, Group, AuthGroup +from ..admin import HasLeaderFilter, GroupAdmin, Group from . import get_admin_change_view_url if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: @@ -38,8 +38,7 @@ class TestGroupAdmin(TestCase): super().setUpClass() # group 1 - has leader - cls.group_1 = Group.objects.create(name='Group 1') - AuthGroup.objects.create(group=cls.group_1) + cls.group_1 = Group.objects.create(name='Group 1') cls.group_1.authgroup.description = 'Default Group' cls.group_1.authgroup.internal = False cls.group_1.authgroup.hidden = False @@ -47,14 +46,12 @@ class TestGroupAdmin(TestCase): # group 2 - no leader cls.group_2 = Group.objects.create(name='Group 2') - AuthGroup.objects.create(group=cls.group_2) cls.group_2.authgroup.description = 'Internal Group' cls.group_2.authgroup.internal = True cls.group_2.authgroup.save() # group 3 - has leader cls.group_3 = Group.objects.create(name='Group 3') - AuthGroup.objects.create(group=cls.group_3) cls.group_3.authgroup.description = 'Hidden Group' cls.group_3.authgroup.internal = False cls.group_3.authgroup.hidden = True @@ -62,7 +59,6 @@ class TestGroupAdmin(TestCase): # group 4 - no leader cls.group_4 = Group.objects.create(name='Group 4') - AuthGroup.objects.create(group=cls.group_4) cls.group_4.authgroup.description = 'Open Group' cls.group_4.authgroup.internal = False cls.group_4.authgroup.hidden = False @@ -71,7 +67,6 @@ class TestGroupAdmin(TestCase): # group 5 - no leader cls.group_5 = Group.objects.create(name='Group 5') - AuthGroup.objects.create(group=cls.group_5) cls.group_5.authgroup.description = 'Public Group' cls.group_5.authgroup.internal = False cls.group_5.authgroup.hidden = False @@ -80,7 +75,6 @@ class TestGroupAdmin(TestCase): # group 6 - no leader cls.group_6 = Group.objects.create(name='Group 6') - AuthGroup.objects.create(group=cls.group_6) cls.group_6.authgroup.description = 'Mixed Group' cls.group_6.authgroup.internal = False cls.group_6.authgroup.hidden = True diff --git a/allianceauth/groupmanagement/tests/test_managers.py b/allianceauth/groupmanagement/tests/test_managers.py index 005d6d5d..eb48490f 100644 --- a/allianceauth/groupmanagement/tests/test_managers.py +++ b/allianceauth/groupmanagement/tests/test_managers.py @@ -7,7 +7,7 @@ from django.urls import reverse from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo from allianceauth.tests.auth_utils import AuthUtils -from ..models import GroupRequest, AuthGroup +from ..models import GroupRequest from ..managers import GroupManager @@ -29,11 +29,8 @@ class GroupManagementVisibilityTestCase(TestCase): corporation_id='2', corporation_name='test corp', corporation_ticker='TEST', alliance=cls.alliance, member_count=1 ) cls.group1 = Group.objects.create(name='group1') - AuthGroup.objects.create(group=cls.group1) cls.group2 = Group.objects.create(name='group2') - AuthGroup.objects.create(group=cls.group2) cls.group3 = Group.objects.create(name='group3') - AuthGroup.objects.create(group=cls.group3) def setUp(self): self.user.refresh_from_db() @@ -80,8 +77,7 @@ class TestGroupManager(TestCase): super().setUpClass() # group 1 - cls.group_default = Group.objects.create(name='default') - AuthGroup.objects.create(group=cls.group_default) + cls.group_default = Group.objects.create(name='default') cls.group_default.authgroup.description = 'Default Group' cls.group_default.authgroup.internal = False cls.group_default.authgroup.hidden = False @@ -89,14 +85,12 @@ class TestGroupManager(TestCase): # group 2 cls.group_internal = Group.objects.create(name='internal') - AuthGroup.objects.create(group=cls.group_internal) cls.group_internal.authgroup.description = 'Internal Group' cls.group_internal.authgroup.internal = True cls.group_internal.authgroup.save() # group 3 cls.group_hidden = Group.objects.create(name='hidden') - AuthGroup.objects.create(group=cls.group_hidden) cls.group_hidden.authgroup.description = 'Hidden Group' cls.group_hidden.authgroup.internal = False cls.group_hidden.authgroup.hidden = True @@ -104,7 +98,6 @@ class TestGroupManager(TestCase): # group 4 cls.group_open = Group.objects.create(name='open') - AuthGroup.objects.create(group=cls.group_open) cls.group_open.authgroup.description = 'Open Group' cls.group_open.authgroup.internal = False cls.group_open.authgroup.hidden = False @@ -113,7 +106,6 @@ class TestGroupManager(TestCase): # group 5 cls.group_public_1 = Group.objects.create(name='public 1') - AuthGroup.objects.create(group=cls.group_public_1) cls.group_public_1.authgroup.description = 'Public Group 1' cls.group_public_1.authgroup.internal = False cls.group_public_1.authgroup.hidden = False @@ -122,7 +114,6 @@ class TestGroupManager(TestCase): # group 6 cls.group_public_2 = Group.objects.create(name='public 2') - AuthGroup.objects.create(group=cls.group_public_2) cls.group_public_2.authgroup.description = 'Public Group 2' cls.group_public_2.authgroup.internal = False cls.group_public_2.authgroup.hidden = True @@ -132,7 +123,6 @@ class TestGroupManager(TestCase): # group 7 cls.group_default_member = Group.objects.create(name='default members') - AuthGroup.objects.create(group=cls.group_default_member) cls.group_default_member.authgroup.description = \ 'Default Group for members only' cls.group_default_member.authgroup.internal = False @@ -348,9 +338,7 @@ class TestPendingRequestsCountForUser(TestCase): def setUp(self) -> None: self.group_1 = Group.objects.create(name="Group 1") - AuthGroup.objects.create(group=self.group_1) self.group_2 = Group.objects.create(name="Group 2") - AuthGroup.objects.create(group=self.group_2) self.user_leader_1 = AuthUtils.create_member('Clark Kent') self.group_1.authgroup.group_leaders.add(self.user_leader_1) self.user_leader_2 = AuthUtils.create_member('Peter Parker') diff --git a/allianceauth/groupmanagement/tests/test_models.py b/allianceauth/groupmanagement/tests/test_models.py index 869db671..01511f97 100644 --- a/allianceauth/groupmanagement/tests/test_models.py +++ b/allianceauth/groupmanagement/tests/test_models.py @@ -8,7 +8,7 @@ from allianceauth.eveonline.models import ( EveCorporationInfo, EveAllianceInfo, EveCharacter ) -from ..models import GroupRequest, RequestLog, AuthGroup +from ..models import GroupRequest, RequestLog def create_testdata(): @@ -20,8 +20,7 @@ def create_testdata(): EveAllianceInfo.objects.all().delete() # group 1 - group = Group.objects.create(name='Superheros') - AuthGroup.objects.create(group=group) + group = Group.objects.create(name='Superheros') group.authgroup.description = 'Default Group' group.authgroup.internal = False group.authgroup.hidden = False diff --git a/allianceauth/groupmanagement/tests/test_signals.py b/allianceauth/groupmanagement/tests/test_signals.py index 3483fe5d..18e94fde 100644 --- a/allianceauth/groupmanagement/tests/test_signals.py +++ b/allianceauth/groupmanagement/tests/test_signals.py @@ -5,8 +5,6 @@ from allianceauth.eveonline.models import EveCorporationInfo from allianceauth.eveonline.autogroups.models import AutogroupsConfig from allianceauth.tests.auth_utils import AuthUtils -from ..models import AuthGroup - class TestCheckGroupsOnStateChange(TestCase): @@ -41,17 +39,14 @@ class TestCheckGroupsOnStateChange(TestCase): and remains member of normal group and auto group """ # setup - state_group = Group.objects.create(name='state_group') - AuthGroup.objects.create(group=state_group) + state_group = Group.objects.create(name='state_group') state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.internal = False state_group.save() normal_group = Group.objects.create(name='normal_group') - AuthGroup.objects.create(group=normal_group) normal_group.authgroup.internal = False normal_group.save() - internal_group = Group.objects.create(name='internal_group') - AuthGroup.objects.create(group=internal_group) + internal_group = Group.objects.create(name='internal_group') autogroup_config = AutogroupsConfig.objects.create(corp_groups=True) autogroup_config.states.add(self.test_state_1) autogroup_config.states.add(self.guest_state) @@ -84,8 +79,7 @@ class TestCheckGroupsOnStateChange(TestCase): then user remains member of that group """ # setup - state_group = Group.objects.create(name='state_group') - AuthGroup.objects.create(group=state_group) + state_group = Group.objects.create(name='state_group') state_group.authgroup.states.add(self.test_state_1) state_group.authgroup.states.add(self.test_state_2) From 2e0ddf2e7a81e437055d0cb454968a56fcbd23e3 Mon Sep 17 00:00:00 2001 From: colcrunch Date: Tue, 13 Jul 2021 18:00:21 -0400 Subject: [PATCH 18/20] has_leader should return true when a group has a `group_leader_group` --- allianceauth/groupmanagement/admin.py | 2 +- allianceauth/groupmanagement/tests/test_admin.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index 37fa1e37..496c752d 100644 --- a/allianceauth/groupmanagement/admin.py +++ b/allianceauth/groupmanagement/admin.py @@ -138,7 +138,7 @@ class GroupAdmin(admin.ModelAdmin): _member_count.admin_order_field = 'member_count' def has_leader(self, obj): - return obj.authgroup.group_leaders.exists() + return obj.authgroup.group_leaders.exists() or obj.authgroup.group_leader_groups.exists() has_leader.boolean = True diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index b3916d7e..82d3df99 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -47,7 +47,8 @@ class TestGroupAdmin(TestCase): # group 2 - no leader cls.group_2 = Group.objects.create(name='Group 2') cls.group_2.authgroup.description = 'Internal Group' - cls.group_2.authgroup.internal = True + cls.group_2.authgroup.internal = True + cls.group_2.authgroup.group_leader_groups.add(cls.group_1) cls.group_2.authgroup.save() # group 3 - has leader @@ -237,10 +238,14 @@ class TestGroupAdmin(TestCase): result = self.modeladmin._member_count(obj) self.assertEqual(result, expected) - def test_has_leader(self): + def test_has_leader_user(self): result = self.modeladmin.has_leader(self.group_1) self.assertTrue(result) + def test_has_leader_group(self): + result = self.modeladmin.has_leader(self.group_2) + self.assertTrue(result) + def test_properties_1(self): expected = ['Default'] result = self.modeladmin._properties(self.group_1) From 1e133b7c5d814b197522372fc09f848df6e2a07e Mon Sep 17 00:00:00 2001 From: Erik Kalkoken Date: Wed, 11 Aug 2021 06:06:23 +0000 Subject: [PATCH 19/20] Improve notifications --- allianceauth/notifications/admin.py | 33 +++++++++- allianceauth/notifications/managers.py | 4 +- .../migrations/0005_fix_level_choices.py | 18 ++++++ allianceauth/notifications/models.py | 62 ++++++++++++------- .../notifications/tests/test_managers.py | 29 +++++++++ .../tech_docu/api/notifications.rst | 7 +-- 6 files changed, 125 insertions(+), 28 deletions(-) create mode 100644 allianceauth/notifications/migrations/0005_fix_level_choices.py diff --git a/allianceauth/notifications/admin.py b/allianceauth/notifications/admin.py index 783f0f0a..89d22e78 100644 --- a/allianceauth/notifications/admin.py +++ b/allianceauth/notifications/admin.py @@ -1,4 +1,35 @@ from django.contrib import admin from .models import Notification -admin.site.register(Notification) + +@admin.register(Notification) +class NotificationAdmin(admin.ModelAdmin): + list_display = ("timestamp", "_main", "_state", "title", "level", "viewed") + list_select_related = ("user", "user__profile__main_character", "user__profile__state") + list_filter = ( + "level", + "timestamp", + "user__profile__state", + ('user__profile__main_character', admin.RelatedOnlyFieldListFilter), + ) + ordering = ("-timestamp", ) + search_fields = ["user__username", "user__profile__main_character__character_name"] + + def _main(self, obj): + try: + return obj.user.profile.main_character + except AttributeError: + return obj.user + + _main.admin_order_field = "user__profile__main_character__character_name" + + def _state(self, obj): + return obj.user.profile.state + + _state.admin_order_field = "user__profile__state__name" + + def has_change_permission(self, request, obj=None): + return False + + def has_add_permission(self, request) -> bool: + return False diff --git a/allianceauth/notifications/managers.py b/allianceauth/notifications/managers.py index f6856c9e..96278576 100644 --- a/allianceauth/notifications/managers.py +++ b/allianceauth/notifications/managers.py @@ -12,7 +12,7 @@ class NotificationQuerySet(models.QuerySet): """Custom QuerySet for Notification model""" def update(self, *args, **kwargs): - # overriden update to ensure cache is invaidated on very call + """Override update to ensure cache is invalidated on very call.""" super().update(*args, **kwargs) user_pks = set(self.select_related("user").values_list('user__pk', flat=True)) for user_pk in user_pks: @@ -43,6 +43,8 @@ class NotificationManager(models.Manager): if not message: message = title + if level not in self.model.Level: + level = self.model.Level.INFO obj = self.create(user=user, title=title, message=message, level=level) logger.info("Created notification %s", obj) return obj diff --git a/allianceauth/notifications/migrations/0005_fix_level_choices.py b/allianceauth/notifications/migrations/0005_fix_level_choices.py new file mode 100644 index 00000000..6cf031b7 --- /dev/null +++ b/allianceauth/notifications/migrations/0005_fix_level_choices.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.12 on 2021-07-01 21:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notifications', '0004_performance_tuning'), + ] + + operations = [ + migrations.AlterField( + model_name='notification', + name='level', + field=models.CharField(choices=[('danger', 'danger'), ('warning', 'warning'), ('info', 'info'), ('success', 'success')], default='info', max_length=10), + ), + ] diff --git a/allianceauth/notifications/models.py b/allianceauth/notifications/models.py index cc3ea113..760aaafe 100644 --- a/allianceauth/notifications/models.py +++ b/allianceauth/notifications/models.py @@ -2,6 +2,7 @@ import logging from django.db import models from django.contrib.auth.models import User +from django.utils.translation import gettext_lazy as _ from .managers import NotificationManager @@ -13,17 +14,43 @@ class Notification(models.Model): NOTIFICATIONS_MAX_PER_USER_DEFAULT = 50 NOTIFICATIONS_REFRESH_TIME_DEFAULT = 30 - - LEVEL_CHOICES = ( - ('danger', 'CRITICAL'), - ('danger', 'ERROR'), - ('warning', 'WARN'), - ('info', 'INFO'), - ('success', 'DEBUG'), - ) + + class Level(models.TextChoices): + """A notification level.""" + + DANGER = 'danger', _('danger') #: + WARNING = 'warning', _('warning') #: + INFO = 'info', _('info') #: + SUCCESS = 'success', _('success') #: + + @classmethod + def from_old_name(cls, name: str) -> object: + """Map old name to enum. + + Raises ValueError for invalid names. + """ + name_map = { + "CRITICAL": cls.DANGER, + "ERROR": cls.DANGER, + "WARN": cls.WARNING, + "INFO": cls.INFO, + "DEBUG": cls.SUCCESS, + } + try: + return name_map[name] + except KeyError: + raise ValueError(f"Unknown name: {name}") from None + + # LEVEL_CHOICES = ( + # ('danger', 'CRITICAL'), + # ('danger', 'ERROR'), + # ('warning', 'WARN'), + # ('info', 'INFO'), + # ('success', 'DEBUG'), + # ) user = models.ForeignKey(User, on_delete=models.CASCADE) - level = models.CharField(choices=LEVEL_CHOICES, max_length=10) + level = models.CharField(choices=Level.choices, max_length=10, default=Level.INFO) title = models.CharField(max_length=254) message = models.TextField() timestamp = models.DateTimeField(auto_now_add=True, db_index=True) @@ -45,22 +72,15 @@ class Notification(models.Model): Notification.objects.invalidate_user_notification_cache(self.user.pk) def mark_viewed(self) -> None: - """mark notification as viewed""" + """Mark notification as viewed.""" logger.info("Marking notification as viewed: %s" % self) self.viewed = True self.save() def set_level(self, level_name: str) -> None: - """set notification level according to level name, e.g. 'CRITICAL' + """Set notification level according to old level name, e.g. 'CRITICAL'. - raised exception on invalid level names - """ - try: - new_level = [ - item[0] for item in self.LEVEL_CHOICES if item[1] == level_name - ][0] - except IndexError: - raise ValueError('Invalid level name: %s' % level_name) - - self.level = new_level + Raises ValueError on invalid level names. + """ + self.level = self.Level.from_old_name(level_name) self.save() diff --git a/allianceauth/notifications/tests/test_managers.py b/allianceauth/notifications/tests/test_managers.py index e7feff62..4d8be2d0 100644 --- a/allianceauth/notifications/tests/test_managers.py +++ b/allianceauth/notifications/tests/test_managers.py @@ -64,6 +64,35 @@ class TestUserNotify(TestCase): self.assertEqual(obj.user, self.user) self.assertEqual(obj.title, title) self.assertEqual(obj.message, title) + + def test_should_use_default_level_when_not_specified(self): + # given + title = 'dummy_title' + message = 'dummy message' + # when + Notification.objects.notify_user(self.user, title, message) + # then + self.assertEqual(Notification.objects.filter(user=self.user).count(), 1) + obj = Notification.objects.first() + self.assertEqual(obj.user, self.user) + self.assertEqual(obj.title, title) + self.assertEqual(obj.message, message) + self.assertEqual(obj.level, Notification.Level.INFO) + + def test_should_use_default_level_when_invalid_level_given(self): + # given + title = 'dummy_title' + message = 'dummy message' + level = "invalid" + # when + Notification.objects.notify_user(self.user, title, message, level) + # then + self.assertEqual(Notification.objects.filter(user=self.user).count(), 1) + obj = Notification.objects.first() + self.assertEqual(obj.user, self.user) + self.assertEqual(obj.title, title) + self.assertEqual(obj.message, message) + self.assertEqual(obj.level, Notification.Level.INFO) @override_settings(NOTIFICATIONS_MAX_PER_USER=3) def test_remove_when_too_many_notifications(self): diff --git a/docs/development/tech_docu/api/notifications.rst b/docs/development/tech_docu/api/notifications.rst index d2bf6352..0814739f 100644 --- a/docs/development/tech_docu/api/notifications.rst +++ b/docs/development/tech_docu/api/notifications.rst @@ -7,19 +7,16 @@ The notifications package has an API for sending notifications. Location: ``allianceauth.notifications`` .. automodule:: allianceauth.notifications.__init__ - :members: notify - :undoc-members: + :members: notify models =========== .. autoclass:: allianceauth.notifications.models.Notification - :members: LEVEL_CHOICES, mark_viewed, set_level - :undoc-members: + :members: Level, mark_viewed, set_level managers =========== .. autoclass:: allianceauth.notifications.managers.NotificationManager :members: notify_user, user_unread_count - :undoc-members: From a0db8e8e2c0d167e98c0bed0197186e3f8628d85 Mon Sep 17 00:00:00 2001 From: Erik Kalkoken Date: Fri, 20 Aug 2021 04:03:48 +0000 Subject: [PATCH 20/20] Fix logging notifications --- allianceauth/notifications/handlers.py | 33 +++++---- .../notifications/tests/test_handlers.py | 69 +++++++++++++++++++ 2 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 allianceauth/notifications/tests/test_handlers.py diff --git a/allianceauth/notifications/handlers.py b/allianceauth/notifications/handlers.py index 9fcaee18..20628a4a 100644 --- a/allianceauth/notifications/handlers.py +++ b/allianceauth/notifications/handlers.py @@ -12,21 +12,20 @@ class NotificationHandler(logging.Handler): try: perm = Permission.objects.get(codename="logging_notifications") - - message = record.getMessage() - if record.exc_text: - message += "\n\n" - message = message + record.exc_text - - users = User.objects.filter( - Q(groups__permissions=perm) | Q(user_permissions=perm) | Q(is_superuser=True)).distinct() - - for user in users: - notify( - user, - "%s [%s:%s]" % (record.levelname, record.funcName, record.lineno), - level=str([item[0] for item in Notification.LEVEL_CHOICES if item[1] == record.levelname][0]), - message=message - ) except Permission.DoesNotExist: - pass + return + + message = record.getMessage() + if record.exc_text: + message += "\n\n" + message = message + record.exc_text + + users = User.objects.filter( + Q(groups__permissions=perm) | Q(user_permissions=perm) | Q(is_superuser=True)).distinct() + for user in users: + notify( + user, + "%s [%s:%s]" % (record.levelname, record.funcName, record.lineno), + level=Notification.Level.from_old_name(record.levelname), + message=message + ) diff --git a/allianceauth/notifications/tests/test_handlers.py b/allianceauth/notifications/tests/test_handlers.py new file mode 100644 index 00000000..2bc04fb2 --- /dev/null +++ b/allianceauth/notifications/tests/test_handlers.py @@ -0,0 +1,69 @@ +from logging import LogRecord, DEBUG + +from django.contrib.auth.models import Permission, Group, User +from django.test import TestCase +from allianceauth.tests.auth_utils import AuthUtils + +from ..handlers import NotificationHandler +from ..models import Notification + +MODULE_PATH = 'allianceauth.notifications.handlers' + + +class TestHandler(TestCase): + def test_do_nothing_if_permission_does_not_exist(self): + # given + Permission.objects.get(codename="logging_notifications").delete() + handler = NotificationHandler() + record = LogRecord( + name="name", + level=DEBUG, + pathname="pathname", + lineno=42, + msg="msg", + args=[], + exc_info=None, + func="func" + ) + # when + handler.emit(record) + # then + self.assertEqual(Notification.objects.count(), 0) + + def test_should_emit_message_to_users_with_permission_only(self): + # given + AuthUtils.create_user('Lex Luthor') + user_permission = AuthUtils.create_user('Bruce Wayne') + user_permission = AuthUtils.add_permission_to_user_by_name( + "auth.logging_notifications", user_permission + ) + group = Group.objects.create(name="Dummy Group") + perm = Permission.objects.get(codename="logging_notifications") + group.permissions.add(perm) + user_group = AuthUtils.create_user('Peter Parker') + user_group.groups.add(group) + user_superuser = User.objects.create_superuser("Clark Kent") + handler = NotificationHandler() + record = LogRecord( + name="name", + level=DEBUG, + pathname="pathname", + lineno=42, + msg="msg", + args=[], + exc_info=None, + func="func" + ) + # when + handler.emit(record) + # then + self.assertEqual(Notification.objects.count(), 3) + users = set(Notification.objects.values_list("user__pk", flat=True)) + self.assertSetEqual( + users, {user_permission.pk, user_group.pk, user_superuser.pk} + ) + notif = Notification.objects.first() + self.assertEqual(notif.user, user_permission) + self.assertEqual(notif.title, "DEBUG [func:42]") + self.assertEqual(notif.level, "success") + self.assertEqual(notif.message, "msg")