From 01c17d28f6dc08ba6caa10ff56136e0b7b84cd2a Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Tue, 18 Feb 2020 19:34:44 +0100 Subject: [PATCH 1/5] Extend tox setup to include core only testing --- .gitlab-ci.yml | 36 ++++++++++++++++++++------ runtests.py | 4 +-- tests/{settings.py => settings_all.py} | 12 +++------ tests/settings_core.py | 33 +++++++++++++++++++++++ tox.ini | 10 ++++--- 5 files changed, 71 insertions(+), 24 deletions(-) rename tests/{settings.py => settings_all.py} (94%) create mode 100644 tests/settings_core.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91ef1f0e..d6c0ddc1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,25 +6,45 @@ before_script: - python -V - pip install wheel tox -test-3.5: +test-3.5-core: image: python:3.5-buster script: - - tox -e py35 + - tox -e py35-core -test-3.6: +test-3.6-core: image: python:3.6-buster script: - - tox -e py36 + - tox -e py36-core -test-3.7: +test-3.7-core: image: python:3.7-buster script: - - tox -e py37 + - tox -e py37-core -test-3.8: +test-3.8-core: image: python:3.8-buster script: - - tox -e py38 + - tox -e py38-core + +test-3.5-all: + image: python:3.5-buster + script: + - tox -e py35-all + +test-3.6-all: + image: python:3.6-buster + script: + - tox -e py36-all + +test-3.7-all: + image: python:3.7-buster + script: + - tox -e py37-all + +test-3.8-all: + image: python:3.8-buster + script: + - tox -e py38-all deploy_production: stage: deploy diff --git a/runtests.py b/runtests.py index cdf361a0..983a8e7d 100644 --- a/runtests.py +++ b/runtests.py @@ -2,9 +2,7 @@ import os import sys -if __name__ == "__main__": - os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.settings' - +if __name__ == "__main__": try: from django.core.management import execute_from_command_line except ImportError: diff --git a/tests/settings.py b/tests/settings_all.py similarity index 94% rename from tests/settings.py rename to tests/settings_all.py index 045f1089..ade3edd5 100644 --- a/tests/settings.py +++ b/tests/settings_all.py @@ -1,5 +1,7 @@ """ -Alliance Auth Test Suite Django settings. +Alliance Auth Test Suite Django settings + +Testing all services and plug-in apps """ from allianceauth.project_template.project_name.settings.base import * @@ -41,14 +43,6 @@ ROOT_URLCONF = 'tests.urls' CACHES['default'] = {'BACKEND': 'django.core.cache.backends.db.DatabaseCache'} -##################### -# HR Configuration -##################### -# JACK_KNIFE_URL - Url for the audit page of API Jack knife -# Should seriously replace with your own. -##################### -JACK_KNIFE_URL = 'http://example.com/eveapi/audit.php' - ######################## # XenForo Configuration ######################## diff --git a/tests/settings_core.py b/tests/settings_core.py new file mode 100644 index 00000000..84086fc4 --- /dev/null +++ b/tests/settings_core.py @@ -0,0 +1,33 @@ +""" +Alliance Auth Test Suite Django settings + +Testing core packages only +""" + +from allianceauth.project_template.project_name.settings.base import * + +# Use nose to run all tests +TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' + +NOSE_ARGS = [ + #'--with-coverage', + #'--cover-package=', + #'--exe', # If your tests need this to be found/run, check they py files are not chmodded +x +] + +# Celery configuration +CELERY_ALWAYS_EAGER = True # Forces celery to run locally for testing + +INSTALLED_APPS += [ + 'django_nose', +] + +ROOT_URLCONF = 'tests.urls' + +CACHES['default'] = {'BACKEND': 'django.core.cache.backends.db.DatabaseCache'} + +PASSWORD_HASHERS = [ + 'django.contrib.auth.hashers.MD5PasswordHasher', +] + +LOGGING = None # Comment out to enable logging for debugging diff --git a/tox.ini b/tox.ini index d009fdfc..156a9334 100644 --- a/tox.ini +++ b/tox.ini @@ -1,11 +1,12 @@ [tox] skipsdist = true usedevelop = true -envlist = py{35,36,37,38}-dj{2X} +envlist = py{35,36,37,38}-{all} [testenv] setenv = - DJANGO_SETTINGS_MODULE = settings + all: DJANGO_SETTINGS_MODULE = tests.settings_all + core: DJANGO_SETTINGS_MODULE = tests.settings_core basepython = py35: python3.5 py36: python3.6 @@ -13,8 +14,9 @@ basepython = py38: python3.8 deps= coverage - dj2X: Django>=2.0,<3.0 + Django>=2.0,<3.0 install_command = pip install -e ".[testing]" -U {opts} {packages} commands = - coverage run runtests.py -v 2 + all: coverage run runtests.py -v 2 + core: coverage run runtests.py allianceauth.authentication.tests.test_app_settings -v 2 coverage report -m From cfa2cf58f3951394122d334949c19ae094537e3d Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Tue, 18 Feb 2020 20:35:34 +0100 Subject: [PATCH 2/5] Fix issue #1219 --- .../authentication/tests/test_admin.py | 26 ++-- .../authentication/tests/test_app_settings.py | 8 +- allianceauth/groupmanagement/admin.py | 12 +- .../groupmanagement/tests/test_admin.py | 145 ++++++++++-------- 4 files changed, 101 insertions(+), 90 deletions(-) diff --git a/allianceauth/authentication/tests/test_admin.py b/allianceauth/authentication/tests/test_admin.py index 4e94434e..2c048c23 100644 --- a/allianceauth/authentication/tests/test_admin.py +++ b/allianceauth/authentication/tests/test_admin.py @@ -1,12 +1,12 @@ from unittest.mock import patch -from django.test import TestCase, RequestFactory +from django.conf import settings from django.contrib import admin from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import User as BaseUser, Group +from django.test import TestCase, RequestFactory from allianceauth.authentication.models import CharacterOwnership, State -from allianceauth.eveonline.autogroups.models import AutogroupsConfig from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) @@ -22,6 +22,11 @@ from ..admin import ( user_username, ) +if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: + _has_auto_groups = True + from allianceauth.eveonline.autogroups.models import AutogroupsConfig +else: + _has_auto_groups = False MODULE_PATH = 'allianceauth.authentication.admin' @@ -174,14 +179,15 @@ class TestUserAdmin(TestCase): def _create_autogroups(self): """create autogroups for corps and alliances""" - autogroups_config = AutogroupsConfig( - corp_groups = True, - alliance_groups = True - ) - autogroups_config.save() - for state in State.objects.all(): - autogroups_config.states.add(state) - autogroups_config.update_corp_group_membership(self.user_1) + if _has_auto_groups: + autogroups_config = AutogroupsConfig( + corp_groups = True, + alliance_groups = True + ) + autogroups_config.save() + for state in State.objects.all(): + autogroups_config.states.add(state) + autogroups_config.update_corp_group_membership(self.user_1) # column rendering diff --git a/allianceauth/authentication/tests/test_app_settings.py b/allianceauth/authentication/tests/test_app_settings.py index 6bd2b8c1..f941e411 100644 --- a/allianceauth/authentication/tests/test_app_settings.py +++ b/allianceauth/authentication/tests/test_app_settings.py @@ -1,11 +1,11 @@ from unittest.mock import Mock, patch - from django.test import TestCase from .. import app_settings MODULE_PATH = 'allianceauth.authentication' + class TestSetAppSetting(TestCase): @patch(MODULE_PATH + '.app_settings.settings') @@ -17,7 +17,6 @@ class TestSetAppSetting(TestCase): ) self.assertEqual(result, False) - @patch(MODULE_PATH + '.app_settings.settings') def test_default_if_not_set_for_none(self, mock_settings): mock_settings.TEST_SETTING_DUMMY = Mock(spec=None) @@ -28,7 +27,6 @@ class TestSetAppSetting(TestCase): ) self.assertEqual(result, None) - @patch(MODULE_PATH + '.app_settings.settings') def test_true_stays_true(self, mock_settings): mock_settings.TEST_SETTING_DUMMY = True @@ -56,7 +54,6 @@ class TestSetAppSetting(TestCase): ) self.assertEqual(result, False) - @patch(MODULE_PATH + '.app_settings.settings') def test_default_for_invalid_type_int(self, mock_settings): mock_settings.TEST_SETTING_DUMMY = 'invalid type' @@ -95,7 +92,6 @@ class TestSetAppSetting(TestCase): ) self.assertEqual(result, 50) - @patch(MODULE_PATH + '.app_settings.settings') def test_default_is_none_needs_required_type(self, mock_settings): mock_settings.TEST_SETTING_DUMMY = 'invalid type' @@ -104,5 +100,3 @@ class TestSetAppSetting(TestCase): 'TEST_SETTING_DUMMY', default_value=None ) - - diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index eaf9060d..e9e52362 100644 --- a/allianceauth/groupmanagement/admin.py +++ b/allianceauth/groupmanagement/admin.py @@ -103,14 +103,16 @@ class GroupAdmin(admin.ModelAdmin): '_member_count', 'has_leader' ) - list_filter = ( + list_filter = [ 'authgroup__internal', 'authgroup__hidden', 'authgroup__open', - 'authgroup__public', - IsAutoGroupFilter, - HasLeaderFilter - ) + 'authgroup__public', + ] + if _has_auto_groups: + list_filter.append(IsAutoGroupFilter) + list_filter.append(HasLeaderFilter) + search_fields = ('name', 'authgroup__description') def get_queryset(self, request): diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index 2d9f452b..d25779af 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -1,23 +1,29 @@ from unittest.mock import patch -from django.test import TestCase, RequestFactory +from django.conf import settings from django.contrib import admin from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import User +from django.test import TestCase, RequestFactory from allianceauth.authentication.models import CharacterOwnership, State -from allianceauth.eveonline.autogroups.models import AutogroupsConfig from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) -from ..admin import ( - IsAutoGroupFilter, +from ..admin import ( HasLeaderFilter, GroupAdmin, Group ) +if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: + _has_auto_groups = True + from allianceauth.eveonline.autogroups.models import AutogroupsConfig + from ..admin import IsAutoGroupFilter +else: + _has_auto_groups = False + MODULE_PATH = 'allianceauth.groupmanagement.admin' @@ -210,14 +216,15 @@ class TestGroupAdmin(TestCase): def _create_autogroups(self): """create autogroups for corps and alliances""" - autogroups_config = AutogroupsConfig( - corp_groups = True, - alliance_groups = True - ) - autogroups_config.save() - for state in State.objects.all(): - autogroups_config.states.add(state) - autogroups_config.update_corp_group_membership(self.user_1) + if _has_auto_groups: + autogroups_config = AutogroupsConfig( + corp_groups = True, + alliance_groups = True + ) + autogroups_config.save() + for state in State.objects.all(): + autogroups_config.states.add(state) + autogroups_config.update_corp_group_membership(self.user_1) # column rendering @@ -267,70 +274,72 @@ class TestGroupAdmin(TestCase): result = self.modeladmin._properties(self.group_6) self.assertListEqual(result, expected) - @patch(MODULE_PATH + '._has_auto_groups', True) - def test_properties_6(self): - self._create_autogroups() - expected = ['Auto Group'] - my_group = Group.objects\ - .filter(managedcorpgroup__isnull=False)\ - .first() - result = self.modeladmin._properties(my_group) - self.assertListEqual(result, expected) + if _has_auto_groups: + @patch(MODULE_PATH + '._has_auto_groups', True) + def test_properties_6(self): + self._create_autogroups() + expected = ['Auto Group'] + my_group = Group.objects\ + .filter(managedcorpgroup__isnull=False)\ + .first() + result = self.modeladmin._properties(my_group) + self.assertListEqual(result, expected) # actions # filters - @patch(MODULE_PATH + '._has_auto_groups', True) - def test_filter_is_auto_group(self): - - class GroupAdminTest(admin.ModelAdmin): - list_filter = (IsAutoGroupFilter,) - - self._create_autogroups() - my_modeladmin = GroupAdminTest(Group, AdminSite()) + if _has_auto_groups: + @patch(MODULE_PATH + '._has_auto_groups', True) + def test_filter_is_auto_group(self): + + class GroupAdminTest(admin.ModelAdmin): + list_filter = (IsAutoGroupFilter,) + + self._create_autogroups() + my_modeladmin = GroupAdminTest(Group, AdminSite()) - # Make sure the lookups are correct - request = self.factory.get('/') - request.user = self.user_1 - changelist = my_modeladmin.get_changelist_instance(request) - filters = changelist.get_filters(request) - filterspec = filters[0][0] - expected = [ - ('yes', 'Yes'), - ('no', 'No'), - ] - self.assertEqual(filterspec.lookup_choices, expected) + # Make sure the lookups are correct + request = self.factory.get('/') + request.user = self.user_1 + changelist = my_modeladmin.get_changelist_instance(request) + filters = changelist.get_filters(request) + filterspec = filters[0][0] + expected = [ + ('yes', 'Yes'), + ('no', 'No'), + ] + self.assertEqual(filterspec.lookup_choices, expected) - # Make sure the correct queryset is returned - no - request = self.factory.get( - '/', {'is_auto_group__exact': 'no'} - ) - request.user = self.user_1 - changelist = my_modeladmin.get_changelist_instance(request) - queryset = changelist.get_queryset(request) - expected = [ - self.group_1, - self.group_2, - self.group_3, - self.group_4, - self.group_5, - self.group_6 - ] - self.assertSetEqual(set(queryset), set(expected)) + # Make sure the correct queryset is returned - no + request = self.factory.get( + '/', {'is_auto_group__exact': 'no'} + ) + request.user = self.user_1 + changelist = my_modeladmin.get_changelist_instance(request) + queryset = changelist.get_queryset(request) + expected = [ + self.group_1, + self.group_2, + self.group_3, + self.group_4, + self.group_5, + self.group_6 + ] + self.assertSetEqual(set(queryset), set(expected)) - # Make sure the correct queryset is returned - yes - request = self.factory.get( - '/', {'is_auto_group__exact': 'yes'} - ) - request.user = self.user_1 - changelist = my_modeladmin.get_changelist_instance(request) - queryset = changelist.get_queryset(request) - expected = Group.objects.exclude( - managedalliancegroup__isnull=True, - managedcorpgroup__isnull=True - ) - self.assertSetEqual(set(queryset), set(expected)) + # Make sure the correct queryset is returned - yes + request = self.factory.get( + '/', {'is_auto_group__exact': 'yes'} + ) + request.user = self.user_1 + changelist = my_modeladmin.get_changelist_instance(request) + queryset = changelist.get_queryset(request) + expected = Group.objects.exclude( + managedalliancegroup__isnull=True, + managedcorpgroup__isnull=True + ) + self.assertSetEqual(set(queryset), set(expected)) def test_filter_has_leader(self): From 8290081365e665352544c2254e94b8b509cf00d7 Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Thu, 20 Feb 2020 15:29:54 +0100 Subject: [PATCH 3/5] Fix missing import bug in UserAdmin, StateAdmin, add tests for those cases --- allianceauth/authentication/admin.py | 6 +- allianceauth/authentication/tests/__init__.py | 11 + .../authentication/tests/test_admin.py | 369 +++++++++++------- allianceauth/groupmanagement/admin.py | 22 +- .../groupmanagement/tests/__init__.py | 11 + .../groupmanagement/tests/test_admin.py | 13 +- 6 files changed, 282 insertions(+), 150 deletions(-) diff --git a/allianceauth/authentication/admin.py b/allianceauth/authentication/admin.py index 0393168e..653e89b3 100644 --- a/allianceauth/authentication/admin.py +++ b/allianceauth/authentication/admin.py @@ -18,14 +18,14 @@ from django.utils.text import slugify from allianceauth.authentication.models import State, get_guest_state,\ CharacterOwnership, UserProfile, OwnershipRecord from allianceauth.hooks import get_hooks -from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo +from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo,\ + EveAllianceInfo from allianceauth.eveonline.tasks import update_character from .app_settings import AUTHENTICATION_ADMIN_USERS_MAX_GROUPS, \ AUTHENTICATION_ADMIN_USERS_MAX_CHARS if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: - _has_auto_groups = True - from allianceauth.eveonline.autogroups.models import * + _has_auto_groups = True else: _has_auto_groups = False diff --git a/allianceauth/authentication/tests/__init__.py b/allianceauth/authentication/tests/__init__.py index e69de29b..c886d262 100644 --- a/allianceauth/authentication/tests/__init__.py +++ b/allianceauth/authentication/tests/__init__.py @@ -0,0 +1,11 @@ +from django.urls import reverse + + +def get_admin_change_view_url(obj: object) -> str: + return reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + type(obj).__name__.lower() + ), + args=(obj.pk,) + ) \ No newline at end of file diff --git a/allianceauth/authentication/tests/test_admin.py b/allianceauth/authentication/tests/test_admin.py index 2c048c23..22663a30 100644 --- a/allianceauth/authentication/tests/test_admin.py +++ b/allianceauth/authentication/tests/test_admin.py @@ -4,23 +4,30 @@ from django.conf import settings from django.contrib import admin from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import User as BaseUser, Group -from django.test import TestCase, RequestFactory +from django.test import TestCase, RequestFactory, Client -from allianceauth.authentication.models import CharacterOwnership, State +from allianceauth.authentication.models import CharacterOwnership, State, \ + OwnershipRecord from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) +from allianceauth.tests.auth_utils import AuthUtils from ..admin import ( - BaseUserAdmin, + BaseUserAdmin, + CharacterOwnershipAdmin, + PermissionAdmin, + StateAdmin, MainCorporationsFilter, MainAllianceFilter, + OwnershipRecordAdmin, User, UserAdmin, user_main_organization, user_profile_pic, - user_username, + user_username, ) +from . import get_admin_change_view_url if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: _has_auto_groups = True @@ -31,151 +38,232 @@ else: MODULE_PATH = 'allianceauth.authentication.admin' -class MockRequest(object): - +class MockRequest(object): def __init__(self, user=None): self.user = user +def create_test_data(): + # groups + group_1 = Group.objects.create( + name='Group 1' + ) + group_2 = Group.objects.create( + name='Group 2' + ) + + # user 1 - corp and alliance, normal user + character_1 = EveCharacter.objects.create( + character_id='1001', + character_name='Bruce Wayne', + corporation_id='2001', + corporation_name='Wayne Technologies', + corporation_ticker='WT', + alliance_id='3001', + alliance_name='Wayne Enterprises', + alliance_ticker='WE', + ) + character_1a = EveCharacter.objects.create( + character_id='1002', + character_name='Batman', + corporation_id='2001', + corporation_name='Wayne Technologies', + corporation_ticker='WT', + alliance_id='3001', + alliance_name='Wayne Enterprises', + alliance_ticker='WE', + ) + alliance = EveAllianceInfo.objects.create( + alliance_id='3001', + alliance_name='Wayne Enterprises', + alliance_ticker='WE', + executor_corp_id='2001' + ) + EveCorporationInfo.objects.create( + corporation_id='2001', + corporation_name='Wayne Technologies', + corporation_ticker='WT', + member_count=42, + alliance=alliance + ) + user_1 = User.objects.create_user( + character_1.character_name.replace(' ', '_'), + 'abc@example.com', + 'password' + ) + CharacterOwnership.objects.create( + character=character_1, + owner_hash='x1' + character_1.character_name, + user=user_1 + ) + CharacterOwnership.objects.create( + character=character_1a, + owner_hash='x1' + character_1a.character_name, + user=user_1 + ) + user_1.profile.main_character = character_1 + user_1.profile.save() + user_1.groups.add(group_1) + + # user 2 - corp only, staff + character_2 = EveCharacter.objects.create( + character_id=1003, + character_name='Clark Kent', + corporation_id=2002, + corporation_name='Daily Planet', + corporation_ticker='DP', + alliance_id=None + ) + EveCorporationInfo.objects.create( + corporation_id=2002, + corporation_name='Daily Plane', + corporation_ticker='DP', + member_count=99, + alliance=None + ) + user_2 = User.objects.create_user( + character_2.character_name.replace(' ', '_'), + 'abc@example.com', + 'password' + ) + CharacterOwnership.objects.create( + character=character_2, + owner_hash='x1' + character_2.character_name, + user=user_2 + ) + user_2.profile.main_character = character_2 + user_2.profile.save() + user_2.groups.add(group_2) + user_2.is_staff = True + user_2.save() + + # user 3 - no main, no group, superuser + character_3 = EveCharacter.objects.create( + character_id=1101, + character_name='Lex Luthor', + corporation_id=2101, + corporation_name='Lex Corp', + corporation_ticker='LC', + alliance_id=None + ) + EveCorporationInfo.objects.create( + corporation_id=2101, + corporation_name='Lex Corp', + corporation_ticker='LC', + member_count=666, + alliance=None + ) + EveAllianceInfo.objects.create( + alliance_id='3101', + alliance_name='Lex World Domination', + alliance_ticker='LWD', + executor_corp_id='' + ) + user_3 = User.objects.create_user( + character_3.character_name.replace(' ', '_'), + 'abc@example.com', + 'password' + ) + CharacterOwnership.objects.create( + character=character_3, + owner_hash='x1' + character_3.character_name, + user=user_3 + ) + user_3.is_superuser = True + user_3.save() + return user_1, user_2, user_3, group_1, group_2 + + +class TestCharacterOwnershipAdmin(TestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_1, _, _, _, _ = create_test_data() + + def setUp(self): + self.modeladmin = CharacterOwnershipAdmin( + model=User, admin_site=AdminSite() + ) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + ownership = self.user_1.character_ownerships.first() + response = c.get(get_admin_change_view_url(ownership)) + self.assertEqual(response.status_code, 200) + + +class TestOwnershipRecordAdmin(TestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_1, _, _, _, _ = create_test_data() + + def setUp(self): + self.modeladmin = OwnershipRecordAdmin( + model=User, admin_site=AdminSite() + ) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + ownership_record = OwnershipRecord.objects\ + .filter(user=self.user_1)\ + .first() + response = c.get(get_admin_change_view_url(ownership_record)) + self.assertEqual(response.status_code, 200) + + +class TestStateAdmin(TestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + create_test_data() + + def setUp(self): + self.modeladmin = StateAdmin( + model=User, admin_site=AdminSite() + ) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + + guest_state = AuthUtils.get_guest_state() + response = c.get(get_admin_change_view_url(guest_state)) + self.assertEqual(response.status_code, 200) + + member_state = AuthUtils.get_member_state() + response = c.get(get_admin_change_view_url(member_state)) + self.assertEqual(response.status_code, 200) + + class TestUserAdmin(TestCase): @classmethod def setUpClass(cls): - super().setUpClass() - - # groups - cls.group_1 = Group.objects.create( - name='Group 1' - ) - cls.group_2 = Group.objects.create( - name='Group 2' - ) - - # user 1 - corp and alliance, normal user - cls.character_1 = EveCharacter.objects.create( - character_id='1001', - character_name='Bruce Wayne', - corporation_id='2001', - corporation_name='Wayne Technologies', - corporation_ticker='WT', - alliance_id='3001', - alliance_name='Wayne Enterprises', - alliance_ticker='WE', - ) - cls.character_1a = EveCharacter.objects.create( - character_id='1002', - character_name='Batman', - corporation_id='2001', - corporation_name='Wayne Technologies', - corporation_ticker='WT', - alliance_id='3001', - alliance_name='Wayne Enterprises', - alliance_ticker='WE', - ) - alliance = EveAllianceInfo.objects.create( - alliance_id='3001', - alliance_name='Wayne Enterprises', - alliance_ticker='WE', - executor_corp_id='2001' - ) - EveCorporationInfo.objects.create( - corporation_id='2001', - corporation_name='Wayne Technologies', - corporation_ticker='WT', - member_count=42, - alliance=alliance - ) - cls.user_1 = User.objects.create_user( - cls.character_1.character_name.replace(' ', '_'), - 'abc@example.com', - 'password' - ) - CharacterOwnership.objects.create( - character=cls.character_1, - owner_hash='x1' + cls.character_1.character_name, - user=cls.user_1 - ) - CharacterOwnership.objects.create( - character=cls.character_1a, - owner_hash='x1' + cls.character_1a.character_name, - user=cls.user_1 - ) - cls.user_1.profile.main_character = cls.character_1 - cls.user_1.profile.save() - cls.user_1.groups.add(cls.group_1) - - # user 2 - corp only, staff - cls.character_2 = EveCharacter.objects.create( - character_id=1003, - character_name='Clark Kent', - corporation_id=2002, - corporation_name='Daily Planet', - corporation_ticker='DP', - alliance_id=None - ) - EveCorporationInfo.objects.create( - corporation_id=2002, - corporation_name='Daily Plane', - corporation_ticker='DP', - member_count=99, - alliance=None - ) - cls.user_2 = User.objects.create_user( - cls.character_2.character_name.replace(' ', '_'), - 'abc@example.com', - 'password' - ) - CharacterOwnership.objects.create( - character=cls.character_2, - owner_hash='x1' + cls.character_2.character_name, - user=cls.user_2 - ) - cls.user_2.profile.main_character = cls.character_2 - cls.user_2.profile.save() - cls.user_2.groups.add(cls.group_2) - cls.user_2.is_staff = True - cls.user_2.save() - - # user 3 - no main, no group, superuser - cls.character_3 = EveCharacter.objects.create( - character_id=1101, - character_name='Lex Luthor', - corporation_id=2101, - corporation_name='Lex Corp', - corporation_ticker='LC', - alliance_id=None - ) - EveCorporationInfo.objects.create( - corporation_id=2101, - corporation_name='Lex Corp', - corporation_ticker='LC', - member_count=666, - alliance=None - ) - EveAllianceInfo.objects.create( - alliance_id='3101', - alliance_name='Lex World Domination', - alliance_ticker='LWD', - executor_corp_id='' - ) - cls.user_3 = User.objects.create_user( - cls.character_3.character_name.replace(' ', '_'), - 'abc@example.com', - 'password' - ) - CharacterOwnership.objects.create( - character=cls.character_3, - owner_hash='x1' + cls.character_3.character_name, - user=cls.user_3 - ) - cls.user_3.is_superuser = True - cls.user_3.save() + super().setUpClass() + cls.user_1, cls.user_2, cls.user_3, cls.group_1, cls.group_2 = \ + create_test_data() def setUp(self): self.factory = RequestFactory() self.modeladmin = UserAdmin( model=User, admin_site=AdminSite() ) + self.character_1 = self.user_1.character_ownerships.first().character def _create_autogroups(self): """create autogroups for corps and alliances""" @@ -442,4 +530,13 @@ class TestUserAdmin(TestCase): changelist = my_modeladmin.get_changelist_instance(request) queryset = changelist.get_queryset(request) expected = [self.user_1] - self.assertSetEqual(set(queryset), set(expected)) \ No newline at end of file + self.assertSetEqual(set(queryset), set(expected)) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + response = c.get(get_admin_change_view_url(self.user_1)) + self.assertEqual(response.status_code, 200) diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index e9e52362..d03a4929 100644 --- a/allianceauth/groupmanagement/admin.py +++ b/allianceauth/groupmanagement/admin.py @@ -1,7 +1,7 @@ from django.conf import settings from django.contrib import admin -from django.contrib.auth.models import Group as BaseGroup +from django.contrib.auth.models import Group as BaseGroup, User from django.db.models import Count from django.db.models.functions import Lower from django.db.models.signals import pre_save, post_save, pre_delete, \ @@ -13,8 +13,7 @@ from .models import GroupRequest from . import signals if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: - _has_auto_groups = True - from allianceauth.eveonline.autogroups.models import * + _has_auto_groups = True else: _has_auto_groups = False @@ -22,19 +21,24 @@ else: class AuthGroupInlineAdmin(admin.StackedInline): model = AuthGroup filter_horizontal = ('group_leaders', 'group_leader_groups', 'states',) - fields = ('description', 'group_leaders', 'group_leader_groups', 'states', 'internal', 'hidden', 'open', 'public') + fields = ( + 'description', + 'group_leaders', + 'group_leader_groups', + 'states', 'internal', + 'hidden', + 'open', + 'public' + ) verbose_name_plural = 'Auth Settings' verbose_name = '' def formfield_for_manytomany(self, db_field, request, **kwargs): """overriding this formfield to have sorted lists in the form""" if db_field.name == "group_leaders": - kwargs["queryset"] = User.objects\ - .filter(profile__state__name='Member')\ - .order_by(Lower('username')) + kwargs["queryset"] = User.objects.order_by(Lower('username')) elif db_field.name == "group_leader_groups": - kwargs["queryset"] = Group.objects\ - .order_by(Lower('name')) + kwargs["queryset"] = Group.objects.order_by(Lower('name')) return super().formfield_for_manytomany(db_field, request, **kwargs) def has_add_permission(self, request): diff --git a/allianceauth/groupmanagement/tests/__init__.py b/allianceauth/groupmanagement/tests/__init__.py index e69de29b..c886d262 100644 --- a/allianceauth/groupmanagement/tests/__init__.py +++ b/allianceauth/groupmanagement/tests/__init__.py @@ -0,0 +1,11 @@ +from django.urls import reverse + + +def get_admin_change_view_url(obj: object) -> str: + return reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + type(obj).__name__.lower() + ), + args=(obj.pk,) + ) \ No newline at end of file diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index d25779af..387eb6df 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -4,7 +4,7 @@ from django.conf import settings from django.contrib import admin from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import User -from django.test import TestCase, RequestFactory +from django.test import TestCase, RequestFactory, Client from allianceauth.authentication.models import CharacterOwnership, State from allianceauth.eveonline.models import ( @@ -16,6 +16,7 @@ from ..admin import ( GroupAdmin, Group ) +from . import get_admin_change_view_url if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: _has_auto_groups = True @@ -385,4 +386,12 @@ class TestGroupAdmin(TestCase): self.group_3 ] self.assertSetEqual(set(queryset), set(expected)) - \ No newline at end of file + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + response = c.get(get_admin_change_view_url(self.group_1)) + self.assertEqual(response.status_code, 200) \ No newline at end of file From 81f9211098ee830832e46449bf38d78a870e683a Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Thu, 20 Feb 2020 17:16:28 +0100 Subject: [PATCH 4/5] Fix update_main_character_model() bug --- allianceauth/authentication/admin.py | 39 ++++++++++--------- .../authentication/tests/test_admin.py | 7 ++-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/allianceauth/authentication/admin.py b/allianceauth/authentication/admin.py index 653e89b3..9f2ce766 100644 --- a/allianceauth/authentication/admin.py +++ b/allianceauth/authentication/admin.py @@ -241,6 +241,22 @@ class MainAllianceFilter(admin.SimpleListFilter): self.value()) +def update_main_character_model(modeladmin, request, queryset): + tasks_count = 0 + for obj in queryset: + if obj.profile.main_character: + update_character.delay(obj.profile.main_character.character_id) + tasks_count += 1 + + modeladmin.message_user( + request, + 'Update from ESI started for {} characters'.format(tasks_count) + ) + +update_main_character_model.short_description = \ + 'Update main character model from ESI' + + class UserAdmin(BaseUserAdmin): """Extending Django's UserAdmin model @@ -272,28 +288,13 @@ class UserAdmin(BaseUserAdmin): else: return queryset.filter(groups__pk=self.value()) - def update_main_character_model(self, request, queryset): - tasks_count = 0 - for obj in queryset: - if obj.profile.main_character: - update_character.delay(obj.profile.main_character.character_id) - tasks_count += 1 - - self.message_user( - request, - 'Update from ESI started for {} characters'.format(tasks_count) - ) - - update_main_character_model.short_description = \ - 'Update main character model from ESI' - def get_actions(self, request): actions = super(BaseUserAdmin, self).get_actions(request) - actions[self.update_main_character_model.__name__] = ( - self.update_main_character_model, - self.update_main_character_model.__name__, - self.update_main_character_model.short_description + actions[update_main_character_model.__name__] = ( + update_main_character_model, + update_main_character_model.__name__, + update_main_character_model.short_description ) for hook in get_hooks('services_hook'): diff --git a/allianceauth/authentication/tests/test_admin.py b/allianceauth/authentication/tests/test_admin.py index 22663a30..21b65ef2 100644 --- a/allianceauth/authentication/tests/test_admin.py +++ b/allianceauth/authentication/tests/test_admin.py @@ -25,7 +25,8 @@ from ..admin import ( UserAdmin, user_main_organization, user_profile_pic, - user_username, + user_username, + update_main_character_model ) from . import get_admin_change_view_url @@ -409,8 +410,8 @@ class TestUserAdmin(TestCase): self, mock_task, mock_message_user ): users_qs = User.objects.filter(pk__in=[self.user_1.pk, self.user_2.pk]) - self.modeladmin.update_main_character_model( - MockRequest(self.user_1), users_qs + update_main_character_model( + self.modeladmin, MockRequest(self.user_1), users_qs ) self.assertEqual(mock_task.delay.call_count, 2) self.assertTrue(mock_message_user.called) From b9da6911e694a50dda8f018426f2833c55e816e8 Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Thu, 20 Feb 2020 20:07:48 +0100 Subject: [PATCH 5/5] Fix Mumble search issue --- allianceauth/services/admin.py | 7 ++----- allianceauth/services/modules/discord/admin.py | 5 ++--- allianceauth/services/modules/teamspeak3/admin.py | 1 + 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/allianceauth/services/admin.py b/allianceauth/services/admin.py index 061b97e1..7128c218 100644 --- a/allianceauth/services/admin.py +++ b/allianceauth/services/admin.py @@ -20,11 +20,8 @@ class ServicesUserAdmin(admin.ModelAdmin): "all": ("services/admin.css",) } - search_fields = ( - 'user__username', - 'uid' - ) - ordering = ('user__username', ) + search_fields = ('user__username',) + ordering = ('user__username',) list_select_related = True list_display = ( user_profile_pic, diff --git a/allianceauth/services/modules/discord/admin.py b/allianceauth/services/modules/discord/admin.py index c5b12467..55fffd05 100644 --- a/allianceauth/services/modules/discord/admin.py +++ b/allianceauth/services/modules/discord/admin.py @@ -6,9 +6,8 @@ from ...admin import ServicesUserAdmin @admin.register(DiscordUser) class DiscordUserAdmin(ServicesUserAdmin): - list_display = ServicesUserAdmin.list_display + ( - '_uid', - ) + list_display = ServicesUserAdmin.list_display + ('_uid',) + search_fields = ServicesUserAdmin.search_fields + ('uid', ) def _uid(self, obj): return obj.uid diff --git a/allianceauth/services/modules/teamspeak3/admin.py b/allianceauth/services/modules/teamspeak3/admin.py index 0a6379dd..9b562ecc 100644 --- a/allianceauth/services/modules/teamspeak3/admin.py +++ b/allianceauth/services/modules/teamspeak3/admin.py @@ -10,6 +10,7 @@ class Teamspeak3UserAdmin(ServicesUserAdmin): 'uid', 'perm_key' ) + search_fields = ServicesUserAdmin.search_fields + ('uid', ) @admin.register(AuthTS)