diff --git a/allianceauth/services/signals.py b/allianceauth/services/signals.py index 55478592..912a5a4c 100644 --- a/allianceauth/services/signals.py +++ b/allianceauth/services/signals.py @@ -141,7 +141,7 @@ def pre_delete_user(sender, instance, *args, **kwargs): @receiver(pre_save, sender=User) -def pre_save_user(sender, instance, *args, **kwargs): +def disable_services_on_inactive(sender, instance, *args, **kwargs): logger.debug("Received pre_save from %s" % instance) # check if user is being marked active/inactive if not instance.pk: @@ -154,3 +154,17 @@ def pre_save_user(sender, instance, *args, **kwargs): disable_user(instance) except User.DoesNotExist: pass + + +@receiver(pre_save, sender=UserProfile) +def disable_services_on_no_main(sender, instance, *args, **kwargs): + if not instance.pk: + # new model being created + return + try: + old_instance = UserProfile.objects.get(pk=instance.pk) + if old_instance.main_character and not instance.main_character: + logger.info("Disabling services due to loss of main character for user {0}".format(instance.user)) + disable_user(instance.user) + except UserProfile.DoesNotExist: + pass diff --git a/allianceauth/services/tests/test_signals.py b/allianceauth/services/tests/test_signals.py index 83c1313a..04ff148f 100644 --- a/allianceauth/services/tests/test_signals.py +++ b/allianceauth/services/tests/test_signals.py @@ -9,6 +9,7 @@ from allianceauth.authentication.models import State class ServicesSignalsTestCase(TestCase): def setUp(self): self.member = AuthUtils.create_user('auth_member', disconnect_signals=True) + AuthUtils.add_main_character(self.member, 'Test', '1', '2', 'Test Corp', 'TEST') self.none_user = AuthUtils.create_user('none_user', disconnect_signals=True) @mock.patch('allianceauth.services.signals.transaction') @@ -67,6 +68,18 @@ class ServicesSignalsTestCase(TestCase): args, kwargs = disable_user.call_args self.assertEqual(self.member, args[0]) + @mock.patch('allianceauth.services.signals.disable_user') + def test_disable_services_on_loss_of_main_character(self, disable_user): + """ + Test a user set inactive has disable_member called + """ + self.member.profile.main_character = None + self.member.profile.save() # Signal Trigger + + self.assertTrue(disable_user.called) + args, kwargs = disable_user.call_args + self.assertEqual(self.member, args[0]) + @mock.patch('allianceauth.services.signals.transaction') @mock.patch('allianceauth.services.signals.ServicesHook') def test_m2m_changed_group_permissions(self, services_hook, transaction): diff --git a/allianceauth/tests/auth_utils.py b/allianceauth/tests/auth_utils.py index cc27676a..08a10f19 100644 --- a/allianceauth/tests/auth_utils.py +++ b/allianceauth/tests/auth_utils.py @@ -9,7 +9,7 @@ from allianceauth.eveonline.models import EveCharacter from allianceauth.services.signals import m2m_changed_group_permissions, m2m_changed_user_permissions, \ m2m_changed_state_permissions -from allianceauth.services.signals import m2m_changed_user_groups, pre_save_user +from allianceauth.services.signals import m2m_changed_user_groups, disable_services_on_inactive class AuthUtils: @@ -90,7 +90,7 @@ class AuthUtils: m2m_changed.disconnect(m2m_changed_group_permissions, sender=Group.permissions.through) m2m_changed.disconnect(m2m_changed_user_permissions, sender=User.user_permissions.through) m2m_changed.disconnect(m2m_changed_state_permissions, sender=State.permissions.through) - pre_save.disconnect(pre_save_user, sender=User) + pre_save.disconnect(disable_services_on_inactive, sender=User) m2m_changed.disconnect(state_member_corporations_changed, sender=State.member_corporations.through) m2m_changed.disconnect(state_member_characters_changed, sender=State.member_characters.through) m2m_changed.disconnect(state_member_alliances_changed, sender=State.member_alliances.through) @@ -102,7 +102,7 @@ class AuthUtils: m2m_changed.connect(m2m_changed_group_permissions, sender=Group.permissions.through) m2m_changed.connect(m2m_changed_user_permissions, sender=User.user_permissions.through) m2m_changed.connect(m2m_changed_state_permissions, sender=State.permissions.through) - pre_save.connect(pre_save_user, sender=User) + pre_save.connect(disable_services_on_inactive, sender=User) m2m_changed.connect(state_member_corporations_changed, sender=State.member_corporations.through) m2m_changed.connect(state_member_characters_changed, sender=State.member_characters.through) m2m_changed.connect(state_member_alliances_changed, sender=State.member_alliances.through)