From 18a627b01edd9e15260431ef938c4d7d0ca55cd9 Mon Sep 17 00:00:00 2001 From: Aaron Kable Date: Tue, 19 Oct 2021 00:49:39 +0000 Subject: [PATCH 01/19] Breakout Model updates into separate tasks --- allianceauth/eveonline/tasks.py | 79 +++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/allianceauth/eveonline/tasks.py b/allianceauth/eveonline/tasks.py index 9562d520..0f131c87 100644 --- a/allianceauth/eveonline/tasks.py +++ b/allianceauth/eveonline/tasks.py @@ -43,58 +43,71 @@ def run_model_update(): # update existing corp models for corp in EveCorporationInfo.objects.all().values('corporation_id'): - update_corp.apply_async( - args=[corp['corporation_id']], priority=TASK_PRIORITY - ) + update_corp.apply_async(args=[corp['corporation_id']], priority=TASK_PRIORITY) # update existing alliance models for alliance in EveAllianceInfo.objects.all().values('alliance_id'): - update_alliance.apply_async( - args=[alliance['alliance_id']], priority=TASK_PRIORITY - ) + update_alliance.apply_async(args=[alliance['alliance_id']], priority=TASK_PRIORITY) + #update existing character models if required # update existing character models character_ids = EveCharacter.objects.all().values_list('character_id', flat=True) for character_ids_chunk in chunks(character_ids, CHUNK_SIZE): + update_character_chunk.apply_async( + args=[character_ids_chunk], priority=TASK_PRIORITY + ) + + +@shared_task +def update_character_chunk(character_ids_chunk: list): + """Update a list of character from ESI""" + try: affiliations_raw = providers.provider.client.Character\ .post_characters_affiliation(characters=character_ids_chunk).result() character_names = providers.provider.client.Universe\ .post_universe_names(ids=character_ids_chunk).result() + except: + logger.error("Failed to bulk update characters. Attempting single updates") + for character_id in character_ids_chunk: + update_character.apply_async( + args=[character_id], priority=TASK_PRIORITY + ) + return - affiliations = { + affiliations = { affiliation.get('character_id'): affiliation for affiliation in affiliations_raw - } - # add character names to affiliations - for character in character_names: - character_id = character.get('id') - if character_id in affiliations: - affiliations[character_id]['name'] = character.get('name') + } + # add character names to affiliations + for character in character_names: + character_id = character.get('id') + if character_id in affiliations: + affiliations[character_id]['name'] = character.get('name') - # fetch current characters - characters = EveCharacter.objects.filter(character_id__in=character_ids_chunk)\ - .values('character_id', 'corporation_id', 'alliance_id', 'character_name') + # fetch current characters + characters = EveCharacter.objects.filter(character_id__in=character_ids_chunk)\ + .values('character_id', 'corporation_id', 'alliance_id', 'character_name') - for character in characters: - character_id = character.get('character_id') - if character_id in affiliations: - affiliation = affiliations[character_id] + for character in characters: + character_id = character.get('character_id') + if character_id in affiliations: + affiliation = affiliations[character_id] - corp_changed = ( - character.get('corporation_id') != affiliation.get('corporation_id') - ) + corp_changed = ( + character.get('corporation_id') != affiliation.get('corporation_id') + ) - alliance_id = character.get('alliance_id') - if not alliance_id: - alliance_id = None - alliance_changed = alliance_id != affiliation.get('alliance_id') + alliance_id = character.get('alliance_id') + if not alliance_id: + alliance_id = None + alliance_changed = alliance_id != affiliation.get('alliance_id') - name_changed = False - fetched_name = affiliation.get('name', False) - if fetched_name: - name_changed = character.get('character_name') != fetched_name + name_changed = False + fetched_name = affiliation.get('name', False) + if fetched_name: + name_changed = character.get('character_name') != fetched_name - if corp_changed or alliance_changed or name_changed: - update_character.apply_async( + if corp_changed or alliance_changed or name_changed: + update_character.apply_async( args=[character.get('character_id')], priority=TASK_PRIORITY ) From f17ebbede6d675f6308f41b3e72b78758642ef60 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Wed, 3 Nov 2021 21:02:03 -0400 Subject: [PATCH 02/19] Use danger and error message tags to render correctly on admin site. Closes #1305 --- allianceauth/project_template/project_name/settings/base.py | 2 +- allianceauth/templates/allianceauth/messages.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/allianceauth/project_template/project_name/settings/base.py b/allianceauth/project_template/project_name/settings/base.py index 18ec3634..af53215f 100644 --- a/allianceauth/project_template/project_name/settings/base.py +++ b/allianceauth/project_template/project_name/settings/base.py @@ -167,7 +167,7 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'static') # Bootstrap messaging css workaround MESSAGE_TAGS = { - messages.ERROR: 'danger' + messages.ERROR: 'danger error' } CACHES = { diff --git a/allianceauth/templates/allianceauth/messages.html b/allianceauth/templates/allianceauth/messages.html index e1c61455..41fc2756 100644 --- a/allianceauth/templates/allianceauth/messages.html +++ b/allianceauth/templates/allianceauth/messages.html @@ -13,7 +13,7 @@ {% elif message.level_tag == "warning" %} - {% elif message.level_tag == "danger" %} + {% elif "danger" in message.level_tag %} {% endif %} From d8797a8dc63339d2822b257958174548ed6551bd Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 21 Nov 2021 18:18:05 +0100 Subject: [PATCH 03/19] Prefix the setting so it is clear where it belongs to --- allianceauth/groupmanagement/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/groupmanagement/views.py b/allianceauth/groupmanagement/views.py index 994447dc..e8d68157 100755 --- a/allianceauth/groupmanagement/views.py +++ b/allianceauth/groupmanagement/views.py @@ -388,7 +388,7 @@ def group_request_leave(request, group_id): logger.info(f"{request.user} attempted to leave {group} but already has an pending leave request.") messages.warning(request, _("You already have a pending leave request for that group.")) return redirect("groupmanagement:groups") - if getattr(settings, 'AUTO_LEAVE', False): + if getattr(settings, 'GROUPMANAGEMENT_AUTO_LEAVE', False): logger.info(f"{request.user} leaving joinable group {group} due to auto_leave") request_info = request.user.username + ":" + group.name log = RequestLog(request_type=True, group=group, request_info=request_info, action=1, request_actor=request.user) From a636fd1cf056d5bcc38377a2215c8fa37e1e6ff5 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 21 Nov 2021 18:24:04 +0100 Subject: [PATCH 04/19] Add it to the docu --- docs/features/core/groupmanagement.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/features/core/groupmanagement.md b/docs/features/core/groupmanagement.md index 1f2685ea..54e58054 100644 --- a/docs/features/core/groupmanagement.md +++ b/docs/features/core/groupmanagement.md @@ -41,11 +41,13 @@ Here is a list of available settings for Group Management. They can be configure Note that all settings are optional and the app will use the documented default settings if they are not used. ```eval_rst -+---------------------------------------------+---------------------------------------------------------------------------+------------+ -| Name | Description | Default | -+=============================================+===========================================================================+============+ -| ``GROUPMANAGEMENT_REQUESTS_NOTIFICATION`` | Send Auth notifications to all group leaders for join and leave requests. | ``False`` | -+---------------------------------------------+---------------------------------------------------------------------------+------------+ ++---------------------------------------------+-------------------------------------------------------------------------------------------+------------+ +| Name | Description | Default | ++=============================================+===========================================================================================+============+ +| ``GROUPMANAGEMENT_AUTO_LEAVE`` | Group members can leave their group without needing confirmation from their group leaders | ``False`` | ++---------------------------------------------+-------------------------------------------------------------------------------------------+------------+ +| ``GROUPMANAGEMENT_REQUESTS_NOTIFICATION`` | Send Auth notifications to all group leaders for join and leave requests. | ``False`` | ++---------------------------------------------+-------------------------------------------------------------------------------------------+------------+ ``` ## Permissions From 03305c72c762e63a834cd834ae25626c4f53a45d Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 22 Nov 2021 18:10:02 +0100 Subject: [PATCH 05/19] Added error handling when fetching from GitLab API --- allianceauth/templatetags/admin_status.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/allianceauth/templatetags/admin_status.py b/allianceauth/templatetags/admin_status.py index 9170b168..dbfa46ac 100644 --- a/allianceauth/templatetags/admin_status.py +++ b/allianceauth/templatetags/admin_status.py @@ -156,14 +156,26 @@ def _latests_versions(tags: list) -> tuple: def _fetch_list_from_gitlab(url: str, max_pages: int = MAX_PAGES) -> list: - """returns a list from the GitLab API. Supports pageing""" + """returns a list from the GitLab API. Supports paging""" result = list() + for page in range(1, max_pages + 1): - request = requests.get( - url, params={'page': page}, timeout=REQUESTS_TIMEOUT - ) - request.raise_for_status() + try: + request = requests.get( + url, params={'page': page}, timeout=REQUESTS_TIMEOUT + ) + except requests.exceptions.RequestException as e: + error_str = str(e) + + logger.error( + f'Unable to fetch from GitLab API. Error: {error_str}', + exc_info=True, + ) + + return result + result += request.json() + if 'x-total-pages' in request.headers: try: total_pages = int(request.headers['x-total-pages']) From 20da1ebfab47f19b9aa19655c7cc214ddb4e2e56 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 22 Nov 2021 18:56:33 +0100 Subject: [PATCH 06/19] request.raise_for_status() re-added --- allianceauth/templatetags/admin_status.py | 1 + 1 file changed, 1 insertion(+) diff --git a/allianceauth/templatetags/admin_status.py b/allianceauth/templatetags/admin_status.py index dbfa46ac..c84b47fe 100644 --- a/allianceauth/templatetags/admin_status.py +++ b/allianceauth/templatetags/admin_status.py @@ -164,6 +164,7 @@ def _fetch_list_from_gitlab(url: str, max_pages: int = MAX_PAGES) -> list: request = requests.get( url, params={'page': page}, timeout=REQUESTS_TIMEOUT ) + request.raise_for_status() except requests.exceptions.RequestException as e: error_str = str(e) From 8faadc23b0621c674e4cd816f012cd64c6649765 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 23 Nov 2021 01:02:08 +0100 Subject: [PATCH 07/19] Set logger to warning to not trigger a notification to admins every time --- allianceauth/templatetags/admin_status.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/templatetags/admin_status.py b/allianceauth/templatetags/admin_status.py index c84b47fe..f7de2513 100644 --- a/allianceauth/templatetags/admin_status.py +++ b/allianceauth/templatetags/admin_status.py @@ -168,7 +168,7 @@ def _fetch_list_from_gitlab(url: str, max_pages: int = MAX_PAGES) -> list: except requests.exceptions.RequestException as e: error_str = str(e) - logger.error( + logger.warning( f'Unable to fetch from GitLab API. Error: {error_str}', exc_info=True, ) From 49548d6f9f02ef7b890ec7eb4490b5f612b56299 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 23 Nov 2021 01:23:34 +0100 Subject: [PATCH 08/19] test_can_handle_connection_timeout added --- allianceauth/authentication/tests/test_templatetags.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/allianceauth/authentication/tests/test_templatetags.py b/allianceauth/authentication/tests/test_templatetags.py index 9a7a313c..8b142e17 100644 --- a/allianceauth/authentication/tests/test_templatetags.py +++ b/allianceauth/authentication/tests/test_templatetags.py @@ -1,6 +1,7 @@ from math import ceil from unittest.mock import patch +import requests import requests_mock from packaging.version import Version as Pep440Version @@ -307,3 +308,9 @@ class TestFetchListFromGitlab(TestCase): result = _fetch_list_from_gitlab(self.url, max_pages=max_pages) self.assertEqual(result, GITHUB_TAGS[:4]) self.assertEqual(requests_mocker.call_count, max_pages) + + @requests_mock.mock() + def test_can_handle_connection_timeout(self, requests_mocker): + requests_mocker.get(self.url, exc=requests.exceptions.ConnectTimeout) + with self.assertRaises(requests.exceptions.ConnectTimeout): + result = _fetch_list_from_gitlab(self.url) From b6d6c68e54c88b6e3155ebe81e19113500080679 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 23 Nov 2021 02:31:18 +0100 Subject: [PATCH 09/19] Fix tests Thanks to @ErikKalkoken for helping here --- .../authentication/tests/test_templatetags.py | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/allianceauth/authentication/tests/test_templatetags.py b/allianceauth/authentication/tests/test_templatetags.py index 8b142e17..50361724 100644 --- a/allianceauth/authentication/tests/test_templatetags.py +++ b/allianceauth/authentication/tests/test_templatetags.py @@ -310,7 +310,23 @@ class TestFetchListFromGitlab(TestCase): self.assertEqual(requests_mocker.call_count, max_pages) @requests_mock.mock() - def test_can_handle_connection_timeout(self, requests_mocker): - requests_mocker.get(self.url, exc=requests.exceptions.ConnectTimeout) - with self.assertRaises(requests.exceptions.ConnectTimeout): - result = _fetch_list_from_gitlab(self.url) + @patch(MODULE_PATH + '.admin_status.logger') + def test_should_not_raise_any_exception_from_github_request_but_log_as_warning( + self, requests_mocker, mock_logger + ): + for my_exception in [ + requests.exceptions.ConnectionError, + requests.exceptions.HTTPError, + requests.exceptions.URLRequired, + requests.exceptions.TooManyRedirects, + requests.exceptions.ConnectTimeout, + requests.exceptions.Timeout, + + ]: + requests_mocker.get(self.url, exc=my_exception) + try: + result = _fetch_list_from_gitlab(self.url) + except Exception as ex: + self.fail(f"Unexpected exception raised: {ex}") + self.assertTrue(mock_logger.warning.called) + self.assertListEqual(result, []) From 3e487e5f134927e5d804ae41d24a90d305ce02ca Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Wed, 24 Nov 2021 17:56:15 +1000 Subject: [PATCH 10/19] Add jqueryui bundles --- allianceauth/templates/bundles/jquery-ui-css.html | 3 +++ allianceauth/templates/bundles/jquery-ui-js.html | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 allianceauth/templates/bundles/jquery-ui-css.html create mode 100644 allianceauth/templates/bundles/jquery-ui-js.html diff --git a/allianceauth/templates/bundles/jquery-ui-css.html b/allianceauth/templates/bundles/jquery-ui-css.html new file mode 100644 index 00000000..970b5e9f --- /dev/null +++ b/allianceauth/templates/bundles/jquery-ui-css.html @@ -0,0 +1,3 @@ + + + diff --git a/allianceauth/templates/bundles/jquery-ui-js.html b/allianceauth/templates/bundles/jquery-ui-js.html new file mode 100644 index 00000000..03b89f95 --- /dev/null +++ b/allianceauth/templates/bundles/jquery-ui-js.html @@ -0,0 +1,3 @@ + + + From 60b12bad61e1683fbaf763180bcdcb31e3cc3d54 Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Sat, 27 Nov 2021 03:35:40 +0000 Subject: [PATCH 11/19] Python 3.10 Support --- .gitignore | 1 - .gitlab-ci.yml | 20 ++++++++++++++++++- .../authentication/tests/test_admin.py | 2 +- docs/requirements.txt | 1 - setup.py | 2 +- tests/settings_all.py | 10 ---------- tests/settings_core.py | 12 ----------- tox.ini | 7 ++++--- 8 files changed, 25 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index cf9bfc18..dc83a16a 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,6 @@ htmlcov/ .tox/ .coverage .cache -nosetests.xml coverage.xml # Translations diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 20ec9e74..5fe4470e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -65,6 +65,15 @@ test-3.9-core: reports: cobertura: coverage.xml +test-3.10-core: + image: python:3.10-bullseye + script: + - tox -e py310-core + artifacts: + when: always + reports: + cobertura: coverage.xml + test-3.7-all: image: python:3.7-bullseye script: @@ -92,9 +101,18 @@ test-3.9-all: reports: cobertura: coverage.xml +test-3.10-all: + image: python:3.10-bullseye + script: + - tox -e py310-all + artifacts: + when: always + reports: + cobertura: coverage.xml + deploy_production: stage: deploy - image: python:3.9-bullseye + image: python:3.10-bullseye before_script: - pip install twine wheel diff --git a/allianceauth/authentication/tests/test_admin.py b/allianceauth/authentication/tests/test_admin.py index 01455ddf..e48f3623 100644 --- a/allianceauth/authentication/tests/test_admin.py +++ b/allianceauth/authentication/tests/test_admin.py @@ -419,7 +419,7 @@ class TestUserAdmin(TestCaseWithTestData): # actions - @patch(MODULE_PATH + '.UserAdmin.message_user', auto_spec=True) + @patch(MODULE_PATH + '.UserAdmin.message_user', auto_spec=True, unsafe=True) @patch(MODULE_PATH + '.update_character') def test_action_update_main_character_model( self, mock_task, mock_message_user diff --git a/docs/requirements.txt b/docs/requirements.txt index cbbe8ebd..b187b2e6 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -13,4 +13,3 @@ celery>5,<6 celery_once passlib redis>=3.3.1,<4.0.0 -django-nose diff --git a/setup.py b/setup.py index 1e9632e5..17863292 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,6 @@ install_requires = [ testing_extras = [ 'coverage>=4.3.1', 'requests-mock>=1.2.0', - 'django-nose', 'django-webtest', ] @@ -80,6 +79,7 @@ setup( 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', ], diff --git a/tests/settings_all.py b/tests/settings_all.py index f3d618c7..4e7b631d 100644 --- a/tests/settings_all.py +++ b/tests/settings_all.py @@ -6,15 +6,6 @@ Testing all services and plug-in apps 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 @@ -36,7 +27,6 @@ INSTALLED_APPS += [ 'allianceauth.services.modules.phpbb3', 'allianceauth.services.modules.xenforo', 'allianceauth.services.modules.teamspeak3', - 'django_nose', ] ROOT_URLCONF = 'tests.urls' diff --git a/tests/settings_core.py b/tests/settings_core.py index effc39da..fd97a388 100644 --- a/tests/settings_core.py +++ b/tests/settings_core.py @@ -6,21 +6,9 @@ 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' diff --git a/tox.ini b/tox.ini index a8603b58..2219c239 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] skipsdist = true usedevelop = true -envlist = py{37,38,39}-{all,core} +envlist = py{37,38,39,310}-{all,core} [testenv] setenv = @@ -11,11 +11,12 @@ basepython = py37: python3.7 py38: python3.8 py39: python3.9 + py310: python3.10 deps= coverage install_command = pip install -e ".[testing]" -U {opts} {packages} commands = - all: coverage run runtests.py -v 2 - core: coverage run runtests.py allianceauth.authentication.tests.test_app_settings -v 2 + all: coverage run runtests.py -v 2 --debug-mode + core: coverage run runtests.py allianceauth.authentication.tests.test_app_settings -v 2 --debug-mode all: coverage report -m all: coverage xml From 4ad8e88bd8f451e1984604d77e229323748f2a82 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sat, 27 Nov 2021 04:40:23 +0100 Subject: [PATCH 12/19] Old reference to AUTO_LEAVE removed --- docs/features/core/groups.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/docs/features/core/groups.md b/docs/features/core/groups.md index 936adaff..71fe6469 100644 --- a/docs/features/core/groups.md +++ b/docs/features/core/groups.md @@ -48,12 +48,3 @@ When a user loses this permission, they will be removed from all groups _except_ .. note:: By default, the ``groupmanagement.request_groups`` permission is applied to the ``Member`` group. In most instances this, and perhaps adding it to the ``Blue`` group, should be all that is ever needed. It is unsupported and NOT advisable to apply this permission to a public group. See #697 for more information. ``` - -### Auto Leave - -By default in AA, Both requests and leaves for non-open groups must be approved by a group manager. If you wish to allow users to leave groups without requiring approvals, add the following lines to your `local.py` - -```python -## Allows users to freely leave groups without requiring approval. -AUTO_LEAVE = True -``` From 930c5d7c7ab89dce56c794d22e698ae722b3ce82 Mon Sep 17 00:00:00 2001 From: Kevin McKernan Date: Sat, 27 Nov 2021 04:45:21 +0000 Subject: [PATCH 13/19] Build docker image in gitlab, add docs for turn key docker setup --- .editorconfig | 4 + .gitlab-ci.yml | 78 ++++++++++++++++++ docker/.env.example | 32 ++++++++ docker/.gitignore | 2 + docker/Dockerfile | 49 ++++++++++++ docker/README.md | 69 ++++++++++++++++ docker/conf/local.py | 81 +++++++++++++++++++ docker/conf/nginx.conf | 20 +++++ docker/conf/requirements.txt | 0 docker/conf/supervisord.conf | 56 +++++++++++++ docker/custom.dockerfile | 8 ++ docker/docker-compose.yml | 96 +++++++++++++++++++++++ docker/docs/images/grafana-host.png | Bin 0 -> 87028 bytes docker/docs/images/nginx-host.png | Bin 0 -> 87577 bytes docker/docs/images/proxy-manager-ssl.png | Bin 0 -> 31967 bytes docker/scripts/download.sh | 4 + docker/scripts/prepare-env.sh | 46 +++++++++++ docker/setup.base.sql | 7 ++ 18 files changed, 552 insertions(+) create mode 100644 docker/.env.example create mode 100644 docker/.gitignore create mode 100644 docker/Dockerfile create mode 100644 docker/README.md create mode 100644 docker/conf/local.py create mode 100644 docker/conf/nginx.conf create mode 100644 docker/conf/requirements.txt create mode 100644 docker/conf/supervisord.conf create mode 100644 docker/custom.dockerfile create mode 100644 docker/docker-compose.yml create mode 100644 docker/docs/images/grafana-host.png create mode 100644 docker/docs/images/nginx-host.png create mode 100644 docker/docs/images/proxy-manager-ssl.png create mode 100755 docker/scripts/download.sh create mode 100755 docker/scripts/prepare-env.sh create mode 100644 docker/setup.base.sql diff --git a/.editorconfig b/.editorconfig index 93b7b093..765b35c4 100644 --- a/.editorconfig +++ b/.editorconfig @@ -22,3 +22,7 @@ indent_style = tab [*.bat] indent_style = tab + +[{Dockerfile,*.dockerfile}] +indent_style = space +indent_size = 4 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5fe4470e..7d97c031 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,15 @@ +.only-default: &only-default + only: + - master + - branches + - merge_requests + stages: - pre-commit - gitlab - test - deploy +- docker include: - template: Dependency-Scanning.gitlab-ci.yml @@ -15,6 +22,7 @@ before_script: - pip install wheel tox pre-commit-check: + <<: *only-default stage: pre-commit image: python:3.6-buster variables: @@ -39,6 +47,7 @@ dependency_scanning: - pip install wheel tox test-3.7-core: + <<: *only-default image: python:3.7-bullseye script: - tox -e py37-core @@ -48,6 +57,7 @@ test-3.7-core: cobertura: coverage.xml test-3.8-core: + <<: *only-default image: python:3.8-bullseye script: - tox -e py38-core @@ -57,6 +67,7 @@ test-3.8-core: cobertura: coverage.xml test-3.9-core: + <<: *only-default image: python:3.9-bullseye script: - tox -e py39-core @@ -66,6 +77,7 @@ test-3.9-core: cobertura: coverage.xml test-3.10-core: + <<: *only-default image: python:3.10-bullseye script: - tox -e py310-core @@ -75,6 +87,7 @@ test-3.10-core: cobertura: coverage.xml test-3.7-all: + <<: *only-default image: python:3.7-bullseye script: - tox -e py37-all @@ -84,6 +97,7 @@ test-3.7-all: cobertura: coverage.xml test-3.8-all: + <<: *only-default image: python:3.8-bullseye script: - tox -e py38-all @@ -93,6 +107,7 @@ test-3.8-all: cobertura: coverage.xml test-3.9-all: + <<: *only-default image: python:3.9-bullseye script: - tox -e py39-all @@ -102,6 +117,7 @@ test-3.9-all: cobertura: coverage.xml test-3.10-all: + <<: *only-default image: python:3.10-bullseye script: - tox -e py310-all @@ -123,3 +139,65 @@ deploy_production: rules: - if: $CI_COMMIT_TAG + +build-image: + before_script: [] + image: docker:20.10.10 + stage: docker + services: + - docker:20.10.10-dind + script: | + CURRENT_DATE=$(echo $CI_COMMIT_TIMESTAMP | head -c 10 | tr -d -) + IMAGE_TAG=$CI_REGISTRY_IMAGE/auth:$CURRENT_DATE-$CI_COMMIT_SHORT_SHA + CURRENT_TAG=$CI_REGISTRY_IMAGE/auth:$CI_COMMIT_TAG + MINOR_TAG=$CI_REGISTRY_IMAGE/auth:$(echo $CI_COMMIT_TAG | cut -d '.' -f 1-2) + MAJOR_TAG=$CI_REGISTRY_IMAGE/auth:$(echo $CI_COMMIT_TAG | cut -d '.' -f 1) + LATEST_TAG=$CI_REGISTRY_IMAGE/auth:latest + + docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + docker build . -t $IMAGE_TAG -f docker/Dockerfile --build-arg AUTH_VERSION=$(echo $CI_COMMIT_TAG | cut -c 2-) + docker tag $IMAGE_TAG $CURRENT_TAG + docker tag $IMAGE_TAG $MINOR_TAG + docker tag $IMAGE_TAG $MAJOR_TAG + docker tag $IMAGE_TAG $LATEST_TAG + docker image push --all-tags $CI_REGISTRY_IMAGE/auth + rules: + - if: $CI_COMMIT_TAG + +build-image-dev: + before_script: [] + image: docker:20.10.10 + stage: docker + services: + - docker:20.10.10-dind + script: | + CURRENT_DATE=$(echo $CI_COMMIT_TIMESTAMP | head -c 10 | tr -d -) + IMAGE_TAG=$CI_REGISTRY_IMAGE/auth:$CURRENT_DATE-$CI_COMMIT_BRANCH-$CI_COMMIT_SHORT_SHA + + docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + docker build . -t $IMAGE_TAG -f docker/Dockerfile --build-arg AUTH_PACKAGE=git+https://gitlab.com/allianceauth/allianceauth@$CI_COMMIT_BRANCH + docker push $IMAGE_TAG + rules: + - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == ""' + when: manual + - if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME != ""' + when: never + +build-image-mr: + before_script: [] + image: docker:20.10.10 + stage: docker + services: + - docker:20.10.10-dind + script: | + CURRENT_DATE=$(echo $CI_COMMIT_TIMESTAMP | head -c 10 | tr -d -) + IMAGE_TAG=$CI_REGISTRY_IMAGE/auth:$CURRENT_DATE-$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME-$CI_COMMIT_SHORT_SHA + + docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + docker build . -t $IMAGE_TAG -f docker/Dockerfile --build-arg AUTH_PACKAGE=git+$CI_MERGE_REQUEST_SOURCE_PROJECT_URL@$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME + docker push $IMAGE_TAG + rules: + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + when: manual + - if: '$CI_PIPELINE_SOURCE != "merge_request_event"' + when: never diff --git a/docker/.env.example b/docker/.env.example new file mode 100644 index 00000000..efddce22 --- /dev/null +++ b/docker/.env.example @@ -0,0 +1,32 @@ +PROTOCOL=https:// +AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN% +DOMAIN=%DOMAIN% +AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v2.9 + +# Nginx Proxy Manager +PROXY_HTTP_PORT=80 +PROXY_HTTPS_PORT=443 +PROXY_DASH_PORT=81 +PROXY_MYSQL_PASS=%PROXY_MYSQL_PASS% +PROXY_MYSQL_PASS_ROOT=%PROXY_MYSQL_PASS_ROOT% + +# grafana +GRAFANA_DB_PASSWORD=%GRAFANA_DB_PASSWORD% + +# Alliance Auth Environment Config +AA_SITENAME=%AA_SITENAME% +AA_SECRET_KEY=%AA_SECRET_KEY% +AA_DB_HOST=auth_mysql +AA_DB_NAME=alliance_auth +AA_DB_USER=aauth +AA_DB_PASSWORD=%AA_DB_PASSWORD% +AA_DB_ROOT_PASSWORD=%AA_DB_ROOT_PASSWORD% +AA_EMAIL_HOST='' +AA_EMAIL_PORT=587 +AA_EMAIL_HOST_USER='' +AA_EMAIL_HOST_PASSWORD='' +AA_EMAIL_USE_TLS=True +AA_DEFAULT_FROM_EMAIL='' +ESI_SSO_CLIENT_ID=%ESI_SSO_CLIENT_ID% +ESI_SSO_CLIENT_SECRET=%ESI_SSO_CLIENT_SECRET% +ESI_USER_CONTACT_EMAIL=%ESI_USER_CONTACT_EMAIL% diff --git a/docker/.gitignore b/docker/.gitignore new file mode 100644 index 00000000..1d174f3e --- /dev/null +++ b/docker/.gitignore @@ -0,0 +1,2 @@ +.env +setup.sql diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..9ba7bc40 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,49 @@ +FROM python:3.9-slim +ARG AUTH_VERSION=2.9.0 +ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION} +ENV VIRTUAL_ENV=/opt/venv +ENV AUTH_USER=allianceauth +ENV AUTH_GROUP=allianceauth +ENV AUTH_USERGROUP=${AUTH_USER}:${AUTH_GROUP} +ENV STATIC_BASE=/var/www +ENV AUTH_HOME=/home/allianceauth + +# Setup user and directory permissions +SHELL ["/bin/bash", "-c"] +RUN groupadd -g 61000 ${AUTH_GROUP} +RUN useradd -g 61000 -l -M -s /bin/false -u 61000 ${AUTH_USER} +RUN mkdir -p ${VIRTUAL_ENV} \ + && chown ${AUTH_USERGROUP} ${VIRTUAL_ENV} \ + && mkdir -p ${STATIC_BASE} \ + && chown ${AUTH_USERGROUP} ${STATIC_BASE} \ + && mkdir -p ${AUTH_HOME} \ + && chown ${AUTH_USERGROUP} ${AUTH_HOME} + +# Install build dependencies +RUN apt-get update && apt-get upgrade -y && apt-get install -y \ + libmariadb-dev gcc supervisor git htop + +# Switch to non-root user +USER ${AUTH_USER} +RUN python3 -m venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" +WORKDIR ${AUTH_HOME} + +# Install python dependencies +RUN pip install --upgrade pip +RUN pip install wheel gunicorn +RUN pip install ${AUTH_PACKAGE} + +# Initialize auth +RUN allianceauth start myauth +COPY /allianceauth/project_template/project_name/settings/local.py ${AUTH_HOME}/myauth/myauth/settings/local.py +RUN allianceauth update myauth +RUN mkdir -p ${STATIC_BASE}/myauth/static +RUN python ${AUTH_HOME}/myauth/manage.py collectstatic --noinput +COPY /docker/conf/supervisord.conf /etc/supervisor/conf.d/supervisord.conf +RUN echo 'alias auth="python $AUTH_HOME/myauth/manage.py"' >> ~/.bashrc && \ + echo 'alias supervisord="supervisord -c /etc/supervisor/conf.d/supervisord.conf"' >> ~/.bashrc && \ + source ~/.bashrc + +EXPOSE 8000 +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 00000000..900dad56 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,69 @@ +# Alliance Auth -- Docker + +## Prerequesites +You should have the following available on the system you are using to set this up: +* Docker - https://docs.docker.com/get-docker/ +* git +* curl + +## Setup Guide + +1. run `bash <(curl -s https://gitlab.com/allianceauth/allianceauth/-/raw/v2.9.x/docker/scripts/download.sh)`. This will download all the files you need to install auth and place them in a directory named `aa-docker`. Feel free to rename/move this folder. +1. run `./scripts/prepare-env.sh` to set up your environment +1. (optional) Change `PROTOCOL` to `http://` if not using SSL in `.env` +1. run `docker-compose --env-file=.env up -d` (NOTE: if this command hangs, follow the instructions [here](https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged)) +1. run `docker-compose exec allianceauth bash` to open up a terminal inside your auth container +1. run `auth migrate` +1. run `auth collectstatic` +1. run `auth createsuperuser` +1. visit http://yourdomain:81 to set up nginx proxy manager (NOTE: if this doesn't work, the machine likely has a firewall. You'll want to open up ports 80,443, and 81. [Instructions for ufw](https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands)) +1. login with user `admin@example.com` and password `changeme`, then update your password as requested +1. click on "Proxy Hosts" +1. click "Add Proxy Host", with the following settings for auth. The example uses `auth.localhost` for the domain, but you'll want to use whatever address you have auth configured on + ![](./docs/images/nginx-host.png) +1. click "Add Proxy Host", with the following settings for grafana. The example uses `grafana.localhost` for the domain + ![](./docs/images/grafana-host.png) + +Congrats! You should now see auth running at http://auth.yourdomain and grafana at http://grafana.yourdomain! + +## SSL Guide +Unless you're running auth locally in docker for testing, you should be using SSL. +Thankfully, setting up SSL in nginx Proxy Manager takes about three clicks. +1. Edit your existing proxy host, and go to the SSL tab. Select "Request a new SSL Certificate" from the drop down. +1. Now, enable "Force SSL" and "HTTP/2 Support". (NOTE: Do not enable HSTS unless you know what you're doing. This will force your domains to only work with SSL enabled, and is cached extremely hard in browsers. ) + ![](./docs/images/proxy-manager-ssl.png) +1. (optional) select "Use a DNS Challenge". This is not a required option, but it is recommended if you use a supported DNS provider. You'll then be asked for an API key for the provider you choose. If you use Cloudflare, you'll probably have issues getting SSL certs unless you use a DNS Challenge. +1. The email address here will be used to notify you if there are issues renewing your certificates. +1. Repeat for any other services, like grafana. + +That's it! You should now be able to access your auth install at https://auth.yourdomain + +## Adding extra packages +There are a handful of ways to add packages: +* Running `pip install` in the container +* Modifying the container's initial command to install packages +* Building a custom Docker image (recommended, and less scary than it sounds!) + +### Using a custom docker image +Using a custom docker image is the preferred approach, as it gives you the stability of packages only changing when you tell them to, along with packages not having to be downloaded every time your container restarts + +1. Add each additional package that you want to install to a single line in `conf/requirements.txt`. It is recommended, but not required, that you include a version number as well. This will keep your packages from magically updating. You can lookup packages on https://package.wiki, and copy everything after `pip install` from the top of the page to use the most recent version. It should look something like `allianceauth-signal-pings==0.0.7`. Every entry in this file should be on a separate line +1. In `docker-compose.yml`, comment out the `image` line under `allianceauth` (line 36... ish) and uncomment the `build` section +1. Now run `docker-compose --env-file=.env up -d`, your custom container will be built, and auth will have your new packages. Make sure to follow the package's instructions on config values that go in `local.py` + +_NOTE: It is recommended that you put any secret values (API keys, database credentials, etc) in an environment variable instead of hardcoding them into `local.py`. This gives you the ability to track your config in git without committing passwords. To do this, just add it to your `.env` file, and then reference in `local.py` with `os.environ.get("SECRET_NAME")`_ + +## Updating Auth + +### Base Image +Whether you're using a custom image or not, the version of auth is dictated by $AA_DOCKER_TAG in your `.env` file. +1. To update to a new version of auth, update the version number at the end (or replace the whole value with the tag in the release notes). +1. Next, run `docker-compose pull` +1. Finally, run `docker-compose --env-file=.env up -d` + +_NOTE: If you specify a version of allianceauth in your `requirements.txt` in a custom image it will override the version from the base image. Not recommended unless you know what you're doing_ + +### Custom Packages +1. Update the versions in your `requirements.txt` file +1. Run `docker-compose build` +1. Run `docker-compose --env-file=.env up -d` diff --git a/docker/conf/local.py b/docker/conf/local.py new file mode 100644 index 00000000..1b2d7cc8 --- /dev/null +++ b/docker/conf/local.py @@ -0,0 +1,81 @@ +# Every setting in base.py can be overloaded by redefining it here. +from .base import * + +SECRET_KEY = os.environ.get("AA_SECRET_KEY") +SITE_NAME = os.environ.get("AA_SITENAME") +DEBUG = os.environ.get("AA_DEBUG", False) +DATABASES['default'] = { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': os.environ.get("AA_DB_NAME"), + 'USER': os.environ.get("AA_DB_USER"), + 'PASSWORD': os.environ.get("AA_DB_PASSWORD"), + 'HOST': os.environ.get("AA_DB_HOST"), + 'PORT': os.environ.get("AA_DB_PORT", "3306"), +} + +# Register an application at https://developers.eveonline.com for Authentication +# & API Access and fill out these settings. Be sure to set the callback URL +# to https://example.com/sso/callback substituting your domain for example.com +# Logging in to auth requires the publicData scope (can be overridden through the +# LOGIN_TOKEN_SCOPES setting). Other apps may require more (see their docs). + +ESI_SSO_CLIENT_ID = os.environ.get("ESI_SSO_CLIENT_ID") +ESI_SSO_CLIENT_SECRET = os.environ.get("ESI_SSO_CLIENT_SECRET") +ESI_SSO_CALLBACK_URL = (f"{os.environ.get('PROTOCOL')}" + f"{os.environ.get('AUTH_SUBDOMAIN')}." + f"{os.environ.get('DOMAIN')}/sso/callback") +ESI_USER_CONTACT_EMAIL = os.environ.get("ESI_USER_CONTACT_EMAIL") # A server maintainer that CCP can contact in case of issues. + +# By default emails are validated before new users can log in. +# It's recommended to use a free service like SparkPost or Elastic Email to send email. +# https://www.sparkpost.com/docs/integrations/django/ +# https://elasticemail.com/resources/settings/smtp-api/ +# Set the default from email to something like 'noreply@example.com' +# Email validation can be turned off by uncommenting the line below. This can break some services. +REGISTRATION_VERIFY_EMAIL = False +EMAIL_HOST = os.environ.get("AA_EMAIL_HOST", "") +EMAIL_PORT = os.environ.get("AA_EMAIL_PORT", 587) +EMAIL_HOST_USER = os.environ.get("AA_EMAIL_HOST_USER", "") +EMAIL_HOST_PASSWORD = os.environ.get("AA_EMAIL_HOST_PASSWORD", "") +EMAIL_USE_TLS = os.environ.get("AA_EMAIL_USE_TLS", True) +DEFAULT_FROM_EMAIL = os.environ.get("AA_DEFAULT_FROM_EMAIL", "") + +ROOT_URLCONF = 'myauth.urls' +WSGI_APPLICATION = 'myauth.wsgi.application' +STATIC_ROOT = "/var/www/myauth/static/" +BROKER_URL = F"redis://{os.environ.get('AA_REDIS', 'redis:6379')}/0" +CELERY_RESULT_BACKEND = F"redis://{os.environ.get('AA_REDIS', 'redis:6379')}/0" +CACHES = { + "default": { + "BACKEND": "redis_cache.RedisCache", + "LOCATION": os.environ.get('AA_REDIS', 'redis:6379'), + "OPTIONS": { + "DB": 1, + } + } +} + +# Add any additional apps to this list. +INSTALLED_APPS += [ +# https://allianceauth.readthedocs.io/en/latest/features/apps/index.html +# 'allianceauth.corputils', +# 'allianceauth.fleetactivitytracking', +# 'allianceauth.optimer', +# 'allianceauth.permissions_tool', +# 'allianceauth.srp', +# 'allianceauth.timerboard', + +# https://allianceauth.readthedocs.io/en/latest/features/services/index.html +# 'allianceauth.services.modules.discord', +# 'allianceauth.services.modules.discourse', +# 'allianceauth.services.modules.ips4', +# 'allianceauth.services.modules.openfire', +# 'allianceauth.services.modules.phpbb3', +# 'allianceauth.services.modules.smf', +# 'allianceauth.services.modules.teamspeak3', +# 'allianceauth.services.modules.xenforo', +] + +####################################### +# Add any custom settings below here. # +####################################### diff --git a/docker/conf/nginx.conf b/docker/conf/nginx.conf new file mode 100644 index 00000000..2069d9bf --- /dev/null +++ b/docker/conf/nginx.conf @@ -0,0 +1,20 @@ +server { + listen 80; + location = /favicon.ico { access_log off; log_not_found off; } + location /static { + alias /var/www/myauth/static; + autoindex off; + } + + location /robots.txt { + alias /var/www/myauth/static/robots.txt; + } + + location / { + proxy_pass http://allianceauth:8000; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_redirect off; + } +} diff --git a/docker/conf/requirements.txt b/docker/conf/requirements.txt new file mode 100644 index 00000000..e69de29b diff --git a/docker/conf/supervisord.conf b/docker/conf/supervisord.conf new file mode 100644 index 00000000..37f96fce --- /dev/null +++ b/docker/conf/supervisord.conf @@ -0,0 +1,56 @@ +[supervisord] +nodaemon=true +user=allianceauth + +[program:beat] +command=/opt/venv/bin/celery -A myauth beat +directory=/home/allianceauth/myauth +user=allianceauth +stdout_logfile=/dev/stdout +stderr_logfile=/dev/stderr +stdout_logfile_maxbytes=0 +stderr_logfile_maxbytes=0 +autostart=true +autorestart=true +startsecs=10 +priority=998 +stdout_events_enabled=true +stderr_events_enabled=true + +[program:worker] +command=/opt/venv/bin/celery -A myauth worker -l INFO --max-tasks-per-child=250 +directory=/home/allianceauth/myauth +user=allianceauth +stdout_logfile=/dev/stdout +stderr_logfile=/dev/stderr +stdout_logfile_maxbytes=0 +stderr_logfile_maxbytes=0 +numprocs=1 +autostart=true +autorestart=true +startsecs=10 +stopwaitsecs = 600 +killasgroup=true +priority=998 +stdout_events_enabled=true +stderr_events_enabled=true + +[program:gunicorn] +user=allianceauth +directory=/home/allianceauth/myauth +command=/opt/venv/bin/gunicorn myauth.wsgi --bind :8000 --workers=3 --timeout 120 +stdout_logfile=/dev/stdout +stderr_logfile=/dev/stderr +stdout_logfile_maxbytes=0 +stderr_logfile_maxbytes=0 +stdout_events_enabled=true +stderr_events_enabled=true +autostart=true +autorestart=true +stopsignal=INT + +[group:myauth] +programs=beat,worker,gunicorn +priority=999 + +[supervisorctl] diff --git a/docker/custom.dockerfile b/docker/custom.dockerfile new file mode 100644 index 00000000..be487117 --- /dev/null +++ b/docker/custom.dockerfile @@ -0,0 +1,8 @@ +ARG AA_DOCKER_TAG +FROM $AA_DOCKER_TAG + +RUN cd /home/allianceauth +COPY /conf/requirements.txt requirements.txt +RUN pip install -r requirements.txt +RUN python $AUTH_HOME/myauth/manage.py collectstatic --noinput +RUN allianceauth update myauth diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..405776b8 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,96 @@ +version: '3.8' + +services: + auth_mysql: + image: mysql:8.0 + command: [mysqld, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --default-authentication-plugin=mysql_native_password] + volumes: + - ./mysql-data:/var/lib/mysql + - ./setup.sql:/docker-entrypoint-initdb.d/setup.sql + environment: + - MYSQL_ROOT_PASSWORD=${AA_DB_ROOT_PASSWORD?err} + healthcheck: + test: ["CMD", "mysqladmin", "-uroot", "-proot", "-h", "localhost", "ping"] + interval: 5s + timeout: 10s + retries: 3 + restart: unless-stopped + + nginx: + image: nginx:1.21 + restart: always + volumes: + - ./conf/nginx.conf:/etc/nginx/conf.d/default.conf + - static-volume:/var/www/myauth/static + depends_on: + - allianceauth + + redis: + image: redis:6.2 + command: redis-server + restart: always + volumes: + - "redis-data:/data" + + allianceauth: + image: ${AA_DOCKER_TAG?err} + # build: + # context: . + # dockerfile: custom.dockerfile + # args: + # AA_DOCKER_TAG: ${AA_DOCKER_TAG?err} + restart: always + env_file: + - ./.env + volumes: + - ./conf/local.py:/home/allianceauth/myauth/myauth/settings/local.py + - ./templates:/home/allianceauth/myauth/myauth/templates/ + - ./conf/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf + - static-volume:/var/www/myauth/static + depends_on: + - redis + - auth_mysql + + grafana: + image: grafana/grafana:8.2 + restart: always + depends_on: + - auth_mysql + volumes: + - grafana-data:/var/lib/grafana + proxy: + image: 'jc21/nginx-proxy-manager:latest' + restart: always + ports: + - '${PROXY_HTTP_PORT:-80}:80' + - '${PROXY_DASH_PORT:-81}:81' + - '${PROXY_HTTPS_PORT:-443}:443' + environment: + DB_MYSQL_HOST: "proxy-db" + DB_MYSQL_PORT: 3306 + DB_MYSQL_USER: "npm" + DB_MYSQL_PASSWORD: "${PROXY_MYSQL_PASS?err}" + DB_MYSQL_NAME: "npm" + volumes: + - proxy-data:/data + - proxy-le:/etc/letsencrypt + proxy-db: + image: 'jc21/mariadb-aria:latest' + restart: always + environment: + MYSQL_ROOT_PASSWORD: "${PROXY_MYSQL_PASS_ROOT?err}" + MYSQL_DATABASE: 'npm' + MYSQL_USER: 'npm' + MYSQL_PASSWORD: "${PROXY_MYSQL_PASS?err}" + ports: + - 3306 + volumes: + - proxy-db:/var/lib/mysql + +volumes: + redis-data: + static-volume: + grafana-data: + proxy-data: + proxy-le: + proxy-db: diff --git a/docker/docs/images/grafana-host.png b/docker/docs/images/grafana-host.png new file mode 100644 index 0000000000000000000000000000000000000000..a93c6ec601c5f42e339da52023aaaf577784c707 GIT binary patch literal 87028 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 EFD9{YCIA2c literal 0 HcmV?d00001 diff --git a/docker/docs/images/nginx-host.png b/docker/docs/images/nginx-host.png new file mode 100644 index 0000000000000000000000000000000000000000..92d661bad0d0242a05cd0b1d9638afccab68da7c GIT binary patch literal 87577 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 z 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%0Dr*jWj$3aKI&a!bkl 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 literal 0 HcmV?d00001 diff --git a/docker/docs/images/proxy-manager-ssl.png b/docker/docs/images/proxy-manager-ssl.png new file mode 100644 index 0000000000000000000000000000000000000000..f311d2588d602975ab49b24186b990baaf63f048 GIT binary patch literal 31967 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 Date: Sun, 28 Nov 2021 14:48:49 +0000 Subject: [PATCH 14/19] Add blacklist for groups and ignore blacklisted roles in Discord service --- allianceauth/groupmanagement/admin.py | 59 +++++++++- .../migrations/0018_reservedgroupname.py | 24 ++++ allianceauth/groupmanagement/models.py | 46 +++++--- allianceauth/groupmanagement/signals.py | 22 ++++ .../groupmanagement/tests/test_admin.py | 108 +++++++++++++++++- .../groupmanagement/tests/test_models.py | 21 +++- .../groupmanagement/tests/test_signals.py | 21 ++++ .../groupmanagement/tests/test_views.py | 3 - .../modules/discord/discord_client/helpers.py | 41 ++++--- .../discord/discord_client/tests/__init__.py | 4 +- .../discord_client/tests/test_helpers.py | 20 +++- .../services/modules/discord/models.py | 37 +++--- .../modules/discord/tests/__init__.py | 1 + .../modules/discord/tests/test_models.py | 26 +++-- allianceauth_model.png | Bin 280473 -> 310621 bytes docs/features/core/groupmanagement.md | 73 ------------ docs/features/core/groups.md | 92 ++++++++++++++- docs/features/core/index.md | 1 - docs/features/services/discord.md | 24 +++- 19 files changed, 483 insertions(+), 140 deletions(-) create mode 100644 allianceauth/groupmanagement/migrations/0018_reservedgroupname.py delete mode 100644 docs/features/core/groupmanagement.md diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index 44750aab..0f38bfe7 100644 --- a/allianceauth/groupmanagement/admin.py +++ b/allianceauth/groupmanagement/admin.py @@ -1,14 +1,18 @@ +from django import forms from django.apps import apps from django.contrib.auth.models import Permission from django.contrib import admin from django.contrib.auth.models import Group as BaseGroup, User +from django.core.exceptions import ValidationError 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, \ post_delete, m2m_changed from django.dispatch import receiver +from django.utils.timezone import now +from django.utils.translation import gettext_lazy as _ -from .models import AuthGroup +from .models import AuthGroup, ReservedGroupName from .models import GroupRequest if 'eve_autogroups' in apps.app_configs: @@ -70,8 +74,7 @@ if _has_auto_groups: managedalliancegroup__isnull=True, managedcorpgroup__isnull=True ) - else: - return queryset + return queryset class HasLeaderFilter(admin.SimpleListFilter): @@ -90,11 +93,22 @@ class HasLeaderFilter(admin.SimpleListFilter): return queryset.filter(authgroup__group_leaders__isnull=False) elif value == 'no': return queryset.filter(authgroup__group_leaders__isnull=True) - else: - return queryset + return queryset + + +class GroupAdminForm(forms.ModelForm): + def clean_name(self): + my_name = self.cleaned_data['name'] + if ReservedGroupName.objects.filter(name__iexact=my_name).exists(): + raise ValidationError( + _("This name has been reserved and can not be used for groups."), + code='reserved_name' + ) + return my_name class GroupAdmin(admin.ModelAdmin): + form = GroupAdminForm list_select_related = ('authgroup',) ordering = ('name',) list_display = ( @@ -209,6 +223,41 @@ class GroupRequestAdmin(admin.ModelAdmin): _leave_request.boolean = True +class ReservedGroupNameAdminForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['created_by'].initial = self.current_user.username + self.fields['created_at'].initial = _("(auto)") + + created_by = forms.CharField(disabled=True) + created_at = forms.CharField(disabled=True) + + def clean_name(self): + my_name = self.cleaned_data['name'].lower() + if Group.objects.filter(name__iexact=my_name).exists(): + raise ValidationError( + _("There already exists a group with that name."), code='already_exists' + ) + return my_name + + def clean_created_at(self): + return now() + + +@admin.register(ReservedGroupName) +class ReservedGroupNameAdmin(admin.ModelAdmin): + form = ReservedGroupNameAdminForm + list_display = ("name", "created_by", "created_at") + + def get_form(self, request, *args, **kwargs): + form = super().get_form(request, *args, **kwargs) + form.current_user = request.user + return form + + def has_change_permission(self, *args, **kwargs) -> bool: + return False + + @receiver(pre_save, sender=Group) def redirect_pre_save(sender, signal=None, *args, **kwargs): pre_save.send(BaseGroup, *args, **kwargs) diff --git a/allianceauth/groupmanagement/migrations/0018_reservedgroupname.py b/allianceauth/groupmanagement/migrations/0018_reservedgroupname.py new file mode 100644 index 00000000..0349b9e2 --- /dev/null +++ b/allianceauth/groupmanagement/migrations/0018_reservedgroupname.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.9 on 2021-11-25 18:38 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('groupmanagement', '0017_improve_groups_documentation'), + ] + + operations = [ + migrations.CreateModel( + name='ReservedGroupName', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text='Name that can not be used for groups.', max_length=150, unique=True, verbose_name='name')), + ('reason', models.TextField(help_text='Reason why this name is reserved.', verbose_name='reason')), + ('created_by', models.CharField(help_text='Name of the user who created this entry.', max_length=255, verbose_name='created by')), + ('created_at', models.DateTimeField(default=django.utils.timezone.now, help_text='Date when this entry was created', verbose_name='created at')), + ], + ), + ] diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index c023c643..9befa8d0 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -4,8 +4,7 @@ from django.conf import settings from django.contrib.auth.models import Group from django.contrib.auth.models import User from django.db import models -from django.db.models.signals import post_save -from django.dispatch import receiver +from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ from allianceauth.authentication.models import State @@ -181,18 +180,35 @@ class AuthGroup(models.Model): ) -@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) +class ReservedGroupName(models.Model): + """Name that can not be used for groups. + This enables AA to ignore groups on other services (e.g. Discord) with that name. + """ + name = models.CharField( + _('name'), + max_length=150, + unique=True, + help_text=_("Name that can not be used for groups.") + ) + reason = models.TextField( + _('reason'), help_text=_("Reason why this name is reserved.") + ) + created_by = models.CharField( + _('created by'), + max_length=255, + help_text="Name of the user who created this entry." + ) + created_at = models.DateTimeField( + _('created at'), default=now, help_text=_("Date when this entry was created") + ) -@receiver(post_save, sender=Group) -def save_auth_group(sender, instance, **kwargs): - """ - Ensures AuthGroup model is saved automatically - """ - instance.authgroup.save() + def __str__(self) -> str: + return self.name + + def save(self, *args, **kwargs) -> None: + if Group.objects.filter(name__iexact=self.name).exists(): + raise RuntimeError( + f"Save failed. There already exists a group with the name: {self.name}." + ) + super().save(*args, **kwargs) diff --git a/allianceauth/groupmanagement/signals.py b/allianceauth/groupmanagement/signals.py index 99af3d5d..60bbeb80 100644 --- a/allianceauth/groupmanagement/signals.py +++ b/allianceauth/groupmanagement/signals.py @@ -1,11 +1,33 @@ import logging +from django.contrib.auth.models import Group +from django.db.models.signals import pre_save, post_save from django.dispatch import receiver + from allianceauth.authentication.signals import state_changed +from .models import AuthGroup, ReservedGroupName logger = logging.getLogger(__name__) +@receiver(pre_save, sender=Group) +def find_new_name_for_conflicting_groups(sender, instance, **kwargs): + """Find new name for a group which name is already reserved.""" + new_name = instance.name + num = 0 + while ReservedGroupName.objects.filter(name__iexact=new_name).exists(): + num += 1 + new_name = f"{instance.name}_{num}" + instance.name = new_name + + +@receiver(post_save, sender=Group) +def create_auth_group(sender, instance, created, **kwargs): + """Create the AuthGroup model when a group is created.""" + if created: + AuthGroup.objects.create(group=instance) + + @receiver(state_changed) def check_groups_on_state_change(sender, user, state, **kwargs): logger.debug( diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index 5b32ba10..02c5a848 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -10,9 +10,10 @@ from allianceauth.authentication.models import CharacterOwnership, State from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) - from ..admin import HasLeaderFilter, GroupAdmin, Group from . import get_admin_change_view_url +from ..models import ReservedGroupName + if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: _has_auto_groups = True @@ -396,3 +397,108 @@ class TestGroupAdmin(TestCase): c.login(username='superuser', password='secret') response = c.get(get_admin_change_view_url(self.group_1)) self.assertEqual(response.status_code, 200) + + def test_should_create_new_group(self): + # given + user = User.objects.create_superuser("bruce") + self.client.force_login(user) + # when + response = self.client.post( + "/admin/groupmanagement/group/add/", + data={ + "name": "new group", + "authgroup-TOTAL_FORMS": 1, + "authgroup-INITIAL_FORMS": 0, + "authgroup-MIN_NUM_FORMS": 0, + "authgroup-MAX_NUM_FORMS": 1, + } + ) + # then + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, "/admin/groupmanagement/group/") + self.assertTrue(Group.objects.filter(name="new group").exists()) + + def test_should_not_allow_creating_new_group_with_reserved_name(self): + # given + ReservedGroupName.objects.create( + name="new group", reason="dummy", created_by="bruce" + ) + user = User.objects.create_superuser("bruce") + self.client.force_login(user) + # when + response = self.client.post( + "/admin/groupmanagement/group/add/", + data={ + "name": "New group", + "authgroup-TOTAL_FORMS": 1, + "authgroup-INITIAL_FORMS": 0, + "authgroup-MIN_NUM_FORMS": 0, + "authgroup-MAX_NUM_FORMS": 1, + } + ) + # then + self.assertContains( + response, "This name has been reserved and can not be used for groups" + ) + self.assertFalse(Group.objects.filter(name="new group").exists()) + + def test_should_not_allow_changing_name_of_existing_group_to_reserved_name(self): + # given + ReservedGroupName.objects.create( + name="new group", reason="dummy", created_by="bruce" + ) + group = Group.objects.create(name="dummy") + user = User.objects.create_superuser("bruce") + self.client.force_login(user) + # when + response = self.client.post( + f"/admin/groupmanagement/group/{group.pk}/change/", + data={ + "name": "new group", + "authgroup-TOTAL_FORMS": 1, + "authgroup-INITIAL_FORMS": 0, + "authgroup-MIN_NUM_FORMS": 0, + "authgroup-MAX_NUM_FORMS": 1, + } + ) + # then + self.assertContains( + response, "This name has been reserved and can not be used for groups" + ) + self.assertFalse(Group.objects.filter(name="new group").exists()) + + +class TestReservedGroupNameAdmin(TestCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user = User.objects.create_superuser("bruce") + + def test_should_create_new_entry(self): + # given + self.client.force_login(self.user) + # when + response = self.client.post( + "/admin/groupmanagement/reservedgroupname/add/", + data={"name": "Test", "reason": "dummy"} + ) + # then + self.assertEqual(response.status_code, 302) + self.assertEqual(response.url, "/admin/groupmanagement/reservedgroupname/") + obj = ReservedGroupName.objects.get(name="test") + self.assertEqual(obj.name, "test") + self.assertEqual(obj.created_by, self.user.username) + self.assertTrue(obj.created_at) + + def test_should_not_allow_names_of_existing_groups(self): + # given + Group.objects.create(name="Already taken") + self.client.force_login(self.user) + # when + response = self.client.post( + "/admin/groupmanagement/reservedgroupname/add/", + data={"name": "already taken", "reason": "dummy"} + ) + # then + self.assertContains(response, "There already exists a group with that name") + self.assertFalse(ReservedGroupName.objects.filter(name="already taken").exists()) diff --git a/allianceauth/groupmanagement/tests/test_models.py b/allianceauth/groupmanagement/tests/test_models.py index b8179550..dcf9a1e2 100644 --- a/allianceauth/groupmanagement/tests/test_models.py +++ b/allianceauth/groupmanagement/tests/test_models.py @@ -5,7 +5,7 @@ from django.test import TestCase, override_settings from allianceauth.tests.auth_utils import AuthUtils -from ..models import GroupRequest, RequestLog +from ..models import GroupRequest, RequestLog, ReservedGroupName MODULE_PATH = "allianceauth.groupmanagement.models" @@ -284,3 +284,22 @@ class TestAuthGroupRequestApprovers(TestCase): leaders = child_group.authgroup.group_request_approvers() # then self.assertSetEqual(leaders, set()) + + +class TestReservedGroupName(TestCase): + def test_should_return_name(self): + # given + obj = ReservedGroupName(name="test", reason="abc", created_by="xxx") + # when + result = str(obj) + # then + self.assertEqual(result, "test") + + def test_should_not_allow_creating_reserved_name_for_existing_group(self): + # given + Group.objects.create(name="Dummy") + # when + with self.assertRaises(RuntimeError): + ReservedGroupName.objects.create( + name="dummy", reason="abc", created_by="xxx" + ) diff --git a/allianceauth/groupmanagement/tests/test_signals.py b/allianceauth/groupmanagement/tests/test_signals.py index e9e47f36..efa35dda 100644 --- a/allianceauth/groupmanagement/tests/test_signals.py +++ b/allianceauth/groupmanagement/tests/test_signals.py @@ -6,6 +6,27 @@ from allianceauth.eveonline.autogroups.models import AutogroupsConfig from allianceauth.tests.auth_utils import AuthUtils +from ..models import ReservedGroupName + + +class TestGroupSignals(TestCase): + def test_should_create_authgroup_when_group_is_created(self): + # when + group = Group.objects.create(name="test") + # then + self.assertEqual(group.authgroup.group, group) + + def test_should_rename_group_that_conflicts_with_reserved_name(self): + # given + ReservedGroupName.objects.create(name="test", reason="dummy", created_by="xyz") + ReservedGroupName.objects.create(name="test_1", reason="dummy", created_by="xyz") + # when + group = Group.objects.create(name="Test") + # then + self.assertNotEqual(group.name, "test") + self.assertNotEqual(group.name, "test_1") + + class TestCheckGroupsOnStateChange(TestCase): @classmethod diff --git a/allianceauth/groupmanagement/tests/test_views.py b/allianceauth/groupmanagement/tests/test_views.py index b90775e1..0c723ec9 100644 --- a/allianceauth/groupmanagement/tests/test_views.py +++ b/allianceauth/groupmanagement/tests/test_views.py @@ -1,10 +1,7 @@ -from unittest.mock import Mock, patch - from django.test import RequestFactory, TestCase from django.urls import reverse from allianceauth.tests.auth_utils import AuthUtils -from esi.models import Token from .. import views diff --git a/allianceauth/services/modules/discord/discord_client/helpers.py b/allianceauth/services/modules/discord/discord_client/helpers.py index 859b3d01..50e7b7dc 100644 --- a/allianceauth/services/modules/discord/discord_client/helpers.py +++ b/allianceauth/services/modules/discord/discord_client/helpers.py @@ -1,4 +1,5 @@ from copy import copy +from typing import Set, Iterable class DiscordRoles: @@ -39,7 +40,7 @@ class DiscordRoles: def __len__(self): return len(self._roles.keys()) - def has_roles(self, role_ids: set) -> bool: + def has_roles(self, role_ids: Set[int]) -> bool: """returns true if this objects contains all roles defined by given role_ids incl. managed roles """ @@ -47,13 +48,22 @@ class DiscordRoles: all_role_ids = self._roles.keys() return role_ids.issubset(all_role_ids) - def ids(self) -> set: + def ids(self) -> Set[int]: """return a set of all role IDs""" return set(self._roles.keys()) - def subset(self, role_ids: set = None, managed_only: bool = False) -> object: - """returns a new object containing the subset of roles as defined - by given role IDs and/or including managed roles only + def subset( + self, + role_ids: Iterable[int] = None, + managed_only: bool = False, + role_names: Iterable[str] = None + ) -> "DiscordRoles": + """returns a new object containing the subset of roles + + Args: + - role_ids: role ids must be in the provided list + - managed_only: roles must be managed + - role_names: role names must match provided list (not case sensitive) """ if role_ids is not None: role_ids = {int(id) for id in role_ids} @@ -74,15 +84,21 @@ class DiscordRoles: if role_id in role_ids and role['managed'] ]) - else: - return copy(self) + elif role_ids is None and managed_only is False and role_names is not None: + role_names = {self.sanitize_role_name(name).lower() for name in role_names} + return type(self)([ + role for role in self._roles.values() + if role["name"].lower() in role_names + ]) - def union(self, other: object) -> object: + return copy(self) + + def union(self, other: object) -> "DiscordRoles": """returns a new roles object that is the union of this roles object with other""" return type(self)(list(self) + list(other)) - def difference(self, other: object) -> object: + def difference(self, other: object) -> "DiscordRoles": """returns a new roles object that only contains the roles that exist in the current objects, but not in other """ @@ -94,11 +110,10 @@ class DiscordRoles: role_name = self.sanitize_role_name(role_name) if role_name in self._roles_by_name: return self._roles_by_name[role_name] - else: - return dict() + return dict() @classmethod - def create_from_matched_roles(cls, matched_roles: list) -> None: + def create_from_matched_roles(cls, matched_roles: list) -> "DiscordRoles": """returns a new object created from the given list of matches roles matches_roles must be a list of tuples in the form: (role, created) @@ -107,7 +122,7 @@ class DiscordRoles: return cls(raw_roles) @staticmethod - def _assert_valid_role(role: dict): + def _assert_valid_role(role: dict) -> None: if not isinstance(role, dict): raise TypeError('Roles must be of type dict: %s' % role) diff --git a/allianceauth/services/modules/discord/discord_client/tests/__init__.py b/allianceauth/services/modules/discord/discord_client/tests/__init__.py index 7ba14d17..48be4f00 100644 --- a/allianceauth/services/modules/discord/discord_client/tests/__init__.py +++ b/allianceauth/services/modules/discord/discord_client/tests/__init__.py @@ -6,7 +6,7 @@ TEST_BOT_TOKEN = 'abcdefhijlkmnopqastzvwxyz1234567890ABCDEFGHOJKLMNOPQRSTUVWXY' TEST_ROLE_ID = 654321012345678912 -def create_role(id: int, name: str, managed=False): +def create_role(id: int, name: str, managed=False) -> dict: return { 'id': int(id), 'name': str(name), @@ -21,8 +21,10 @@ def create_matched_role(role, created=False) -> tuple: ROLE_ALPHA = create_role(1, 'alpha') ROLE_BRAVO = create_role(2, 'bravo') ROLE_CHARLIE = create_role(3, 'charlie') +ROLE_CHARLIE_2 = create_role(4, 'Charlie') # Discord roles are case sensitive ROLE_MIKE = create_role(13, 'mike', True) + ALL_ROLES = [ROLE_ALPHA, ROLE_BRAVO, ROLE_CHARLIE, ROLE_MIKE] diff --git a/allianceauth/services/modules/discord/discord_client/tests/test_helpers.py b/allianceauth/services/modules/discord/discord_client/tests/test_helpers.py index e19140cf..6a65cca2 100644 --- a/allianceauth/services/modules/discord/discord_client/tests/test_helpers.py +++ b/allianceauth/services/modules/discord/discord_client/tests/test_helpers.py @@ -1,6 +1,14 @@ from unittest import TestCase -from . import ROLE_ALPHA, ROLE_BRAVO, ROLE_CHARLIE, ROLE_MIKE, ALL_ROLES, create_role +from . import ( + ROLE_ALPHA, + ROLE_BRAVO, + ROLE_CHARLIE, + ROLE_CHARLIE_2, + ROLE_MIKE, + ALL_ROLES, + create_role +) from .. import DiscordRoles @@ -143,6 +151,16 @@ class TestSubset(TestCase): expected = {1, 2, 3, 13} self.assertSetEqual(roles.ids(), expected) + def test_should_return_role_names_only(self): + # given + all_roles = DiscordRoles([ + ROLE_ALPHA, ROLE_BRAVO, ROLE_CHARLIE, ROLE_MIKE, ROLE_CHARLIE_2 + ]) + # when + roles = all_roles.subset(role_names={"bravo", "charlie"}) + # then + self.assertSetEqual(roles.ids(), {2, 3, 4}) + class TestHasRoles(TestCase): diff --git a/allianceauth/services/modules/discord/models.py b/allianceauth/services/modules/discord/models.py index 321cd183..33389845 100644 --- a/allianceauth/services/modules/discord/models.py +++ b/allianceauth/services/modules/discord/models.py @@ -6,11 +6,12 @@ from django.contrib.auth.models import User from django.db import models from django.utils.translation import gettext_lazy +from allianceauth.groupmanagement.models import ReservedGroupName from allianceauth.notifications import notify from . import __title__ from .app_settings import DISCORD_GUILD_ID -from .discord_client import DiscordApiBackoff, DiscordRoles +from .discord_client import DiscordApiBackoff, DiscordClient, DiscordRoles from .discord_client.helpers import match_or_create_roles_from_names from .managers import DiscordUserManager from .utils import LoggerAddTag @@ -109,11 +110,16 @@ class DiscordUser(models.Model): - False on error or raises exception """ client = DiscordUser.objects._bot_client() + member_roles = self._determine_member_roles(client) + if member_roles is None: + return None + return self._update_roles_if_needed(client, state_name, member_roles) + + def _determine_member_roles(self, client: DiscordClient) -> DiscordRoles: + """Determine the roles of the current member / user.""" member_info = client.guild_member(guild_id=DISCORD_GUILD_ID, user_id=self.uid) if member_info is None: - # User is no longer a member - return None - + return None # User is no longer a member guild_roles = DiscordRoles(client.guild_roles(guild_id=DISCORD_GUILD_ID)) logger.debug('Current guild roles: %s', guild_roles.ids()) if 'roles' in member_info: @@ -128,10 +134,13 @@ class DiscordUser(models.Model): set(member_info['roles']).difference(guild_roles.ids()) ) ) - member_roles = guild_roles.subset(member_info['roles']) - else: - raise RuntimeError('member_info from %s is not valid' % self.user) + return guild_roles.subset(member_info['roles']) + raise RuntimeError('member_info from %s is not valid' % self.user) + def _update_roles_if_needed( + self, client: DiscordClient, state_name: str, member_roles: DiscordRoles + ) -> bool: + """Update the roles of this member/user if needed.""" requested_roles = match_or_create_roles_from_names( client=client, guild_id=DISCORD_GUILD_ID, @@ -143,10 +152,13 @@ class DiscordUser(models.Model): 'Requested roles for user %s: %s', self.user, requested_roles.ids() ) logger.debug('Current roles user %s: %s', self.user, member_roles.ids()) + reserved_role_names = ReservedGroupName.objects.values_list("name", flat=True) + member_roles_reserved = member_roles.subset(role_names=reserved_role_names) member_roles_managed = member_roles.subset(managed_only=True) - if requested_roles != member_roles.difference(member_roles_managed): + member_roles_persistent = member_roles_managed.union(member_roles_reserved) + if requested_roles != member_roles.difference(member_roles_persistent): logger.debug('Need to update roles for user %s', self.user) - new_roles = requested_roles.union(member_roles_managed) + new_roles = requested_roles.union(member_roles_persistent) success = client.modify_guild_member( guild_id=DISCORD_GUILD_ID, user_id=self.uid, @@ -157,10 +169,8 @@ class DiscordUser(models.Model): else: logger.warning('Failed to update roles for %s', self.user) return success - - else: - logger.info('No need to update roles for user %s', self.user) - return True + logger.info('No need to update roles for user %s', self.user) + return True def update_username(self) -> bool: """Updates the username incl. the discriminator @@ -171,7 +181,6 @@ class DiscordUser(models.Model): - None if user is no longer a member of the Discord server - False on error or raises exception """ - client = DiscordUser.objects._bot_client() user_info = client.guild_member(guild_id=DISCORD_GUILD_ID, user_id=self.uid) if user_info is None: diff --git a/allianceauth/services/modules/discord/tests/__init__.py b/allianceauth/services/modules/discord/tests/__init__.py index aae30b3f..ab6023db 100644 --- a/allianceauth/services/modules/discord/tests/__init__.py +++ b/allianceauth/services/modules/discord/tests/__init__.py @@ -9,6 +9,7 @@ from ..discord_client.tests import ( # noqa ROLE_ALPHA, ROLE_BRAVO, ROLE_CHARLIE, + ROLE_CHARLIE_2, ROLE_MIKE, ALL_ROLES, create_user_info diff --git a/allianceauth/services/modules/discord/tests/test_models.py b/allianceauth/services/modules/discord/tests/test_models.py index 332b8cb3..bf23f573 100644 --- a/allianceauth/services/modules/discord/tests/test_models.py +++ b/allianceauth/services/modules/discord/tests/test_models.py @@ -5,6 +5,7 @@ from requests.exceptions import HTTPError from django.test import TestCase from allianceauth.tests.auth_utils import AuthUtils +from allianceauth.groupmanagement.models import ReservedGroupName from . import ( TEST_USER_NAME, @@ -15,7 +16,8 @@ from . import ( ROLE_ALPHA, ROLE_BRAVO, ROLE_CHARLIE, - ROLE_MIKE + ROLE_CHARLIE_2, + ROLE_MIKE, ) from ..discord_client import DiscordClient, DiscordApiBackoff from ..discord_client.tests import create_matched_role @@ -294,25 +296,33 @@ class TestUpdateGroups(TestCase): args, kwargs = mock_DiscordClient.return_value.modify_guild_member.call_args self.assertEqual(set(kwargs['role_ids']), {1, 2}) - def test_update_if_needed_and_preserve_managed_roles( + def test_should_update_and_preserve_managed_and_reserved_roles( self, mock_user_group_names, mock_DiscordClient ): - roles_current = [1, 13] + # given + roles_current = [1, 3, 4, 13] mock_user_group_names.return_value = [] mock_DiscordClient.return_value.match_or_create_roles_from_names\ .return_value = self.roles_requested - mock_DiscordClient.return_value.guild_roles.return_value = self.guild_roles - mock_DiscordClient.return_value.guild_member.return_value = \ - {'roles': roles_current} + mock_DiscordClient.return_value.guild_roles.return_value = [ + ROLE_ALPHA, ROLE_BRAVO, ROLE_CHARLIE, ROLE_MIKE, ROLE_CHARLIE_2 + ] + mock_DiscordClient.return_value.guild_member.return_value = { + 'roles': roles_current + } mock_DiscordClient.return_value.modify_guild_member.return_value = True - + ReservedGroupName.objects.create( + name="charlie", reason="dummy", created_by="xyz" + ) + # when result = self.discord_user.update_groups() + # then self.assertTrue(result) self.assertTrue(mock_DiscordClient.return_value.modify_guild_member.called) args, kwargs = mock_DiscordClient.return_value.modify_guild_member.call_args - self.assertEqual(set(kwargs['role_ids']), {1, 2, 13}) + self.assertEqual(set(kwargs['role_ids']), {1, 2, 3, 4, 13}) def test_dont_update_if_not_needed( self, diff --git a/allianceauth_model.png b/allianceauth_model.png index 09b93574357068f678b8cd6b33c8fce50be0d84a..e3fa337fab52e27d166c13181fd9a7fcf9bcee4a 100644 GIT binary patch literal 310621 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