Compare commits

..

No commits in common. "master" and "v4.11.0" have entirely different histories.

20 changed files with 104 additions and 213 deletions

View File

@ -25,7 +25,7 @@ before_script:
pre-commit-check: pre-commit-check:
<<: *only-default <<: *only-default
stage: pre-commit stage: pre-commit
image: python:3.11-trixie image: python:3.11-bookworm
# variables: # variables:
# PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit # PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
# cache: # cache:
@ -65,7 +65,7 @@ test-3.8-core:
test-3.9-core: test-3.9-core:
<<: *only-default <<: *only-default
image: python:3.9-trixie image: python:3.9-bookworm
script: script:
- tox -e py39-core - tox -e py39-core
artifacts: artifacts:
@ -77,7 +77,7 @@ test-3.9-core:
test-3.10-core: test-3.10-core:
<<: *only-default <<: *only-default
image: python:3.10-trixie image: python:3.10-bookworm
script: script:
- tox -e py310-core - tox -e py310-core
artifacts: artifacts:
@ -89,7 +89,7 @@ test-3.10-core:
test-3.11-core: test-3.11-core:
<<: *only-default <<: *only-default
image: python:3.11-trixie image: python:3.11-bookworm
script: script:
- tox -e py311-core - tox -e py311-core
artifacts: artifacts:
@ -101,7 +101,7 @@ test-3.11-core:
test-3.12-core: test-3.12-core:
<<: *only-default <<: *only-default
image: python:3.12-trixie image: python:3.12-bookworm
script: script:
- tox -e py312-core - tox -e py312-core
artifacts: artifacts:
@ -125,7 +125,7 @@ test-3.8-all:
test-3.9-all: test-3.9-all:
<<: *only-default <<: *only-default
image: python:3.9-trixie image: python:3.9-bookworm
script: script:
- tox -e py39-all - tox -e py39-all
artifacts: artifacts:
@ -137,7 +137,7 @@ test-3.9-all:
test-3.10-all: test-3.10-all:
<<: *only-default <<: *only-default
image: python:3.10-trixie image: python:3.10-bookworm
script: script:
- tox -e py310-all - tox -e py310-all
artifacts: artifacts:
@ -149,7 +149,7 @@ test-3.10-all:
test-3.11-all: test-3.11-all:
<<: *only-default <<: *only-default
image: python:3.11-trixie image: python:3.11-bookworm
script: script:
- tox -e py311-all - tox -e py311-all
artifacts: artifacts:
@ -162,7 +162,7 @@ test-3.11-all:
test-3.12-all: test-3.12-all:
<<: *only-default <<: *only-default
image: python:3.12-trixie image: python:3.12-bookworm
script: script:
- tox -e py312-all - tox -e py312-all
artifacts: artifacts:
@ -174,7 +174,7 @@ test-3.12-all:
build-test: build-test:
stage: test stage: test
image: python:3.11-trixie image: python:3.11-bookworm
before_script: before_script:
- python -m pip install --upgrade pip - python -m pip install --upgrade pip
@ -193,13 +193,13 @@ build-test:
test-docs: test-docs:
<<: *only-default <<: *only-default
image: python:3.11-trixie image: python:3.11-bookworm
script: script:
- tox -e docs - tox -e docs
deploy_production: deploy_production:
stage: deploy stage: deploy
image: python:3.11-trixie image: python:3.11-bookworm
before_script: before_script:
- python -m pip install --upgrade pip - python -m pip install --upgrade pip

View File

@ -25,12 +25,12 @@ exclude: |
repos: repos:
# Code Upgrades # Code Upgrades
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: v3.21.1 rev: v3.21.0
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: [--py38-plus] args: [--py38-plus]
- repo: https://github.com/adamchainz/django-upgrade - repo: https://github.com/adamchainz/django-upgrade
rev: 1.29.1 rev: 1.29.0
hooks: hooks:
- id: django-upgrade - id: django-upgrade
args: [--target-version=4.2] args: [--target-version=4.2]
@ -64,7 +64,7 @@ repos:
- id: check-executables-have-shebangs - id: check-executables-have-shebangs
- id: end-of-file-fixer - id: end-of-file-fixer
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python - repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 3.4.1 rev: 3.4.0
hooks: hooks:
- id: editorconfig-checker - id: editorconfig-checker
- repo: https://github.com/igorshubovych/markdownlint-cli - repo: https://github.com/igorshubovych/markdownlint-cli
@ -76,7 +76,7 @@ repos:
- --disable=MD013 - --disable=MD013
# Infrastructure # Infrastructure
- repo: https://github.com/tox-dev/pyproject-fmt - repo: https://github.com/tox-dev/pyproject-fmt
rev: v2.11.1 rev: v2.11.0
hooks: hooks:
- id: pyproject-fmt - id: pyproject-fmt
name: pyproject.toml formatter name: pyproject.toml formatter
@ -84,7 +84,7 @@ repos:
args: args:
- --indent=4 - --indent=4
additional_dependencies: additional_dependencies:
- tox==4.32.0 # https://github.com/tox-dev/tox/releases/latest - tox==4.31.0 # https://github.com/tox-dev/tox/releases/latest
- repo: https://github.com/abravalheri/validate-pyproject - repo: https://github.com/abravalheri/validate-pyproject
rev: v0.24.1 rev: v0.24.1
hooks: hooks:

View File

@ -5,7 +5,7 @@ manage online service access.
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.
__version__ = '4.11.2' __version__ = '4.11.0'
__title__ = 'Alliance Auth' __title__ = 'Alliance Auth'
__title_useragent__ = 'AllianceAuth' __title_useragent__ = 'AllianceAuth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth' __url__ = 'https://gitlab.com/allianceauth/allianceauth'

View File

@ -727,8 +727,7 @@ class TestEveSwaggerProvider(TestCase):
my_provider = EveSwaggerProvider() my_provider = EveSwaggerProvider()
my_client = my_provider.client my_client = my_provider.client
operation = my_client.Universe.get_universe_factions() operation = my_client.Universe.get_universe_factions()
expected_variants = { self.assertEqual(
f'AllianceAuth/{aa_version} (dummy@example.net; +{aa_url}) DjangoEsi/{esi_version} (+{esi_url})', # Django-ESI 8.0.0 operation.future.request.headers['User-Agent'],
f'AllianceAuth/{aa_version} (dummy@example.net; +{aa_url}) Django-ESI/{esi_version} (+{esi_url})' # Django-ESI 7.x, Py38 Py39 f'AllianceAuth/{aa_version} (dummy@example.net; +{aa_url}) Django-ESI/{esi_version} (+{esi_url})'
} )
self.assertIn(operation.future.request.headers['User-Agent'], expected_variants)

View File

@ -320,8 +320,8 @@ def click_fatlink_view(request, token, fat_hash=None):
messages.warning( messages.warning(
request, request,
_( _(
"Cannot register the fleet participation for {character_name}. The character needs to be online." f"Cannot register the fleet participation for {character.character_name}. The character needs to be online."
).format(character_name=character.character_name) ),
) )
return redirect('fatlink:view') return redirect('fatlink:view')

View File

@ -47,12 +47,6 @@
/* Side Navigation /* Side Navigation
------------------------------------------------------------------------------------- */ ------------------------------------------------------------------------------------- */
@media all { @media all {
.sidemenu-total-notifications-badge {
position: absolute;
left: 28px;
font-size: 42.5% !important;
}
#sidebar > div { #sidebar > div {
width: 325px; width: 325px;
} }

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-13 10:19+1000\n" "POT-Creation-Date: 2025-09-21 13:44+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -57,7 +57,7 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:105 #: allianceauth/project_template/project_name/settings/base.py:104
msgid "English" msgid "English"
msgstr "" msgstr ""
@ -66,57 +66,57 @@ msgid "Czech"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:74 #: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:107 #: allianceauth/project_template/project_name/settings/base.py:106
msgid "German" msgid "German"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:75 #: allianceauth/authentication/models.py:75
#: allianceauth/project_template/project_name/settings/base.py:108 #: allianceauth/project_template/project_name/settings/base.py:107
msgid "Spanish" msgid "Spanish"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:76 #: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:109 #: allianceauth/project_template/project_name/settings/base.py:108
msgid "Italian" msgid "Italian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:77 #: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:110 #: allianceauth/project_template/project_name/settings/base.py:109
msgid "Japanese" msgid "Japanese"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:78 #: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:111 #: allianceauth/project_template/project_name/settings/base.py:110
msgid "Korean" msgid "Korean"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:112 #: allianceauth/project_template/project_name/settings/base.py:111
msgid "French" msgid "French"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:115 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Russian" msgid "Russian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:112
msgid "Dutch" msgid "Dutch"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Polish" msgid "Polish"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:83 #: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:115
msgid "Ukrainian" msgid "Ukrainian"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:84 #: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:117 #: allianceauth/project_template/project_name/settings/base.py:116
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "" msgstr ""
@ -125,30 +125,22 @@ msgstr ""
msgid "Language" msgid "Language"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:106 #: allianceauth/authentication/models.py:105
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:110 #: allianceauth/authentication/models.py:109
#: allianceauth/theme/templates/theme/theme_select.html:4 #: allianceauth/theme/templates/theme/theme_select.html:4
msgid "Theme" msgid "Theme"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:117 #: allianceauth/authentication/models.py:126
msgid "Minimize Sidebar Menu"
msgstr ""
#: allianceauth/authentication/models.py:119
msgid "Keep the sidebar menu minimized"
msgstr ""
#: allianceauth/authentication/models.py:133
#, python-format #, python-format
msgid "State changed to: %s" msgid "State changed to: %s"
msgstr "" msgstr ""
#: allianceauth/authentication/models.py:134 #: allianceauth/authentication/models.py:127
#, python-format #, python-format
msgid "Your user's state is now: %(state)s" msgid "Your user's state is now: %(state)s"
msgstr "" msgstr ""
@ -208,8 +200,8 @@ msgstr ""
#: allianceauth/authentication/templates/authentication/tokens.html:7 #: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:11 #: allianceauth/authentication/templates/authentication/tokens.html:11
#: allianceauth/menu/templates/menu/menu-user.html:158 #: allianceauth/menu/templates/menu/menu-user.html:133
#: allianceauth/menu/templates/menu/menu-user.html:161 #: allianceauth/menu/templates/menu/menu-user.html:136
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management" msgid "Token Management"
msgstr "" msgstr ""
@ -755,8 +747,8 @@ msgstr ""
#: allianceauth/fleetactivitytracking/views.py:323 #: allianceauth/fleetactivitytracking/views.py:323
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"Cannot register the fleet participation for {character_name}. The character " "Cannot register the fleet participation for {character.character_name}. The "
"needs to be online." "character needs to be online."
msgstr "" msgstr ""
#: allianceauth/framework/apps.py:16 #: allianceauth/framework/apps.py:16
@ -1494,45 +1486,37 @@ msgid "Notifications"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:77 #: allianceauth/menu/templates/menu/menu-user.html:77
msgid "Sidebar"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:93
msgid "Minimize Sidebar"
msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:102
msgid "Super User" msgid "Super User"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:108 #: allianceauth/menu/templates/menu/menu-user.html:83
#: allianceauth/menu/templates/menu/menu-user.html:111 #: allianceauth/menu/templates/menu/menu-user.html:86
msgid "Alliance Auth Documentation" msgid "Alliance Auth Documentation"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:119 #: allianceauth/menu/templates/menu/menu-user.html:94
#: allianceauth/menu/templates/menu/menu-user.html:122 #: allianceauth/menu/templates/menu/menu-user.html:97
msgid "Alliance Auth Discord" msgid "Alliance Auth Discord"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:130 #: allianceauth/menu/templates/menu/menu-user.html:105
#: allianceauth/menu/templates/menu/menu-user.html:133 #: allianceauth/menu/templates/menu/menu-user.html:108
msgid "Alliance Auth Git" msgid "Alliance Auth Git"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:143 #: allianceauth/menu/templates/menu/menu-user.html:118
#: allianceauth/menu/templates/menu/menu-user.html:146 #: allianceauth/menu/templates/menu/menu-user.html:121
#: allianceauth/templates/allianceauth/top-menu-admin.html:9 #: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin" msgid "Admin"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:169 #: allianceauth/menu/templates/menu/menu-user.html:144
#: allianceauth/menu/templates/menu/menu-user.html:172 #: allianceauth/menu/templates/menu/menu-user.html:147
msgid "Sign Out" msgid "Sign Out"
msgstr "" msgstr ""
#: allianceauth/menu/templates/menu/menu-user.html:180 #: allianceauth/menu/templates/menu/menu-user.html:155
#: allianceauth/menu/templates/menu/menu-user.html:183 #: allianceauth/menu/templates/menu/menu-user.html:158
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:13 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:13
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:14 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:14
msgid "Sign In" msgid "Sign In"
@ -1793,9 +1777,9 @@ msgstr ""
msgid "That service account already exists" msgid "That service account already exists"
msgstr "" msgstr ""
#: allianceauth/services/abstract.py:105 #: allianceauth/services/abstract.py:103
#, python-brace-format #, python-brace-format
msgid "Successfully set your {service_name} password" msgid "Successfully set your {self.service_name} password"
msgstr "" msgstr ""
#: allianceauth/services/apps.py:8 allianceauth/services/auth_hooks.py:12 #: allianceauth/services/apps.py:8 allianceauth/services/auth_hooks.py:12
@ -2334,11 +2318,11 @@ msgstr ""
msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org" msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:49 #: allianceauth/srp/form.py:46
msgid "Invalid Link. Please post a direct link to a killmail." msgid "Invalid Link. Please post a direct link to a killmail."
msgstr "" msgstr ""
#: allianceauth/srp/form.py:56 #: allianceauth/srp/form.py:53
msgid "After Action Report Link" msgid "After Action Report Link"
msgstr "" msgstr ""
@ -2612,7 +2596,7 @@ msgstr ""
msgid "Saved changes to SRP fleet %(fleetname)s" msgid "Saved changes to SRP fleet %(fleetname)s"
msgstr "" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/esi_check.html:5 #: allianceauth/templates/allianceauth/admin-status/esi_check.html:4
msgid "Your Server received an ESI error response code of " msgid "Your Server received an ESI error response code of "
msgstr "" msgstr ""
@ -3017,36 +3001,36 @@ msgstr ""
msgid "Saved changes to the timer." msgid "Saved changes to the timer."
msgstr "" msgstr ""
#: allianceauth/views.py:78 #: allianceauth/views.py:55
msgid "Bad Request" msgid "Bad Request"
msgstr "" msgstr ""
#: allianceauth/views.py:80 allianceauth/views.py:110 #: allianceauth/views.py:57 allianceauth/views.py:87
msgid "" msgid ""
"Auth encountered an error processing your request, please try again. If the " "Auth encountered an error processing your request, please try again. If the "
"error persists, please contact the administrators." "error persists, please contact the administrators."
msgstr "" msgstr ""
#: allianceauth/views.py:88 #: allianceauth/views.py:65
msgid "Permission Denied" msgid "Permission Denied"
msgstr "" msgstr ""
#: allianceauth/views.py:90 #: allianceauth/views.py:67
msgid "" msgid ""
"You do not have permission to access the requested page. If you believe this " "You do not have permission to access the requested page. If you believe this "
"is in error please contact the administrators." "is in error please contact the administrators."
msgstr "" msgstr ""
#: allianceauth/views.py:98 #: allianceauth/views.py:75
msgid "Page Not Found" msgid "Page Not Found"
msgstr "" msgstr ""
#: allianceauth/views.py:100 #: allianceauth/views.py:77
msgid "" msgid ""
"Page does not exist. If you believe this is in error please contact the " "Page does not exist. If you believe this is in error please contact the "
"administrators. " "administrators. "
msgstr "" msgstr ""
#: allianceauth/views.py:108 #: allianceauth/views.py:85
msgid "Internal Server Error" msgid "Internal Server Error"
msgstr "" msgstr ""

View File

@ -1,4 +1,4 @@
from __future__ import annotations # Still needed for Python 3.8, replaced with better implementations in Py39+ from __future__ import annotations
import logging import logging
from typing import TYPE_CHECKING from typing import TYPE_CHECKING

View File

@ -11,10 +11,10 @@ environment =
[program:beat] [program:beat]
command = %(ENV_AA_COMMAND_CELERY)s command = %(ENV_AA_COMMAND_CELERY)s
-A %(ENV_AA_PROJECT_NAME)s beat -A %(ENV_AA_PROJECT_NAME)s beat
directory = %(ENV_AA_PROJECT_DIRECTORY)s directory = %(ENV_AA_VENV_DIRECTORY)s
user = %(ENV_AA_USER)s user = %(ENV_AA_USER)s
stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log
stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log
autostart = true autostart = true
autorestart = true autorestart = true
startsecs = 10 startsecs = 10
@ -26,12 +26,12 @@ command = %(ENV_AA_COMMAND_CELERY)s
--pool=threads --pool=threads
--concurrency=5 --concurrency=5
-n %(program_name)s_%(process_num)02d -n %(program_name)s_%(process_num)02d
directory = %(ENV_AA_PROJECT_DIRECTORY)s directory = %(ENV_AA_VENV_DIRECTORY)s
user = %(ENV_AA_USER)s user = %(ENV_AA_USER)s
numprocs = 1 numprocs = 1
process_name = %(program_name)s_%(process_num)02d process_name = %(program_name)s_%(process_num)02d
stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log
stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log
autostart = true autostart = true
autorestart = true autorestart = true
startsecs = 10 startsecs = 10
@ -42,12 +42,12 @@ priority = 998
{% if gunicorn %} {% if gunicorn %}
[program:gunicorn] [program:gunicorn]
user = %(ENV_AA_USER)s user = %(ENV_AA_USER)s
directory = %(ENV_AA_PROJECT_DIRECTORY)s directory = %(ENV_AA_VENV_DIRECTORY)s
command = %(ENV_AA_COMMAND_GUNICORN)s %(ENV_AA_PROJECT_NAME)s.wsgi command = %(ENV_AA_COMMAND_GUNICORN)s %(ENV_AA_PROJECT_NAME)s.wsgi
--workers=3 --workers=3
--timeout 120 --timeout 120
stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log
stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/%(program_name)s.log stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/%(program_name)s.log
autostart = true autostart = true
autorestart = true autorestart = true
stopsignal = INT stopsignal = INT
@ -57,10 +57,10 @@ stopsignal = INT
command = %(ENV_AA_COMMAND_MEMMON)s command = %(ENV_AA_COMMAND_MEMMON)s
-p worker_00=256MB -p worker_00=256MB
-p gunicorn=256MB -p gunicorn=256MB
directory = %(ENV_AA_PROJECT_DIRECTORY)s directory = %(ENV_AA_VENV_DIRECTORY)s
events = TICK_60 events = TICK_60
stdout_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/memmon.log stdout_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/memmon.log
stderr_logfile = %(ENV_AA_PROJECT_DIRECTORY)s/log/memmon.log stderr_logfile = %(ENV_AA_VENV_DIRECTORY)s/log/memmon.log
[group:{{ project_name }}] [group:{{ project_name }}]
programs = beat,worker{% if gunicorn %},gunicorn{% endif %} programs = beat,worker{% if gunicorn %},gunicorn{% endif %}

View File

@ -100,10 +100,7 @@ class BaseSetPasswordServiceAccountView(ServicesCRUDMixin, BaseServiceView, Upda
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
result = super().post(request, *args, **kwargs) result = super().post(request, *args, **kwargs)
if self.get_form().is_valid(): if self.get_form().is_valid():
messages.success( messages.success(request, _(f"Successfully set your {self.service_name} password"))
request,
_("Successfully set your {service_name} password").format(service_name=self.service_name)
)
return result return result

View File

@ -111,11 +111,11 @@ class Teamspeak3Manager:
outlist = {} outlist = {}
if type(groups) == list: if type(groups) == list:
logger.debug("Received multiple groups. Iterating.") logger.debug("Recieved multiple groups. Iterating.")
for group in groups: for group in groups:
outlist[group['keys']['name']] = group['keys']['sgid'] outlist[group['keys']['name']] = group['keys']['sgid']
elif type(groups) == dict: elif type(groups) == dict:
logger.debug("Received single group.") logger.debug("Recieved single group.")
outlist[groups['keys']['name']] = groups['keys']['sgid'] outlist[groups['keys']['name']] = groups['keys']['sgid']
logger.debug("Returning name/id pairing: %s" % outlist) logger.debug("Returning name/id pairing: %s" % outlist)
return outlist return outlist

View File

@ -34,9 +34,6 @@ class SrpFleetUserRequestForm(forms.Form):
_("Invalid Link. Please use zkillboard.com or kb.evetools.org") _("Invalid Link. Please use zkillboard.com or kb.evetools.org")
) )
if re.match(r"^http[s]?:\/\/zkillboard\.com\/", data) and not data.endswith("/"):
data += "/"
# Check if it's an actual kill mail # Check if it's an actual kill mail
if not any( if not any(
re.match(regex, data) re.match(regex, data)

View File

@ -1,27 +0,0 @@
from django.test import TestCase
from allianceauth.srp.form import SrpFleetUserRequestForm
class TestForms(TestCase):
def test_allow_missing_trailing_slash_zkillboard(self):
form = SrpFleetUserRequestForm(
data = {
"killboard_link": "https://zkillboard.com/kill/130429493",
"additional_info": "Details",
}
)
form.cleaned_data = {"killboard_link": "https://zkillboard.com/kill/130429493"}
self.assertEqual("https://zkillboard.com/kill/130429493/", form.clean_killboard_link())
def test_not_add_trailling_slash_kb_evetools(self):
form = SrpFleetUserRequestForm(
data = {
"killboard_link": "https://kb.evetools.org/kill/130429493",
}
)
form.cleaned_data = {"killboard_link": "https://kb.evetools.org/kill/130429493"}
self.assertEqual("https://kb.evetools.org/kill/130429493", form.clean_killboard_link())

View File

@ -0,0 +1,13 @@
$(document).ready(() => {
'use strict';
const activeChildMenuItem = document.querySelector('ul#sidebar-menu ul.collapse a.active');
if (activeChildMenuItem) {
const activeChildMenuUl = activeChildMenuItem.closest('ul');
activeChildMenuUl.classList.add('show');
document.querySelectorAll(`[data-bs-target^="#${activeChildMenuUl.id}"]`)
.forEach(element => element.setAttribute('aria-expanded', true));
}
});

View File

@ -1,57 +0,0 @@
$(document).ready(() => {
'use strict';
/**
* Collect all badges in the sidebar menu that are not part of a collapsible submenu, and calculate the total notification count.
* Show a total notification badge in the navbar if there are any notifications.
*/
const totalNotificationsBadge = () => {
const badges = [];
let notificationCount = 0;
document.querySelectorAll('#sidebar-menu .badge').forEach(b => {
const li = b.closest('li');
if (!li || !li.querySelector('ul.collapse')) {
badges.push(b);
notificationCount += parseInt(b.textContent);
}
});
if (badges.length > 0 && notificationCount > 0) {
const notificationBadge = document.createElement('span');
notificationBadge.classList.add(
'badge',
'text-bg-danger',
'align-self-center',
'sidemenu-notification-badge',
'sidemenu-total-notifications-badge'
);
notificationBadge.textContent = String(notificationCount);
document.querySelector('a.navbar-brand i.fa-solid').prepend(notificationBadge);
}
};
/**
* Find the active child menu item in the sidebar menu, if any, and ensure its parent submenu is expanded.
*/
const expandChildMenu = () => {
const activeChildMenuItem = document.querySelector('ul#sidebar-menu ul.collapse a.active');
if (activeChildMenuItem) {
const activeChildMenuUl = activeChildMenuItem.closest('ul');
activeChildMenuUl.classList.add('show');
document.querySelectorAll(`[data-bs-target^="#${activeChildMenuUl.id}"]`)
.forEach(element => element.setAttribute('aria-expanded', 'true'));
}
};
// Execute functions on document ready
[
totalNotificationsBadge,
expandChildMenu
].forEach(fn => fn());
});

View File

@ -1,3 +1,3 @@
{% load sri %} {% load sri %}
{% sri_static 'allianceauth/js/sidebar.js' %} {% sri_static 'allianceauth/js/sidebar-collapse.js' %}

View File

@ -1,11 +0,0 @@
{# Template override to display the errors of django Forms when using `boostrap_form` form the `django-bootstrap5` #}
{# library. #}
{# See: https://github.com/zostera/django-bootstrap5/pull/767 #}
{% if field_errors %}
<div id="{{ field.auto_id }}_error" class="invalid-feedback">
{% for text in field_errors %}
<div>{{ text }}</div>
{% endfor %}
</div>
{% endif %}

View File

@ -1,7 +1,7 @@
PROTOCOL=https:// PROTOCOL=https://
AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN% AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN%
DOMAIN=%DOMAIN% DOMAIN=%DOMAIN%
AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.11.2 AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.11.0
# Nginx Proxy Manager # Nginx Proxy Manager
PROXY_HTTP_PORT=80 PROXY_HTTP_PORT=80

View File

@ -1,5 +1,5 @@
FROM python:3.11-slim FROM python:3.11-slim
ARG AUTH_VERSION=v4.11.2 ARG AUTH_VERSION=v4.11.0
ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION} ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION}
ENV AUTH_USER=allianceauth ENV AUTH_USER=allianceauth
ENV AUTH_GROUP=allianceauth ENV AUTH_GROUP=allianceauth

View File

@ -15,7 +15,7 @@ license = { file = "LICENSE" }
authors = [ authors = [
{ name = "Alliance Auth", email = "adarnof@gmail.com" }, { name = "Alliance Auth", email = "adarnof@gmail.com" },
] ]
requires-python = ">=3.8,<3.13" requires-python = ">=3.8"
classifiers = [ classifiers = [
"Environment :: Web Environment", "Environment :: Web Environment",
"Framework :: Celery", "Framework :: Celery",
@ -31,6 +31,8 @@ classifiers = [
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP",
"Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
] ]