mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-09 04:20:17 +02:00
Merge branch 'master' of gitlab.com:allianceauth/allianceauth into v5.x
This commit is contained in:
commit
2bd5ff8723
@ -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-bullseye
|
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:
|
||||||
@ -53,7 +53,7 @@ secret_detection:
|
|||||||
|
|
||||||
test-3.10-core:
|
test-3.10-core:
|
||||||
<<: *only-default
|
<<: *only-default
|
||||||
image: python:3.10-bullseye
|
image: python:3.10-bookworm
|
||||||
script:
|
script:
|
||||||
- tox -e py310-core
|
- tox -e py310-core
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -65,7 +65,7 @@ test-3.10-core:
|
|||||||
|
|
||||||
test-3.11-core:
|
test-3.11-core:
|
||||||
<<: *only-default
|
<<: *only-default
|
||||||
image: python:3.11-bullseye
|
image: python:3.11-bookworm
|
||||||
script:
|
script:
|
||||||
- tox -e py311-core
|
- tox -e py311-core
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -77,7 +77,7 @@ test-3.11-core:
|
|||||||
|
|
||||||
test-3.12-core:
|
test-3.12-core:
|
||||||
<<: *only-default
|
<<: *only-default
|
||||||
image: python:3.12-bullseye
|
image: python:3.12-bookworm
|
||||||
script:
|
script:
|
||||||
- tox -e py312-core
|
- tox -e py312-core
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -89,7 +89,7 @@ test-3.12-core:
|
|||||||
|
|
||||||
test-3.10-all:
|
test-3.10-all:
|
||||||
<<: *only-default
|
<<: *only-default
|
||||||
image: python:3.10-bullseye
|
image: python:3.10-bookworm
|
||||||
script:
|
script:
|
||||||
- tox -e py310-all
|
- tox -e py310-all
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -101,7 +101,7 @@ test-3.10-all:
|
|||||||
|
|
||||||
test-3.11-all:
|
test-3.11-all:
|
||||||
<<: *only-default
|
<<: *only-default
|
||||||
image: python:3.11-bullseye
|
image: python:3.11-bookworm
|
||||||
script:
|
script:
|
||||||
- tox -e py311-all
|
- tox -e py311-all
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -114,7 +114,7 @@ test-3.11-all:
|
|||||||
|
|
||||||
test-3.12-all:
|
test-3.12-all:
|
||||||
<<: *only-default
|
<<: *only-default
|
||||||
image: python:3.12-bullseye
|
image: python:3.12-bookworm
|
||||||
script:
|
script:
|
||||||
- tox -e py312-all
|
- tox -e py312-all
|
||||||
artifacts:
|
artifacts:
|
||||||
@ -126,7 +126,7 @@ test-3.12-all:
|
|||||||
|
|
||||||
build-test:
|
build-test:
|
||||||
stage: test
|
stage: test
|
||||||
image: python:3.12-bullseye
|
image: python:3.12-bookworm
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- python -m pip install --upgrade pip
|
- python -m pip install --upgrade pip
|
||||||
@ -145,13 +145,13 @@ build-test:
|
|||||||
|
|
||||||
test-docs:
|
test-docs:
|
||||||
<<: *only-default
|
<<: *only-default
|
||||||
image: python:3.12-bullseye
|
image: python:3.12-bookworm
|
||||||
script:
|
script:
|
||||||
- tox -e docs
|
- tox -e docs
|
||||||
|
|
||||||
deploy_production:
|
deploy_production:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
image: python:3.12-bullseye
|
image: python:3.12-bookworm
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
- python -m pip install --upgrade pip
|
- python -m pip install --upgrade pip
|
||||||
|
@ -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.1.0'
|
__version__ = '4.2.2'
|
||||||
__title__ = 'Alliance Auth'
|
__title__ = 'Alliance Auth'
|
||||||
__url__ = 'https://gitlab.com/allianceauth/allianceauth'
|
__url__ = 'https://gitlab.com/allianceauth/allianceauth'
|
||||||
NAME = f'{__title__} v{__version__}'
|
NAME = f'{__title__} v{__version__}'
|
||||||
|
@ -101,11 +101,38 @@ def analytics_daily_stats():
|
|||||||
event_type='Stats')
|
event_type='Stats')
|
||||||
|
|
||||||
for appconfig in apps.get_app_configs():
|
for appconfig in apps.get_app_configs():
|
||||||
analytics_event(namespace='allianceauth.analytics',
|
if appconfig.label in [
|
||||||
task='send_extension_stats',
|
"django_celery_beat",
|
||||||
label=appconfig.label,
|
"bootstrapform",
|
||||||
value=1,
|
"messages",
|
||||||
event_type='Stats')
|
"sessions",
|
||||||
|
"auth",
|
||||||
|
"staticfiles",
|
||||||
|
"users",
|
||||||
|
"addons",
|
||||||
|
"admin",
|
||||||
|
"humanize",
|
||||||
|
"contenttypes",
|
||||||
|
"sortedm2m",
|
||||||
|
"django_bootstrap5",
|
||||||
|
"tokens",
|
||||||
|
"authentication",
|
||||||
|
"services",
|
||||||
|
"framework",
|
||||||
|
"notifications"
|
||||||
|
"eveonline",
|
||||||
|
"navhelper",
|
||||||
|
"analytics",
|
||||||
|
"menu",
|
||||||
|
"theme"
|
||||||
|
]:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
analytics_event(namespace='allianceauth.analytics',
|
||||||
|
task='send_extension_stats',
|
||||||
|
label=appconfig.label,
|
||||||
|
value=1,
|
||||||
|
event_type='Stats')
|
||||||
|
|
||||||
|
|
||||||
@shared_task()
|
@shared_task()
|
||||||
|
@ -5,26 +5,5 @@ from django.core.checks import Warning, Error, register
|
|||||||
class AllianceAuthConfig(AppConfig):
|
class AllianceAuthConfig(AppConfig):
|
||||||
name = 'allianceauth'
|
name = 'allianceauth'
|
||||||
|
|
||||||
|
def ready(self) -> None:
|
||||||
@register()
|
import allianceauth.checks # noqa
|
||||||
def check_settings(app_configs, **kwargs):
|
|
||||||
from django.conf import settings
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
if hasattr(settings, "SITE_URL"):
|
|
||||||
if settings.SITE_URL[-1] == "/":
|
|
||||||
errors.append(Warning(
|
|
||||||
"'SITE_URL' Has a trailing slash. This may lead to incorrect links being generated by Auth."))
|
|
||||||
else:
|
|
||||||
errors.append(Error(
|
|
||||||
"No 'SITE_URL' found is settings. This may lead to incorrect links being generated by Auth or Errors in 3rd party modules."))
|
|
||||||
if hasattr(settings, "CSRF_TRUSTED_ORIGINS"):
|
|
||||||
if hasattr(settings, "SITE_URL"):
|
|
||||||
if settings.SITE_URL not in settings.CSRF_TRUSTED_ORIGINS:
|
|
||||||
errors.append(Warning(
|
|
||||||
"'SITE_URL' not found in 'CSRF_TRUSTED_ORIGINS'. Auth may not load pages correctly until this is rectified."))
|
|
||||||
else:
|
|
||||||
errors.append(Error(
|
|
||||||
"No 'CSRF_TRUSTED_ORIGINS' found is settings, Auth may not load pages correctly until this is rectified"))
|
|
||||||
|
|
||||||
return errors
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
{% translate "Dashboard" %}
|
{% translate "Dashboard" %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="d-flex justify-content-around align-self-center flex-wrap">
|
<div class="row">
|
||||||
{% for dash in views %}
|
{% for dash in views %}
|
||||||
{{ dash | safe }}
|
{{ dash | safe }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
<div id="aa-dashboard-panel-characters" class="col-12 col-xl-8 align-self-stretch p-2 ps-0 pe-0 ps-xl-0 pe-xl-2">
|
<div id="aa-dashboard-panel-characters" class="col-12 col-xl-8 mb-3">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% translate "Characters" as widget_title %}
|
{% translate "Characters" as widget_title %}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
<div id="aa-dashboard-panel-membership" class="col-12 col-xl-4 align-self-stretch py-2 ps-xl-2">
|
<div id="aa-dashboard-panel-membership" class="col-12 col-xl-4 mb-3">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% translate "Membership" as widget_title %}
|
{% translate "Membership" as widget_title %}
|
||||||
|
187
allianceauth/checks.py
Normal file
187
allianceauth/checks.py
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
from typing import List
|
||||||
|
from django import db
|
||||||
|
from django.core.checks import CheckMessage, Error, register, Warning
|
||||||
|
from allianceauth.utils.cache import get_redis_client
|
||||||
|
from django.utils import timezone
|
||||||
|
from packaging.version import InvalidVersion, Version as Pep440Version
|
||||||
|
from celery import current_app
|
||||||
|
from django.conf import settings
|
||||||
|
from sqlite3.dbapi2 import sqlite_version_info
|
||||||
|
|
||||||
|
"""
|
||||||
|
A = System Packages
|
||||||
|
B = Configuration
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@register()
|
||||||
|
def django_settings(app_configs, **kwargs) -> List[CheckMessage]:
|
||||||
|
errors: List[CheckMessage] = []
|
||||||
|
if hasattr(settings, "SITE_URL"):
|
||||||
|
if settings.SITE_URL[-1] == "/":
|
||||||
|
errors.append(Warning("'SITE_URL' Has a trailing slash. This may lead to incorrect links being generated by Auth.", hint="", id="allianceauth.checks.B005"))
|
||||||
|
else:
|
||||||
|
errors.append(Error("No 'SITE_URL' found is settings. This may lead to incorrect links being generated by Auth or Errors in 3rd party modules.", hint="", id="allianceauth.checks.B006"))
|
||||||
|
|
||||||
|
if hasattr(settings, "CSRF_TRUSTED_ORIGINS") and hasattr(settings, "SITE_URL"):
|
||||||
|
if settings.SITE_URL not in settings.CSRF_TRUSTED_ORIGINS:
|
||||||
|
errors.append(Warning("'SITE_URL' not found in 'CSRF_TRUSTED_ORIGINS'. Auth may not load pages correctly until this is rectified.", hint="", id="allianceauth.checks.B007"))
|
||||||
|
else:
|
||||||
|
errors.append(Error("No 'CSRF_TRUSTED_ORIGINS' found is settings, Auth may not load pages correctly until this is rectified", hint="", id="allianceauth.checks.B008"))
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
@register()
|
||||||
|
def system_package_redis(app_configs, **kwargs) -> List[CheckMessage]:
|
||||||
|
errors: List[CheckMessage] = []
|
||||||
|
try:
|
||||||
|
redis_version = Pep440Version(get_redis_client().info()['redis_version'])
|
||||||
|
except InvalidVersion:
|
||||||
|
errors.append(Warning("Unable to confirm Redis Version"))
|
||||||
|
return errors
|
||||||
|
|
||||||
|
if redis_version.major == 7 and redis_version.minor == 2 and timezone.now() > timezone.datetime(year=2025, month=8, day=31, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A001"))
|
||||||
|
elif redis_version.major == 7 and redis_version.minor == 0:
|
||||||
|
errors.append(Warning(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A002"))
|
||||||
|
elif redis_version.major == 6 and redis_version.minor == 2:
|
||||||
|
errors.append(Warning(f"Redis {redis_version.public} in Security Support only, Updating Suggested", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A018"))
|
||||||
|
elif redis_version.major in [6, 5]:
|
||||||
|
errors.append(Error(f"Redis {redis_version.public} EOL", hint="https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools", id="allianceauth.checks.A003"))
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
@register()
|
||||||
|
def system_package_mysql(app_configs, **kwargs) -> List[CheckMessage]:
|
||||||
|
errors: List[CheckMessage] = []
|
||||||
|
|
||||||
|
for connection in db.connections.all():
|
||||||
|
if connection.vendor == "mysql":
|
||||||
|
try:
|
||||||
|
mysql_version = Pep440Version(".".join(str(i) for i in connection.mysql_version))
|
||||||
|
except InvalidVersion:
|
||||||
|
errors.append(Warning("Unable to confirm MySQL Version"))
|
||||||
|
return errors
|
||||||
|
|
||||||
|
# MySQL 8
|
||||||
|
if mysql_version.major == 8 and mysql_version.minor == 4 and timezone.now() > timezone.datetime(year=2032, month=4, day=30, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MySQL {mysql_version.public} EOL", hint="https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/", id="allianceauth.checks.A004"))
|
||||||
|
elif mysql_version.major == 8 and mysql_version.minor == 3:
|
||||||
|
errors.append(Warning(f"MySQL {mysql_version.public} Non LTS", hint="https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/", id="allianceauth.checks.A005"))
|
||||||
|
elif mysql_version.major == 8 and mysql_version.minor == 2:
|
||||||
|
errors.append(Warning(f"MySQL {mysql_version.public} Non LTS", hint="https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/", id="allianceauth.checks.A006"))
|
||||||
|
elif mysql_version.major == 8 and mysql_version.minor == 1:
|
||||||
|
errors.append(Error(f"MySQL {mysql_version.public} EOL", hint="https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/", id="allianceauth.checks.A007"))
|
||||||
|
elif mysql_version.major == 8 and mysql_version.minor == 0 and timezone.now() > timezone.datetime(year=2026, month=4, day=30, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MySQL {mysql_version.public} EOL", hint="https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/", id="allianceauth.checks.A008"))
|
||||||
|
elif mysql_version.major < 8: # This will also catch Mariadb 5.x
|
||||||
|
errors.append(Error(f"MySQL or MariaDB {mysql_version.public} EOL", hint="https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/", id="allianceauth.checks.A009"))
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
@register()
|
||||||
|
def system_package_mariadb(app_configs, **kwargs) -> List[CheckMessage]:
|
||||||
|
errors: List[CheckMessage] = []
|
||||||
|
|
||||||
|
for connection in db.connections.all():
|
||||||
|
if connection.vendor == "mysql": # Still to find a way to determine MySQL vs MariaDB
|
||||||
|
try:
|
||||||
|
mariadb_version = Pep440Version(".".join(str(i) for i in connection.mysql_version))
|
||||||
|
except InvalidVersion:
|
||||||
|
errors.append(Warning("Unable to confirm MariaDB Version"))
|
||||||
|
return errors
|
||||||
|
|
||||||
|
# MariaDB 11
|
||||||
|
if mariadb_version.major == 11 and mariadb_version.minor == 4 and timezone.now() > timezone.datetime(year=2029, month=5, day=19, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A010"))
|
||||||
|
elif mariadb_version.major == 11 and mariadb_version.minor == 2:
|
||||||
|
errors.append(Warning(f"MariaDB {mariadb_version.public} Non LTS", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A018"))
|
||||||
|
if timezone.now() > timezone.datetime(year=2024, month=11, day=21, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A011"))
|
||||||
|
elif mariadb_version.major == 11 and mariadb_version.minor == 1:
|
||||||
|
errors.append(Warning(f"MariaDB {mariadb_version.public} Non LTS", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A019"))
|
||||||
|
if timezone.now() > timezone.datetime(year=2024, month=8, day=21, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A012"))
|
||||||
|
elif mariadb_version.major == 11 and mariadb_version.minor in [0, 3]: # Demote versions down here once EOL
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config.", id="allianceauth.checks.A013"))
|
||||||
|
|
||||||
|
# MariaDB 10
|
||||||
|
elif mariadb_version.major == 10 and mariadb_version.minor == 11 and timezone.now() > timezone.datetime(year=2028, month=2, day=10, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config.", id="allianceauth.checks.A014"))
|
||||||
|
elif mariadb_version.major == 10 and mariadb_version.minor == 6 and timezone.now() > timezone.datetime(year=2026, month=7, day=6, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A0015"))
|
||||||
|
elif mariadb_version.major == 10 and mariadb_version.minor == 5 and timezone.now() > timezone.datetime(year=2025, month=6, day=24, tzinfo=timezone.utc):
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A016"))
|
||||||
|
elif mariadb_version.major == 10 and mariadb_version.minor in [0, 1, 2, 3, 4, 7, 9, 10]: # Demote versions down here once EOL
|
||||||
|
errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint="https://mariadb.org/download/?t=repo-config", id="allianceauth.checks.A017"))
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
@register()
|
||||||
|
def system_package_sqlite(app_configs, **kwargs) -> List[CheckMessage]:
|
||||||
|
errors: List[CheckMessage] = []
|
||||||
|
for connection in db.connections.all():
|
||||||
|
if connection.vendor == "sqlite":
|
||||||
|
try:
|
||||||
|
sqlite_version = Pep440Version(".".join(str(i) for i in sqlite_version_info))
|
||||||
|
except InvalidVersion:
|
||||||
|
errors.append(Warning("Unable to confirm SQLite Version"))
|
||||||
|
return errors
|
||||||
|
if sqlite_version.major == 3 and sqlite_version.minor < 27:
|
||||||
|
errors.append(Error(f"SQLite {sqlite_version.public} Unsupported by Django", hint="https://pkgs.org/download/sqlite3", id="allianceauth.checks.A020"))
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
@register()
|
||||||
|
def sql_settings(app_configs, **kwargs) -> List[CheckMessage]:
|
||||||
|
errors: List[CheckMessage] = []
|
||||||
|
for connection in db.connections.all():
|
||||||
|
if connection.vendor == "mysql":
|
||||||
|
try:
|
||||||
|
if connection.settings_dict["OPTIONS"]["charset"] != "utf8mb4":
|
||||||
|
errors.append(Error(f"SQL Charset is not set to utf8mb4 DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
|
||||||
|
except KeyError:
|
||||||
|
errors.append(Error(f"SQL Charset is not set to utf8mb4 DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
|
||||||
|
|
||||||
|
# This hasn't actually been set on AA yet
|
||||||
|
# try:
|
||||||
|
# if connection.settings_dict["OPTIONS"]["collation"] != "utf8mb4_unicode_ci":
|
||||||
|
# errors.append(Error(f"SQL Collation is not set to utf8mb4_unicode_ci DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
|
||||||
|
# except KeyError:
|
||||||
|
# errors.append(Error(f"SQL Collation is not set to utf8mb4_unicode_ci DB:{connection.alias}", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/89be2456fb2d741b86417e889da9b6129525bec8", id="allianceauth.checks.B001"))
|
||||||
|
|
||||||
|
# if connection.vendor == "sqlite":
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
@register()
|
||||||
|
def celery_settings(app_configs, **kwargs) -> List[CheckMessage]:
|
||||||
|
errors: List[CheckMessage] = []
|
||||||
|
|
||||||
|
try:
|
||||||
|
if current_app.conf.broker_transport_options != {'priority_steps': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 'queue_order_strategy': 'priority'}:
|
||||||
|
errors.append(Error("Celery Priorities are not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/8861ec0a61790eca0261f1adc1cc04ca5f243cbc", id="allianceauth.checks.B003"))
|
||||||
|
except KeyError:
|
||||||
|
errors.append(Error("Celery Priorities are not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/8861ec0a61790eca0261f1adc1cc04ca5f243cbc", id="allianceauth.checks.B003"))
|
||||||
|
|
||||||
|
try:
|
||||||
|
if current_app.conf.broker_connection_retry_on_startup != True:
|
||||||
|
errors.append(Error("Celery broker_connection_retry_on_startup not set correctly", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004"))
|
||||||
|
except KeyError:
|
||||||
|
errors.append(Error("Celery broker_connection_retry_on_startup not set", hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", id="allianceauth.checks.B004"))
|
||||||
|
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
|
# IDEAS
|
||||||
|
|
||||||
|
# Any other celery things weve manually changed over the years
|
||||||
|
# I'd be happy to add Community App checks, old versions the owners dont want to support etc.
|
||||||
|
|
||||||
|
|
||||||
|
# Check Default Collation on DB
|
||||||
|
# Check Charset Collation on all tables
|
@ -1,7 +1,7 @@
|
|||||||
{#Usage:#}
|
{#Usage:#}
|
||||||
{# {% include "framework/dashboard/widget-title.html" with title="Foobar" %}#}
|
{# {% include "framework/dashboard/widget-title.html" with title="Foobar" %}#}
|
||||||
|
|
||||||
<div class="d-flex align-items-center">
|
<div class="text-center">
|
||||||
<h4 class="ms-auto me-auto mb-3">
|
<h4 class="ms-auto me-auto mb-3">
|
||||||
{{ title }}
|
{{ title }}
|
||||||
</h4>
|
</h4>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load evelinks %}
|
{% load evelinks %}
|
||||||
|
|
||||||
<div class="col-12 align-self-stretch py-2">
|
<div class="col-12 mb-3">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% translate "Upcoming Fleets" as widget_title %}
|
{% translate "Upcoming Fleets" as widget_title %}
|
||||||
|
@ -7,7 +7,9 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block url %}
|
{% block url %}
|
||||||
<a href="{{ service_url }}">{{ service_url }}</a>
|
{% if username != '' %}
|
||||||
|
<a href="mumble://{{ connect_url }}">{{ service_url }}</a>
|
||||||
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block user %}
|
{% block user %}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
<div id="esi-alert" class="col-12 align-self-stretch py-2 collapse">
|
<div id="esi-alert" class="col-12 collapse">
|
||||||
<div class="alert alert-warning">
|
<div class="alert alert-warning">
|
||||||
<p class="text-center ">{% translate 'Your Server received an ESI error response code of ' %}<b id="esi-code">?</b></p>
|
<p class="text-center ">{% translate 'Your Server received an ESI error response code of ' %}<b id="esi-code">?</b></p>
|
||||||
<hr>
|
<hr>
|
||||||
@ -23,7 +23,7 @@
|
|||||||
console.log("ESI Check: ", JSON.stringify(responseJson, null, 2));
|
console.log("ESI Check: ", JSON.stringify(responseJson, null, 2));
|
||||||
|
|
||||||
const status = responseJson.status;
|
const status = responseJson.status;
|
||||||
if (status != 200) {
|
if (status !== 200) {
|
||||||
elemCode.textContent = status
|
elemCode.textContent = status
|
||||||
elemMessage.textContent = responseJson.data.error;
|
elemMessage.textContent = responseJson.data.error;
|
||||||
new bootstrap.Collapse(elemCard, {
|
new bootstrap.Collapse(elemCard, {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
{% load humanize %}
|
{% load humanize %}
|
||||||
|
|
||||||
{% if notifications %}
|
{% if notifications %}
|
||||||
<div id="aa-dashboard-panel-admin-notifications" class="col-12 align-self-stretch pb-2">
|
<div id="aa-dashboard-panel-admin-notifications" class="col-12 mb-3">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% translate "Alliance Auth Notifications" as widget_title %}
|
{% translate "Alliance Auth Notifications" as widget_title %}
|
||||||
@ -13,9 +13,9 @@
|
|||||||
{% for notif in notifications %}
|
{% for notif in notifications %}
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
{% if notif.state == 'opened' %}
|
{% if notif.state == 'opened' %}
|
||||||
<span class="badge bg-success">{% translate "Open" %}</span>
|
<span class="badge bg-success me-2">{% translate "Open" %}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="badge bg-danger">{% translate "Closed" %}</span>
|
<span class="badge bg-danger me-2">{% translate "Closed" %}</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<a href="{{ notif.web_url }}" target="_blank">#{{ notif.iid }} {{ notif.title }}</a>
|
<a href="{{ notif.web_url }}" target="_blank">#{{ notif.iid }} {{ notif.title }}</a>
|
||||||
</li>
|
</li>
|
||||||
@ -46,7 +46,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div class="col-12 align-self-stretch py-2">
|
<div class="col-12 mb-3">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body row">
|
<div class="card-body row">
|
||||||
<div id="aa-dashboard-panel-software-version" class="col-xl-6 col-lg-12 col-md-12 col-sm-12">
|
<div id="aa-dashboard-panel-software-version" class="col-xl-6 col-lg-12 col-md-12 col-sm-12">
|
||||||
|
@ -1,31 +1,37 @@
|
|||||||
{% extends "allianceauth/base-bs5.html" %}
|
{% extends "allianceauth/base-bs5.html" %}
|
||||||
|
|
||||||
|
{% load theme_tags %}
|
||||||
|
|
||||||
{% block page_title %}
|
{% block page_title %}
|
||||||
{{ error_title }}
|
{{ error_title }}
|
||||||
{% endblock page_title %}
|
{% endblock page_title %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div>
|
<div class="d-flex flex-column" style="height: calc(100vh - {% header_padding_size %}); margin-top: -1rem; margin-bottom: -1rem;">
|
||||||
{% include "framework/header/page-header.html" with title=error_title %}
|
<div class="d-flex flex-grow-1 justify-content-center align-items-center">
|
||||||
|
<div>
|
||||||
|
{% include "framework/header/page-header.html" with title=error_title %}
|
||||||
|
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
width="150"
|
width="150"
|
||||||
height="150"
|
height="150"
|
||||||
fill="currentColor"
|
fill="currentColor"
|
||||||
class="bi bi-exclamation-triangle"
|
class="bi bi-exclamation-triangle"
|
||||||
viewBox="0 0 16 16"
|
viewBox="0 0 16 16"
|
||||||
>
|
>
|
||||||
<path
|
<path
|
||||||
d="M7.938 2.016A.13.13 0 0 1 8.002 2a.13.13 0 0 1 .063.016.146.146 0 0 1 .054.057l6.857 11.667c.036.06.035.124.002.183a.163.163 0 0 1-.054.06.116.116 0 0 1-.066.017H1.146a.115.115 0 0 1-.066-.017.163.163 0 0 1-.054-.06.176.176 0 0 1 .002-.183L7.884 2.073a.147.147 0 0 1 .054-.057zm1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566z"
|
d="M7.938 2.016A.13.13 0 0 1 8.002 2a.13.13 0 0 1 .063.016.146.146 0 0 1 .054.057l6.857 11.667c.036.06.035.124.002.183a.163.163 0 0 1-.054.06.116.116 0 0 1-.066.017H1.146a.115.115 0 0 1-.066-.017.163.163 0 0 1-.054-.06.176.176 0 0 1 .002-.183L7.884 2.073a.147.147 0 0 1 .054-.057zm1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767L8.982 1.566z"
|
||||||
/>
|
/>
|
||||||
<path
|
<path
|
||||||
d="M7.002 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 5.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995z"
|
d="M7.002 12a1 1 0 1 1 2 0 1 1 0 0 1-2 0zM7.1 5.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0L7.1 5.995z"
|
||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="text-center">{{ error_message }}</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="text-center">{{ error_message }}</p>
|
|
||||||
</div>
|
</div>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
{% load evelinks %}
|
{% load evelinks %}
|
||||||
|
|
||||||
<div class="col-12 align-self-stretch py-2">
|
<div class="col-12 mb-3">
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% translate "Upcoming Timers" as widget_title %}
|
{% translate "Upcoming Timers" as widget_title %}
|
||||||
|
@ -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.1.0
|
AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.2.2
|
||||||
|
|
||||||
# Nginx Proxy Manager
|
# Nginx Proxy Manager
|
||||||
PROXY_HTTP_PORT=80
|
PROXY_HTTP_PORT=80
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
FROM python:3.11-slim
|
FROM python:3.11-slim
|
||||||
ARG AUTH_VERSION=v4.1.0
|
ARG AUTH_VERSION=v4.2.2
|
||||||
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
|
||||||
@ -9,21 +9,21 @@ ENV AUTH_HOME=/home/allianceauth
|
|||||||
|
|
||||||
# Setup user and directory permissions
|
# Setup user and directory permissions
|
||||||
SHELL ["/bin/bash", "-c"]
|
SHELL ["/bin/bash", "-c"]
|
||||||
RUN groupadd -g 61000 ${AUTH_GROUP}
|
RUN groupadd -g 61000 ${AUTH_GROUP} && \
|
||||||
RUN useradd -g 61000 -l -M -s /bin/false -u 61000 ${AUTH_USER}
|
useradd -g 61000 -l -m -s /bin/false -u 61000 ${AUTH_USER}
|
||||||
RUN mkdir -p ${STATIC_BASE} \
|
|
||||||
&& chown ${AUTH_USERGROUP} ${STATIC_BASE} \
|
|
||||||
&& mkdir -p ${AUTH_HOME} \
|
|
||||||
&& chown ${AUTH_USERGROUP} ${AUTH_HOME}
|
|
||||||
|
|
||||||
# Install build dependencies
|
RUN mkdir -p ${STATIC_BASE}/myauth/static \
|
||||||
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
|
&& chown ${AUTH_USERGROUP} ${STATIC_BASE}/myauth/static
|
||||||
libmariadb-dev gcc git pkg-config
|
|
||||||
|
|
||||||
# Install python dependencies
|
# Install Build Dependencies
|
||||||
RUN pip install --upgrade pip
|
RUN apt-get update \
|
||||||
RUN pip install wheel gunicorn
|
&& apt-get upgrade -y \
|
||||||
RUN pip install ${AUTH_PACKAGE}
|
&& apt-get install -y --no-install-recommends libmariadb-dev gcc git pkg-config \
|
||||||
|
&& apt-get clean \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Install AA and Dependencies
|
||||||
|
RUN pip install --no-cache-dir ${AUTH_PACKAGE} gunicorn
|
||||||
|
|
||||||
# Switch to non-root user
|
# Switch to non-root user
|
||||||
USER ${AUTH_USER}
|
USER ${AUTH_USER}
|
||||||
@ -33,7 +33,6 @@ WORKDIR ${AUTH_HOME}
|
|||||||
RUN allianceauth start myauth
|
RUN allianceauth start myauth
|
||||||
COPY /allianceauth/project_template/project_name/settings/local.py ${AUTH_HOME}/myauth/myauth/settings/local.py
|
COPY /allianceauth/project_template/project_name/settings/local.py ${AUTH_HOME}/myauth/myauth/settings/local.py
|
||||||
RUN allianceauth update myauth
|
RUN allianceauth update myauth
|
||||||
RUN mkdir -p ${STATIC_BASE}/myauth/static
|
|
||||||
|
|
||||||
RUN echo 'alias auth="python $AUTH_HOME/myauth/manage.py"' >> ~/.bashrc && \
|
RUN echo 'alias auth="python $AUTH_HOME/myauth/manage.py"' >> ~/.bashrc && \
|
||||||
source ~/.bashrc
|
source ~/.bashrc
|
||||||
|
@ -9,6 +9,10 @@ from django.conf import settings # noqa
|
|||||||
|
|
||||||
app = Celery('myauth')
|
app = Celery('myauth')
|
||||||
|
|
||||||
|
# Automatically try to establish the connection to the AMQP broker on
|
||||||
|
# Celery startup if it is unavailable.
|
||||||
|
app.conf.broker_connection_retry_on_startup = True
|
||||||
|
|
||||||
# Using a string here means the worker don't have to serialize
|
# Using a string here means the worker don't have to serialize
|
||||||
# the configuration object to child processes.
|
# the configuration object to child processes.
|
||||||
app.config_from_object('django.conf:settings')
|
app.config_from_object('django.conf:settings')
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
ARG AA_DOCKER_TAG
|
ARG AA_DOCKER_TAG
|
||||||
FROM $AA_DOCKER_TAG
|
FROM $AA_DOCKER_TAG
|
||||||
|
|
||||||
RUN cd /home/allianceauth
|
WORKDIR ${AUTH_HOME}
|
||||||
|
|
||||||
COPY /conf/requirements.txt requirements.txt
|
COPY /conf/requirements.txt requirements.txt
|
||||||
RUN pip install -r requirements.txt
|
RUN --mount=type=cache,target=~/.cache \
|
||||||
|
pip install -r requirements.txt
|
||||||
|
@ -35,7 +35,7 @@ To ensure the dashboard widgets have a unified style, we provide a template part
|
|||||||
To use it, you can use the following code in your dashboard widget template:
|
To use it, you can use the following code in your dashboard widget template:
|
||||||
|
|
||||||
```django
|
```django
|
||||||
<div id="my-app-dashboard-widget" class="col-12 align-self-stretch py-2">
|
<div id="my-app-dashboard-widget" class="col-12 mb-3">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{% translate "My Widget Title" as widget_title %}
|
{% translate "My Widget Title" as widget_title %}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Mumble
|
# Mumble (Docker)
|
||||||
|
|
||||||
An alternate install guide for Mumble using Docker, better suited to an Alliance Auth Docker install
|
An alternate install guide for Mumble using Docker, better suited to an Alliance Auth Docker install
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Openfire
|
# Openfire (Docker)
|
||||||
|
|
||||||
An alternate install guide for Openfire using Docker, better suited to an Alliance Auth Docker install
|
An alternate install guide for Openfire using Docker, better suited to an Alliance Auth Docker install
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# TeamSpeak 3
|
# TeamSpeak 3 (Docker)
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
|
@ -181,13 +181,17 @@ If you don't plan on running the database on the same server as auth you still n
|
|||||||
|
|
||||||
### Redis and Other Tools
|
### Redis and Other Tools
|
||||||
|
|
||||||
A few extra utilities are also required for installation of packages.
|
A few extra utilities are also required for the installation of packages.
|
||||||
|
|
||||||
::::{tabs}
|
::::{tabs}
|
||||||
|
|
||||||
:::{group-tab} Ubuntu 2004, 2204
|
:::{group-tab} Ubuntu 2004, 2204
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
|
||||||
|
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
|
||||||
|
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
|
||||||
|
sudo apt-get update
|
||||||
sudo apt-get install unzip git redis-server curl libssl-dev libbz2-dev libffi-dev build-essential pkg-config
|
sudo apt-get install unzip git redis-server curl libssl-dev libbz2-dev libffi-dev build-essential pkg-config
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@ authors = [
|
|||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
classifiers = [
|
classifiers = [
|
||||||
"Environment :: Web Environment",
|
"Environment :: Web Environment",
|
||||||
|
"Framework :: Celery",
|
||||||
"Framework :: Django",
|
"Framework :: Django",
|
||||||
"Framework :: Django :: 4.2",
|
"Framework :: Django :: 4.2",
|
||||||
"Intended Audience :: Developers",
|
"Intended Audience :: Developers",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user