From 77da6928b23224e8b53af74e4ca2a13d27528561 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Thu, 12 Sep 2024 15:53:53 +1000 Subject: [PATCH 01/85] add Chart.js 4.4.1 to Bundles --- allianceauth/templates/bundles/chart-js.html | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 allianceauth/templates/bundles/chart-js.html diff --git a/allianceauth/templates/bundles/chart-js.html b/allianceauth/templates/bundles/chart-js.html new file mode 100644 index 00000000..9747b5ed --- /dev/null +++ b/allianceauth/templates/bundles/chart-js.html @@ -0,0 +1,3 @@ + + + From 3f54d49d8b1cb4c1e7222ec2eaf0bb4be7ebd9a0 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Thu, 12 Sep 2024 15:54:06 +1000 Subject: [PATCH 02/85] update help text from mumble definition --- allianceauth/services/modules/mumble/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/allianceauth/services/modules/mumble/models.py b/allianceauth/services/modules/mumble/models.py index 72ab63fc..8c7d0ead 100644 --- a/allianceauth/services/modules/mumble/models.py +++ b/allianceauth/services/modules/mumble/models.py @@ -90,7 +90,7 @@ class MumbleUser(AbstractServiceModel): blank=True, null=True, editable=False, - help_text="The Mumble Release the user last authenticated with" + help_text="Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else." ) version = models.IntegerField( verbose_name="Mumble Version", @@ -159,4 +159,5 @@ class MumbleUser(AbstractServiceModel): class Meta: permissions = ( ("access_mumble", "Can access the Mumble service"), + ("view_connection_history", "Can access the connection history of the Mumble service"), ) From 1dea92ed76cf31ff9d56da4547b2c6504a7ac8b2 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Thu, 12 Sep 2024 15:54:14 +1000 Subject: [PATCH 03/85] add Connection History --- .../mumble/mumble_connection_history.html | 185 ++++++++++++++++++ .../services/mumble/mumble_service_ctrl.html | 5 + allianceauth/services/modules/mumble/urls.py | 4 + allianceauth/services/modules/mumble/views.py | 53 +++++ 4 files changed, 247 insertions(+) create mode 100644 allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html diff --git a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html new file mode 100644 index 00000000..99ad0be0 --- /dev/null +++ b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html @@ -0,0 +1,185 @@ +{% extends "allianceauth/base-bs5.html" %} +{% load i18n %} +{% load humanize %} + +{% block page_title %} + {% translate "Mumble" %} +{% endblock page_title %} + +{% block header_nav_brand %} + {% trans "Mumble History" %} - {{ mumble_url }} +{% endblock header_nav_brand %} +{% block header_nav_collapse_left %} +{% endblock header_nav_collapse_left %} + +{% block header_nav_collapse_right %} +{% endblock header_nav_collapse_right %} + +{% block content %} +
+
+ {% translate "Server Connection History" %} +
+
+
+
+ + + + + + + + + + + +
{% translate "User" %}{% translate "Display_Name" %}{% translate "Release" %}{% translate "Version" %}{% translate "Last Connection" %}{% translate "Last Disconnection" %}
+
+
+
+
+
+
+
+ {% translate "Server Connection Breakdown" %} +
+
+
+
+ +
+
+
+
+
+
+
+ {% translate "Server Connection Breakdown" %} +
+
+
+
+ + + + + + + +
{% translate "Version" %}{% translate "Number" %}
+
+
+
+
+
+{% endblock content %} +{% block extra_javascript %} + {% include "bundles/datatables-js-bs5.html" %} + {% include "bundles/filterdropdown-js.html" %} + {% include "bundles/chart-js.html" %} + {% include "bundles/moment-js.html" with locale=True %} + +{% endblock extra_javascript %} + +{% block extra_css %} + {% include "bundles/datatables-css-bs5.html" %} +{% endblock extra_css %} +{% block extra_script %} +$(document).ready(function () { + $("#table-mumble-connection-history").DataTable({ + ajax: { + url: "{% url 'mumble:connection_history_data' %}", + dataSrc: "connection_history_data", + }, + columns: [ + { data: "user" }, + { data: "display_name" }, + { data: "release" }, + { data: "version" }, + { data: "last_connect" }, + { data: "last_connect" }, + ], + order: [[4, "desc"]], + processing: true, + stateSave: true, + stateDuration: 0, + filterDropDown: { + columns: [ + { + idx: 2, + }, + { + idx: 3, + }, + ], + bootstrap: true, + bootstrap_version: 5, + }, + }); + + $("#table-mumble-connection-stats").DataTable({ + ajax: { + url: "{% url 'mumble:release_counts_data' %}", + dataSrc: "release_counts_data", + }, + columns: [{ data: "release" }, { data: "user_count" }], + order: [[1, "desc"]], + processing: true, + stateSave: true, + stateDuration: 0, + }); + + // Initialize empty Pie chart + var ctx = document.getElementById("pieChart").getContext("2d"); + var pieChart = new Chart(ctx, { + type: "pie", + data: { + labels: [], // Initially empty + datasets: [ + { + label: "Server Connection Breakdown", + data: [], // Initially empty + backgroundColor: [ + "rgba(255, 99, 132, 0.2)", + "rgba(54, 162, 235, 0.2)", + "rgba(255, 206, 86, 0.2)", + ], + borderColor: [ + "rgba(255, 99, 132, 1)", + "rgba(54, 162, 235, 1)", + "rgba(255, 206, 86, 1)", + ], + borderWidth: 1, + }, + ], + }, + options: { + responsive: true, + plugins: { + legend: { + position: "top", + }, + }, + }, + }); + + // AJAX call to dynamically update the chart + $.ajax({ + url: "{% url 'mumble:release_pie_chart_data' %}", // Your Django view URL that returns chart data + method: "GET", + success: function (data) { + // Replace chart data with the data from the AJAX response + pieChart.data.labels = data.labels; // Set the new labels + pieChart.data.datasets[0].data = data.values; // Set the new values + + // Update the chart to reflect the new data + pieChart.update(); + }, + error: function (xhr, status, error) { + console.error("Error fetching pie chart data:", status, error); + }, + }); +}); + +{% endblock extra_script %} diff --git a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html index e140ee7c..cf122157 100644 --- a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html +++ b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html @@ -48,4 +48,9 @@ {% endif %} {% endif %} + {% if request.user.is_superuser %} + + History + +{% endif %} {% endblock %} diff --git a/allianceauth/services/modules/mumble/urls.py b/allianceauth/services/modules/mumble/urls.py index ef7ff699..d3276e0b 100644 --- a/allianceauth/services/modules/mumble/urls.py +++ b/allianceauth/services/modules/mumble/urls.py @@ -10,6 +10,10 @@ module_urls = [ path('deactivate/', views.DeleteMumbleView.as_view(), name='deactivate'), path('reset_password/', views.ResetPasswordMumbleView.as_view(), name='reset_password'), path('set_password/', views.SetPasswordMumbleView.as_view(), name='set_password'), + path('connection_history/', views.connection_history, name="connection_history"), + path('ajax/connection_history_data', views.connection_history_data, name="connection_history_data"), + path('ajax/release_counts_data', views.release_counts_data, name="release_counts_data"), + path('ajax/release_pie_chart_data', views.release_pie_chart_data, name="release_pie_chart_data"), ] urlpatterns = [ diff --git a/allianceauth/services/modules/mumble/views.py b/allianceauth/services/modules/mumble/views.py index ba8904fd..7dd07c82 100644 --- a/allianceauth/services/modules/mumble/views.py +++ b/allianceauth/services/modules/mumble/views.py @@ -3,6 +3,11 @@ import logging from allianceauth.services.forms import ServicePasswordModelForm from allianceauth.services.abstract import BaseCreatePasswordServiceAccountView, BaseDeactivateServiceAccountView, \ BaseResetPasswordServiceAccountView, BaseSetPasswordServiceAccountView +from django.conf import settings +from django.contrib.auth.decorators import login_required, permission_required +from django.db.models import Count +from django.http import HttpResponse, JsonResponse +from django.shortcuts import render from .models import MumbleUser @@ -35,3 +40,51 @@ class ResetPasswordMumbleView(MumbleViewMixin, BaseResetPasswordServiceAccountVi class SetPasswordMumbleView(MumbleViewMixin, BaseSetPasswordServiceAccountView): form_class = MumblePasswordForm + + +@login_required +@permission_required('mumble.view_connection_history') +def connection_history(request) -> HttpResponse: + + context = { + "mumble_url": settings.MUMBLE_URL, + } + + return render(request, 'services/mumble/mumble_connection_history.html', context) + + +@login_required +@permission_required("mumble.view_connection_history") +def connection_history_data(request) -> JsonResponse: + connection_history_data = MumbleUser.objects.all( + ).values( + 'user', + 'display_name', + 'release', + 'version', + 'last_connect', + 'last_disconnect', + ) + + return JsonResponse({"connection_history_data": list(connection_history_data)}) + + +@login_required +@permission_required("mumble.view_connection_history") +def release_counts_data(request) -> JsonResponse: + release_counts_data = MumbleUser.objects.values('release').annotate(user_count=Count('user_id')).order_by('release') + + return JsonResponse({ + "release_counts_data": list(release_counts_data), + }) + + +@login_required +@permission_required("mumble.view_connection_history") +def release_pie_chart_data(request) -> JsonResponse: + release_counts = MumbleUser.objects.values('release').annotate(user_count=Count('user_id')).order_by('release') + + return JsonResponse({ + "labels": list(release_counts.values_list("release", flat=True)), + "values": list(release_counts.values_list("user_count", flat=True)), + }) From 660fe79d08397844340882ed0fd7b8d551328326 Mon Sep 17 00:00:00 2001 From: Aaron Kable Date: Tue, 17 Sep 2024 21:24:01 +0800 Subject: [PATCH 04/85] re-add the dark bootstrap html tag --- allianceauth/theme/bootstrap/auth_hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/theme/bootstrap/auth_hooks.py b/allianceauth/theme/bootstrap/auth_hooks.py index 72fe265a..887a6220 100644 --- a/allianceauth/theme/bootstrap/auth_hooks.py +++ b/allianceauth/theme/bootstrap/auth_hooks.py @@ -45,7 +45,7 @@ class BootstrapDarkThemeHook(ThemeHook): self, "Bootstrap Dark", "Powerful, extensible, and feature-packed frontend toolkit.", - html_tags={"data-theme": "bootstrap-dark"}, + html_tags={"data-theme": "bootstrap-dark", "data-bs-theme":"dark"}, css=CSS_STATICS, js=JS_STATICS, header_padding="3.5em" From 07c62ed32a273ede5cf4fe935f81a4fba6329e90 Mon Sep 17 00:00:00 2001 From: r0kym Date: Mon, 23 Sep 2024 13:15:19 +0200 Subject: [PATCH 05/85] Add an example to the notification documentation --- allianceauth/notifications/__init__.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/allianceauth/notifications/__init__.py b/allianceauth/notifications/__init__.py index 1a7c9e01..74122db7 100644 --- a/allianceauth/notifications/__init__.py +++ b/allianceauth/notifications/__init__.py @@ -1 +1,21 @@ +""" +Example +======= + +.. code-block:: python + + from allianceauth.notifications.models import Notification + + + def notify_user_view(request): + '''Simple view sending a notification to the user''' + + Notification.objects.notify_user( + user=request.user, + title="Some title", + message="Some message", + level=Notification.Level.INFO, + ) + +""" from .core import notify # noqa: F401 From 1fb091acb29b443f226e7c93985005fb382ece81 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 23 Sep 2024 15:09:35 +0200 Subject: [PATCH 06/85] [CHANGE] Some improvements - Fixed Bootstraps cards, rows and cols - Replaced style argument with Bootstrap class - Removed unused Django templatetag - JS modernized and moved to its own script tag instead of concatenating it with other more or less "global" scripts - Fixed Bootstrap classes --- .../mumble/mumble_connection_history.html | 290 ++++++++++-------- 1 file changed, 155 insertions(+), 135 deletions(-) diff --git a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html index 99ad0be0..536e3d39 100644 --- a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html +++ b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html @@ -1,6 +1,6 @@ {% extends "allianceauth/base-bs5.html" %} + {% load i18n %} -{% load humanize %} {% block page_title %} {% translate "Mumble" %} @@ -9,6 +9,7 @@ {% block header_nav_brand %} {% trans "Mumble History" %} - {{ mumble_url }} {% endblock header_nav_brand %} + {% block header_nav_collapse_left %} {% endblock header_nav_collapse_left %} @@ -16,55 +17,55 @@ {% endblock header_nav_collapse_right %} {% block content %} -
+
{% translate "Server Connection History" %}
+
-
-
- - - - - - - - - - - -
{% translate "User" %}{% translate "Display_Name" %}{% translate "Release" %}{% translate "Version" %}{% translate "Last Connection" %}{% translate "Last Disconnection" %}
-
+
+ + + + + + + + + + + +
{% translate "User" %}{% translate "Displayed Name" %}{% translate "Release" %}{% translate "Version" %}{% translate "Last Connect" %}{% translate "Last Disconnect" %}
+
-
-
- {% translate "Server Connection Breakdown" %} -
-
-
-
- -
-
+
+
+
+ {% translate "Server Connection Breakdown" %} +
+ +
+
-
-
- {% translate "Server Connection Breakdown" %} -
-
-
-
- + +
+
+
+ {% translate "Server Connection Breakdown" %} +
+ +
+
+
- - + +
{% translate "Version" %}{% translate "Number" %}{% translate "Version" %}{% translate "Number" %}
@@ -74,112 +75,131 @@
{% endblock content %} + {% block extra_javascript %} {% include "bundles/datatables-js-bs5.html" %} {% include "bundles/filterdropdown-js.html" %} {% include "bundles/chart-js.html" %} {% include "bundles/moment-js.html" with locale=True %} + {% endblock extra_javascript %} {% block extra_css %} {% include "bundles/datatables-css-bs5.html" %} {% endblock extra_css %} -{% block extra_script %} -$(document).ready(function () { - $("#table-mumble-connection-history").DataTable({ - ajax: { - url: "{% url 'mumble:connection_history_data' %}", - dataSrc: "connection_history_data", - }, - columns: [ - { data: "user" }, - { data: "display_name" }, - { data: "release" }, - { data: "version" }, - { data: "last_connect" }, - { data: "last_connect" }, - ], - order: [[4, "desc"]], - processing: true, - stateSave: true, - stateDuration: 0, - filterDropDown: { - columns: [ - { - idx: 2, - }, - { - idx: 3, - }, - ], - bootstrap: true, - bootstrap_version: 5, - }, - }); - - $("#table-mumble-connection-stats").DataTable({ - ajax: { - url: "{% url 'mumble:release_counts_data' %}", - dataSrc: "release_counts_data", - }, - columns: [{ data: "release" }, { data: "user_count" }], - order: [[1, "desc"]], - processing: true, - stateSave: true, - stateDuration: 0, - }); - - // Initialize empty Pie chart - var ctx = document.getElementById("pieChart").getContext("2d"); - var pieChart = new Chart(ctx, { - type: "pie", - data: { - labels: [], // Initially empty - datasets: [ - { - label: "Server Connection Breakdown", - data: [], // Initially empty - backgroundColor: [ - "rgba(255, 99, 132, 0.2)", - "rgba(54, 162, 235, 0.2)", - "rgba(255, 206, 86, 0.2)", - ], - borderColor: [ - "rgba(255, 99, 132, 1)", - "rgba(54, 162, 235, 1)", - "rgba(255, 206, 86, 1)", - ], - borderWidth: 1, - }, - ], - }, - options: { - responsive: true, - plugins: { - legend: { - position: "top", - }, - }, - }, - }); - - // AJAX call to dynamically update the chart - $.ajax({ - url: "{% url 'mumble:release_pie_chart_data' %}", // Your Django view URL that returns chart data - method: "GET", - success: function (data) { - // Replace chart data with the data from the AJAX response - pieChart.data.labels = data.labels; // Set the new labels - pieChart.data.datasets[0].data = data.values; // Set the new values - - // Update the chart to reflect the new data - pieChart.update(); - }, - error: function (xhr, status, error) { - console.error("Error fetching pie chart data:", status, error); - }, - }); -}); - -{% endblock extra_script %} From 5148b1914dd9c6d14f96fd8aed5dc56250d9a3cc Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Fri, 4 Oct 2024 13:56:37 +0200 Subject: [PATCH 07/85] [REMOVE] Duplicate menu item --- allianceauth/groupmanagement/auth_hooks.py | 2 +- allianceauth/templates/allianceauth/side-menu.html | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/allianceauth/groupmanagement/auth_hooks.py b/allianceauth/groupmanagement/auth_hooks.py index 318d2095..07a11252 100644 --- a/allianceauth/groupmanagement/auth_hooks.py +++ b/allianceauth/groupmanagement/auth_hooks.py @@ -49,7 +49,7 @@ class GroupsMenuItem(MenuItemHook): MenuItemHook.__init__( self, text=_("Groups"), - classes="fa-solid fa-user", + classes="fa-solid fa-users", url_name="groupmanagement:groups", order=25, navactive=[ diff --git a/allianceauth/templates/allianceauth/side-menu.html b/allianceauth/templates/allianceauth/side-menu.html index 408b9d95..72c7200b 100644 --- a/allianceauth/templates/allianceauth/side-menu.html +++ b/allianceauth/templates/allianceauth/side-menu.html @@ -10,11 +10,6 @@ {% translate "Dashboard" %} -
  • - - {% translate "Groups" %} - -
  • {% menu_items %} From 6397cf358a40f2258976201deabfdba9252ab5e8 Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Fri, 4 Oct 2024 12:06:53 +0000 Subject: [PATCH 08/85] Updates for project Alliance Auth --- allianceauth/locale/de/LC_MESSAGES/django.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/allianceauth/locale/de/LC_MESSAGES/django.po b/allianceauth/locale/de/LC_MESSAGES/django.po index 0e9aff60..976c7654 100644 --- a/allianceauth/locale/de/LC_MESSAGES/django.po +++ b/allianceauth/locale/de/LC_MESSAGES/django.po @@ -68,7 +68,7 @@ msgstr "Englisch" #: allianceauth/authentication/models.py:72 msgid "Czech" -msgstr "" +msgstr "Tschechisch" #: allianceauth/authentication/models.py:73 #: allianceauth/project_template/project_name/settings/base.py:101 @@ -108,7 +108,7 @@ msgstr "Russisch" #: allianceauth/authentication/models.py:80 #: allianceauth/project_template/project_name/settings/base.py:107 msgid "Dutch" -msgstr "" +msgstr "Niederländisch" #: allianceauth/authentication/models.py:81 #: allianceauth/project_template/project_name/settings/base.py:108 @@ -123,7 +123,7 @@ msgstr "Ukrainisch" #: allianceauth/authentication/models.py:83 #: allianceauth/project_template/project_name/settings/base.py:111 msgid "Simplified Chinese" -msgstr "" +msgstr "Vereinfachtes Chinesisch" #: allianceauth/authentication/models.py:99 #: allianceauth/menu/templates/menu/menu-user.html:42 @@ -1664,7 +1664,7 @@ msgstr "Anstehende Flotten" #: allianceauth/optimer/templates/optimer/management.html:44 #: allianceauth/timerboard/templates/timerboard/view.html:62 msgid "No upcoming timers." -msgstr "Keine bevorstehenden Timer." +msgstr "Keine anstehenden Timer." #: allianceauth/optimer/templates/optimer/management.html:52 msgid "Past Fleet Operations" @@ -2804,12 +2804,12 @@ msgstr "Entankernd" #: allianceauth/timerboard/models.py:58 msgid "Abandoned" -msgstr "" +msgstr "Aufgegeben" #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7 #: allianceauth/timerboard/templates/timerboard/view.html:53 msgid "Upcoming Timers" -msgstr "Bevorstehende Timefr" +msgstr "Anstehende Timer" #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:15 msgid "Timer" From 0467b23a1a59e18dfa67daa51921bc572a29364f Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 7 Oct 2024 15:42:51 +0200 Subject: [PATCH 09/85] [ADD] Missing Mumble migration Running migrations: No migrations to apply. Your models in app(s): 'mumble' have changes that are not yet reflected in a migration, and so won't be applied. Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them. --- .../migrations/0013_connection_history.py | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 allianceauth/services/modules/mumble/migrations/0013_connection_history.py diff --git a/allianceauth/services/modules/mumble/migrations/0013_connection_history.py b/allianceauth/services/modules/mumble/migrations/0013_connection_history.py new file mode 100644 index 00000000..aec4b55d --- /dev/null +++ b/allianceauth/services/modules/mumble/migrations/0013_connection_history.py @@ -0,0 +1,37 @@ +# Generated by Django 4.2.16 on 2024-10-07 13:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("mumble", "0012_mumble_client_info"), + ] + + operations = [ + migrations.AlterModelOptions( + name="mumbleuser", + options={ + "permissions": ( + ("access_mumble", "Can access the Mumble service"), + ( + "view_connection_history", + "Can access the connection history of the Mumble service", + ), + ) + }, + ), + migrations.AlterField( + model_name="mumbleuser", + name="release", + field=models.TextField( + blank=True, + editable=False, + help_text="Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else.", + max_length=254, + null=True, + verbose_name="Mumble Release", + ), + ), + ] From ffedc4103d8b5eef72dd43c0140d198359dd049b Mon Sep 17 00:00:00 2001 From: Aaron Kable Date: Mon, 14 Oct 2024 19:22:46 +0800 Subject: [PATCH 10/85] fix max chars on duration --- allianceauth/optimer/form.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/optimer/form.py b/allianceauth/optimer/form.py index 3a870a08..856a36a4 100644 --- a/allianceauth/optimer/form.py +++ b/allianceauth/optimer/form.py @@ -15,7 +15,7 @@ class OpForm(forms.Form): operation_name = forms.CharField(max_length=254, required=True, label=_("Operation Name")) type = forms.CharField(required=False, label=_("Operation Type")) fc = forms.CharField(max_length=254, required=True, label=_("Fleet Commander")) - duration = forms.CharField(max_length=254, required=True, label=_("Duration")) + duration = forms.CharField(max_length=25, required=True, label=_("Duration")) description = forms.CharField( widget=forms.Textarea(attrs={"rows": 10, "cols": 20, "input_type": "textarea"}), required=False, From c5918b9b3c8a0efc5e920894a2c046ce56da1b04 Mon Sep 17 00:00:00 2001 From: salartarium Date: Fri, 18 Oct 2024 02:29:33 +0000 Subject: [PATCH 11/85] Use https where applicable --- README.md | 6 +++--- allianceauth/eveonline/evelinks/dotlan.py | 2 +- allianceauth/eveonline/evelinks/tests/test_evelinks.py | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 5e9f5e94..1b4232ea 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ [![django](https://img.shields.io/pypi/djversions/allianceauth?label=django)](https://pypi.org/project/allianceauth/) [![version](https://img.shields.io/pypi/v/allianceauth?label=release)](https://pypi.org/project/allianceauth/) [![pipeline status](https://gitlab.com/allianceauth/allianceauth/badges/master/pipeline.svg)](https://gitlab.com/allianceauth/allianceauth/commits/master) -[![Documentation Status](https://readthedocs.org/projects/allianceauth/badge/?version=latest)](http://allianceauth.readthedocs.io/?badge=latest) +[![Documentation Status](https://readthedocs.org/projects/allianceauth/badge/?version=latest)](https://allianceauth.readthedocs.io/?badge=latest) [![coverage report](https://gitlab.com/allianceauth/allianceauth/badges/master/coverage.svg)](https://gitlab.com/allianceauth/allianceauth/commits/master) [![Chat on Discord](https://img.shields.io/discord/399006117012832262.svg)](https://discord.gg/fjnHAmk) @@ -14,7 +14,7 @@ An auth system for EVE Online to help in-game organizations manage online servic ## Content - [Overview](#overview) -- [Documentation](http://allianceauth.rtfd.io) +- [Documentation](https://allianceauth.rtfd.io) - [Support](#support) - [Release Notes](https://gitlab.com/allianceauth/allianceauth/-/releases) - [Developer Team](#development-team) @@ -38,7 +38,7 @@ Main features: - English :flag_gb:, Chinese :flag_cn:, German :flag_de:, Spanish :flag_es:, Korean :flag_kr:, Russian :flag_ru:, Italian :flag_it:, French :flag_fr:, Japanese :flag_jp: and Ukrainian :flag_ua: Localization -For further details about AA - including an installation guide and a full list of included services and plugin apps - please see the [official documentation](http://allianceauth.rtfd.io). +For further details about AA - including an installation guide and a full list of included services and plugin apps - please see the [official documentation](https://allianceauth.rtfd.io). ## Screenshot diff --git a/allianceauth/eveonline/evelinks/dotlan.py b/allianceauth/eveonline/evelinks/dotlan.py index b782eabd..ad295193 100644 --- a/allianceauth/eveonline/evelinks/dotlan.py +++ b/allianceauth/eveonline/evelinks/dotlan.py @@ -10,7 +10,7 @@ from . import ( ) -_BASE_URL = 'http://evemaps.dotlan.net' +_BASE_URL = 'https://evemaps.dotlan.net' def _build_url(category: str, name: str) -> str: diff --git a/allianceauth/eveonline/evelinks/tests/test_evelinks.py b/allianceauth/eveonline/evelinks/tests/test_evelinks.py index 32f79f05..09aa30fb 100644 --- a/allianceauth/eveonline/evelinks/tests/test_evelinks.py +++ b/allianceauth/eveonline/evelinks/tests/test_evelinks.py @@ -31,29 +31,29 @@ class TestDotlan(TestCase): def test_alliance_url(self): self.assertEqual( dotlan.alliance_url('Wayne Enterprices'), - 'http://evemaps.dotlan.net/alliance/Wayne_Enterprices' + 'https://evemaps.dotlan.net/alliance/Wayne_Enterprices' ) def test_corporation_url(self): self.assertEqual( dotlan.corporation_url('Wayne Technology'), - 'http://evemaps.dotlan.net/corp/Wayne_Technology' + 'https://evemaps.dotlan.net/corp/Wayne_Technology' ) self.assertEqual( dotlan.corporation_url('Crédit Agricole'), - 'http://evemaps.dotlan.net/corp/Cr%C3%A9dit_Agricole' + 'https://evemaps.dotlan.net/corp/Cr%C3%A9dit_Agricole' ) def test_region_url(self): self.assertEqual( dotlan.region_url('Black Rise'), - 'http://evemaps.dotlan.net/map/Black_Rise' + 'https://evemaps.dotlan.net/map/Black_Rise' ) def test_solar_system_url(self): self.assertEqual( dotlan.solar_system_url('Jita'), - 'http://evemaps.dotlan.net/system/Jita' + 'https://evemaps.dotlan.net/system/Jita' ) From 4210b2eabc3d9b013f6cb7e07a79997e0d8dc8ac Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Mon, 21 Oct 2024 13:00:43 +1000 Subject: [PATCH 12/85] Version Bump 4.4.0 --- allianceauth/__init__.py | 2 +- allianceauth/locale/de/LC_MESSAGES/django.mo | Bin 45580 -> 45742 bytes allianceauth/locale/en/LC_MESSAGES/django.po | 50 ++++++++++++++++++- docker/.env.example | 2 +- docker/Dockerfile | 2 +- 5 files changed, 51 insertions(+), 5 deletions(-) diff --git a/allianceauth/__init__.py b/allianceauth/__init__.py index 91b57af5..2620a79d 100644 --- a/allianceauth/__init__.py +++ b/allianceauth/__init__.py @@ -5,7 +5,7 @@ manage online service access. # This will make sure the app is always imported when # Django starts so that shared_task will use this app. -__version__ = '4.3.1' +__version__ = '4.4.0' __title__ = 'Alliance Auth' __url__ = 'https://gitlab.com/allianceauth/allianceauth' NAME = f'{__title__} v{__version__}' diff --git a/allianceauth/locale/de/LC_MESSAGES/django.mo b/allianceauth/locale/de/LC_MESSAGES/django.mo index 4d50f2b8385b929db945bf77dda2552857d611b5..e61c2ae63d1b34a3434afb32716903444f7d5f51 100644 GIT binary patch delta 13004 zcmZA72YgT0|HttwvJkQe8RTmvf`phsj0h2J>>Z+3A~7N*TH4fAMXjK;R;$!3T5UyZ zwMx;}>`+>xR&7<)s-jx|*ZX^q-^1g7AHU;y);;%}&pG#g>Hk0LqQ}Nd9`>0a&o?Zt zZXT8uft!OYt737>N~^9~%i0xhStD^bs=ZD<%W`2F_Q#Q!j)$-%M%TA2ZybsxFc*_? z90uU07=(wNcH25frVJI=Q8(Vl2B<%pLPJ!29{S+(=!-Un<1`G#RTzRhu_7MBF#HoM zV3~%N<%Q9xiNs=Q%eJf*WJ*zy=B}`;-lm*|{?w1gk~qoK7h)vk#aI)!q554!J>U)o z;{$X*xRDdFXw<}0Q4{Zi2|V8#Nu~*|!NzzFnY2}bLNn}u2{;{TvcABscpv*=8jXW+ z9V+C045ko=AUkQrpz32$k#3A3n1Z%CW{^>+@=&3fiGKJNYNqS3GVVjI;0kIhemCWN zsN+(M{ffnC)LH0(?56bww#WTg8iQGtB2~E=@z;RSRA|7usF^09I=03M*clb#Z%`9F zi<Wp+sB>r8iP+o*ag$^BN?R(UefloL=Z z9AL~wO)L-HuODjWg~r9GNUcUiXaj1cAEQFP9bNb}s{I;j0)L{$^JuLtwdqWzA{8}J zdzp%nIMCg}vR=k8%5S5#WE;A07iwkaQTP9b8rYA|o%XgoYMeyWR`f&NKN_`=@#w?z zttn)*r-fJ<7oaAx6*cqkjHgijE*XDA9lF1 zXf*m_1N6q`rrgGqJJ@8jcimApj6=GNU^ec1%6U%Q)0Q=lvfYe~W_ASix*aoKL2bc((;l4W{OE+C5A`Eadpj1j zr&CZ9oq^iQxmXI9pw7-3{1iXMnmE3L`-5j&tH|)XV4XrmBBZ1H+h8?CJ*WUR!O5ry z%tT*&3-#dDsEDjbJ#Z^3a(hwzenL&?JeI*5SPvgyklz2;PR;{bp>Al0e%KjxiZf6T z$U{wN0&1mGQ3K9GP4G?BgjS#?uoiWucA)xyi5l+^s{dImt@r;j84Yv?wZh_^opM>! zja5-^MU1IWLVwDgQLo(q3_u%e<6Mlz&rpZ<25Ld2Ik{Ru7%s&sXlsVMOv6Fc43A&cF=R^OmEwWJ6ctuZoYU(1&Fg z>OI|qdhJf4zJw2u<6#ANbM|;3##0`Nioh~-;ZD@g^jXw64^j6AcXtkRZPbKQFbMm0 zC;s|&=TZ@fvrwUZ8+GGG)LZZs2IG0uS@_FXyoa-rKvV?6P1%KtL``E8)VQgrh4n^l z$vB&gLOcaEz)V!g<{B3nm!k%J7klFt)CvN6@;79xiZ!th>JU#xorOXyhucwa$G52Q zPh$Yu7s+Vle;IvxIUx!~-57`A*aj7W0j514wRO``1HXN2qc3pcZff z6~U{>L~ZLX8O`VsDgr(%Pp8%owURj00F6;0>wrx#9Tm#gQ3G#AO<)h|z5^JAN3j7u zKz(QG^l>IO41M(e7m#t$Fd3t9HP*tz?hbqbQ7bH#?yRgdR-jxSL$EGt0_{){>WMBK zhMM3^)B-l3Cbk&E{ z;aC@6$8g+-ip+WARn$app{)lN@8|4E5Qb59p&r}}<1iJ&@pMeSN zib%x_=l%w$2_~WXb;Gha6g8oO4C1dne}xLIV486;Dgx_Kq1uB_<6+c;L;E`qsDkAw z*FhJyL!G5;RKGmbTQVLs{wz$xrKky9@6Z10hTBvqr1w!X^nAwY5NdScFzTaCc^+zF zi%}C;iHh6~)Ps(rB6|h(pu4E8`4{V9)BxvseQYxNFbqL;%*W#RB5FcvSN#ms-oJ*L z;8Noz)UW1OsPD)Ptc|y^304~D{JWwz>Tu7&X1E2vK>JTJgNj+!Cxgt2hd2YdP!otU z#-mo8XxdXydz*$@aevf8Mxows8$GcQb>BQ3i*I3F49avz!nTshRHx!Oj8X@zf_qRa zzKn{%AE-llAN3&bEXNRIl(7-&5T>9OkYUQ%s551wCcMa9Z}YEPGMecw)36UU4%L4OY5@zeIM27%l4*n+Faa-M zG=^t8kx0f?l(VoFuElsfih8hDj`MoD@I}gr*ci8BL;M{_V-zP?6I+Zua6Q`f$ymdk z88tv1rZ%WUn2kEEBhVL@p+fquu?W2>?=?p}5T^qYubY)O&pc^{KUNGb*y;fFGbHduU&^KZda)XHaLEBp@I zVNkx)FCEps3as=Wo4)bIaOWYn<-*2f8$ikq+%{)3${k?HDzg{X-wMNMoi zYT_T7`mLx5eu10tN7P==V3onR%D5Fn^!^_rqtO3?8t58oCAU!ndA{JxJQT}Qj>4MQ z0y*GT4)Q`X~ay~F4kVRT6Q1^vTa6%k~dSE?cqA>-vm7OOL{}eL)O~Y!`03V=2wH@{T zA3;UpC~EJnn)W*wK-rft24X1sVJ%by^`BSe(-?;Ox!1VkQR5ZbCbPo01$DzA)D34* zd;Y-Gmz?N4up(BWJ`Q8B3u>h=qPB1fYC?sm2`@8lFm5sKvB~JhZ%}981nS1KsMqc` zDpVmaI}fggT46)f1Y2V`W}xbDQI((h3#Jc)XXE~Czr|0_=a7}S>5NA+)kT4)Ng6}FW|rV|IR-!(oTTm0(iJIuwsQ$N%_fTh|7)M-(Gzb-eHt2yFn27_hmEQj^ z$>;;&GsOvE0_uUCP!k%A8gLAH;$-x~>8J_KL4|SwYAaTwBCs2^m8Vc=>L#k6HPz8y z@_efj89gu-)iDVb((b6x4?qn#!L%b6Z*2K&_<%_Ynb|m=tH>`#$YOHOGcv(WdUkI3(*@lpdzu!xEIS& zK0b~3E5yH2q0{>ivoUx&uM8I8U5uE)e@IgOOy_Obh#M$>ike9FEaw4vsDUS;-tR@I ziM@}n;TBVFU+7G*TOsk+42M$Tg}JB!^HDbzpe8mIPvTN+h~s8EziJyXiSnOV2OG|D z{=Sfjr6})4jei&wksnawUN!z zJ1N&j)!#r(@Bs#)=j%?W%cHimmN6a!DK|#F740!V@BdITTKPD4g=M{jwJ6U}$7d7A!)BX#VqkI?3qu&xIBGpilXpSM6fx0grHQw|k#9!~} z5-RlIHKyYS7)tp|Q$B~f;cs-mMsGUrbp=!eB8|})O}P##LcLHE8iJa50XD^{sD8U` zGQni7p(gMzs-yQ?PKN;02POeq;|r)2e1_`(J?dP)N;YP^A{tsIUn z9FIC%_7XA*%{C0jZ!sQ!MTM@?+s+|sff}fvDQBT3Fd4OgLR5s_!7$u}+T+8<)2K+_ zK)p48BU@`*9?P7Nmcs@#RL2BNM;FdV4ZIokKJPW zK^L$%UPDFXrm449JNMd%Ec#IOy{M5?3CMjg~yNwnJQ%Vqi*~a^?-Y* z(3O1O*~>80VT?shECoF<9cyC-w#6B!FWa|R74KmOjM(VB-ovmtO@!Kg^MFaT?#CpI^>Htp?Dd)y7Zus^zAJ5-2Apza%kI!oh>1sF(qBI+Nm z);u!0@lDi#E0IHO{mmceF`76RBd>#_>uCoo4?C+PSCnyv^5V% zjT!Sp%Jy>1X*zY)Ahj^1ao- zl|*?u^$8eCdVHmksX^J#)afi}yIv!8@*w_2WOUUx9rPo#fz*V-u8`75-n4bZH>jV4 z&ygNqI#lJ%y#uHpP146p*I80c(hkxePu%klWnGPJDi@LpNqa~?k@nMY4#OGr3w(Ty zBL6k1vUylX8tPDf1ru>0_C*~wUB^kgDeHQGg;>kndxvrxlD*G#P^UH|y_>o!Q~wF- z-R(w-Bn4CFYx=jxr%e6;2Gbsfexya@7h@OF)1+!VG?4T<_3J6;lCF|Q7SsF3rB7=J z6~Ccgy)Zftqx>@I@%7N;kC=*ltYz{q(6*GM|0hQGs{>WY*CmCM-%DE`458cvb@`KD zQ;ca3rEwht%wk~E9F-dtTNq!QGXBk4Lu`kCZn*a{?F z+fCaCc+IJD|DQTc)*48?zL^m?$n>q_+-qA6%pfgk*g?8sI)rdTQ`*{5eusQ{+>Xt# zB&iJf$JboSK@?WtL<~oL#M4Qikv^xa>y(3jr`^|~V$Qx;`{}TO^efeka1gd69V1`U zOi*{6r|gFXSem4(lY>=&$)q^?XVcb?{3TK|%3~>a#E&qG^c4B;@Ti_YgiL!XqHzgH zR}vm4O(2b@tY3_~Z*uhr^V=AU~7z8u{AvI%xXL#+js^q&GPVQaPjk*0&Gvv$()Gg7vxxPUb%w$Abg=a_=$m?oMIznEdPt|wvk!je9rOag3k`E*$kh<$GuCk=3NNZH!s!E#&{r|+O zI1$H_9$yh;E|OAdiy^&A+d0a+OrQGX?ScG}OZt!WHA&Y3I#j{Eq^hLmlsz$)q^lBx z>Eid>`j)m@r0e8ckmi$qB0YKCqg~fFk{0}fDIZc0`cnD4sYo*euQTOJ#_Bj#BXE6b z>gqVf|NZ%%sehlEXUM;A${$lcLEhW+y!yX8I5XM={oUs;(r(l64V`^RSxX; z)y)Lk;u*@HD$&*nf5%viA^Dho^TUrSVIl} z@A{5%8#8!u`X!T}f?KE`hm-Mu?lFBF_GnBmG0Z0~1<_|Ct*%<0+G;i}e91g+5PSV=0`b&%1a5ci{`9$5#~n z4^xOhyO_E8UplU(vYF{socav%-<$HYSl;9()3-Oti$3*8O-=n)%%pw>mNa$sC_i~k zpiq{3(y1S({jWgEMwX~q&&^^c^Lyt zy{e|0`T@Aqa4W{$}$s?t9zu*BG`p_xN72W93KO&zsApj7uUgR{9i2Z}mQ z{K&(jJ&Da<_uo*KOGYn(4iD61e4qIVz$f@Sgfv-bOZH_q~E9XR5 zPB|t?qDVz*Iyjev94eLH>%HsJ!~cIj9+&6!xvuNJ?(1~l8@2I*Tj6;(*V*#!a~-Y@ zZjMt0=ahGxu+om>S3{+aGd9t22H`kV{cjkKe)SwD2kT%rEX3w`2|Y2UzT-TC@tBT{ zupGXE<#8I8aU7TP1{vM(E+*kNOu=7lc{GJy#C6ac8(?Kj#SrXSb(9p4lCh7 z^uS`&0M4O5-a=oV@3=KE1!d5eiYizZYoZS}vgPSmjkp8W!Xc=3i%<`E8v}6@mOL24 ziHlJK{}(lIuVnhfC~VC0ogQQw;yh$f&S%&JOH-(Z&5-gu zSO<$yXTX>JWA~i4*alswCI1AqQm0V;6{oQN>hK~3n!z>O@DChA?8!1{i6^24I2SeY z)u@5)M0I!w-SH@D3s2bkVpP9Bqwc?jIwKxU9p`b3YRdZeCo`M^?cMjN4t~cFypL5d zq?zd`8J{O^ft9cbgYYP-{g0?Ka}PCR&s4{W!ywcOrD1g(g0VQqMMitO7d4aHsJG!B zYUFOLr&h=hwPZo4@-XBWI5D<9*VaFa6(}EyT9HYp6)ZqaY%x~EH5h=dePpzxCs0dz z-o`gjhsM2yIW&Q&C9Gv_g1WDrjdN{06m`fZp!!>c>SqnAd>e-2F^u8)&NVWcVQ`wU zDr#iWSn~RzMxJi%fLej>s2S#=mU;k&<0w@9Lezs-p!(T@+R8l`hG(#n-v2+yRHGoE zrD>3ep~Ts!t>};8I21LbS*Q+{p*r4;+S89w{ai(Dfghhe-5-gXKrCva4NzOz3?q2H z(~67^Q$N(m$5{(d4d+^yp$^*`jKbZv{0G!ZTtN-+8tN?FLp`umhMB-4sJIrY-+JiM z9yTEpi`l4=k3u(`j+rb9V|JFt;`ApqT-sUEog|^vX-br))UoFKI*leh-$wO z)qX8%ONv^t{u;?X3bc2pFaqzQJ`f>~@`DBkqB?jRJ#i=M0sBz{J%L)%v$p<{jj!4G zE=E!RFRFcHYct@wE;1Tn7J6U~s^dPWnGd(|1k?cLpw7SwWH+20I354NpRlkE=Lm;n znFpQ5*~Ax610U7azV{EDMMhh&0@Yv-cEp3|g%#VGt*M6E)4HgECZYB+1${9Cb#@-Z z-PjjvVN`qbfy+j|>dr*eO6*5oJePBxj2;x7Z3YmJT7d@Wjjd1*?tuQ-3H88UsFfRx zYBwG=paLv|bFm(-L>48+dgv4+upKs3vNr30MY`Q5|HW2GkBU zfXC4X^HA-Fq8>N`)qW~!;4@MEEJICjgJQk^d&%g=W2nP;QWf|Mmc_qNubt0h=Ehiz zBTm6O_$=zs&P6}mj+($hT#83g102AKR{3z$07s)MfXqxX8o*oDwW#uqs88m8)S)Xz z&HN^6fOoM5dUiA&$Dz(Z66%3js4eMi<6P8tWdQ0m9n_Ka*K7AG1^NQ6M2>^A2erq( zPdH8@Rz$5p8w|&OsDVvIb+j6F{~pv~{u(vl>sTH=I+;&)B@7@=My+h?POQIf>`H-d z9EO2dfZDU=)(xnc>_V-;M>al!T8S^M=TIHrL`}@Cvwh!DD_j?Ke*@H3q_}LRr8NuH zVMpwW&!A@TJ~qH(sMo4=7juf^QD>ncR=_@}m3s;GfJs;mr=w=R+`1Wqh+Q9&(T%6E zGG0TifX|brK~>aV)<<=miaOO5Mt7D$OPPx5I0rR=L8y-NF&al>60SsjXud%WEa)lo;Ajjdj>j16 zfVK7hkF*U|pk}xpHM8wl2|vJKJcAm*4b%$huRY-qgc@K2)C4-C1~w4YPd;kqV^CW$ z3DwVhtiI11Zg z5^5#Jq1sJBt>jG9z!uy3O*yQ;8g8dx0PeLFvAJeI38)9Bpq8v7>Oq50OF9O1|1{K= z%)xrN2lc?~sPDl&R6F0N&0o#Rqw0fQWK+Vh&I5hhvNpnhEDpgthuF%G9-W88|# z_#5g}M?Yi!?wE}Sh+o5ArTD7$GSAu6+w`*?H2~Khn>mcyf|IsEF=|iGp=Nv=H51Q1 z<`4y=_Ov?czE~WN^)Uh0p;qDy>Su(1o_S5{V$dM&r(%XktSVu$|bXToHBo_G&xUTlV&#=xzFXE-vRRdXnb+my3xdk<{ z?WhOsvJDSgkD~^78V7Q!&tYrg4ui~xX#r|0x1m<#G%`u2?O?M7+t8o*SMDnw3jL4J-viFcbCN$VI)*BT-veh&rTe zQHS#b7a5J{v~6$^^+UvMn6VP7VZ4nqQ5|G&$P#}NF&dKIe>d%j{;CJNPGJnG+{oK|F7;6zNsL)ZZSKql$Lk2W{1L2bbn z)C2cg4_m)LZRK~^3V*iciDS(DO;9V<3f-~W7}j4)kxPL(&bJN5VmabD7=Wu#d%PXB zga@ssFqHUbRL34Hr}_)A##_@-_jN_JABfuWNiJJ45B0!x7>Vy=EEc0?>NVEvVE}4C zA*cb@wl=h;quO^s?fp}z_PJOchoM$z9_o23U1T(~t*DV5z{*&R+Uq|t49kr(_3>DV zxDD!%_QD7pi28+O8dk$4sD5{&z6+mV99~ED7dGAu)YXKH8fKzSX-Cw|x}jd5zNo`A z12waCsMo6q)qXE(riV~la1^WJ52yj&N458!VCnN^qgq6 zpaN>&8Pu< zf@=Q-YGuE(vFj!oeUbh~jm(GjRfi#{xHjs6DX0%q7HS}UQ8OHeak$LJpQ2`V85>~O zY<_;=6R7^iqYmXP+^hG0iLL1Vx*6dBEKh@c)KX7I?df9cn;1a62K83##Bz8FHS^0h z{uOHz|BG6gT60Xl^-vSa#4>vSJCo6f`k*=(f|_AI*1#E94Yy){{0jBJ=5x(k^B6`E zzl3_=GK|0@sQa#>zKDMF%+HqEs4dTyJl}bijBXrjE8ekwgzDfdYNr39wxG&<^L{r% ztyCsz;9XHO?TOm!Jk*j8L2dCE)XWPp7MEbj-~SJh(Tyij9er!#AFP+H*D;9tKX3^8 zFE9@njha9qhT{&@q5B3C@F&zj0~eZ=i$)Ew;X>A59i~yB23@cM_Q#6o!b&(FwGx{! z7>}dwyM)?`ztI={7nui#pxQ-Z2sXCy6R7qBP%H8BBGz9Yjsgm_0<*1)FoyUo^ur^l z0i8mP{5MR&KT++H7MsJ`12yxZsCF-+>L*|tuE&=6D{2A>t|jJ%OpK%;8?`sXP)oNM zHL#8`W`7 z)ZX<+?bTSUhqF*CbP#*sCDh7fykWiv?J%4;2X$s#sD2lqCbkB3wsxWVKY^Y+-??0p zVNX#rxr6$^Jo2Vlfy$_vCSw;&Lk)BRs@+P|A=`%4@i=OUZ(Hx9Ci2Kz<}an8s53VW zy?MSfhm3AmiW=D()Xesx8Xm&2c+AGxE6kR4Mjgr=)Siz(J!m#+<||NJy9Hx$7dF8Q zs0l@^WRdldH`DV%D0D;!zJsLJcq#wdC2hz8h*UpGM7igpDVo_IfF5 zBAZbI--^7c&VFow-Pf7JIZMCqCsS~Q0$J*9vqX(hH|C=T;zI59RMdkPqgG8W>KTf$Ap@b^k~g8GT?1ZNWnHCEkeY@O_NM6R39gP+R5wj@kRN z7)cz1zLqJbh4@X>fNE{xCoQI6eV*?uC!;+)iBWhSwdCHL z&A`f|KXG&P#`frkT~I60+d9CO4@0fQ7*xNnp*t?NzG3TEp^x7G&15`iup9N-9YA$_ z1a;#H)M5JCdIkfC&!Pr&9d+NI=!2!Uknnf@IEzuN^S`M5)|F)_`3c(IrIuV#)~Qx4 zwXP1NX{7#?*CR!fze}o5ryGcelYfb%YanScWj9C@N#}_Nkl0Zto>*5|Z93Px#J{2I zO9iC46#PUgOKL&-o}`N(3r?WDX`wBvM|_R)=Sj;bt48vnOskM?+l<9GiRX|$BLpiQThF0#){&BF zcaGGCN1FzlMlk}*a*Ey`qVwRrV$4aEJtlrC9H@~k=`fmCf0S@;H~|)%r4yB3?wgN&XjGet>uhX_Ji$u?p#mjR#YgLZ7!#S1VFK zQWxrK#+HPUqQHEDI&wkg0Vq$fzTNeLufWoXl#{4DZ6 zmz3~+Ql_hkbujghlGl&S{v|bhB((pPZ3A28?4sfOq-Slx_gI6tIcWmv!BvO+ID&A} zF!GJ)=X1PG`~#^rDUA3keoLxAURN^dQ}SalQ=heawqh%K*}<$NUxw6x^n~u>3M925 ztyI7jPTjwx-$>QCZ#0e|J-8~9`H_@CT@BK!)D;u&v2E&+cRkG?gGl#CACYvuPJ;;i zfD}neA=VH0IFhbVI@853AkH!BYLYII*RMOXNnep3zHU*kYa8hm@+WNkiT1x6h55Fi zwe5JdjVoItaiV(Q`p}leoAAFs*V*#*l=L9~wvCI3zasBxTVD9@4*m+I^RHjFZj$!e zila1kC*?iV@Nx1_Q5Inbn1*MFcPdfW4u8d37)>f|+sz>V;95)OG2#GQ){ZtM|67w9 z)F2Hbb)zzt)Sk*1Rs6r}GvXGubBA`#$&bhPC?Ad!@MF^7gVX_Qu}C7sx+uW5WM)^&y&JOLpPUv}=G@r5)f<^1qVm5Z|D#FUg&J z6waia%jHZabAsGoq*3G#;*X}%IgXDJFR^hVh7mt}J!*qs+vXc$Kbv2VPm{i;tQo#Z zN+6$w^Gohy|6>`^VS;6(#^hfusW5-kvH4?Iikoy*GdTNkDP`Z<^7k-;lw<2fOX5Mc zUU6xg|5E|i7M@>njo{CQqy;pXgo&iPN=B3(Lp?^u`S<f^yvRB;_Nu|8*(oNYIybo79{*6m?xEdE0!=k`n%{jJP4`ZQ_IIYwI@> zPquBwqQ5Oy(G>l`l}lP&lH+^8ARM2f1Bu~oMOW+Z^e1Meoi3$*1Vux7K\n" "Language-Team: LANGUAGE \n" @@ -519,6 +519,7 @@ msgstr "" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "" @@ -714,7 +715,6 @@ msgstr "" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "" @@ -1856,6 +1856,48 @@ msgstr "" msgid "Deactivated IPSuite4 account." msgstr "" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1865,6 +1907,10 @@ msgstr "" msgid "Connect" msgstr "" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "" diff --git a/docker/.env.example b/docker/.env.example index 75d9da3f..e02ab228 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,7 +1,7 @@ PROTOCOL=https:// AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN% DOMAIN=%DOMAIN% -AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.3.1 +AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.4.0 # Nginx Proxy Manager PROXY_HTTP_PORT=80 diff --git a/docker/Dockerfile b/docker/Dockerfile index 61801557..20f431e1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ FROM python:3.11-slim -ARG AUTH_VERSION=v4.3.1 +ARG AUTH_VERSION=v4.4.1 ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION} ENV AUTH_USER=allianceauth ENV AUTH_GROUP=allianceauth From c0f0f8db738648fc6ff0da46dd36eafc33d74b7e Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 21 Oct 2024 05:35:22 +0200 Subject: [PATCH 13/85] [FIX] Make chart labels better readable for darker themes --- .../templates/services/mumble/mumble_connection_history.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html index 536e3d39..03fff3bf 100644 --- a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html +++ b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html @@ -147,6 +147,8 @@ }); // Initialize empty Pie chart + const elementBody = document.querySelector('body'); + const elementBodyCss = getComputedStyle(elementBody); const ctx = document.getElementById('pieChart').getContext('2d'); const pieChart = new Chart(ctx, { type: 'pie', @@ -180,6 +182,8 @@ } }); + Chart.defaults.color = elementBodyCss.color; + // AJAX call to dynamically update the chart $.ajax({ url: '{% url "mumble:release_pie_chart_data" %}', // Your Django view URL that returns chart data From 66b97835d485b58b0a571d820b7d3172de30b08f Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 22 Oct 2024 18:51:30 +0200 Subject: [PATCH 14/85] [FIX] Language selector --- .../authentication/templates/public/lang_select.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/allianceauth/authentication/templates/public/lang_select.html b/allianceauth/authentication/templates/public/lang_select.html index 05883f2a..e581a335 100644 --- a/allianceauth/authentication/templates/public/lang_select.html +++ b/allianceauth/authentication/templates/public/lang_select.html @@ -5,11 +5,11 @@ {% csrf_token %} From 5507c30af4c2ef5d58263b654a4a5d3462c231cd Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Thu, 7 Nov 2024 10:49:31 +0100 Subject: [PATCH 15/85] [CHANGE] Use language local name --- allianceauth/authentication/templates/public/lang_select.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/authentication/templates/public/lang_select.html b/allianceauth/authentication/templates/public/lang_select.html index e581a335..7f641524 100644 --- a/allianceauth/authentication/templates/public/lang_select.html +++ b/allianceauth/authentication/templates/public/lang_select.html @@ -9,7 +9,7 @@ {% for lang_code, lang_name in LANGUAGES %} {% endfor %} From 9a6472831146176dee0883e8a9d4cbf466409a63 Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Fri, 8 Nov 2024 02:43:11 +0000 Subject: [PATCH 16/85] Updates for project Alliance Auth --- allianceauth/locale/de/LC_MESSAGES/django.po | 50 ++++++++++++++++++- allianceauth/locale/es/LC_MESSAGES/django.po | 50 ++++++++++++++++++- .../locale/fr_FR/LC_MESSAGES/django.po | 50 ++++++++++++++++++- .../locale/it_IT/LC_MESSAGES/django.po | 50 ++++++++++++++++++- allianceauth/locale/ja/LC_MESSAGES/django.po | 50 ++++++++++++++++++- .../locale/ko_KR/LC_MESSAGES/django.po | 50 ++++++++++++++++++- .../locale/pl_PL/LC_MESSAGES/django.po | 50 ++++++++++++++++++- allianceauth/locale/ru/LC_MESSAGES/django.po | 50 ++++++++++++++++++- allianceauth/locale/uk/LC_MESSAGES/django.po | 50 ++++++++++++++++++- .../locale/zh_Hans/LC_MESSAGES/django.po | 50 ++++++++++++++++++- 10 files changed, 480 insertions(+), 20 deletions(-) diff --git a/allianceauth/locale/de/LC_MESSAGES/django.po b/allianceauth/locale/de/LC_MESSAGES/django.po index 976c7654..72b8b12d 100644 --- a/allianceauth/locale/de/LC_MESSAGES/django.po +++ b/allianceauth/locale/de/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: Peter Pfeufer, 2024\n" "Language-Team: German (https://app.transifex.com/alliance-auth/teams/107430/de/)\n" @@ -547,6 +547,7 @@ msgstr "FAT löschen" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "Benutzername" @@ -744,7 +745,6 @@ msgstr "Gruppenverwaltung" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "Gruppen" @@ -1930,6 +1930,48 @@ msgstr "Setze IPSuite4 Passwort." msgid "Deactivated IPSuite4 account." msgstr "IP4Suite Konto deaktiviert." +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "Mumble" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "Mumbleverbindungen" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "Verlauf der Serververbindungen" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "Angezeigter Name" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "Release" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "Version" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "Zuletzt verbunden" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "Zuletzt getrennt" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "Serververbindungen" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "Nummer" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1939,6 +1981,10 @@ msgstr "Setze Passwort" msgid "Connect" msgstr "Verbinden" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "Verlauf der Mumbleverbindungen" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/es/LC_MESSAGES/django.po b/allianceauth/locale/es/LC_MESSAGES/django.po index 6c5d3763..8862a413 100644 --- a/allianceauth/locale/es/LC_MESSAGES/django.po +++ b/allianceauth/locale/es/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: trenus, 2023\n" "Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/es/)\n" @@ -539,6 +539,7 @@ msgstr "Borrar fatlink" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "Usuario" @@ -738,7 +739,6 @@ msgstr "Manejo de Grupo" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "Grupos" @@ -1919,6 +1919,48 @@ msgstr "Establecer contraseña de IPSuite4." msgid "Deactivated IPSuite4 account." msgstr "Cuenta IPSuite4 desactivada." +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1928,6 +1970,10 @@ msgstr "Cambiar Contraseña" msgid "Connect" msgstr "" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/fr_FR/LC_MESSAGES/django.po b/allianceauth/locale/fr_FR/LC_MESSAGES/django.po index b1c459b4..0d1f7fd0 100644 --- a/allianceauth/locale/fr_FR/LC_MESSAGES/django.po +++ b/allianceauth/locale/fr_FR/LC_MESSAGES/django.po @@ -20,7 +20,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: T'rahk Rokym, 2024\n" "Language-Team: French (France) (https://app.transifex.com/alliance-auth/teams/107430/fr_FR/)\n" @@ -556,6 +556,7 @@ msgstr "supprimer lien FAT" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "Utilisateur" @@ -755,7 +756,6 @@ msgstr "Gestion de groupe" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "Groupes" @@ -1940,6 +1940,48 @@ msgstr "Définir le mot de passe IPSuite4." msgid "Deactivated IPSuite4 account." msgstr "Compte IPSuite4 désactivé." +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1949,6 +1991,10 @@ msgstr "Définir le mot de passe" msgid "Connect" msgstr "Connecter" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/it_IT/LC_MESSAGES/django.po b/allianceauth/locale/it_IT/LC_MESSAGES/django.po index 97435344..20f9df11 100644 --- a/allianceauth/locale/it_IT/LC_MESSAGES/django.po +++ b/allianceauth/locale/it_IT/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: Tuz, 2024\n" "Language-Team: Italian (Italy) (https://app.transifex.com/alliance-auth/teams/107430/it_IT/)\n" @@ -549,6 +549,7 @@ msgstr "Elimina fat" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "Utente" @@ -748,7 +749,6 @@ msgstr "Gestione gruppi" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "Gruppi" @@ -1936,6 +1936,48 @@ msgstr "Imposta password IPSuite4." msgid "Deactivated IPSuite4 account." msgstr "Disattiva account IPSuite4." +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1945,6 +1987,10 @@ msgstr "Imposta password" msgid "Connect" msgstr "Connect" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/ja/LC_MESSAGES/django.po b/allianceauth/locale/ja/LC_MESSAGES/django.po index 9eb5bb77..715af6ab 100644 --- a/allianceauth/locale/ja/LC_MESSAGES/django.po +++ b/allianceauth/locale/ja/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: kotaneko, 2024\n" "Language-Team: Japanese (https://app.transifex.com/alliance-auth/teams/107430/ja/)\n" @@ -531,6 +531,7 @@ msgstr "Fat-Linkを削除" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "ユーザ" @@ -724,7 +725,6 @@ msgstr "グループ管理" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "グループ" @@ -1878,6 +1878,48 @@ msgstr "IPSuite4 のパスワードを設定します。" msgid "Deactivated IPSuite4 account." msgstr "IPSuite4 アカウントを非アクティブ化しました。" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1887,6 +1929,10 @@ msgstr "パスワード設定" msgid "Connect" msgstr "接続" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/ko_KR/LC_MESSAGES/django.po b/allianceauth/locale/ko_KR/LC_MESSAGES/django.po index dd92e50c..272fc7f5 100644 --- a/allianceauth/locale/ko_KR/LC_MESSAGES/django.po +++ b/allianceauth/locale/ko_KR/LC_MESSAGES/django.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: Woojin Kang, 2024\n" "Language-Team: Korean (Korea) (https://app.transifex.com/alliance-auth/teams/107430/ko_KR/)\n" @@ -537,6 +537,7 @@ msgstr "함대 활동 추적(FAT) 링크 삭제" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "사용자" @@ -732,7 +733,6 @@ msgstr "그룹 관리" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "그룹" @@ -1886,6 +1886,48 @@ msgstr "IPSuite4 비밀번호 설정" msgid "Deactivated IPSuite4 account." msgstr "IPSuite4 계정 비활성화 완료" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1895,6 +1937,10 @@ msgstr "비밀번호 설정" msgid "Connect" msgstr "연결" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "재버" diff --git a/allianceauth/locale/pl_PL/LC_MESSAGES/django.po b/allianceauth/locale/pl_PL/LC_MESSAGES/django.po index f297a358..f2b005a5 100644 --- a/allianceauth/locale/pl_PL/LC_MESSAGES/django.po +++ b/allianceauth/locale/pl_PL/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: MisBimbrownik, 2024\n" "Language-Team: Polish (Poland) (https://app.transifex.com/alliance-auth/teams/107430/pl_PL/)\n" @@ -549,6 +549,7 @@ msgstr "Usuń FAT" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "Użytkownik" @@ -750,7 +751,6 @@ msgstr "Zarządzanie Grupami" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "Grupy" @@ -1929,6 +1929,48 @@ msgstr "Ustaw hasło IPSuite4." msgid "Deactivated IPSuite4 account." msgstr "Wyłączono konto IPSuite4." +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1938,6 +1980,10 @@ msgstr "Ustaw hasło" msgid "Connect" msgstr "Połącz" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/ru/LC_MESSAGES/django.po b/allianceauth/locale/ru/LC_MESSAGES/django.po index 894de4ad..9a34102e 100644 --- a/allianceauth/locale/ru/LC_MESSAGES/django.po +++ b/allianceauth/locale/ru/LC_MESSAGES/django.po @@ -16,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: Joel Falknau , 2024\n" "Language-Team: Russian (https://app.transifex.com/alliance-auth/teams/107430/ru/)\n" @@ -533,6 +533,7 @@ msgstr "Удалить ФлАк" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "Пользователь" @@ -734,7 +735,6 @@ msgstr "Управление Группой" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "Группы" @@ -1920,6 +1920,48 @@ msgstr "Установить пароль IPSuite4." msgid "Deactivated IPSuite4 account." msgstr "Деактивированный аккаунт IPSuite4." +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1929,6 +1971,10 @@ msgstr "Установить Пароль" msgid "Connect" msgstr "Подключить" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/uk/LC_MESSAGES/django.po b/allianceauth/locale/uk/LC_MESSAGES/django.po index bab28086..c2d5c65c 100644 --- a/allianceauth/locale/uk/LC_MESSAGES/django.po +++ b/allianceauth/locale/uk/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: Andrii Yukhymchak, 2024\n" "Language-Team: Ukrainian (https://app.transifex.com/alliance-auth/teams/107430/uk/)\n" @@ -549,6 +549,7 @@ msgstr "Видалити Fat" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "Користувач" @@ -750,7 +751,6 @@ msgstr "Керування групами" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "Групи" @@ -1934,6 +1934,48 @@ msgstr "Встановити пароль IPSuite4." msgid "Deactivated IPSuite4 account." msgstr "Деактивовано обліковий запис IPSuite4." +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1943,6 +1985,10 @@ msgstr "Встановити пароль" msgid "Connect" msgstr "Підєднатись" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" diff --git a/allianceauth/locale/zh_Hans/LC_MESSAGES/django.po b/allianceauth/locale/zh_Hans/LC_MESSAGES/django.po index 5dd890c4..79786d16 100644 --- a/allianceauth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/allianceauth/locale/zh_Hans/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-09-13 19:57+1000\n" +"POT-Creation-Date: 2024-10-21 12:59+1000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n" "Last-Translator: Joel Falknau , 2023\n" "Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n" @@ -526,6 +526,7 @@ msgstr "删除舰队活动历史" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 msgid "User" msgstr "用户" @@ -719,7 +720,6 @@ msgstr "用户组管理" #: allianceauth/groupmanagement/auth_hooks.py:51 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 -#: allianceauth/templates/allianceauth/side-menu.html:15 msgid "Groups" msgstr "群组" @@ -1863,6 +1863,48 @@ msgstr "修改IPSuite4密码" msgid "Deactivated IPSuite4 account." msgstr "停用IPSuite4账户" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +msgid "Mumble" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +msgid "Mumble History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +msgid "Server Connection History" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +msgid "Displayed Name" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +msgid "Release" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +msgid "Version" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +msgid "Last Connect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +msgid "Last Disconnect" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +msgid "Server Connection Breakdown" +msgstr "" + +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +msgid "Number" +msgstr "" + #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/templates/services/service_password.html:26 msgid "Set Password" @@ -1872,6 +1914,10 @@ msgstr "设置密码" msgid "Connect" msgstr "" +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 +msgid "Mumble Connection History" +msgstr "" + #: allianceauth/services/modules/openfire/auth_hooks.py:27 msgid "Jabber" msgstr "Jabber" From 94b52c850ee69470e5b8cbbb9dcf28d9c94e1e9d Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Fri, 8 Nov 2024 12:47:55 +1000 Subject: [PATCH 17/85] Version Bump 4.4.2 --- allianceauth/__init__.py | 2 +- docker/.env.example | 2 +- docker/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/allianceauth/__init__.py b/allianceauth/__init__.py index 2620a79d..77d54c77 100644 --- a/allianceauth/__init__.py +++ b/allianceauth/__init__.py @@ -5,7 +5,7 @@ manage online service access. # This will make sure the app is always imported when # Django starts so that shared_task will use this app. -__version__ = '4.4.0' +__version__ = '4.4.2' __title__ = 'Alliance Auth' __url__ = 'https://gitlab.com/allianceauth/allianceauth' NAME = f'{__title__} v{__version__}' diff --git a/docker/.env.example b/docker/.env.example index e02ab228..74712116 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,7 +1,7 @@ PROTOCOL=https:// AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN% DOMAIN=%DOMAIN% -AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.4.0 +AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.4.2 # Nginx Proxy Manager PROXY_HTTP_PORT=80 diff --git a/docker/Dockerfile b/docker/Dockerfile index 20f431e1..462f6a56 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ FROM python:3.11-slim -ARG AUTH_VERSION=v4.4.1 +ARG AUTH_VERSION=v4.4.2 ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION} ENV AUTH_USER=allianceauth ENV AUTH_GROUP=allianceauth From d624ba44275511da8f917bddee31c0731b20216a Mon Sep 17 00:00:00 2001 From: Matteo Ghia <61846068+Maestro-Zacht@users.noreply.github.com> Date: Sat, 9 Nov 2024 12:01:57 +0100 Subject: [PATCH 18/85] set default collation in startup script --- docker/setup.base.sql | 2 +- docs/installation/allianceauth.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/setup.base.sql b/docker/setup.base.sql index ba4f3b43..a3daa8bb 100644 --- a/docker/setup.base.sql +++ b/docker/setup.base.sql @@ -1,6 +1,6 @@ CREATE USER 'aauth'@'%' IDENTIFIED BY 'authpass'; CREATE USER 'grafana'@'%' IDENTIFIED BY 'grafanapass'; -CREATE DATABASE alliance_auth CHARACTER SET utf8mb4; +CREATE DATABASE alliance_auth CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON alliance_auth.* TO 'aauth'@'%'; GRANT SELECT, diff --git a/docs/installation/allianceauth.md b/docs/installation/allianceauth.md index dd033b61..9560597c 100644 --- a/docs/installation/allianceauth.md +++ b/docs/installation/allianceauth.md @@ -246,7 +246,7 @@ and create them as follows, replacing `PASSWORD` with an actual secure password: ```sql CREATE USER 'allianceserver'@'localhost' IDENTIFIED BY 'PASSWORD'; -CREATE DATABASE alliance_auth CHARACTER SET utf8mb4; +CREATE DATABASE alliance_auth CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON alliance_auth . * TO 'allianceserver'@'localhost'; ``` From ae7ed5c297b944368764ee3da1c6267f222a93f4 Mon Sep 17 00:00:00 2001 From: Matteo Ghia <61846068+Maestro-Zacht@users.noreply.github.com> Date: Sat, 9 Nov 2024 12:45:31 +0100 Subject: [PATCH 19/85] add default keyword required by mariadb --- docker/setup.base.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/setup.base.sql b/docker/setup.base.sql index a3daa8bb..c9bbb96e 100644 --- a/docker/setup.base.sql +++ b/docker/setup.base.sql @@ -1,6 +1,6 @@ CREATE USER 'aauth'@'%' IDENTIFIED BY 'authpass'; CREATE USER 'grafana'@'%' IDENTIFIED BY 'grafanapass'; -CREATE DATABASE alliance_auth CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE DATABASE alliance_auth CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON alliance_auth.* TO 'aauth'@'%'; GRANT SELECT, From e053fb7d9688d83abe2379d77a7b522c19abf316 Mon Sep 17 00:00:00 2001 From: Matteo Ghia <61846068+Maestro-Zacht@users.noreply.github.com> Date: Sat, 9 Nov 2024 12:45:59 +0100 Subject: [PATCH 20/85] also in baremetal docs --- docs/installation/allianceauth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/allianceauth.md b/docs/installation/allianceauth.md index 9560597c..2b7c3924 100644 --- a/docs/installation/allianceauth.md +++ b/docs/installation/allianceauth.md @@ -246,7 +246,7 @@ and create them as follows, replacing `PASSWORD` with an actual secure password: ```sql CREATE USER 'allianceserver'@'localhost' IDENTIFIED BY 'PASSWORD'; -CREATE DATABASE alliance_auth CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE DATABASE alliance_auth CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON alliance_auth . * TO 'allianceserver'@'localhost'; ``` From 8d63801b00b5a09746aa832723927530cbca63e4 Mon Sep 17 00:00:00 2001 From: r0kym Date: Fri, 15 Nov 2024 15:12:03 +0100 Subject: [PATCH 21/85] Change logging imports and commands Now uses `get_extension_logger` as is recommanded by https://allianceauth.readthedocs.io/en/v4.4.2/development/custom/logging.html --- docs/development/tech_docu/celery.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/development/tech_docu/celery.md b/docs/development/tech_docu/celery.md index 537b7d3d..4d87fc09 100644 --- a/docs/development/tech_docu/celery.md +++ b/docs/development/tech_docu/celery.md @@ -40,10 +40,10 @@ Please use the following approach to ensure your tasks are working properly with Here is an example implementation of a task: ```python -import logging +from allianceauth.services.hooks import get_extension_logger from celery import shared_task -logger = logging.getLogger(__name__) +logger = get_extension_logger(__name__) @shared_task @@ -80,10 +80,10 @@ However, many long-running tasks consist of several smaller processes that need Example implementation for a celery chain: ```python -import logging +from allianceauth.services.hooks import get_extension_logger from celery import shared_task, chain -logger = logging.getLogger(__name__) +logger = get_extension_logger(__name__) @shared_task From 2125192f723ade864eba26047cd6e00f676671cb Mon Sep 17 00:00:00 2001 From: r0kym Date: Fri, 15 Nov 2024 15:13:25 +0100 Subject: [PATCH 22/85] Fix typo in the long-running tasks example --- docs/development/tech_docu/celery.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development/tech_docu/celery.md b/docs/development/tech_docu/celery.md index 4d87fc09..f92a0cb1 100644 --- a/docs/development/tech_docu/celery.md +++ b/docs/development/tech_docu/celery.md @@ -96,7 +96,7 @@ def long_runner(): my_tasks = list() for _ in range(10): task_signature = example.si() - my_task.append(task_signature) + my_tasks.append(task_signature) chain(my_tasks).delay() ``` From 2822775fb89c3123d7a705073fe9e5ea70c26a15 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Fri, 22 Nov 2024 15:01:32 +0100 Subject: [PATCH 23/85] [ADD] `js_type` parameter to allow JS modules to be loaded --- allianceauth/theme/hooks.py | 25 +++++++++++++------ .../templates/theme/theme_imports_js.html | 6 ++++- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/allianceauth/theme/hooks.py b/allianceauth/theme/hooks.py index dde11493..6156e96f 100644 --- a/allianceauth/theme/hooks.py +++ b/allianceauth/theme/hooks.py @@ -8,14 +8,16 @@ class ThemeHook: """ def __init__(self, - name: str, - description: str, - css: List[dict], - js: List[dict], - css_template: Optional[str] = None, - js_template: Optional[str] = None, - html_tags: Optional[Union[dict, str]] = None, - header_padding: Optional[str] = "4em"): + name: str, + description: str, + css: List[dict], + js: List[dict], + css_template: Optional[str] = None, + js_template: Optional[str] = None, + js_type: Optional[str] = None, + html_tags: Optional[Union[dict, str]] = None, + header_padding: Optional[str] = "4em" + ): """ :param name: Theme python name :type name: str @@ -29,11 +31,14 @@ class ThemeHook: :type css_template: Optional[str], optional :param js_template: _description_, defaults to None :type js_template: Optional[str], optional + :param js_type: The type of the JS (e.g.: 'module'), defaults to None + :type js_type: Optional[str], optional :param html_tags: Attributes added to the `` tag, defaults to None :type html_tags: Optional[dict|str], optional :param header_padding: Top padding, defaults to "4em" :type header_padding: Optional[str], optional """ + self.name = name self.description = description @@ -45,11 +50,15 @@ class ThemeHook: self.css_template = css_template self.js_template = js_template + # Define the JS type (e.g.: 'module') + self.js_type = js_type + self.html_tags = ( " ".join([f"{key}={value}" for key, value in html_tags.items()]) if isinstance(html_tags, dict) else html_tags ) self.header_padding = header_padding + def get_name(self): return f"{self.__class__.__module__}.{self.__class__.__name__}" diff --git a/allianceauth/theme/templates/theme/theme_imports_js.html b/allianceauth/theme/templates/theme/theme_imports_js.html index ad19fdf1..0821ba98 100644 --- a/allianceauth/theme/templates/theme/theme_imports_js.html +++ b/allianceauth/theme/templates/theme/theme_imports_js.html @@ -4,7 +4,11 @@ {% include theme.js_template %} {% else %} {% for x in theme.js %} - + {% if x.js_type %} + + {% else %} + + {% endif %} {% endfor %} {% endif %} From 50681b023bf425786cf3fc5481ba93aa64c6e910 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sat, 23 Nov 2024 01:55:04 +0100 Subject: [PATCH 24/85] [CHANGE] Move the `if` inside the `script` tag Makes the code better readable and maintainable. --- .../theme/templates/theme/theme_imports_js.html | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/allianceauth/theme/templates/theme/theme_imports_js.html b/allianceauth/theme/templates/theme/theme_imports_js.html index 0821ba98..b3c5fdba 100644 --- a/allianceauth/theme/templates/theme/theme_imports_js.html +++ b/allianceauth/theme/templates/theme/theme_imports_js.html @@ -4,11 +4,13 @@ {% include theme.js_template %} {% else %} {% for x in theme.js %} - {% if x.js_type %} - - {% else %} - - {% endif %} + {% endfor %} {% endif %} From cef2e86ea1bf748fc24e2ac25a300e868a7d1f57 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 26 Nov 2024 22:28:35 +0100 Subject: [PATCH 25/85] [FIX] Prevent images from overflowing their parent element --- .../static/allianceauth/framework/css/auth-framework.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/allianceauth/framework/static/allianceauth/framework/css/auth-framework.css b/allianceauth/framework/static/allianceauth/framework/css/auth-framework.css index d377370d..39de66cb 100644 --- a/allianceauth/framework/static/allianceauth/framework/css/auth-framework.css +++ b/allianceauth/framework/static/allianceauth/framework/css/auth-framework.css @@ -13,6 +13,15 @@ } } +/* Image overflow fix +------------------------------------------------------------------------------------- */ +@media all { + img { + max-width: 100%; + height: auto; + } +} + /* Side Navigation ------------------------------------------------------------------------------------- */ @media all { From 702564d15e2fa692d80c796f0ed45ccd0c37b72d Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Tue, 3 Dec 2024 09:50:55 +0000 Subject: [PATCH 26/85] correct top level indentation to be able to be directly copy-pasteable --- docs/installation-containerized/docker.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation-containerized/docker.md b/docs/installation-containerized/docker.md index 7017f3bc..63391cc8 100644 --- a/docs/installation-containerized/docker.md +++ b/docs/installation-containerized/docker.md @@ -65,7 +65,7 @@ Using a custom docker image is the preferred approach, as it gives you the stabi * e.g. ```docker - x-allianceauth-base: &allianceauth-base + x-allianceauth-base: &allianceauth-base # image: ${AA_DOCKER_TAG?err} build: context: . From c6890dd2c61fd20ecf1ebc585c626f5b272ed0de Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Wed, 4 Dec 2024 18:01:01 +1000 Subject: [PATCH 27/85] Spread esi tasks over 10 minutes --- allianceauth/eveonline/tasks.py | 42 ++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/allianceauth/eveonline/tasks.py b/allianceauth/eveonline/tasks.py index ce2b4219..657e63f1 100644 --- a/allianceauth/eveonline/tasks.py +++ b/allianceauth/eveonline/tasks.py @@ -1,4 +1,5 @@ import logging +from random import randint from celery import shared_task @@ -9,7 +10,8 @@ from . import providers logger = logging.getLogger(__name__) TASK_PRIORITY = 7 -CHUNK_SIZE = 500 +CHARACTER_AFFILIATION_CHUNK_SIZE = 500 +EVEONLINE_TASK_JITTER = 600 def chunks(lst, n): @@ -19,13 +21,13 @@ def chunks(lst, n): @shared_task -def update_corp(corp_id): +def update_corp(corp_id: int) -> None: """Update given corporation from ESI""" EveCorporationInfo.objects.update_corporation(corp_id) @shared_task -def update_alliance(alliance_id): +def update_alliance(alliance_id: int) -> None: """Update given alliance from ESI""" EveAllianceInfo.objects.update_alliance(alliance_id).populate_alliance() @@ -37,23 +39,30 @@ def update_character(character_id: int) -> None: @shared_task -def run_model_update(): +def run_model_update() -> None: """Update all alliances, corporations and characters from ESI""" - #update existing corp models + # Queue update tasks for Known Corporation 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, + countdown=randint(1, EVEONLINE_TASK_JITTER)) - # update existing alliance models + # Queue update tasks for Known 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, + countdown=randint(1, EVEONLINE_TASK_JITTER)) - # update existing character models + # Queue update tasks for Known Character Models character_ids = EveCharacter.objects.all().values_list('character_id', flat=True) - for character_ids_chunk in chunks(character_ids, CHUNK_SIZE): + for character_ids_chunk in chunks(character_ids, CHARACTER_AFFILIATION_CHUNK_SIZE): update_character_chunk.apply_async( - args=[character_ids_chunk], priority=TASK_PRIORITY - ) + args=[character_ids_chunk], + priority=TASK_PRIORITY, + countdown=randint(1, EVEONLINE_TASK_JITTER)) @shared_task @@ -68,8 +77,9 @@ def update_character_chunk(character_ids_chunk: list): logger.info("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 - ) + args=[character_id], + priority=TASK_PRIORITY, + countdown=randint(1, EVEONLINE_TASK_JITTER)) return affiliations = { @@ -107,5 +117,5 @@ def update_character_chunk(character_ids_chunk: list): if corp_changed or alliance_changed or name_changed: update_character.apply_async( - args=[character.get('character_id')], priority=TASK_PRIORITY - ) + args=[character.get('character_id')], + priority=TASK_PRIORITY) From 292fb7b29d152e44a715047a07266703be5a2576 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Wed, 4 Dec 2024 18:35:07 +1000 Subject: [PATCH 28/85] Add docs for smoothing out task execution --- docs/development/tech_docu/celery.md | 45 +++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/docs/development/tech_docu/celery.md b/docs/development/tech_docu/celery.md index 537b7d3d..483894bb 100644 --- a/docs/development/tech_docu/celery.md +++ b/docs/development/tech_docu/celery.md @@ -168,6 +168,49 @@ example.apply_async(priority=3) For defining a priority to tasks, you cannot use the convenient shortcut ``delay()``, but instead need to start a task with ``apply_async()``, which also requires you to pass parameters to your task function differently. Please check out the `official docs `_ for details. ::: +## Rate-Limiting and Smoothing of Task Execution + +Large numbers of installs running the same crontab (ie. `0 * * * *`) can all slam an external service at the same time. + +Consider Artificially smoothing out your tasks with a few methods + +### Offset Crontabs + +Avoid running your tasks on the hour or other nice neat human numbers, consider 23 minutes on the hour instead of at zero (`28 * * * *`) + +### Subset Tasks + +Slice your tasks needed up into more manageable chunks and run them more often. 1/10th of your tasks run 10x more often will return the same end result with less peak loads on external services and your task queue. + +### Celery ETA/Countdown + +Scatter your tasks across a larger window using + +This example will queue up tasks across the next 10 minutes, trickling them into your workers (and the external service) + +```python +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, + countdown=randint(1, 600)) +``` + +### Celery Rate Limits + +Celery Rate Limits come with a small catch, its _per worker_, you may have to be either very conservative or have these configurable by the end user if they varied their worker count. + + + +This example of 10 Tasks per Minute will result in ~100 tasks per minute at 10 Workers + +```python +@shared_task(rate_limit="10/m") +def update_charactercorporationhistory(character_id: int) -> None: + """Update CharacterCorporationHistory models from ESI""" +``` + ## What special features should I be aware of? Every Alliance Auth installation will come with a couple of special celery related features "out-of-the-box" that you can make use of in your apps. @@ -192,6 +235,6 @@ You can use it like so: Please see the [official documentation](https://pypi.org/project/celery_once/) of celery-once for details. -### task priorities +### Task Priorities Alliance Auth is using task priorities to enable priority-based scheduling of task execution. Please see [How can I use priorities for tasks?](#how-can-i-use-priorities-for-tasks) for details. From 8489f204ddb42e0886fc1da074ca9945e64edd5f Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Wed, 4 Dec 2024 22:10:06 +1000 Subject: [PATCH 29/85] fix test patch --- allianceauth/eveonline/tests/test_tasks.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/allianceauth/eveonline/tests/test_tasks.py b/allianceauth/eveonline/tests/test_tasks.py index 78054e8f..26dc9d90 100644 --- a/allianceauth/eveonline/tests/test_tasks.py +++ b/allianceauth/eveonline/tests/test_tasks.py @@ -84,7 +84,7 @@ class TestUpdateTasks(TestCase): @override_settings(CELERY_ALWAYS_EAGER=True) @patch('allianceauth.eveonline.providers.esi_client_factory') @patch('allianceauth.eveonline.tasks.providers') -@patch('allianceauth.eveonline.tasks.CHUNK_SIZE', 2) +@patch('allianceauth.eveonline.tasks.CHARACTER_AFFILIATION_CHUNK_SIZE', 2) class TestRunModelUpdate(TransactionTestCase): def test_should_run_updates(self, mock_providers, mock_esi_client_factory): # given @@ -139,7 +139,7 @@ class TestRunModelUpdate(TransactionTestCase): @patch('allianceauth.eveonline.tasks.update_character', wraps=update_character) @patch('allianceauth.eveonline.providers.esi_client_factory') @patch('allianceauth.eveonline.tasks.providers') -@patch('allianceauth.eveonline.tasks.CHUNK_SIZE', 2) +@patch('allianceauth.eveonline.tasks.CHARACTER_AFFILIATION_CHUNK_SIZE', 2) class TestUpdateCharacterChunk(TestCase): @staticmethod def _updated_character_ids(spy_update_character) -> set: From dc1ed8c570e161cd43b5218a7efffe09c94453c9 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Thu, 5 Dec 2024 11:48:45 +1000 Subject: [PATCH 30/85] +x --- docker/conf/redis_healthcheck.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 docker/conf/redis_healthcheck.sh diff --git a/docker/conf/redis_healthcheck.sh b/docker/conf/redis_healthcheck.sh old mode 100644 new mode 100755 From a868438492e01580f396e2d1fcbc60d397667011 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Thu, 5 Dec 2024 11:49:32 +1000 Subject: [PATCH 31/85] force these flags on setup --- docker/scripts/download.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/scripts/download.sh b/docker/scripts/download.sh index 833b254c..f8a4526c 100755 --- a/docker/scripts/download.sh +++ b/docker/scripts/download.sh @@ -1,4 +1,6 @@ #!/bin/bash git clone https://gitlab.com/allianceauth/allianceauth.git aa-git cp -R aa-git/docker ./aa-docker +chmod +x aa-docker/conf/memory_check.sh +chmod +x aa-docker/conf/redis_healthcheck.sh rm -rf aa-git From 0a940810bde31a54d7d124ec6388980c7b5ba48f Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Thu, 5 Dec 2024 11:49:54 +1000 Subject: [PATCH 32/85] dont need this now the flag is set correctly, more consistent --- docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1c427652..c6917fa5 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -83,7 +83,7 @@ services: - "redis-data:/data" - ./conf/redis_healthcheck.sh:/usr/local/bin/redis_healthcheck.sh healthcheck: - test: ["CMD", "bash", "/usr/local/bin/redis_healthcheck.sh"] + test: ["CMD", "/usr/local/bin/redis_healthcheck.sh"] logging: driver: "json-file" options: From 4da67cfaf62dc0ccf808ef51282a72360787ad64 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 8 Dec 2024 13:01:59 -0600 Subject: [PATCH 33/85] fix group display for Groups that are Group Leaders --- .../groupmanagement/templates/groupmanagement/groups.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/groupmanagement/templates/groupmanagement/groups.html b/allianceauth/groupmanagement/templates/groupmanagement/groups.html index ddd2c2d1..56aafafe 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/groups.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/groups.html @@ -56,7 +56,7 @@ {% endif %} {% endfor %} {% endif %} - {% if g.group.authgroup.group_leaders.all.count %} + {% if g.group.authgroup.group_leader_groups.all.count %} {% for group in g.group.authgroup.group_leader_groups.all %} {{group.name}} {% endfor %} From 9ada26e849efceeec721d31c9cb5fba6ffc8c17a Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Mon, 9 Dec 2024 23:54:33 +0000 Subject: [PATCH 34/85] DockerMariaDB Config Template --- docker/conf/aa_mariadb.cnf | 6 ++++++ docker/docker-compose.yml | 1 + 2 files changed, 7 insertions(+) create mode 100644 docker/conf/aa_mariadb.cnf diff --git a/docker/conf/aa_mariadb.cnf b/docker/conf/aa_mariadb.cnf new file mode 100644 index 00000000..737da0c6 --- /dev/null +++ b/docker/conf/aa_mariadb.cnf @@ -0,0 +1,6 @@ +[mariadb] +# Provided as an Example +# AA Doesnt use Aria or MyISAM, So these are worth Considering + +# aria_pagecache_buffer_size = 16M +# key_buffer_size = 16M diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1c427652..d541113b 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -49,6 +49,7 @@ services: volumes: - ./mysql-data:/var/lib/mysql - ./setup.sql:/docker-entrypoint-initdb.d/setup.sql + - ./conf/aa_mariadb.cnf:/etc/mysql/conf.d/aa_mariadb.cnf environment: - MYSQL_ROOT_PASSWORD=${AA_DB_ROOT_PASSWORD?err} - MARIADB_MYSQL_LOCALHOST_USER=1 From 7033406ba6b526eb16bcb1b22b1a35756bdf1246 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Tue, 10 Dec 2024 13:07:03 +1000 Subject: [PATCH 35/85] Version Bump 4.5.0 --- allianceauth/__init__.py | 2 +- docker/.env.example | 2 +- docker/Dockerfile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/allianceauth/__init__.py b/allianceauth/__init__.py index 77d54c77..261f884e 100644 --- a/allianceauth/__init__.py +++ b/allianceauth/__init__.py @@ -5,7 +5,7 @@ manage online service access. # This will make sure the app is always imported when # Django starts so that shared_task will use this app. -__version__ = '4.4.2' +__version__ = '4.5.0' __title__ = 'Alliance Auth' __url__ = 'https://gitlab.com/allianceauth/allianceauth' NAME = f'{__title__} v{__version__}' diff --git a/docker/.env.example b/docker/.env.example index 74712116..61e77a19 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,7 +1,7 @@ PROTOCOL=https:// AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN% DOMAIN=%DOMAIN% -AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.4.2 +AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.5.0 # Nginx Proxy Manager PROXY_HTTP_PORT=80 diff --git a/docker/Dockerfile b/docker/Dockerfile index 462f6a56..6e88124c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ FROM python:3.11-slim -ARG AUTH_VERSION=v4.4.2 +ARG AUTH_VERSION=v4.5.0 ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION} ENV AUTH_USER=allianceauth ENV AUTH_GROUP=allianceauth From 0f057ffa84f2f627690d99326b6c824fda03c11d Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Thu, 2 Jan 2025 16:54:37 +0100 Subject: [PATCH 36/85] [ADD] `django-sri` to provide integrity hashes for local static files --- .../project_template/project_name/settings/base.py | 2 ++ allianceauth/templates/bundles/auth-base-css.html | 4 ++-- allianceauth/templates/bundles/auth-framework-css.html | 4 ++-- allianceauth/templates/bundles/bootstrap-css.html | 6 ++++-- allianceauth/templates/bundles/checkbox-css.html | 4 ++-- allianceauth/templates/bundles/evetime-js.html | 4 ++-- allianceauth/templates/bundles/filterdropdown-js.html | 4 ++-- allianceauth/templates/bundles/jquery-ui-css.html | 7 ++++--- .../templates/bundles/refresh-notification-icon-js.html | 4 ++-- .../templates/bundles/refresh-notifications-js.html | 4 ++-- allianceauth/templates/bundles/timerboard-js.html | 4 ++-- allianceauth/templates/bundles/timers-js.html | 4 ++-- pyproject.toml | 1 + 13 files changed, 29 insertions(+), 23 deletions(-) diff --git a/allianceauth/project_template/project_name/settings/base.py b/allianceauth/project_template/project_name/settings/base.py index fb18e4de..9e8d6957 100644 --- a/allianceauth/project_template/project_name/settings/base.py +++ b/allianceauth/project_template/project_name/settings/base.py @@ -43,8 +43,10 @@ INSTALLED_APPS = [ 'allianceauth.theme.flatly', 'allianceauth.theme.materia', "allianceauth.custom_css", + 'sri', ] +SRI_ALGORITHM = "sha512" SECRET_KEY = "wow I'm a really bad default secret key" # Celery configuration diff --git a/allianceauth/templates/bundles/auth-base-css.html b/allianceauth/templates/bundles/auth-base-css.html index 0ee2e7ce..ce7b4373 100644 --- a/allianceauth/templates/bundles/auth-base-css.html +++ b/allianceauth/templates/bundles/auth-base-css.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/css/auth-base.css' %} diff --git a/allianceauth/templates/bundles/auth-framework-css.html b/allianceauth/templates/bundles/auth-framework-css.html index 9f1c038a..1722377a 100644 --- a/allianceauth/templates/bundles/auth-framework-css.html +++ b/allianceauth/templates/bundles/auth-framework-css.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/framework/css/auth-framework.css' %} diff --git a/allianceauth/templates/bundles/bootstrap-css.html b/allianceauth/templates/bundles/bootstrap-css.html index bed760ba..88147119 100644 --- a/allianceauth/templates/bundles/bootstrap-css.html +++ b/allianceauth/templates/bundles/bootstrap-css.html @@ -1,4 +1,6 @@ {% load static %} +{% load sri %} + {% if NIGHT_MODE %} {% if debug %} @@ -6,7 +8,7 @@ {% else %} - + {% sri_static 'allianceauth/css/themes/darkly/darkly.min.css' %} {% endif %} {% else %} {% if debug %} @@ -14,7 +16,7 @@ {% else %} - + {% sri_static 'allianceauth/css/themes/flatly/flatly.min.css' %} {% endif %} {% endif %} diff --git a/allianceauth/templates/bundles/checkbox-css.html b/allianceauth/templates/bundles/checkbox-css.html index f400d36c..1f2cc08e 100644 --- a/allianceauth/templates/bundles/checkbox-css.html +++ b/allianceauth/templates/bundles/checkbox-css.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/css/checkbox.css' %} diff --git a/allianceauth/templates/bundles/evetime-js.html b/allianceauth/templates/bundles/evetime-js.html index 63b712c3..6611516e 100644 --- a/allianceauth/templates/bundles/evetime-js.html +++ b/allianceauth/templates/bundles/evetime-js.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/js/eve-time.js' %} diff --git a/allianceauth/templates/bundles/filterdropdown-js.html b/allianceauth/templates/bundles/filterdropdown-js.html index 677fa536..41a0e3bd 100644 --- a/allianceauth/templates/bundles/filterdropdown-js.html +++ b/allianceauth/templates/bundles/filterdropdown-js.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/js/filterDropDown/filterDropDown.min.js' %} diff --git a/allianceauth/templates/bundles/jquery-ui-css.html b/allianceauth/templates/bundles/jquery-ui-css.html index 3bf4d1a3..9177c19e 100644 --- a/allianceauth/templates/bundles/jquery-ui-css.html +++ b/allianceauth/templates/bundles/jquery-ui-css.html @@ -1,5 +1,6 @@ -{% load static %} - - + +{% load sri %} + +{% sri_static 'allianceauth/js/jquery-ui/1.13.2/css/jquery-ui.min.css' %} diff --git a/allianceauth/templates/bundles/refresh-notification-icon-js.html b/allianceauth/templates/bundles/refresh-notification-icon-js.html index 88f3d16f..69cc53b8 100644 --- a/allianceauth/templates/bundles/refresh-notification-icon-js.html +++ b/allianceauth/templates/bundles/refresh-notification-icon-js.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/js/refresh-notification-icon.js' %} diff --git a/allianceauth/templates/bundles/refresh-notifications-js.html b/allianceauth/templates/bundles/refresh-notifications-js.html index 27622b3e..50b5e8f4 100644 --- a/allianceauth/templates/bundles/refresh-notifications-js.html +++ b/allianceauth/templates/bundles/refresh-notifications-js.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/js/refresh_notifications.js' %} diff --git a/allianceauth/templates/bundles/timerboard-js.html b/allianceauth/templates/bundles/timerboard-js.html index 8cf6f353..8bad97d9 100644 --- a/allianceauth/templates/bundles/timerboard-js.html +++ b/allianceauth/templates/bundles/timerboard-js.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/js/timerboard.js' %} diff --git a/allianceauth/templates/bundles/timers-js.html b/allianceauth/templates/bundles/timers-js.html index b9690202..a570a10d 100644 --- a/allianceauth/templates/bundles/timers-js.html +++ b/allianceauth/templates/bundles/timers-js.html @@ -1,3 +1,3 @@ -{% load static %} +{% load sri %} - +{% sri_static 'allianceauth/js/timers.js' %} diff --git a/pyproject.toml b/pyproject.toml index 35edbe64..3ed04b9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -52,6 +52,7 @@ dependencies = [ "django-registration<3.4,>=3.3", "django-solo", "django-sortedm2m", + "django-sri", "dnspython", "mysqlclient>=2.1", "openfire-restapi", From 646d3f5408b261ff3e50b9baae85f828d899b738 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 6 Jan 2025 16:21:14 +0100 Subject: [PATCH 37/85] [ADD] Mercenary Dens to structure type selection --- allianceauth/timerboard/models.py | 1 + allianceauth/timerboard/templates/timerboard/timertable.html | 2 ++ 2 files changed, 3 insertions(+) diff --git a/allianceauth/timerboard/models.py b/allianceauth/timerboard/models.py index d4127c9b..e0713e88 100644 --- a/allianceauth/timerboard/models.py +++ b/allianceauth/timerboard/models.py @@ -39,6 +39,7 @@ class Timer(models.Model): PHAROLUX = "Pharolux Cyno Beacon", _("Pharolux Cyno Beacon") TENEBREX = "Tenebrex Cyno Jammer", _("Tenebrex Cyno Jammer") ANSIBLEX = "Ansiblex Jump Gate", _("Ansiblex Jump Gate") + MERCDEN = "Mercenary Den", _("Mercenary Den") MOONPOP = "Moon Mining Cycle", _("Moon Mining Cycle") METENOX = "Metenox Moon Drill", _("Metenox Moon Drill") OTHER = "Other", _("Other") diff --git a/allianceauth/timerboard/templates/timerboard/timertable.html b/allianceauth/timerboard/templates/timerboard/timertable.html index c1d5c818..7ac0099c 100644 --- a/allianceauth/timerboard/templates/timerboard/timertable.html +++ b/allianceauth/timerboard/templates/timerboard/timertable.html @@ -80,6 +80,8 @@
    {% translate "Cyno Jammer" %}
    {% elif timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %}
    {% translate "Ansiblex Jump Gate" %}
    + {% elif timer.structure == "Mercenary Den" %} +
    {% translate "Mercenary Den" %}
    {% elif timer.structure == "Moon Mining Cycle" %}
    {% translate "Moon Mining Cycle" %}
    {% elif timer.structure == "Metenox Moon Drill" %} From a4ea48e14e25477eb41728b44d30a542b91ad13e Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 6 Jan 2025 16:43:59 +0100 Subject: [PATCH 38/85] [CHANGE] Group timer types by BG color BS class --- .../templates/timerboard/timertable.html | 59 +++++++++++++------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/allianceauth/timerboard/templates/timerboard/timertable.html b/allianceauth/timerboard/templates/timerboard/timertable.html index 7ac0099c..3ee2c202 100644 --- a/allianceauth/timerboard/templates/timerboard/timertable.html +++ b/allianceauth/timerboard/templates/timerboard/timertable.html @@ -30,13 +30,21 @@ + {% comment %} Objective: Hostile (BG: Danger) {% endcomment %} {% if timer.objective == "Hostile" %} -
    {% translate "Hostile" %}
    +
    + + {% comment %} Objective: Friendly (BG: Primare) {% endcomment %} {% elif timer.objective == "Friendly" %} -
    {% translate "Friendly" %}
    +
    + + {% comment %} Objective: Neutral (BG: Secondary) {% endcomment %} {% elif timer.objective == "Neutral" %} -
    {% translate "Neutral" %}
    +
    {% endif %} + + {{ timer.get_objective_display }} +
    @@ -44,32 +52,27 @@ + {% comment %} BG: Info {% endcomment %} {% if timer.structure == "POCO" %}
    {% translate "POCO" %}
    - {% elif timer.structure == "Orbital Skyhook" %} -
    {% translate "Orbital Skyhook" %}
    - {% elif timer.structure == "I-HUB" %} -
    {% translate "I-HUB" %}
    - {% elif timer.structure == "TCU" %} {% comment %} Pending Removal {% endcomment %} -
    {% translate "TCU" %}
    {% elif timer.structure == "POS[S]" %}
    {% translate "POS [S]" %}
    {% elif timer.structure == "POS[M]" %}
    {% translate "POS [M]" %}
    {% elif timer.structure == "POS[L]" %}
    {% translate "POS [L]" %}
    - {% elif timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %} -
    {% translate "Astrahus" %}
    - {% elif timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %} -
    {% translate "Fortizar" %}
    - {% elif timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %} -
    {% translate "Keepstar" %}
    + + {% comment %} BG: Warning {% endcomment %} + {% elif timer.structure == "Station" %} +
    {% translate "Station" %}
    + {% elif timer.structure == "Orbital Skyhook" %} +
    {% translate "Orbital Skyhook" %}
    + {% elif timer.structure == "I-HUB" %} +
    {% translate "I-HUB" %}
    {% elif timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %}
    {% translate "Raitaru" %}
    {% elif timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %}
    {% translate "Azbel" %}
    - {% elif timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %} -
    {% translate "Sotiyo" %}
    {% elif timer.structure == "Refinery[M]" or timer.structure == "Athanor" %}
    {% translate "Athanor" %}
    {% elif timer.structure == "Refinery[L]" or timer.structure == "Tatara" %} @@ -82,12 +85,30 @@
    {% translate "Ansiblex Jump Gate" %}
    {% elif timer.structure == "Mercenary Den" %}
    {% translate "Mercenary Den" %}
    - {% elif timer.structure == "Moon Mining Cycle" %} -
    {% translate "Moon Mining Cycle" %}
    {% elif timer.structure == "Metenox Moon Drill" %}
    {% translate "Metenox Moon Drill" %}
    + + {% comment %} BG: Danger {% endcomment %} + {% elif timer.structure == "TCU" %} +
    {% translate "TCU" %}
    + {% elif timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %} +
    {% translate "Astrahus" %}
    + {% elif timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %} +
    {% translate "Fortizar" %}
    + {% elif timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %} +
    {% translate "Keepstar" %}
    + {% elif timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %} +
    {% translate "Sotiyo" %}
    + + {% comment %} BG: Secondary {% endcomment %} + {% elif timer.structure == "TCU" %} {% comment %} Pending Removal {% endcomment %} +
    {% translate "TCU" %}
    {% elif timer.structure == "Other" %}
    {% translate "Other" %}
    + + {% comment %} BG: Success {% endcomment %} + {% elif timer.structure == "Moon Mining Cycle" %} +
    {% translate "Moon Mining Cycle" %}
    {% endif %} From bd4dd60c989d087547b18d155a66f0b04ed1795f Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 6 Jan 2025 16:48:02 +0100 Subject: [PATCH 39/85] [CHANGE] Rename I-Hub to Sovereignty Hub --- allianceauth/timerboard/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/timerboard/models.py b/allianceauth/timerboard/models.py index e0713e88..ce14f17e 100644 --- a/allianceauth/timerboard/models.py +++ b/allianceauth/timerboard/models.py @@ -23,7 +23,7 @@ class Timer(models.Model): POCO = "POCO", _("POCO") ORBITALSKYHOOK = "Orbital Skyhook", _("Orbital Skyhook") - IHUB = "I-HUB", _("I-HUB") + IHUB = "I-HUB", _("Soverreignty Hub") TCU = "TCU", _("TCU") # Pending Remval POSS = "POS[S]", _("POS [S]") POSM = "POS[M]", _("POS [M]") From f51523dc07d768ccbdd74a296459172bf7e268d7 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 6 Jan 2025 17:03:00 +0100 Subject: [PATCH 40/85] [CHANGE] Use TextChoices displayed name in template --- allianceauth/timerboard/models.py | 6 +- .../templates/timerboard/timertable.html | 80 ++++++++++--------- 2 files changed, 46 insertions(+), 40 deletions(-) diff --git a/allianceauth/timerboard/models.py b/allianceauth/timerboard/models.py index ce14f17e..6823ea8d 100644 --- a/allianceauth/timerboard/models.py +++ b/allianceauth/timerboard/models.py @@ -1,6 +1,6 @@ from django.contrib.auth.models import User from django.db import models -from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy as _ from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCorporationInfo @@ -36,8 +36,8 @@ class Timer(models.Model): SOTIYO = "Sotiyo", _("Sotiyo") ATHANOR = "Athanor", _("Athanor") TATARA = "Tatara", _("Tatara") - PHAROLUX = "Pharolux Cyno Beacon", _("Pharolux Cyno Beacon") - TENEBREX = "Tenebrex Cyno Jammer", _("Tenebrex Cyno Jammer") + PHAROLUX = "Pharolux Cyno Beacon", _("Cyno Beacon") + TENEBREX = "Tenebrex Cyno Jammer", _("Cyno Jammer") ANSIBLEX = "Ansiblex Jump Gate", _("Ansiblex Jump Gate") MERCDEN = "Mercenary Den", _("Mercenary Den") MOONPOP = "Moon Mining Cycle", _("Moon Mining Cycle") diff --git a/allianceauth/timerboard/templates/timerboard/timertable.html b/allianceauth/timerboard/templates/timerboard/timertable.html index 3ee2c202..455d0d94 100644 --- a/allianceauth/timerboard/templates/timerboard/timertable.html +++ b/allianceauth/timerboard/templates/timerboard/timertable.html @@ -19,7 +19,6 @@ {% for timer in timers %} - {{ timer.details }} @@ -54,62 +53,69 @@ {% comment %} BG: Info {% endcomment %} {% if timer.structure == "POCO" %} -
    {% translate "POCO" %}
    +
    {% elif timer.structure == "POS[S]" %} -
    {% translate "POS [S]" %}
    +
    {% elif timer.structure == "POS[M]" %} -
    {% translate "POS [M]" %}
    +
    {% elif timer.structure == "POS[L]" %} -
    {% translate "POS [L]" %}
    +
    {% comment %} BG: Warning {% endcomment %} - {% elif timer.structure == "Station" %} -
    {% translate "Station" %}
    + {% elif timer.structure == "Station" %} {% comment %} Pending Removal {% endcomment %} +
    {% elif timer.structure == "Orbital Skyhook" %} -
    {% translate "Orbital Skyhook" %}
    +
    {% elif timer.structure == "I-HUB" %} -
    {% translate "I-HUB" %}
    - {% elif timer.structure == "Engineering Complex[M]" or timer.structure == "Raitaru" %} -
    {% translate "Raitaru" %}
    - {% elif timer.structure == "Engineering Complex[L]" or timer.structure == "Azbel" %} -
    {% translate "Azbel" %}
    - {% elif timer.structure == "Refinery[M]" or timer.structure == "Athanor" %} -
    {% translate "Athanor" %}
    - {% elif timer.structure == "Refinery[L]" or timer.structure == "Tatara" %} -
    {% translate "Tatara" %}
    - {% elif timer.structure == "Cyno Beacon" or timer.structure == "Pharolux Cyno Beacon" %} -
    {% translate "Cyno Beacon" %}
    - {% elif timer.structure == "Cyno Jammer" or timer.structure == "Tenebrex Cyno Jammer" %} -
    {% translate "Cyno Jammer" %}
    - {% elif timer.structure == "Jump Gate" or timer.structure == "Ansiblex Jump Gate" %} -
    {% translate "Ansiblex Jump Gate" %}
    +
    + {% elif timer.structure == "Raitaru" %} +
    + {% elif timer.structure == "Azbel" %} +
    + {% elif timer.structure == "Athanor" %} +
    + {% elif timer.structure == "Tatara" %} +
    + {% elif timer.structure == "Pharolux Cyno Beacon" %} +
    + {% elif timer.structure == "Tenebrex Cyno Jammer" %} +
    + {% elif timer.structure == "Ansiblex Jump Gate" %} +
    {% elif timer.structure == "Mercenary Den" %} -
    {% translate "Mercenary Den" %}
    +
    {% elif timer.structure == "Metenox Moon Drill" %} -
    {% translate "Metenox Moon Drill" %}
    +
    {% comment %} BG: Danger {% endcomment %} {% elif timer.structure == "TCU" %} -
    {% translate "TCU" %}
    - {% elif timer.structure == "Citadel[M]" or timer.structure == "Astrahus" %} -
    {% translate "Astrahus" %}
    - {% elif timer.structure == "Citadel[L]" or timer.structure == "Fortizar" %} -
    {% translate "Fortizar" %}
    - {% elif timer.structure == "Citadel[XL]" or timer.structure == "Keepstar" %} -
    {% translate "Keepstar" %}
    - {% elif timer.structure == "Engineering Complex[XL]" or timer.structure == "Sotiyo" %} -
    {% translate "Sotiyo" %}
    +
    + {% elif timer.structure == "Astrahus" %} +
    + {% elif timer.structure == "Fortizar" %} +
    + {% elif timer.structure == "Keepstar" %} +
    + {% elif timer.structure == "Sotiyo" %} +
    {% comment %} BG: Secondary {% endcomment %} {% elif timer.structure == "TCU" %} {% comment %} Pending Removal {% endcomment %} -
    {% translate "TCU" %}
    +
    {% elif timer.structure == "Other" %} -
    {% translate "Other" %}
    +
    {% comment %} BG: Success {% endcomment %} {% elif timer.structure == "Moon Mining Cycle" %} -
    {% translate "Moon Mining Cycle" %}
    +
    + + {% comment %} BG: Primary (for all other timers) {% endcomment %} + {% else %} +
    {% endif %} + + {{ timer.get_structure_display }} +
    {{ timer.eve_time | date:"Y-m-d H:i" }} From c6b6443901a086b6ee02b9f7a37ef79b3c2d0381 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 6 Jan 2025 18:08:20 +0100 Subject: [PATCH 41/85] [CHANGE] Move structure label BG detection to Python instead of Django MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Python is faster and needs less memory … It's also much mire readable that way. --- .../templates/timerboard/timertable.html | 64 +-------- allianceauth/timerboard/views.py | 135 +++++++++++++++--- 2 files changed, 114 insertions(+), 85 deletions(-) diff --git a/allianceauth/timerboard/templates/timerboard/timertable.html b/allianceauth/timerboard/templates/timerboard/timertable.html index 455d0d94..014b01e8 100644 --- a/allianceauth/timerboard/templates/timerboard/timertable.html +++ b/allianceauth/timerboard/templates/timerboard/timertable.html @@ -51,69 +51,7 @@ - {% comment %} BG: Info {% endcomment %} - {% if timer.structure == "POCO" %} -
    - {% elif timer.structure == "POS[S]" %} -
    - {% elif timer.structure == "POS[M]" %} -
    - {% elif timer.structure == "POS[L]" %} -
    - - {% comment %} BG: Warning {% endcomment %} - {% elif timer.structure == "Station" %} {% comment %} Pending Removal {% endcomment %} -
    - {% elif timer.structure == "Orbital Skyhook" %} -
    - {% elif timer.structure == "I-HUB" %} -
    - {% elif timer.structure == "Raitaru" %} -
    - {% elif timer.structure == "Azbel" %} -
    - {% elif timer.structure == "Athanor" %} -
    - {% elif timer.structure == "Tatara" %} -
    - {% elif timer.structure == "Pharolux Cyno Beacon" %} -
    - {% elif timer.structure == "Tenebrex Cyno Jammer" %} -
    - {% elif timer.structure == "Ansiblex Jump Gate" %} -
    - {% elif timer.structure == "Mercenary Den" %} -
    - {% elif timer.structure == "Metenox Moon Drill" %} -
    - - {% comment %} BG: Danger {% endcomment %} - {% elif timer.structure == "TCU" %} -
    - {% elif timer.structure == "Astrahus" %} -
    - {% elif timer.structure == "Fortizar" %} -
    - {% elif timer.structure == "Keepstar" %} -
    - {% elif timer.structure == "Sotiyo" %} -
    - - {% comment %} BG: Secondary {% endcomment %} - {% elif timer.structure == "TCU" %} {% comment %} Pending Removal {% endcomment %} -
    - {% elif timer.structure == "Other" %} -
    - - {% comment %} BG: Success {% endcomment %} - {% elif timer.structure == "Moon Mining Cycle" %} -
    - - {% comment %} BG: Primary (for all other timers) {% endcomment %} - {% else %} -
    - {% endif %} - +
    {{ timer.get_structure_display }}
    diff --git a/allianceauth/timerboard/views.py b/allianceauth/timerboard/views.py index 93c877c8..bfee13ff 100644 --- a/allianceauth/timerboard/views.py +++ b/allianceauth/timerboard/views.py @@ -3,7 +3,8 @@ import logging from django.contrib import messages from django.contrib.auth.mixins import ( - LoginRequiredMixin, PermissionRequiredMixin, + LoginRequiredMixin, + PermissionRequiredMixin, ) from django.db.models import Q from django.shortcuts import get_object_or_404, redirect, render @@ -20,8 +21,8 @@ from allianceauth.timerboard.models import Timer logger = logging.getLogger(__name__) -TIMER_VIEW_PERMISSION = 'auth.timer_view' -TIMER_MANAGE_PERMISSION = 'auth.timer_management' +TIMER_VIEW_PERMISSION = "auth.timer_view" +TIMER_MANAGE_PERMISSION = "auth.timer_management" class BaseTimerView(LoginRequiredMixin, PermissionRequiredMixin, View): @@ -29,22 +30,112 @@ class BaseTimerView(LoginRequiredMixin, PermissionRequiredMixin, View): class TimerView(BaseTimerView): - template_name = 'timerboard/view.html' + template_name = "timerboard/view.html" permission_required = TIMER_VIEW_PERMISSION def get(self, request): + """ + Renders the timer view + + :param request: + :type request: + :return: + :rtype: + """ + + def get_bg_modifier(structure): + """ + Returns the bootstrap bg modifier for the given structure + + :param structure: + :type structure: + :return: + :rtype: + """ + + if structure in bg_info: + return "info" + elif structure in bg_waning: + return "warning" + elif structure in bg_danger: + return "danger" + elif structure in bg_secondary: + return "secondary" + + return "primary" + logger.debug(f"timer_view called by user {request.user}") char = request.user.profile.main_character + if char: corp = char.corporation else: corp = None - base_query = Timer.objects.select_related('eve_character') + + base_query = Timer.objects.select_related("eve_character") + + timers = [] + corp_timers = [] + future_timers = [] + past_timers = [] + + bg_info = [ + Timer.Structure.POCO.value, # POCO + Timer.Structure.POSS.value, # POS[S] + Timer.Structure.POSM.value, # POS[M] + Timer.Structure.POSL.value, # POS[L] + ] + bg_waning = [ + Timer.Structure.ANSIBLEX.value, # Ansiblex Jump Gate + Timer.Structure.ATHANOR.value, # Athanor + Timer.Structure.AZBEL.value, # Azbel + Timer.Structure.MERCDEN.value, # Mercenary Den + Timer.Structure.METENOX.value, # Metenox Moon Drill + Timer.Structure.ORBITALSKYHOOK.value, # Orbital Skyhook + Timer.Structure.PHAROLUX.value, # Pharolux Cyno Beacon + Timer.Structure.RAITARU.value, # Raitaru + "Station", # Legacy structure, remove in future update + Timer.Structure.TATARA.value, # Tatara + Timer.Structure.TENEBREX.value, # Tenebrex Cyno Jammer + ] + bg_danger = [ + Timer.Structure.ASTRAHUS.value, # Astrahus + Timer.Structure.FORTIZAR.value, # Fortizar + Timer.Structure.IHUB.value, # I-HUB + Timer.Structure.KEEPSTAR.value, # Keepstar + Timer.Structure.SOTIYO.value, # Sotiyo + Timer.Structure.TCU.value, # TCU (Legacy structure, remove in future update) + ] + bg_secondary = [ + Timer.Structure.MOONPOP.value, # Moon Mining Cycle + Timer.Structure.OTHER.value, # Other + ] + + # Timers + for timer in base_query.filter(corp_timer=False): + timer.bg_modifier = get_bg_modifier(timer.structure) + timers.append(timer) + + # Corp Timers + for timer in base_query.filter(corp_timer=True, eve_corp=corp): + timer.bg_modifier = get_bg_modifier(timer.structure) + corp_timers.append(timer) + + # Future Timers + for timer in base_query.filter(corp_timer=False, eve_time__gte=timezone.now()): + timer.bg_modifier = get_bg_modifier(timer.structure) + future_timers.append(timer) + + # Past Timers + for timer in base_query.filter(corp_timer=False, eve_time__lt=timezone.now()): + timer.bg_modifier = get_bg_modifier(timer.structure) + past_timers.append(timer) + render_items = { - 'timers': base_query.filter(corp_timer=False), - 'corp_timers': base_query.filter(corp_timer=True, eve_corp=corp), - 'future_timers': base_query.filter(corp_timer=False, eve_time__gte=timezone.now()), - 'past_timers': base_query.filter(corp_timer=False, eve_time__lt=timezone.now()), + "timers": timers, + "corp_timers": corp_timers, + "future_timers": future_timers, + "past_timers": past_timers, } return render(request, self.template_name, context=render_items) @@ -52,7 +143,7 @@ class TimerView(BaseTimerView): class TimerManagementView(BaseTimerView): permission_required = TIMER_MANAGE_PERMISSION - index_redirect = 'timerboard:view' + index_redirect = "timerboard:view" success_url = reverse_lazy(index_redirect) model = Timer @@ -66,12 +157,12 @@ class AddUpdateMixin: Inject the request user into the kwargs passed to the form """ kwargs = super().get_form_kwargs() - kwargs.update({'user': self.request.user}) + kwargs.update({"user": self.request.user}) return kwargs class AddTimerView(TimerManagementView, AddUpdateMixin, CreateView): - template_name_suffix = '_create_form' + template_name_suffix = "_create_form" form_class = TimerForm def form_valid(self, form): @@ -82,17 +173,18 @@ class AddTimerView(TimerManagementView, AddUpdateMixin, CreateView): ) messages.success( self.request, - _('Added new timer in %(system)s at %(time)s.') % {"system": timer.system, "time": timer.eve_time} + _("Added new timer in %(system)s at %(time)s.") + % {"system": timer.system, "time": timer.eve_time}, ) return result class EditTimerView(TimerManagementView, AddUpdateMixin, UpdateView): - template_name_suffix = '_update_form' + template_name_suffix = "_update_form" form_class = TimerForm def form_valid(self, form): - messages.success(self.request, _('Saved changes to the timer.')) + messages.success(self.request, _("Saved changes to the timer.")) return super().form_valid(form) @@ -107,21 +199,20 @@ def dashboard_timers(request): except (EveCorporationInfo.DoesNotExist, AttributeError): return "" - timers = Timer.objects.select_related( - 'eve_character' - ).filter( + timers = Timer.objects.select_related("eve_character").filter( (Q(corp_timer=True) & Q(eve_corp=corp)) | Q(corp_timer=False), - eve_time__gte=timezone.now() + eve_time__gte=timezone.now(), )[:5] if timers.count(): context = { - 'timers': timers, + "timers": timers, } return render_to_string( - template_name='timerboard/dashboard.timers.html', - context=context, request=request + template_name="timerboard/dashboard.timers.html", + context=context, + request=request, ) else: return "" From b737504d52fea34e7274b0f5b7e4233110166c91 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 6 Jan 2025 18:08:52 +0100 Subject: [PATCH 42/85] [REMOVE] Unused imports --- allianceauth/timerboard/views.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/allianceauth/timerboard/views.py b/allianceauth/timerboard/views.py index bfee13ff..27c6045f 100644 --- a/allianceauth/timerboard/views.py +++ b/allianceauth/timerboard/views.py @@ -1,4 +1,3 @@ -import datetime import logging from django.contrib import messages @@ -7,7 +6,7 @@ from django.contrib.auth.mixins import ( PermissionRequiredMixin, ) from django.db.models import Q -from django.shortcuts import get_object_or_404, redirect, render +from django.shortcuts import get_object_or_404, render from django.template.loader import render_to_string from django.urls import reverse_lazy from django.utils import timezone From 4578ecf21dbe79df29855a08256af88fe7ee2e8a Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 6 Jan 2025 18:17:21 +0100 Subject: [PATCH 43/85] [ADD] Missing migration --- .../migrations/0007_alter_timer_structure.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 allianceauth/timerboard/migrations/0007_alter_timer_structure.py diff --git a/allianceauth/timerboard/migrations/0007_alter_timer_structure.py b/allianceauth/timerboard/migrations/0007_alter_timer_structure.py new file mode 100644 index 00000000..e7468d57 --- /dev/null +++ b/allianceauth/timerboard/migrations/0007_alter_timer_structure.py @@ -0,0 +1,45 @@ +# Generated by Django 4.2.17 on 2025-01-06 17:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("timerboard", "0006_alter_timer_objective_alter_timer_structure_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="timer", + name="structure", + field=models.CharField( + choices=[ + ("POCO", "POCO"), + ("Orbital Skyhook", "Orbital Skyhook"), + ("I-HUB", "Soverreignty Hub"), + ("TCU", "TCU"), + ("POS[S]", "POS [S]"), + ("POS[M]", "POS [M]"), + ("POS[L]", "POS [L]"), + ("Astrahus", "Astrahus"), + ("Fortizar", "Fortizar"), + ("Keepstar", "Keepstar"), + ("Raitaru", "Raitaru"), + ("Azbel", "Azbel"), + ("Sotiyo", "Sotiyo"), + ("Athanor", "Athanor"), + ("Tatara", "Tatara"), + ("Pharolux Cyno Beacon", "Cyno Beacon"), + ("Tenebrex Cyno Jammer", "Cyno Jammer"), + ("Ansiblex Jump Gate", "Ansiblex Jump Gate"), + ("Mercenary Den", "Mercenary Den"), + ("Moon Mining Cycle", "Moon Mining Cycle"), + ("Metenox Moon Drill", "Metenox Moon Drill"), + ("Other", "Other"), + ], + default="Other", + max_length=254, + ), + ), + ] From d99f5858d83cc4daebb27996b9386c9fc664cef1 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 8 Jan 2025 23:04:29 +0100 Subject: [PATCH 44/85] [FIX] Moment.JS Localisation Load the right JS when our language code has 2 parts - fr_FR - it_IT - pl_PL And so on --- allianceauth/templates/bundles/moment-js.html | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/allianceauth/templates/bundles/moment-js.html b/allianceauth/templates/bundles/moment-js.html index a094b4be..802411b9 100644 --- a/allianceauth/templates/bundles/moment-js.html +++ b/allianceauth/templates/bundles/moment-js.html @@ -1,7 +1,19 @@ +{% load i18n %} + + {% if locale and LANGUAGE_CODE != 'en' %} - + {% get_current_language as LANGUAGE_CODE %} + {% get_language_info for LANGUAGE_CODE as lang %} + + {% if lang.code == 'zh-hans' %} + + + {% else %} + + + {% endif %} {% endif %} From 3efdb8f12b24f0ec089eac22c5a2c8f9f658cd21 Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Fri, 10 Jan 2025 08:29:02 +0000 Subject: [PATCH 45/85] Docker/Baremetal Analytics --- allianceauth/analytics/admin.py | 7 +++--- .../0010_alter_analyticsidentifier_options.py | 17 ++++++++++++++ allianceauth/analytics/models.py | 22 ++++++++----------- allianceauth/analytics/tasks.py | 16 +++++++++----- allianceauth/analytics/tests/test_models.py | 15 ++----------- allianceauth/analytics/utils.py | 14 ++++++++++++ docs/features/core/analytics.md | 1 + 7 files changed, 58 insertions(+), 34 deletions(-) create mode 100644 allianceauth/analytics/migrations/0010_alter_analyticsidentifier_options.py diff --git a/allianceauth/analytics/admin.py b/allianceauth/analytics/admin.py index 383bbbe2..497f2d7c 100644 --- a/allianceauth/analytics/admin.py +++ b/allianceauth/analytics/admin.py @@ -1,15 +1,16 @@ from django.contrib import admin from .models import AnalyticsIdentifier, AnalyticsTokens +from solo.admin import SingletonModelAdmin @admin.register(AnalyticsIdentifier) -class AnalyticsIdentifierAdmin(admin.ModelAdmin): +class AnalyticsIdentifierAdmin(SingletonModelAdmin): search_fields = ['identifier', ] - list_display = ('identifier',) + list_display = ['identifier', ] @admin.register(AnalyticsTokens) class AnalyticsTokensAdmin(admin.ModelAdmin): search_fields = ['name', ] - list_display = ('name', 'type',) + list_display = ['name', 'type', ] diff --git a/allianceauth/analytics/migrations/0010_alter_analyticsidentifier_options.py b/allianceauth/analytics/migrations/0010_alter_analyticsidentifier_options.py new file mode 100644 index 00000000..7c1993e9 --- /dev/null +++ b/allianceauth/analytics/migrations/0010_alter_analyticsidentifier_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.16 on 2024-12-11 02:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('analytics', '0009_remove_analyticstokens_ignore_paths_and_more'), + ] + + operations = [ + migrations.AlterModelOptions( + name='analyticsidentifier', + options={'verbose_name': 'Analytics Identifier'}, + ), + ] diff --git a/allianceauth/analytics/models.py b/allianceauth/analytics/models.py index ddee495a..16ea0221 100644 --- a/allianceauth/analytics/models.py +++ b/allianceauth/analytics/models.py @@ -1,23 +1,19 @@ +from typing import Literal from django.db import models -from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ - +from solo.models import SingletonModel from uuid import uuid4 -class AnalyticsIdentifier(models.Model): +class AnalyticsIdentifier(SingletonModel): - identifier = models.UUIDField( - default=uuid4, - editable=False) + identifier = models.UUIDField(default=uuid4, editable=False) - def save(self, *args, **kwargs): - if not self.pk and AnalyticsIdentifier.objects.exists(): - # Force a single object - raise ValidationError('There is can be only one \ - AnalyticsIdentifier instance') - self.pk = self.id = 1 # If this happens to be deleted and recreated, force it to be 1 - return super().save(*args, **kwargs) + def __str__(self) -> Literal['Analytics Identifier']: + return "Analytics Identifier" + + class Meta: + verbose_name = "Analytics Identifier" class AnalyticsTokens(models.Model): diff --git a/allianceauth/analytics/tasks.py b/allianceauth/analytics/tasks.py index cc9ef160..d0a76c30 100644 --- a/allianceauth/analytics/tasks.py +++ b/allianceauth/analytics/tasks.py @@ -5,6 +5,7 @@ from django.apps import apps from celery import shared_task from .models import AnalyticsTokens, AnalyticsIdentifier from .utils import ( + existence_baremetal_or_docker, install_stat_addons, install_stat_tokens, install_stat_users) @@ -67,8 +68,8 @@ def analytics_event(namespace: str, value=value).apply_async(priority=9) -@shared_task() -def analytics_daily_stats(): +@shared_task +def analytics_daily_stats() -> None: """Celery Task: Do not call directly Gathers a series of daily statistics @@ -77,6 +78,7 @@ def analytics_daily_stats(): users = install_stat_users() tokens = install_stat_tokens() addons = install_stat_addons() + existence_type = existence_baremetal_or_docker() logger.debug("Running Daily Analytics Upload") analytics_event(namespace='allianceauth.analytics', @@ -84,6 +86,11 @@ def analytics_daily_stats(): label='existence', value=1, event_type='Stats') + analytics_event(namespace='allianceauth.analytics', + task='send_install_stats', + label=existence_type, + value=1, + event_type='Stats') analytics_event(namespace='allianceauth.analytics', task='send_install_stats', label='users', @@ -99,7 +106,6 @@ def analytics_daily_stats(): label='addons', value=addons, event_type='Stats') - for appconfig in apps.get_app_configs(): if appconfig.label in [ "django_celery_beat", @@ -135,7 +141,7 @@ def analytics_daily_stats(): event_type='Stats') -@shared_task() +@shared_task def send_ga_tracking_celery_event( measurement_id: str, secret: str, @@ -165,7 +171,7 @@ def send_ga_tracking_celery_event( } payload = { - 'client_id': AnalyticsIdentifier.objects.get(id=1).identifier.hex, + 'client_id': AnalyticsIdentifier.get_solo().identifier.hex, "user_properties": { "allianceauth_version": { "value": __version__ diff --git a/allianceauth/analytics/tests/test_models.py b/allianceauth/analytics/tests/test_models.py index 452c4eaa..979f2720 100644 --- a/allianceauth/analytics/tests/test_models.py +++ b/allianceauth/analytics/tests/test_models.py @@ -1,9 +1,8 @@ from allianceauth.analytics.models import AnalyticsIdentifier -from django.core.exceptions import ValidationError from django.test.testcases import TestCase -from uuid import UUID, uuid4 +from uuid import uuid4 # Identifiers @@ -14,14 +13,4 @@ uuid_2 = "7aa6bd70701f44729af5e3095ff4b55c" class TestAnalyticsIdentifier(TestCase): def test_identifier_random(self): - self.assertNotEqual(AnalyticsIdentifier.objects.get(), uuid4) - - def test_identifier_singular(self): - AnalyticsIdentifier.objects.all().delete() - AnalyticsIdentifier.objects.create(identifier=uuid_1) - # Yeah i have multiple asserts here, they all do the same thing - with self.assertRaises(ValidationError): - AnalyticsIdentifier.objects.create(identifier=uuid_2) - self.assertEqual(AnalyticsIdentifier.objects.count(), 1) - self.assertEqual(AnalyticsIdentifier.objects.get( - pk=1).identifier, UUID(uuid_1)) + self.assertNotEqual(AnalyticsIdentifier.get_solo(), uuid4) diff --git a/allianceauth/analytics/utils.py b/allianceauth/analytics/utils.py index e8c57927..fa50084f 100644 --- a/allianceauth/analytics/utils.py +++ b/allianceauth/analytics/utils.py @@ -1,3 +1,4 @@ +import os from django.apps import apps from allianceauth.authentication.models import User from esi.models import Token @@ -34,3 +35,16 @@ def install_stat_addons() -> int: The Number of Installed Apps""" addons = len(list(apps.get_app_configs())) return addons + + +def existence_baremetal_or_docker() -> str: + """Checks the Installation Type of an install + + Returns + ------- + str + existence_baremetal or existence_docker""" + docker_tag = os.getenv('AA_DOCKER_TAG') + if docker_tag: + return "existence_docker" + return "existence_baremetal" diff --git a/docs/features/core/analytics.md b/docs/features/core/analytics.md index d610edb6..d04c47a3 100644 --- a/docs/features/core/analytics.md +++ b/docs/features/core/analytics.md @@ -27,6 +27,7 @@ Analytics comes preloaded with our Google Analytics token, and the three types o Our Daily Stats contain the following: - A phone-in task to identify a server's existence +- A phone-in task to identify if a server is Bare-Metal or Dockerized - A task to send the Number of User models - A task to send the Number of Token Models - A task to send the Number of Installed Apps From a03c7668400bfad8ba43e4040e2ddba3098a91df Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Fri, 10 Jan 2025 11:41:31 +0100 Subject: [PATCH 46/85] [FIX] Spelling mistakes Thx @soratidus999 --- .../timerboard/migrations/0007_alter_timer_structure.py | 2 +- allianceauth/timerboard/models.py | 2 +- allianceauth/timerboard/views.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/allianceauth/timerboard/migrations/0007_alter_timer_structure.py b/allianceauth/timerboard/migrations/0007_alter_timer_structure.py index e7468d57..26513513 100644 --- a/allianceauth/timerboard/migrations/0007_alter_timer_structure.py +++ b/allianceauth/timerboard/migrations/0007_alter_timer_structure.py @@ -17,7 +17,7 @@ class Migration(migrations.Migration): choices=[ ("POCO", "POCO"), ("Orbital Skyhook", "Orbital Skyhook"), - ("I-HUB", "Soverreignty Hub"), + ("I-HUB", "Sovereignty Hub"), ("TCU", "TCU"), ("POS[S]", "POS [S]"), ("POS[M]", "POS [M]"), diff --git a/allianceauth/timerboard/models.py b/allianceauth/timerboard/models.py index 6823ea8d..bf6f9b08 100644 --- a/allianceauth/timerboard/models.py +++ b/allianceauth/timerboard/models.py @@ -23,7 +23,7 @@ class Timer(models.Model): POCO = "POCO", _("POCO") ORBITALSKYHOOK = "Orbital Skyhook", _("Orbital Skyhook") - IHUB = "I-HUB", _("Soverreignty Hub") + IHUB = "I-HUB", _("Sovereignty Hub") TCU = "TCU", _("TCU") # Pending Remval POSS = "POS[S]", _("POS [S]") POSM = "POS[M]", _("POS [M]") diff --git a/allianceauth/timerboard/views.py b/allianceauth/timerboard/views.py index 27c6045f..0c7c76d1 100644 --- a/allianceauth/timerboard/views.py +++ b/allianceauth/timerboard/views.py @@ -54,7 +54,7 @@ class TimerView(BaseTimerView): if structure in bg_info: return "info" - elif structure in bg_waning: + elif structure in bg_warning: return "warning" elif structure in bg_danger: return "danger" @@ -84,7 +84,7 @@ class TimerView(BaseTimerView): Timer.Structure.POSM.value, # POS[M] Timer.Structure.POSL.value, # POS[L] ] - bg_waning = [ + bg_warning = [ Timer.Structure.ANSIBLEX.value, # Ansiblex Jump Gate Timer.Structure.ATHANOR.value, # Athanor Timer.Structure.AZBEL.value, # Azbel From 60998bffc2dd3b05815e402d9fb7dd4eb0f917c4 Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Fri, 10 Jan 2025 12:10:49 +0000 Subject: [PATCH 47/85] Cron Offset Tasks --- allianceauth/apps.py | 1 - allianceauth/crontab/__init__.py | 3 + allianceauth/crontab/apps.py | 14 ++++ allianceauth/crontab/models.py | 23 ++++++ allianceauth/crontab/schedulers.py | 63 +++++++++++++++ allianceauth/crontab/tests/__init__.py | 0 allianceauth/crontab/tests/test_models.py | 63 +++++++++++++++ allianceauth/crontab/tests/test_utils.py | 80 +++++++++++++++++++ allianceauth/crontab/utils.py | 41 ++++++++++ .../project_name/settings/base.py | 6 +- docs/development/tech_docu/celery.md | 51 +++++++++++- 11 files changed, 341 insertions(+), 4 deletions(-) create mode 100644 allianceauth/crontab/__init__.py create mode 100644 allianceauth/crontab/apps.py create mode 100644 allianceauth/crontab/models.py create mode 100644 allianceauth/crontab/schedulers.py create mode 100644 allianceauth/crontab/tests/__init__.py create mode 100644 allianceauth/crontab/tests/test_models.py create mode 100644 allianceauth/crontab/tests/test_utils.py create mode 100644 allianceauth/crontab/utils.py diff --git a/allianceauth/apps.py b/allianceauth/apps.py index 098f50ba..1191fed9 100644 --- a/allianceauth/apps.py +++ b/allianceauth/apps.py @@ -1,5 +1,4 @@ from django.apps import AppConfig -from django.core.checks import Warning, Error, register class AllianceAuthConfig(AppConfig): diff --git a/allianceauth/crontab/__init__.py b/allianceauth/crontab/__init__.py new file mode 100644 index 00000000..c621f6d2 --- /dev/null +++ b/allianceauth/crontab/__init__.py @@ -0,0 +1,3 @@ +""" +Alliance Auth Crontab Utilities +""" diff --git a/allianceauth/crontab/apps.py b/allianceauth/crontab/apps.py new file mode 100644 index 00000000..e47e39ed --- /dev/null +++ b/allianceauth/crontab/apps.py @@ -0,0 +1,14 @@ +""" +Crontab App Config +""" + +from django.apps import AppConfig + + +class CrontabConfig(AppConfig): + """ + Crontab App Config + """ + + name = "allianceauth.crontab" + label = "crontab" diff --git a/allianceauth/crontab/models.py b/allianceauth/crontab/models.py new file mode 100644 index 00000000..f23b35ea --- /dev/null +++ b/allianceauth/crontab/models.py @@ -0,0 +1,23 @@ +from random import random +from django.db import models +from django.utils.translation import gettext_lazy as _ +from solo.models import SingletonModel + + +def random_default() -> float: + return random() + + +class CronOffset(SingletonModel): + + minute = models.FloatField(_("Minute Offset"), default=random_default) + hour = models.FloatField(_("Hour Offset"), default=random_default) + day_of_month = models.FloatField(_("Day of Month Offset"), default=random_default) + month_of_year = models.FloatField(_("Month of Year Offset"), default=random_default) + day_of_week = models.FloatField(_("Day of Week Offset"), default=random_default) + + def __str__(self) -> str: + return "Cron Offsets" + + class Meta: + verbose_name = "Cron Offsets" diff --git a/allianceauth/crontab/schedulers.py b/allianceauth/crontab/schedulers.py new file mode 100644 index 00000000..0b36eead --- /dev/null +++ b/allianceauth/crontab/schedulers.py @@ -0,0 +1,63 @@ +from django.core.exceptions import ObjectDoesNotExist +from django_celery_beat.schedulers import ( + DatabaseScheduler +) +from django_celery_beat.models import CrontabSchedule +from django.db.utils import OperationalError, ProgrammingError + +from celery import schedules +from celery.utils.log import get_logger + +from allianceauth.crontab.models import CronOffset +from allianceauth.crontab.utils import offset_cron + +logger = get_logger(__name__) + + +class OffsetDatabaseScheduler(DatabaseScheduler): + """ + Customization of Django Celery Beat, Database Scheduler + Takes the Celery Schedule from local.py and applies our AA Framework Cron Offset, if apply_offset is true + Otherwise it passes it through as normal + """ + def update_from_dict(self, mapping): + s = {} + + try: + cron_offset = CronOffset.get_solo() + except (OperationalError, ProgrammingError, ObjectDoesNotExist) as exc: + # This is just incase we haven't migrated yet or something + logger.warning( + "OffsetDatabaseScheduler: Could not fetch CronOffset (%r). " + "Defering to DatabaseScheduler", + exc + ) + return super().update_from_dict(mapping) + + for name, entry_fields in mapping.items(): + try: + apply_offset = entry_fields.pop("apply_offset", False) + entry = self.Entry.from_entry(name, app=self.app, **entry_fields) + + if entry.model.enabled and apply_offset: + schedule_obj = entry.schedule + if isinstance(schedule_obj, schedules.crontab): + offset_cs = CrontabSchedule.from_schedule(offset_cron(schedule_obj)) + offset_cs, created = CrontabSchedule.objects.get_or_create( + minute=offset_cs.minute, + hour=offset_cs.hour, + day_of_month=offset_cs.day_of_month, + month_of_year=offset_cs.month_of_year, + day_of_week=offset_cs.day_of_week, + timezone=offset_cs.timezone, + ) + entry.model.crontab = offset_cs + entry.model.save() + logger.debug(f"Offset applied for '{name}' due to 'apply_offset' = True.") + + s[name] = entry + + except Exception as e: + logger.exception("Error updating schedule for %s: %r", name, e) + + self.schedule.update(s) diff --git a/allianceauth/crontab/tests/__init__.py b/allianceauth/crontab/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/allianceauth/crontab/tests/test_models.py b/allianceauth/crontab/tests/test_models.py new file mode 100644 index 00000000..cb92e667 --- /dev/null +++ b/allianceauth/crontab/tests/test_models.py @@ -0,0 +1,63 @@ +from unittest.mock import patch +from django.test import TestCase + +from allianceauth.crontab.models import CronOffset + + +class CronOffsetModelTest(TestCase): + def test_cron_offset_is_singleton(self): + """ + Test that CronOffset is indeed a singleton and that + multiple calls to get_solo() return the same instance. + """ + offset1 = CronOffset.get_solo() + offset2 = CronOffset.get_solo() + + # They should be the exact same object in memory + self.assertEqual(offset1.pk, offset2.pk) + + def test_default_values_random(self): + """ + Test that the default values are set via random_default() when + no explicit value is provided. We'll patch 'random.random' to + produce predictable output. + """ + with patch('allianceauth.crontab.models.random', return_value=0.1234): + # Force creation of a new CronOffset by clearing the existing one + CronOffset.objects.all().delete() + + offset = CronOffset.get_solo() # This triggers creation + + # All fields should be 0.1234, because we patched random() + self.assertAlmostEqual(offset.minute, 0.1234) + self.assertAlmostEqual(offset.hour, 0.1234) + self.assertAlmostEqual(offset.day_of_month, 0.1234) + self.assertAlmostEqual(offset.month_of_year, 0.1234) + self.assertAlmostEqual(offset.day_of_week, 0.1234) + + def test_update_offset_values(self): + """ + Test that we can update the offsets and retrieve them. + """ + offset = CronOffset.get_solo() + offset.minute = 0.5 + offset.hour = 0.25 + offset.day_of_month = 0.75 + offset.month_of_year = 0.99 + offset.day_of_week = 0.33 + offset.save() + + # Retrieve again to ensure changes persist + saved_offset = CronOffset.get_solo() + self.assertEqual(saved_offset.minute, 0.5) + self.assertEqual(saved_offset.hour, 0.25) + self.assertEqual(saved_offset.day_of_month, 0.75) + self.assertEqual(saved_offset.month_of_year, 0.99) + self.assertEqual(saved_offset.day_of_week, 0.33) + + def test_str_representation(self): + """ + Verify the __str__ method returns 'Cron Offsets'. + """ + offset = CronOffset.get_solo() + self.assertEqual(str(offset), "Cron Offsets") diff --git a/allianceauth/crontab/tests/test_utils.py b/allianceauth/crontab/tests/test_utils.py new file mode 100644 index 00000000..48592c99 --- /dev/null +++ b/allianceauth/crontab/tests/test_utils.py @@ -0,0 +1,80 @@ +# myapp/tests/test_tasks.py + +import logging +from unittest.mock import patch +from django.test import TestCase +from django.db import ProgrammingError +from celery.schedules import crontab + +from allianceauth.crontab.utils import offset_cron +from allianceauth.crontab.models import CronOffset + +logger = logging.getLogger(__name__) + + +class TestOffsetCron(TestCase): + + def test_offset_cron_normal(self): + """ + Test that offset_cron modifies the minute/hour fields + based on the CronOffset values when everything is normal. + """ + # We'll create a mock CronOffset instance + mock_offset = CronOffset(minute=0.5, hour=0.5) + + # Our initial crontab schedule + original_schedule = crontab( + minute=[0, 5, 55], + hour=[0, 3, 23], + day_of_month='*', + month_of_year='*', + day_of_week='*' + ) + + # Patch CronOffset.get_solo to return our mock offset + with patch('allianceauth.crontab.models.CronOffset.get_solo', return_value=mock_offset): + new_schedule = offset_cron(original_schedule) + + # Check the new minute/hour + # minute 0 -> 0 + round(60 * 0.5) = 30 % 60 = 30 + # minute 5 -> 5 + 30 = 35 % 60 = 35 + # minute 55 -> 55 + 30 = 85 % 60 = 25 --> sorted => 25,30,35 + self.assertEqual(new_schedule._orig_minute, '25,30,35') + + # hour 0 -> 0 + round(24 * 0.5) = 12 % 24 = 12 + # hour 3 -> 3 + 12 = 15 % 24 = 15 + # hour 23 -> 23 + 12 = 35 % 24 = 11 --> sorted => 11,12,15 + self.assertEqual(new_schedule._orig_hour, '11,12,15') + + # Check that other fields are unchanged + self.assertEqual(new_schedule._orig_day_of_month, '*') + self.assertEqual(new_schedule._orig_month_of_year, '*') + self.assertEqual(new_schedule._orig_day_of_week, '*') + + def test_offset_cron_programming_error(self): + """ + Test that if a ProgrammingError is raised (e.g. before migrations), + offset_cron just returns the original schedule. + """ + original_schedule = crontab(minute=[0, 15, 30], hour=[1, 2, 3]) + + # Force get_solo to raise ProgrammingError + with patch('allianceauth.crontab.models.CronOffset.get_solo', side_effect=ProgrammingError()): + new_schedule = offset_cron(original_schedule) + + # Should return the original schedule unchanged + self.assertEqual(new_schedule, original_schedule) + + def test_offset_cron_unexpected_exception(self): + """ + Test that if any other exception is raised, offset_cron + also returns the original schedule, and logs the error. + """ + original_schedule = crontab(minute='0', hour='0') + + # Force get_solo to raise a generic Exception + with patch('allianceauth.crontab.models.CronOffset.get_solo', side_effect=Exception("Something bad")): + new_schedule = offset_cron(original_schedule) + + # Should return the original schedule unchanged + self.assertEqual(new_schedule, original_schedule) diff --git a/allianceauth/crontab/utils.py b/allianceauth/crontab/utils.py new file mode 100644 index 00000000..150664ca --- /dev/null +++ b/allianceauth/crontab/utils.py @@ -0,0 +1,41 @@ +from celery.schedules import crontab +import logging +from allianceauth.crontab.models import CronOffset +from django.db import ProgrammingError + + +logger = logging.getLogger(__name__) + + +def offset_cron(schedule: crontab) -> crontab: + """Take a crontab and apply a series of precalculated offsets to spread out tasks execution on remote resources + + Args: + schedule (crontab): celery.schedules.crontab() + + Returns: + crontab: A crontab with offsetted Minute and Hour fields + """ + + try: + cron_offset = CronOffset.get_solo() + new_minute = [(m + (round(60 * cron_offset.minute))) % 60 for m in schedule.minute] + new_hour = [(m + (round(24 * cron_offset.hour))) % 24 for m in schedule.hour] + + return crontab( + minute=",".join(str(m) for m in sorted(new_minute)), + hour=",".join(str(h) for h in sorted(new_hour)), + day_of_month=schedule._orig_day_of_month, + month_of_year=schedule._orig_month_of_year, + day_of_week=schedule._orig_day_of_week) + + except ProgrammingError as e: + # If this is called before migrations are run hand back the default schedule + # These offsets are stored in a Singleton Model, + logger.error(e) + return schedule + + except Exception as e: + # We absolutely cant fail to hand back a schedule + logger.error(e) + return schedule diff --git a/allianceauth/project_template/project_name/settings/base.py b/allianceauth/project_template/project_name/settings/base.py index 9e8d6957..56e7c493 100644 --- a/allianceauth/project_template/project_name/settings/base.py +++ b/allianceauth/project_template/project_name/settings/base.py @@ -43,6 +43,7 @@ INSTALLED_APPS = [ 'allianceauth.theme.flatly', 'allianceauth.theme.materia', "allianceauth.custom_css", + 'allianceauth.crontab', 'sri', ] @@ -51,7 +52,7 @@ SECRET_KEY = "wow I'm a really bad default secret key" # Celery configuration BROKER_URL = 'redis://localhost:6379/0' -CELERYBEAT_SCHEDULER = "django_celery_beat.schedulers.DatabaseScheduler" +CELERYBEAT_SCHEDULER = "allianceauth.crontab.schedulers.OffsetDatabaseScheduler" CELERYBEAT_SCHEDULE = { 'esi_cleanup_callbackredirect': { 'task': 'esi.tasks.cleanup_callbackredirect', @@ -64,10 +65,12 @@ CELERYBEAT_SCHEDULE = { 'run_model_update': { 'task': 'allianceauth.eveonline.tasks.run_model_update', 'schedule': crontab(minute='0', hour="*/6"), + 'apply_offset': True }, 'check_all_character_ownership': { 'task': 'allianceauth.authentication.tasks.check_all_character_ownership', 'schedule': crontab(minute='0', hour='*/4'), + 'apply_offset': True }, 'analytics_daily_stats': { 'task': 'allianceauth.analytics.tasks.analytics_daily_stats', @@ -75,6 +78,7 @@ CELERYBEAT_SCHEDULE = { } } + # Build paths inside the project like this: os.path.join(BASE_DIR, ...) PROJECT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR = os.path.dirname(PROJECT_DIR) diff --git a/docs/development/tech_docu/celery.md b/docs/development/tech_docu/celery.md index 3f39d299..b9571170 100644 --- a/docs/development/tech_docu/celery.md +++ b/docs/development/tech_docu/celery.md @@ -123,6 +123,7 @@ Example setting: CELERYBEAT_SCHEDULE['structures_update_all_structures'] = { 'task': 'structures.tasks.update_all_structures', 'schedule': crontab(minute='*/30'), + 'apply_offset': True, } ``` @@ -130,6 +131,7 @@ CELERYBEAT_SCHEDULE['structures_update_all_structures'] = { - `'task'`: Name of your task (full path) - `'schedule'`: Schedule definition (see Celery documentation on [Periodic Tasks](https://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html) for details) +- `'apply_offset'`: Boolean, Apply a Delay unique to the install, in order to reduce impact on ESI. See [Apply Offset](#apply-offset) ## How can I use priorities for tasks? @@ -174,9 +176,54 @@ Large numbers of installs running the same crontab (ie. `0 * * * *`) can all sla Consider Artificially smoothing out your tasks with a few methods -### Offset Crontabs +### Apply Offset -Avoid running your tasks on the hour or other nice neat human numbers, consider 23 minutes on the hour instead of at zero (`28 * * * *`) +`allianceauth.crontab` contains a series of Offsets stored in the DB that are both static for an install, but random across all AA installs. + +This enables us to spread our load on ESI (or other external resources) across a greater window, making it unlikely that two installs will hit ESI at the same time. + +Tasks defined in local.py, can have `'apply_offset': True` added to their Task Definition + +```python +CELERYBEAT_SCHEDULE['taskname'] = { + 'task': 'module.tasks.task', + 'schedule': crontab(minute='*/30'), + 'apply_offset': True, +} +``` + +Tasks added to directly to Django Celery Beat Models (Using a Management Task etc) can pass their Cron Schedule through offset_cron(crontab) + +```{eval-rst} +.. automodule:: allianceauth.crontab.utils + :members: + :undoc-members: +``` + +```python +from django_celery_beat.models import CrontabSchedule, PeriodicTask +from celery.schedules import crontab + +schedule = CrontabSchedule.from_schedule(offset_cron(crontab(minute='0', hour='0'))) + +schedule, created = CrontabSchedule.objects.get_or_create( + minute=schedule.minute, + hour=schedule.hour, + day_of_month=schedule.day_of_month, + month_of_year=schedule.month_of_year, + day_of_week=schedule.day_of_week, + timezone=schedule.timezone, +) + +PeriodicTask.objects.update_or_create( + task='module.tasks.task', + defaults={ + 'crontab': schedule, + 'name': 'task name', + 'enabled': True + } +) +``` ### Subset Tasks From 92c2af9975c9b6ca9f8bfba705368ffd8ddb0fb9 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 12 Jan 2025 17:12:23 +0100 Subject: [PATCH 48/85] [CHANGE] Timertables to Datatables --- .../templates/timerboard/timertable.html | 146 +++++++++--------- .../timerboard/templates/timerboard/view.html | 27 +++- 2 files changed, 98 insertions(+), 75 deletions(-) diff --git a/allianceauth/timerboard/templates/timerboard/timertable.html b/allianceauth/timerboard/templates/timerboard/timertable.html index 014b01e8..13690dc2 100644 --- a/allianceauth/timerboard/templates/timerboard/timertable.html +++ b/allianceauth/timerboard/templates/timerboard/timertable.html @@ -2,80 +2,84 @@ {% load i18n %}
    - - - - - - - - - - - {% if perms.auth.timer_management %} - - {% endif %} - - - {% for timer in timers %} - - - - - - - - - - - - - - +
    {% translate "Details" %}{% translate "Objective" %}{% translate "System" %}{% translate "Structure" %}{% translate "Eve Time" %}{% translate "Local Time" %}{% translate "Creator" %}{% translate "Action" %}
    - {{ timer.details }} - - {% if timer.timer_type != 'UNSPECIFIED' %} -
    - ({{ timer.get_timer_type_display }}) - {% endif %} -
    - {% comment %} Objective: Hostile (BG: Danger) {% endcomment %} - {% if timer.objective == "Hostile" %} -
    - - {% comment %} Objective: Friendly (BG: Primare) {% endcomment %} - {% elif timer.objective == "Friendly" %} -
    - - {% comment %} Objective: Neutral (BG: Secondary) {% endcomment %} - {% elif timer.objective == "Neutral" %} -
    - {% endif %} - - {{ timer.get_objective_display }} -
    -
    - {{ timer.system }} {{ timer.planet_moon }} - -
    - {{ timer.get_structure_display }} -
    -
    {{ timer.eve_time | date:"Y-m-d H:i" }} -
    -
    -
    {{ timer.eve_character.character_name }}
    + + + + + + + + + {% if perms.auth.timer_management %} - + {% endif %} - {% endfor %} + + + + {% for timer in timers %} + + + + + + + + + + + + + + + + {% if perms.auth.timer_management %} + + {% endif %} + + {% endfor %} +
    {% translate "Details" %}{% translate "Objective" %}{% translate "System" %}{% translate "Structure" %}{% translate "Eve Time" %}{% translate "Local Time" %}{% translate "Creator" %} - - - - - - - {% translate "Action" %}
    + {{ timer.details }} + + {% if timer.timer_type != 'UNSPECIFIED' %} +
    + ({{ timer.get_timer_type_display }}) + {% endif %} +
    + {% comment %} Objective: Hostile (BG: Danger) {% endcomment %} + {% if timer.objective == "Hostile" %} +
    + + {% comment %} Objective: Friendly (BG: Primare) {% endcomment %} + {% elif timer.objective == "Friendly" %} +
    + + {% comment %} Objective: Neutral (BG: Secondary) {% endcomment %} + {% elif timer.objective == "Neutral" %} +
    + {% endif %} + + {{ timer.get_objective_display }} +
    +
    + {{ timer.system }} {{ timer.planet_moon }} + +
    + {{ timer.get_structure_display }} +
    +
    {{ timer.eve_time | date:"Y-m-d H:i" }} +
    +
    +
    {{ timer.eve_character.character_name }} + + + + + + +
    diff --git a/allianceauth/timerboard/templates/timerboard/view.html b/allianceauth/timerboard/templates/timerboard/view.html index 85948f20..a39fc027 100644 --- a/allianceauth/timerboard/templates/timerboard/view.html +++ b/allianceauth/timerboard/templates/timerboard/view.html @@ -25,7 +25,7 @@ {% endblock header_nav_collapse_right %} {% block content %} -
    +
    {% translate "Current Eve Time:" %} @@ -42,7 +42,7 @@
    - {% include "timerboard/timertable.html" with timers=corp_timers %} + {% include "timerboard/timertable.html" with id="corp-timers" timers=corp_timers %}
    {% endif %} @@ -56,7 +56,7 @@
    {% if future_timers %} - {% include "timerboard/timertable.html" with timers=future_timers %} + {% include "timerboard/timertable.html" with id="future-timers" timers=future_timers %} {% else %}
    {% translate "No upcoming timers." %} @@ -74,7 +74,7 @@
    {% if past_timers %} - {% include "timerboard/timertable.html" with timers=past_timers %} + {% include "timerboard/timertable.html" with id="past-timers" timers=past_timers %} {% else %}
    {% translate "No past timers." %} @@ -85,9 +85,14 @@
    {% endblock content %} +{% block extra_css %} + {% include "bundles/datatables-css-bs5.html" %} +{% endblock extra_css %} + {% block extra_javascript %} {% include "bundles/moment-js.html" with locale=True %} {% include "bundles/timers-js.html" %} + {% include "bundles/datatables-js-bs5.html" %} {% endblock extra_javascript %} From 856e939c212bd1e27ef16c9969de7604f1a33a29 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 20 Jan 2025 04:35:10 +0100 Subject: [PATCH 49/85] [ADD] Locale mapping for DataTables and Moment.JS --- .pre-commit-config.yaml | 13 +- .../templates/authentication/tokens.html | 12 +- .../templates/corputils/corpstats.html | 6 + .../corputils/templates/corputils/search.html | 4 + .../templates/groupmanagement/audit.html | 4 + .../groupmanagement/groupmembers.html | 4 + .../templates/groupmanagement/groups.html | 7 +- .../templates/permissions_tool/audit.html | 4 + .../templates/permissions_tool/overview.html | 4 + .../project_name/settings/base.py | 33 +++ .../mumble/mumble_connection_history.html | 5 + allianceauth/srp/templates/srp/data.html | 4 + .../DataTables/Plugins/2.2.1/i18n/cs.json | 247 ++++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/de-DE.json | 243 +++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/es-ES.json | 244 +++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/fr-FR.json | 245 +++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/it-IT.json | 244 +++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/ja.json | 84 ++++++ .../DataTables/Plugins/2.2.1/i18n/ko.json | 122 +++++++++ .../DataTables/Plugins/2.2.1/i18n/nl-NL.json | 246 +++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/pl.json | 240 +++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/ru.json | 247 ++++++++++++++++++ .../DataTables/Plugins/2.2.1/i18n/uk.json | 186 +++++++++++++ .../Plugins/2.2.1/i18n/zh-HANT.json | 240 +++++++++++++++++ .../libs/moment.js/2.29.4/locale/cs.js | 191 ++++++++++++++ .../libs/moment.js/2.29.4/locale/de.js | 89 +++++++ .../libs/moment.js/2.29.4/locale/es.js | 121 +++++++++ .../libs/moment.js/2.29.4/locale/fr.js | 119 +++++++++ .../libs/moment.js/2.29.4/locale/it.js | 117 +++++++++ .../libs/moment.js/2.29.4/locale/ja.js | 159 +++++++++++ .../libs/moment.js/2.29.4/locale/ko.js | 86 ++++++ .../libs/moment.js/2.29.4/locale/nl.js | 115 ++++++++ .../libs/moment.js/2.29.4/locale/pl.js | 151 +++++++++++ .../libs/moment.js/2.29.4/locale/ru.js | 224 ++++++++++++++++ .../libs/moment.js/2.29.4/locale/uk.js | 178 +++++++++++++ .../libs/moment.js/2.29.4/locale/zh-cn.js | 131 ++++++++++ allianceauth/templates/bundles/moment-js.html | 15 +- allianceauth/templatetags/aa_i18n.py | 90 +++++++ .../timerboard/templates/timerboard/view.html | 7 +- 39 files changed, 4459 insertions(+), 22 deletions(-) create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/cs.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/de-DE.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/es-ES.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/fr-FR.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/it-IT.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/ja.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/ko.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/nl-NL.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/pl.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/ru.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/uk.json create mode 100644 allianceauth/static/allianceauth/libs/DataTables/Plugins/2.2.1/i18n/zh-HANT.json create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/cs.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/de.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/es.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/fr.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/it.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/ja.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/ko.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/nl.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/pl.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/ru.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/uk.js create mode 100644 allianceauth/static/allianceauth/libs/moment.js/2.29.4/locale/zh-cn.js create mode 100644 allianceauth/templatetags/aa_i18n.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 04c74b56..91268822 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,9 +33,9 @@ repos: - id: detect-private-key - id: check-case-conflict # Python checks - # - id: check-docstring-first +# - id: check-docstring-first - id: debug-statements - # - id: requirements-txt-fixer +# - id: requirements-txt-fixer - id: fix-encoding-pragma args: [--remove] - id: fix-byte-order-marker @@ -50,7 +50,8 @@ repos: \.min\.js| \.po| \.mo| - swagger\.json + swagger\.json| + static/(.*)/libs/ ) - id: check-executables-have-shebangs - id: end-of-file-fixer @@ -60,7 +61,8 @@ repos: \.min\.js| \.po| \.mo| - swagger\.json + swagger\.json| + static/(.*)/libs/ ) - repo: https://github.com/editorconfig-checker/editorconfig-checker.python rev: 2.7.3 @@ -72,7 +74,8 @@ repos: allianceauth\/static\/allianceauth\/css\/themes\/bootstrap-locals.less| \.po| \.mo| - swagger\.json + swagger\.json| + static/(.*)/libs/ ) - repo: https://github.com/igorshubovych/markdownlint-cli rev: v0.41.0 diff --git a/allianceauth/authentication/templates/authentication/tokens.html b/allianceauth/authentication/templates/authentication/tokens.html index 42e3c61b..4453efd7 100644 --- a/allianceauth/authentication/templates/authentication/tokens.html +++ b/allianceauth/authentication/templates/authentication/tokens.html @@ -1,5 +1,6 @@ {% extends "allianceauth/base-bs5.html" %} +{% load aa_i18n %} {% load i18n %} {% block page_title %} @@ -50,20 +51,23 @@ {% block extra_javascript %} {% include "bundles/datatables-js-bs5.html" %} + {% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %} + {% endblock %} diff --git a/allianceauth/permissions_tool/templates/permissions_tool/audit.html b/allianceauth/permissions_tool/templates/permissions_tool/audit.html index 3aa50e63..5055dc03 100644 --- a/allianceauth/permissions_tool/templates/permissions_tool/audit.html +++ b/allianceauth/permissions_tool/templates/permissions_tool/audit.html @@ -1,5 +1,6 @@ {% extends "allianceauth/base-bs5.html" %} +{% load aa_i18n %} {% load i18n %} {% block page_title %} @@ -57,11 +58,14 @@ {% include "bundles/datatables-js-bs5.html" %} {% include "bundles/filterdropdown-js.html" %} + {% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %} + {% if locale and LANGUAGE_CODE != 'en' %} - - {% get_current_language as LANGUAGE_CODE %} - {% get_language_info for LANGUAGE_CODE as lang %} + + {% get_momentjs_language_static LANGUAGE_CODE as MOMENTJS_LANG_PATH %} - {% if lang.code == 'zh-hans' %} - - - {% else %} - - - {% endif %} + {% endif %} diff --git a/allianceauth/templatetags/aa_i18n.py b/allianceauth/templatetags/aa_i18n.py new file mode 100644 index 00000000..216eca6b --- /dev/null +++ b/allianceauth/templatetags/aa_i18n.py @@ -0,0 +1,90 @@ +""" +Template tags for language mapping +""" + +from django.conf import settings +from django.template.defaulttags import register +from django.templatetags.static import static + + +@register.simple_tag +def get_datatable_language_code(language: str) -> str: + """ + Get the correct language code for DataTables + + :param language: Django's language code + :type language: str + :return: Mapped language code + :rtype: str + """ + + mapped_language = ( + settings.LANGUAGE_MAPPING["DataTables"].get(language) + if language != "en" + else "" + ) + + return mapped_language + + +@register.simple_tag +def get_momentjs_language_code(language: str) -> str: + """ + Get the correct language code for Moment.JS + + :param language: Django's language code + :type language: str + :return: Mapped language code + :rtype: str + """ + + mapped_language = ( + settings.LANGUAGE_MAPPING["MomentJS"].get(language) if language != "en" else "" + ) + + return mapped_language + + +@register.simple_tag +def get_datatables_language_static(language: str) -> str: + """ + Get the correct language code URL for DataTables + + :param language: Django's language code + :type language: str + :return: Mapped language code + :rtype: str + """ + + mapped_language = get_datatable_language_code(language) + static_url = ( + static( + path=f"allianceauth/libs/DataTables/Plugins/2.2.1/i18n/{mapped_language}.json" + ) + if mapped_language + else "" + ) + + return static_url + + +@register.simple_tag +def get_momentjs_language_static(language: str) -> str: + """ + Get the correct language code URL for Moment.JS + + :param language: Django's language code + :type language: str + :return: Mapped language code + :rtype: str + """ + + mapped_language = get_momentjs_language_code(language) + + static_url = ( + static(path=f"allianceauth/libs/moment.js/2.29.4/locale/{mapped_language}.js") + if mapped_language + else "" + ) + + return static_url diff --git a/allianceauth/timerboard/templates/timerboard/view.html b/allianceauth/timerboard/templates/timerboard/view.html index a39fc027..8746eb6c 100644 --- a/allianceauth/timerboard/templates/timerboard/view.html +++ b/allianceauth/timerboard/templates/timerboard/view.html @@ -1,5 +1,6 @@ {% extends "allianceauth/base-bs5.html" %} +{% load aa_i18n %} {% load i18n %} {% load evelinks %} @@ -94,6 +95,8 @@ {% include "bundles/timers-js.html" %} {% include "bundles/datatables-js-bs5.html" %} + {% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %} + From 43906f41b3dd865b54b7fcd3c7051460a3e0e171 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sat, 1 Feb 2025 16:00:03 +0100 Subject: [PATCH 58/85] [FIX] Timerboard initial sort order --- allianceauth/timerboard/templates/timerboard/view.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/allianceauth/timerboard/templates/timerboard/view.html b/allianceauth/timerboard/templates/timerboard/view.html index 8746eb6c..8f473340 100644 --- a/allianceauth/timerboard/templates/timerboard/view.html +++ b/allianceauth/timerboard/templates/timerboard/view.html @@ -180,6 +180,9 @@ $(document).ready(() => { const dtOptions = { language: {url: '{{ DT_LANG_PATH }}'}, + order: [ + [4, 'asc'] + ], }; {% if perms.auth.timer_management %} From f047943eb7ae1933ee13a4cb2f0fdc658bbfe674 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sat, 1 Feb 2025 16:11:44 +0100 Subject: [PATCH 59/85] [CHANGE] Define language versions --- .pre-commit-config.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 91268822..3f2e7f21 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,6 +3,11 @@ # Update this file: # pre-commit autoupdate +# Set the default language versions for the hooks +default_language_version: + python: python3 # Force all Python hooks to use Python 3 + node: 22.12.0 # Force all Node hooks to use Node 22.12.0 + repos: # Code Upgrades - repo: https://github.com/asottile/pyupgrade @@ -81,6 +86,7 @@ repos: rev: v0.41.0 hooks: - id: markdownlint + language: node args: - --disable=MD013 # Infrastructure From 8be2760fc4c31ac733e71eae2908a35816d575fb Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sat, 1 Feb 2025 16:14:36 +0100 Subject: [PATCH 60/85] [CHANGNE] Update repos and dependencies --- .pre-commit-config.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3f2e7f21..5362b10d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,19 +11,19 @@ default_language_version: repos: # Code Upgrades - repo: https://github.com/asottile/pyupgrade - rev: v3.15.2 + rev: v3.19.1 hooks: - id: pyupgrade args: [--py38-plus] - repo: https://github.com/adamchainz/django-upgrade - rev: 1.17.0 + rev: 1.22.2 hooks: - id: django-upgrade args: [--target-version=4.2] # Formatting - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: # Identify invalid files - id: check-ast @@ -70,7 +70,7 @@ repos: static/(.*)/libs/ ) - repo: https://github.com/editorconfig-checker/editorconfig-checker.python - rev: 2.7.3 + rev: 3.2.0 hooks: - id: editorconfig-checker exclude: | @@ -83,7 +83,7 @@ repos: static/(.*)/libs/ ) - repo: https://github.com/igorshubovych/markdownlint-cli - rev: v0.41.0 + rev: v0.44.0 hooks: - id: markdownlint language: node @@ -91,7 +91,7 @@ repos: - --disable=MD013 # Infrastructure - repo: https://github.com/tox-dev/pyproject-fmt - rev: 2.1.3 + rev: v2.5.0 hooks: - id: pyproject-fmt name: pyproject.toml formatter @@ -99,9 +99,9 @@ repos: args: - --indent=4 additional_dependencies: - - tox==4.15.0 # https://github.com/tox-dev/tox/releases/latest + - tox==4.24.1 # https://github.com/tox-dev/tox/releases/latest - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.18 + rev: v0.23 hooks: - id: validate-pyproject name: Validate pyproject.toml From b5ad1c8a1a3ccef6e665517c80702a3abc4ba082 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sat, 1 Feb 2025 16:18:08 +0100 Subject: [PATCH 61/85] [CHANGE] Use global exclude instead of per hook --- .pre-commit-config.yaml | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5362b10d..51c69b69 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,6 +8,20 @@ default_language_version: python: python3 # Force all Python hooks to use Python 3 node: 22.12.0 # Force all Node hooks to use Node 22.12.0 +# Globally exclude files +# https://pre-commit.com/#top_level-exclude +exclude: | + (?x)( + LICENSE| + allianceauth\/static\/allianceauth\/css\/themes\/bootstrap-locals.less| + \.min\.css| + \.min\.js| + \.po| + \.mo| + swagger\.json| + static/(.*)/libs/ + ) + repos: # Code Upgrades - repo: https://github.com/asottile/pyupgrade @@ -49,39 +63,12 @@ repos: args: [--fix=lf] - id: trailing-whitespace args: [--markdown-linebreak-ext=md] - exclude: | - (?x)( - \.min\.css| - \.min\.js| - \.po| - \.mo| - swagger\.json| - static/(.*)/libs/ - ) - id: check-executables-have-shebangs - id: end-of-file-fixer - exclude: | - (?x)( - \.min\.css| - \.min\.js| - \.po| - \.mo| - swagger\.json| - static/(.*)/libs/ - ) - repo: https://github.com/editorconfig-checker/editorconfig-checker.python rev: 3.2.0 hooks: - id: editorconfig-checker - exclude: | - (?x)( - LICENSE| - allianceauth\/static\/allianceauth\/css\/themes\/bootstrap-locals.less| - \.po| - \.mo| - swagger\.json| - static/(.*)/libs/ - ) - repo: https://github.com/igorshubovych/markdownlint-cli rev: v0.44.0 hooks: From c2ae680f72f5cfe5c97bd13f91cc540cbb9a8cb9 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sat, 1 Feb 2025 16:22:36 +0100 Subject: [PATCH 62/85] [CHANGE] Apply new pre-commit config --- pyproject.toml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3ed04b9c..c6f73359 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [build-system] build-backend = "flit_core.buildapi" requires = [ - "flit-core<4,>=3.2", + "flit-core>=3.2,<4", ] [project] @@ -31,6 +31,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", ] @@ -41,15 +42,15 @@ dynamic = [ dependencies = [ "bcrypt", "beautifulsoup4", - "celery<6,>=5.2", + "celery>=5.2,<6", "celery-once>=3.0.1", - "django<5,>=4.2", + "django>=4.2,<5", "django-bootstrap-form", "django-bootstrap5>=23.3", "django-celery-beat>=2.3", "django-esi>=5", "django-redis>=5.2", - "django-registration<3.4,>=3.3", + "django-registration>=3.3,<3.4", "django-solo", "django-sortedm2m", "django-sri", @@ -70,7 +71,7 @@ optional-dependencies.docs = [ "myst-parser", "sphinx", "sphinx-copybutton", - "sphinx-rtd-theme<3,>=2", + "sphinx-rtd-theme>=2,<3", "sphinx-tabs", "sphinxcontrib-django", ] From 146c4c8d94e31c972439d667a9b99fc7e81441a5 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 9 Feb 2025 08:55:51 +0100 Subject: [PATCH 63/85] [CHANGE] Update URL to apps management --- .../authentication/templates/authentication/tokens.html | 2 +- allianceauth/authentication/templates/public/middle_box.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/allianceauth/authentication/templates/authentication/tokens.html b/allianceauth/authentication/templates/authentication/tokens.html index 4453efd7..fc9b9c35 100644 --- a/allianceauth/authentication/templates/authentication/tokens.html +++ b/allianceauth/authentication/templates/authentication/tokens.html @@ -14,7 +14,7 @@ {% block content %}

    - {% translate "This page is a best attempt, but backups or database logs can still contain your tokens. Always revoke tokens on https://community.eveonline.com/support/third-party-applications/ where possible."|urlize %} + {% translate "This page is a best attempt, but backups or database logs can still contain your tokens. Always revoke tokens on https://developers.eveonline.com/authorized-apps where possible."|urlize %}

    diff --git a/allianceauth/authentication/templates/public/middle_box.html b/allianceauth/authentication/templates/public/middle_box.html index cfc089e4..c6ad452f 100644 --- a/allianceauth/authentication/templates/public/middle_box.html +++ b/allianceauth/authentication/templates/public/middle_box.html @@ -29,7 +29,7 @@

    - + {% translate "Manage ESI Applications" %}

    From f497c18e5b5f6cd504ff57913a88beb5818ffdcb Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Sun, 16 Feb 2025 23:20:36 +0100 Subject: [PATCH 64/85] [REMOVE] Unused imports --- allianceauth/analytics/tests/test_utils.py | 3 +-- allianceauth/authentication/decorators.py | 3 --- allianceauth/authentication/models.py | 1 - allianceauth/authentication/tests/__init__.py | 6 ------ allianceauth/authentication/tests/test_middleware.py | 1 - allianceauth/authentication/tests/test_signals.py | 8 +------- allianceauth/authentication/views.py | 1 - allianceauth/crontab/tests/test_utils.py | 2 -- allianceauth/custom_css/widgets.py | 3 --- allianceauth/eveonline/autogroups/tests/test_models.py | 1 - allianceauth/eveonline/evelinks/tests/test_evelinks.py | 2 -- allianceauth/fleetactivitytracking/views.py | 2 +- .../menu/tests/templatetags/test_menu_menu_items.py | 2 +- allianceauth/notifications/tests/test_templatetags.py | 2 +- allianceauth/notifications/tests/test_views.py | 2 +- allianceauth/permissions_tool/views.py | 2 +- allianceauth/services/hooks.py | 7 ------- .../services/modules/discord/tests/piloting_tasks.py | 1 - allianceauth/services/modules/discourse/manager.py | 1 - allianceauth/services/modules/discourse/views.py | 2 +- allianceauth/services/modules/ips4/tasks.py | 1 - allianceauth/tests/test_auth_utils.py | 6 ------ allianceauth/urls.py | 1 - 23 files changed, 8 insertions(+), 52 deletions(-) diff --git a/allianceauth/analytics/tests/test_utils.py b/allianceauth/analytics/tests/test_utils.py index b9a22329..60ee44bd 100644 --- a/allianceauth/analytics/tests/test_utils.py +++ b/allianceauth/analytics/tests/test_utils.py @@ -1,7 +1,6 @@ from django.apps import apps from allianceauth.authentication.models import User -from esi.models import Token -from allianceauth.analytics.utils import install_stat_users, install_stat_tokens, install_stat_addons +from allianceauth.analytics.utils import install_stat_users, install_stat_addons from django.test.testcases import TestCase diff --git a/allianceauth/authentication/decorators.py b/allianceauth/authentication/decorators.py index d9d93faa..13b4ed0a 100644 --- a/allianceauth/authentication/decorators.py +++ b/allianceauth/authentication/decorators.py @@ -1,6 +1,3 @@ -from django.urls import include -from django.contrib.auth.decorators import user_passes_test -from django.core.exceptions import PermissionDenied from functools import wraps from typing import Callable, Iterable, Optional diff --git a/allianceauth/authentication/models.py b/allianceauth/authentication/models.py index 714f1934..3df43b4a 100644 --- a/allianceauth/authentication/models.py +++ b/allianceauth/authentication/models.py @@ -5,7 +5,6 @@ from django.db import models, transaction from django.utils.translation import gettext_lazy as _ from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo, EveFactionInfo from allianceauth.notifications import notify -from django.conf import settings from .managers import CharacterOwnershipManager, StateManager diff --git a/allianceauth/authentication/tests/__init__.py b/allianceauth/authentication/tests/__init__.py index 13410df4..474a2c20 100644 --- a/allianceauth/authentication/tests/__init__.py +++ b/allianceauth/authentication/tests/__init__.py @@ -1,9 +1,3 @@ -from django.db.models.signals import ( - m2m_changed, - post_save, - pre_delete, - pre_save -) from django.urls import reverse from unittest import mock diff --git a/allianceauth/authentication/tests/test_middleware.py b/allianceauth/authentication/tests/test_middleware.py index 70335e58..10bd7ed0 100644 --- a/allianceauth/authentication/tests/test_middleware.py +++ b/allianceauth/authentication/tests/test_middleware.py @@ -1,4 +1,3 @@ -from unittest import mock from allianceauth.authentication.middleware import UserSettingsMiddleware from unittest.mock import Mock from django.http import HttpResponse diff --git a/allianceauth/authentication/tests/test_signals.py b/allianceauth/authentication/tests/test_signals.py index 8f7ba716..1e54e785 100644 --- a/allianceauth/authentication/tests/test_signals.py +++ b/allianceauth/authentication/tests/test_signals.py @@ -4,16 +4,10 @@ from allianceauth.eveonline.models import ( EveCorporationInfo, EveAllianceInfo ) -from django.db.models.signals import ( - pre_save, - post_save, - pre_delete, - m2m_changed -) +from django.db.models.signals import post_save from allianceauth.tests.auth_utils import AuthUtils from django.test.testcases import TestCase -from unittest.mock import Mock from . import patch diff --git a/allianceauth/authentication/views.py b/allianceauth/authentication/views.py index 2e8f4e2c..ea73a01f 100644 --- a/allianceauth/authentication/views.py +++ b/allianceauth/authentication/views.py @@ -11,7 +11,6 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required, user_passes_test -from django.contrib.auth.models import User from django.core import signing from django.http import JsonResponse from django.shortcuts import redirect, render diff --git a/allianceauth/crontab/tests/test_utils.py b/allianceauth/crontab/tests/test_utils.py index 48592c99..563d42cf 100644 --- a/allianceauth/crontab/tests/test_utils.py +++ b/allianceauth/crontab/tests/test_utils.py @@ -1,5 +1,3 @@ -# myapp/tests/test_tasks.py - import logging from unittest.mock import patch from django.test import TestCase diff --git a/allianceauth/custom_css/widgets.py b/allianceauth/custom_css/widgets.py index 32ed07dd..f3da39cb 100644 --- a/allianceauth/custom_css/widgets.py +++ b/allianceauth/custom_css/widgets.py @@ -5,9 +5,6 @@ Form widgets for custom_css app # Django from django import forms -# Alliance Auth -from allianceauth.custom_css.models import CustomCSS - class CssEditorWidget(forms.Textarea): """ diff --git a/allianceauth/eveonline/autogroups/tests/test_models.py b/allianceauth/eveonline/autogroups/tests/test_models.py index f9c59389..4b04471d 100644 --- a/allianceauth/eveonline/autogroups/tests/test_models.py +++ b/allianceauth/eveonline/autogroups/tests/test_models.py @@ -1,6 +1,5 @@ from django.test import TestCase from django.contrib.auth.models import Group -from django.db import transaction from allianceauth.tests.auth_utils import AuthUtils diff --git a/allianceauth/eveonline/evelinks/tests/test_evelinks.py b/allianceauth/eveonline/evelinks/tests/test_evelinks.py index 09aa30fb..1b520edc 100644 --- a/allianceauth/eveonline/evelinks/tests/test_evelinks.py +++ b/allianceauth/eveonline/evelinks/tests/test_evelinks.py @@ -1,8 +1,6 @@ from django.test import TestCase -from ...models import EveCharacter, EveCorporationInfo, EveAllianceInfo from .. import dotlan, zkillboard, evewho, eveimageserver -from ...templatetags import evelinks class TestEveWho(TestCase): diff --git a/allianceauth/fleetactivitytracking/views.py b/allianceauth/fleetactivitytracking/views.py index 232fa456..fa7cd204 100644 --- a/allianceauth/fleetactivitytracking/views.py +++ b/allianceauth/fleetactivitytracking/views.py @@ -8,7 +8,7 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import permission_required from django.contrib.auth.models import User from django.core.exceptions import ValidationError, ObjectDoesNotExist -from django.shortcuts import render, redirect, get_object_or_404, Http404 +from django.shortcuts import render, redirect, get_object_or_404 from django.utils import timezone from django.utils.translation import gettext_lazy as _ from esi.decorators import token_required diff --git a/allianceauth/menu/tests/templatetags/test_menu_menu_items.py b/allianceauth/menu/tests/templatetags/test_menu_menu_items.py index 3e3e829a..66117b4f 100644 --- a/allianceauth/menu/tests/templatetags/test_menu_menu_items.py +++ b/allianceauth/menu/tests/templatetags/test_menu_menu_items.py @@ -186,7 +186,7 @@ class TestRenderDefaultMenu(TestCase): classes = "fa-solid fa-users-gear" url_name = "groupmanagement:management" - def render(Self, request): + def render(self, request): # simulate no perms return "" diff --git a/allianceauth/notifications/tests/test_templatetags.py b/allianceauth/notifications/tests/test_templatetags.py index 587970be..626d7226 100644 --- a/allianceauth/notifications/tests/test_templatetags.py +++ b/allianceauth/notifications/tests/test_templatetags.py @@ -1,4 +1,4 @@ -from unittest.mock import patch, Mock +from unittest.mock import patch from django.test import TestCase, override_settings diff --git a/allianceauth/notifications/tests/test_views.py b/allianceauth/notifications/tests/test_views.py index 7fa95bc8..2e8024da 100644 --- a/allianceauth/notifications/tests/test_views.py +++ b/allianceauth/notifications/tests/test_views.py @@ -1,6 +1,6 @@ import json -from unittest.mock import patch, Mock +from unittest.mock import patch from django.test import TestCase, RequestFactory from django.urls import reverse diff --git a/allianceauth/permissions_tool/views.py b/allianceauth/permissions_tool/views.py index e845a466..3552e04c 100644 --- a/allianceauth/permissions_tool/views.py +++ b/allianceauth/permissions_tool/views.py @@ -1,7 +1,7 @@ import logging from django.contrib.auth.decorators import login_required, permission_required -from django.contrib.auth.models import Permission, User +from django.contrib.auth.models import Permission from django.db.models import Count from django.shortcuts import render, Http404 diff --git a/allianceauth/services/hooks.py b/allianceauth/services/hooks.py index 084d8e49..ebfaa04b 100644 --- a/allianceauth/services/hooks.py +++ b/allianceauth/services/hooks.py @@ -1,13 +1,6 @@ from string import Formatter -from django.urls import include, re_path from typing import Iterable, Optional -from django.conf import settings -from django.core.exceptions import ObjectDoesNotExist -from django.template.loader import render_to_string -from django.urls import include, re_path -from django.utils.functional import cached_property - from allianceauth.hooks import get_hooks from allianceauth.menu.hooks import MenuItemHook from django.conf import settings diff --git a/allianceauth/services/modules/discord/tests/piloting_tasks.py b/allianceauth/services/modules/discord/tests/piloting_tasks.py index 4b1d0c7b..715d1b80 100644 --- a/allianceauth/services/modules/discord/tests/piloting_tasks.py +++ b/allianceauth/services/modules/discord/tests/piloting_tasks.py @@ -37,7 +37,6 @@ import random from django.contrib.auth.models import User, Group -from allianceauth.services.modules.discord.models import DiscordUser from allianceauth.utils.cache import get_redis_client logger = logging.getLogger('allianceauth') diff --git a/allianceauth/services/modules/discourse/manager.py b/allianceauth/services/modules/discourse/manager.py index 03cbbdee..fde966ea 100644 --- a/allianceauth/services/modules/discourse/manager.py +++ b/allianceauth/services/modules/discourse/manager.py @@ -1,5 +1,4 @@ import logging -import requests import re from django.conf import settings from django.core.cache import cache diff --git a/allianceauth/services/modules/discourse/views.py b/allianceauth/services/modules/discourse/views.py index a777fbb7..8a19f8e7 100644 --- a/allianceauth/services/modules/discourse/views.py +++ b/allianceauth/services/modules/discourse/views.py @@ -1,7 +1,7 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.shortcuts import render, redirect +from django.shortcuts import redirect from django.utils.translation import gettext_lazy as _ from .manager import DiscourseManager diff --git a/allianceauth/services/modules/ips4/tasks.py b/allianceauth/services/modules/ips4/tasks.py index b6c5dce8..e2ba70c0 100644 --- a/allianceauth/services/modules/ips4/tasks.py +++ b/allianceauth/services/modules/ips4/tasks.py @@ -1,4 +1,3 @@ -from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from allianceauth.services.hooks import NameFormatter diff --git a/allianceauth/tests/test_auth_utils.py b/allianceauth/tests/test_auth_utils.py index 2fa5215c..027e6c1c 100644 --- a/allianceauth/tests/test_auth_utils.py +++ b/allianceauth/tests/test_auth_utils.py @@ -1,12 +1,6 @@ -from unittest import mock - from django.contrib.auth.models import User, Group, Permission from django.test import TestCase -from allianceauth.eveonline.models import ( - EveCorporationInfo, EveAllianceInfo, EveCharacter -) - from .auth_utils import AuthUtils diff --git a/allianceauth/urls.py b/allianceauth/urls.py index 71a43b26..16adfa9c 100644 --- a/allianceauth/urls.py +++ b/allianceauth/urls.py @@ -1,6 +1,5 @@ from typing import List, Iterable, Callable -from django.urls import include import esi.urls from django.conf import settings from django.contrib import admin From 28cb62f373c9c2b73af032c9960648e37db8cbcb Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 19 Feb 2025 09:31:49 +0100 Subject: [PATCH 65/85] [ADD] Check for `ESI_USER_CONTACT_EMAIL` --- allianceauth/checks.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/allianceauth/checks.py b/allianceauth/checks.py index 7235ad8a..aae8b9c1 100644 --- a/allianceauth/checks.py +++ b/allianceauth/checks.py @@ -16,19 +16,40 @@ B = Configuration @register() def django_settings(app_configs, **kwargs) -> List[CheckMessage]: + """ + Check that Django settings are correctly configured + + :param app_configs: + :type app_configs: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + errors: List[CheckMessage] = [] + + # SITE_URL 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")) + # CSRF_TRUSTED_ORIGINS 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")) + # ESI_USER_CONTACT_EMAIL + if hasattr(settings, "ESI_USER_CONTACT_EMAIL"): + if settings.ESI_USER_CONTACT_EMAIL == "": + errors.append(Error("'ESI_USER_CONTACT_EMAIL' is empty. A valid email is required as maintainer contact for CCP.", hint="", id="allianceauth.checks.B009")) + else: + errors.append(Error("No 'ESI_USER_CONTACT_EMAIL' found is settings. A valid email is required as maintainer contact for CCP.", hint="", id="allianceauth.checks.B010")) + return errors From 929485a8f97f28fb3e7c3432249ac1c07a6cf192 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 19 Feb 2025 09:39:22 +0100 Subject: [PATCH 66/85] [ADD] Check for empty `SITE_URL` --- allianceauth/checks.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/allianceauth/checks.py b/allianceauth/checks.py index aae8b9c1..cceabbfc 100644 --- a/allianceauth/checks.py +++ b/allianceauth/checks.py @@ -31,8 +31,10 @@ def django_settings(app_configs, **kwargs) -> List[CheckMessage]: # SITE_URL 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")) + if settings.SITE_URL == "": + errors.append(Error("'SITE_URL' is empty.", hint="Make sure to set 'SITE_URL' to the URL of your Auth instance. (Without trailing slash)", id="allianceauth.checks.B011")) + elif 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")) From 0498f5bb1b4e8055ea7a3ffb45c439ad7716a25c Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 19 Feb 2025 10:00:18 +0100 Subject: [PATCH 67/85] [MISC] Format for better readability --- allianceauth/checks.py | 453 +++++++++++++++++++++++++++++++++++------ 1 file changed, 395 insertions(+), 58 deletions(-) diff --git a/allianceauth/checks.py b/allianceauth/checks.py index cceabbfc..7544bc11 100644 --- a/allianceauth/checks.py +++ b/allianceauth/checks.py @@ -1,3 +1,7 @@ +""" +Django system checks for Alliance Auth +""" + from typing import List from django import db from django.core.checks import CheckMessage, Error, register, Warning @@ -29,58 +33,159 @@ def django_settings(app_configs, **kwargs) -> List[CheckMessage]: errors: List[CheckMessage] = [] - # SITE_URL + # Check for SITE_URL if hasattr(settings, "SITE_URL"): + # Check if SITE_URL is empty if settings.SITE_URL == "": - errors.append(Error("'SITE_URL' is empty.", hint="Make sure to set 'SITE_URL' to the URL of your Auth instance. (Without trailing slash)", id="allianceauth.checks.B011")) + errors.append( + Error( + msg="'SITE_URL' is empty.", + hint="Make sure to set 'SITE_URL' to the URL of your Auth instance. (Without trailing slash)", + id="allianceauth.checks.B011", + ) + ) + # Check if SITE_URL has a trailing slash elif 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")) + errors.append( + Warning( + msg="'SITE_URL' has a trailing slash. This may lead to incorrect links being generated by Auth.", + hint="", + id="allianceauth.checks.B005", + ) + ) + # SITE_URL not found 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")) + errors.append( + Error( + msg="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", + ) + ) - # CSRF_TRUSTED_ORIGINS + # Check for CSRF_TRUSTED_ORIGINS if hasattr(settings, "CSRF_TRUSTED_ORIGINS") and hasattr(settings, "SITE_URL"): + # Check if SITE_URL is not in CSRF_TRUSTED_ORIGINS 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")) + errors.append( + Warning( + msg="'SITE_URL' not found in 'CSRF_TRUSTED_ORIGINS'. Auth may not load pages correctly until this is rectified.", + hint="", + id="allianceauth.checks.B007", + ) + ) + # CSRF_TRUSTED_ORIGINS not found 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")) + errors.append( + Error( + msg="No 'CSRF_TRUSTED_ORIGINS' found is settings, Auth may not load pages correctly until this is rectified", + hint="", + id="allianceauth.checks.B008", + ) + ) - # ESI_USER_CONTACT_EMAIL + # Check for ESI_USER_CONTACT_EMAIL if hasattr(settings, "ESI_USER_CONTACT_EMAIL"): + # Check if ESI_USER_CONTACT_EMAIL is empty if settings.ESI_USER_CONTACT_EMAIL == "": - errors.append(Error("'ESI_USER_CONTACT_EMAIL' is empty. A valid email is required as maintainer contact for CCP.", hint="", id="allianceauth.checks.B009")) + errors.append( + Error( + msg="'ESI_USER_CONTACT_EMAIL' is empty. A valid email is required as maintainer contact for CCP.", + hint="", + id="allianceauth.checks.B009", + ) + ) + # ESI_USER_CONTACT_EMAIL not found else: - errors.append(Error("No 'ESI_USER_CONTACT_EMAIL' found is settings. A valid email is required as maintainer contact for CCP.", hint="", id="allianceauth.checks.B010")) + errors.append( + Error( + msg="No 'ESI_USER_CONTACT_EMAIL' found is settings. A valid email is required as maintainer contact for CCP.", + hint="", + id="allianceauth.checks.B010", + ) + ) return errors @register() def system_package_redis(app_configs, **kwargs) -> List[CheckMessage]: + """ + Check that Redis is a supported version + + :param app_configs: + :type app_configs: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + allianceauth_redis_install_link = "https://allianceauth.readthedocs.io/en/latest/installation/allianceauth.html#redis-and-other-tools" errors: List[CheckMessage] = [] try: - redis_version = Pep440Version(get_redis_client().info()['redis_version']) + 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=allianceauth_redis_install_link, id="allianceauth.checks.A001")) + 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( + msg=f"Redis {redis_version.public} in Security Support only, Updating Suggested", + hint=allianceauth_redis_install_link, + 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=allianceauth_redis_install_link, id="allianceauth.checks.A002")) + errors.append( + Warning( + msg=f"Redis {redis_version.public} in Security Support only, Updating Suggested", + hint=allianceauth_redis_install_link, + 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=allianceauth_redis_install_link, id="allianceauth.checks.A018")) + errors.append( + Warning( + msg=f"Redis {redis_version.public} in Security Support only, Updating Suggested", + hint=allianceauth_redis_install_link, + id="allianceauth.checks.A018", + ) + ) elif redis_version.major in [6, 5]: - errors.append(Error(f"Redis {redis_version.public} EOL", hint=allianceauth_redis_install_link, id="allianceauth.checks.A003")) + errors.append( + Error( + msg=f"Redis {redis_version.public} EOL", + hint=allianceauth_redis_install_link, + id="allianceauth.checks.A003", + ) + ) return errors @register() def system_package_mysql(app_configs, **kwargs) -> List[CheckMessage]: + """ + Check that MySQL is a supported version + + :param app_configs: + :type app_configs: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + mysql_quick_guide_link = "https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/" errors: List[CheckMessage] = [] @@ -88,108 +193,302 @@ def system_package_mysql(app_configs, **kwargs) -> 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)) + 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: - if 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=mysql_quick_guide_link, id="allianceauth.checks.A004")) + if mysql_version.minor == 4 and timezone.now() > timezone.datetime( + year=2032, month=4, day=30, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MySQL {mysql_version.public} EOL", + hint=mysql_quick_guide_link, + id="allianceauth.checks.A004", + ) + ) elif mysql_version.minor == 3: - errors.append(Warning(f"MySQL {mysql_version.public} Non LTS", hint=mysql_quick_guide_link, id="allianceauth.checks.A005")) + errors.append( + Warning( + msg=f"MySQL {mysql_version.public} Non LTS", + hint=mysql_quick_guide_link, + id="allianceauth.checks.A005", + ) + ) elif mysql_version.minor == 2: - errors.append(Warning(f"MySQL {mysql_version.public} Non LTS", hint=mysql_quick_guide_link, id="allianceauth.checks.A006")) + errors.append( + Warning( + msg=f"MySQL {mysql_version.public} Non LTS", + hint=mysql_quick_guide_link, + id="allianceauth.checks.A006", + ) + ) elif mysql_version.minor == 1: - errors.append(Error(f"MySQL {mysql_version.public} EOL", hint=mysql_quick_guide_link, id="allianceauth.checks.A007")) - elif 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=mysql_quick_guide_link, id="allianceauth.checks.A008")) + errors.append( + Error( + msg=f"MySQL {mysql_version.public} EOL", + hint=mysql_quick_guide_link, + id="allianceauth.checks.A007", + ) + ) + elif mysql_version.minor == 0 and timezone.now() > timezone.datetime( + year=2026, month=4, day=30, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MySQL {mysql_version.public} EOL", + hint=mysql_quick_guide_link, + id="allianceauth.checks.A008", + ) + ) # MySQL below 8 # This will also catch Mariadb 5.x elif mysql_version.major < 8: - errors.append(Error(f"MySQL or MariaDB {mysql_version.public} EOL", hint=mysql_quick_guide_link, id="allianceauth.checks.A009")) + errors.append( + Error( + msg=f"MySQL or MariaDB {mysql_version.public} EOL", + hint=mysql_quick_guide_link, + id="allianceauth.checks.A009", + ) + ) + return errors @register() def system_package_mariadb(app_configs, **kwargs) -> List[CheckMessage]: + """ + Check that MariaDB is a supported version + + :param app_configs: + :type app_configs: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + mariadb_download_link = "https://mariadb.org/download/?t=repo-config" errors: List[CheckMessage] = [] for connection in db.connections.all(): - if connection.vendor == "mysql": # Still to find a way to determine MySQL vs MariaDB + # TODO: Find a way to determine MySQL vs. MariaDB + if connection.vendor == "mysql": try: - mariadb_version = Pep440Version(".".join(str(i) for i in connection.mysql_version)) + 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: - if 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=mariadb_download_link, id="allianceauth.checks.A010")) + if mariadb_version.minor == 4 and timezone.now() > timezone.datetime( + year=2029, month=5, day=19, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A010", + ) + ) elif mariadb_version.minor == 2: - errors.append(Warning(f"MariaDB {mariadb_version.public} Non LTS", hint=mariadb_download_link, id="allianceauth.checks.A018")) + errors.append( + Warning( + msg=f"MariaDB {mariadb_version.public} Non LTS", + hint=mariadb_download_link, + 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=mariadb_download_link, id="allianceauth.checks.A011")) + if timezone.now() > timezone.datetime( + year=2024, month=11, day=21, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A011", + ) + ) elif mariadb_version.minor == 1: - errors.append(Warning(f"MariaDB {mariadb_version.public} Non LTS", hint=mariadb_download_link, id="allianceauth.checks.A019")) + errors.append( + Warning( + msg=f"MariaDB {mariadb_version.public} Non LTS", + hint=mariadb_download_link, + 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=mariadb_download_link, id="allianceauth.checks.A012")) - elif mariadb_version.minor in [0, 3]: # Demote versions down here once EOL - errors.append(Error(f"MariaDB {mariadb_version.public} EOL", hint=mariadb_download_link, id="allianceauth.checks.A013")) + if timezone.now() > timezone.datetime( + year=2024, month=8, day=21, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A012", + ) + ) + # Demote versions down here once EOL + elif mariadb_version.minor in [0, 3]: + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A013", + ) + ) # MariaDB 10 elif mariadb_version.major == 10: - if 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=mariadb_download_link, id="allianceauth.checks.A014")) - elif 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=mariadb_download_link, id="allianceauth.checks.A0015")) - elif 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=mariadb_download_link, id="allianceauth.checks.A016")) - elif 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=mariadb_download_link, id="allianceauth.checks.A017")) + if mariadb_version.minor == 11 and timezone.now() > timezone.datetime( + year=2028, month=2, day=10, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A014", + ) + ) + elif mariadb_version.minor == 6 and timezone.now() > timezone.datetime( + year=2026, month=7, day=6, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A0015", + ) + ) + elif mariadb_version.minor == 5 and timezone.now() > timezone.datetime( + year=2025, month=6, day=24, tzinfo=timezone.utc + ): + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A016", + ) + ) + # Demote versions down here once EOL + elif mariadb_version.minor in [0, 1, 2, 3, 4, 7, 9, 10]: + errors.append( + Error( + msg=f"MariaDB {mariadb_version.public} EOL", + hint=mariadb_download_link, + id="allianceauth.checks.A017", + ) + ) return errors @register() def system_package_sqlite(app_configs, **kwargs) -> List[CheckMessage]: + """ + Check that SQLite is a supported version + + :param app_configs: + :type app_configs: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + 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)) + 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")) + errors.append( + Error( + msg=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]: + """ + Check that SQL settings are correctly configured + + :param app_configs: + :type app_configs: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + 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")) + errors.append( + Error( + msg=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")) + errors.append( + Error( + msg=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")) + # if ( + # connection.settings_dict["OPTIONS"]["collation"] + # != "utf8mb4_unicode_ci" + # ): + # errors.append( + # Error( + # msg=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")) + # errors.append( + # Error( + # msg=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": @@ -198,19 +497,57 @@ def sql_settings(app_configs, **kwargs) -> List[CheckMessage]: @register() def celery_settings(app_configs, **kwargs) -> List[CheckMessage]: + """ + Check that Celery settings are correctly configured + + :param app_configs: + :type app_configs: + :param kwargs: + :type kwargs: + :return: + :rtype: + """ + 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")) + 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( + msg="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")) + errors.append( + Error( + msg="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")) + if not current_app.conf.broker_connection_retry_on_startup: + errors.append( + Error( + msg="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")) + errors.append( + Error( + msg="Celery broker_connection_retry_on_startup not set", + hint="https://gitlab.com/allianceauth/allianceauth/-/commit/380c41400b535447839e5552df2410af35a75280", + id="allianceauth.checks.B004", + ) + ) return errors From 2de57b334baf74df9cf4e42f40009b7004b48c36 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 19 Feb 2025 10:09:00 +0100 Subject: [PATCH 68/85] [ADD] `ESI_USER_CONTACT_EMAIL` to test settings --- tests/settings_all.py | 1 + tests/settings_core.py | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/settings_all.py b/tests/settings_all.py index 5bddee70..6063b972 100644 --- a/tests/settings_all.py +++ b/tests/settings_all.py @@ -47,6 +47,7 @@ CACHES = { ESI_SSO_CLIENT_ID = "dummy" ESI_SSO_CLIENT_SECRET = "dummy" ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback" +ESI_USER_CONTACT_EMAIL = "mail@dummy.net" ######################## # XenForo Configuration diff --git a/tests/settings_core.py b/tests/settings_core.py index 6403cfa8..b95218ed 100644 --- a/tests/settings_core.py +++ b/tests/settings_core.py @@ -37,3 +37,4 @@ ALLIANCEAUTH_DASHBOARD_TASK_STATISTICS_DISABLED = True # disable for tests ESI_SSO_CLIENT_ID = "dummy" ESI_SSO_CLIENT_SECRET = "dummy" ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback" +ESI_USER_CONTACT_EMAIL = "mail@dummy.net" From 3acb6516503a882ad6b48345e3544cb960600e18 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Wed, 19 Feb 2025 10:18:35 +0100 Subject: [PATCH 69/85] [CHANGE] Update test --- allianceauth/eveonline/tests/test_providers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/eveonline/tests/test_providers.py b/allianceauth/eveonline/tests/test_providers.py index 95f4f069..ea8df739 100644 --- a/allianceauth/eveonline/tests/test_providers.py +++ b/allianceauth/eveonline/tests/test_providers.py @@ -723,5 +723,5 @@ class TestEveSwaggerProvider(TestCase): my_client = my_provider.client operation = my_client.Universe.get_universe_factions() self.assertEqual( - operation.future.request.headers['User-Agent'], 'allianceauth v1.0.0' + operation.future.request.headers['User-Agent'], 'allianceauth v1.0.0 mail@dummy.net' ) From c1e2449084537fffd76d8e66fd65431ec47190c4 Mon Sep 17 00:00:00 2001 From: Ariel Rin Date: Tue, 25 Feb 2025 09:16:59 +0000 Subject: [PATCH 70/85] Crontab fixes --- allianceauth/crontab/schedulers.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/allianceauth/crontab/schedulers.py b/allianceauth/crontab/schedulers.py index 0b36eead..9a678cf5 100644 --- a/allianceauth/crontab/schedulers.py +++ b/allianceauth/crontab/schedulers.py @@ -20,6 +20,10 @@ class OffsetDatabaseScheduler(DatabaseScheduler): Takes the Celery Schedule from local.py and applies our AA Framework Cron Offset, if apply_offset is true Otherwise it passes it through as normal """ + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + def update_from_dict(self, mapping): s = {} @@ -36,10 +40,10 @@ class OffsetDatabaseScheduler(DatabaseScheduler): for name, entry_fields in mapping.items(): try: - apply_offset = entry_fields.pop("apply_offset", False) + apply_offset = entry_fields.pop("apply_offset", False) # Ensure this pops before django tries to save to ORM entry = self.Entry.from_entry(name, app=self.app, **entry_fields) - if entry.model.enabled and apply_offset: + if apply_offset: schedule_obj = entry.schedule if isinstance(schedule_obj, schedules.crontab): offset_cs = CrontabSchedule.from_schedule(offset_cron(schedule_obj)) @@ -55,7 +59,8 @@ class OffsetDatabaseScheduler(DatabaseScheduler): entry.model.save() logger.debug(f"Offset applied for '{name}' due to 'apply_offset' = True.") - s[name] = entry + if entry.model.enabled: + s[name] = entry except Exception as e: logger.exception("Error updating schedule for %s: %r", name, e) From 960c9625fe0037affb9dbb06e7e2221b5dd6c864 Mon Sep 17 00:00:00 2001 From: Joel Falknau Date: Tue, 25 Feb 2025 19:29:36 +1000 Subject: [PATCH 71/85] Version Bump 4.6.2a --- allianceauth/__init__.py | 2 +- allianceauth/locale/en/LC_MESSAGES/django.po | 474 +++++++++---------- docker/.env.example | 2 +- docker/Dockerfile | 2 +- 4 files changed, 237 insertions(+), 243 deletions(-) diff --git a/allianceauth/__init__.py b/allianceauth/__init__.py index a748cc09..564ea211 100644 --- a/allianceauth/__init__.py +++ b/allianceauth/__init__.py @@ -5,7 +5,7 @@ manage online service access. # This will make sure the app is always imported when # Django starts so that shared_task will use this app. -__version__ = '4.6.1' +__version__ = '4.6.2a' __title__ = 'Alliance Auth' __url__ = 'https://gitlab.com/allianceauth/allianceauth' NAME = f'{__title__} v{__version__}' diff --git a/allianceauth/locale/en/LC_MESSAGES/django.po b/allianceauth/locale/en/LC_MESSAGES/django.po index 0a06e636..1ab09cd4 100644 --- a/allianceauth/locale/en/LC_MESSAGES/django.po +++ b/allianceauth/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-21 12:59+1000\n" +"POT-Creation-Date: 2025-02-25 19:17+1000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,11 +18,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: allianceauth/analytics/models.py:26 +#: allianceauth/analytics/models.py:22 msgid "Google Analytics Universal" msgstr "" -#: allianceauth/analytics/models.py:27 +#: allianceauth/analytics/models.py:23 msgid "Google Analytics V4" msgstr "" @@ -35,7 +35,7 @@ msgid "" "esi on the EVE Online Discord. https://www.eveonline.com/discord" msgstr "" -#: allianceauth/authentication/decorators.py:52 +#: allianceauth/authentication/decorators.py:49 msgid "A main character is required to perform that action. Add one below." msgstr "" @@ -48,91 +48,91 @@ msgstr "" msgid "You are not allowed to add or remove these restricted groups: %s" msgstr "" -#: allianceauth/authentication/models.py:71 -#: allianceauth/project_template/project_name/settings/base.py:99 +#: allianceauth/authentication/models.py:70 +#: allianceauth/project_template/project_name/settings/base.py:105 msgid "English" msgstr "" -#: allianceauth/authentication/models.py:72 +#: allianceauth/authentication/models.py:71 msgid "Czech" msgstr "" -#: allianceauth/authentication/models.py:73 -#: allianceauth/project_template/project_name/settings/base.py:101 +#: allianceauth/authentication/models.py:72 +#: allianceauth/project_template/project_name/settings/base.py:107 msgid "German" msgstr "" -#: allianceauth/authentication/models.py:74 -#: allianceauth/project_template/project_name/settings/base.py:102 +#: allianceauth/authentication/models.py:73 +#: allianceauth/project_template/project_name/settings/base.py:108 msgid "Spanish" msgstr "" -#: allianceauth/authentication/models.py:75 -#: allianceauth/project_template/project_name/settings/base.py:103 +#: allianceauth/authentication/models.py:74 +#: allianceauth/project_template/project_name/settings/base.py:109 msgid "Italian" msgstr "" -#: allianceauth/authentication/models.py:76 -#: allianceauth/project_template/project_name/settings/base.py:104 +#: allianceauth/authentication/models.py:75 +#: allianceauth/project_template/project_name/settings/base.py:110 msgid "Japanese" msgstr "" -#: allianceauth/authentication/models.py:77 -#: allianceauth/project_template/project_name/settings/base.py:105 +#: allianceauth/authentication/models.py:76 +#: allianceauth/project_template/project_name/settings/base.py:111 msgid "Korean" msgstr "" -#: allianceauth/authentication/models.py:78 -#: allianceauth/project_template/project_name/settings/base.py:106 +#: allianceauth/authentication/models.py:77 +#: allianceauth/project_template/project_name/settings/base.py:112 msgid "French" msgstr "" -#: allianceauth/authentication/models.py:79 -#: allianceauth/project_template/project_name/settings/base.py:109 +#: allianceauth/authentication/models.py:78 +#: allianceauth/project_template/project_name/settings/base.py:115 msgid "Russian" msgstr "" -#: allianceauth/authentication/models.py:80 -#: allianceauth/project_template/project_name/settings/base.py:107 +#: allianceauth/authentication/models.py:79 +#: allianceauth/project_template/project_name/settings/base.py:113 msgid "Dutch" msgstr "" -#: allianceauth/authentication/models.py:81 -#: allianceauth/project_template/project_name/settings/base.py:108 +#: allianceauth/authentication/models.py:80 +#: allianceauth/project_template/project_name/settings/base.py:114 msgid "Polish" msgstr "" -#: allianceauth/authentication/models.py:82 -#: allianceauth/project_template/project_name/settings/base.py:110 +#: allianceauth/authentication/models.py:81 +#: allianceauth/project_template/project_name/settings/base.py:116 msgid "Ukrainian" msgstr "" -#: allianceauth/authentication/models.py:83 -#: allianceauth/project_template/project_name/settings/base.py:111 +#: allianceauth/authentication/models.py:82 +#: allianceauth/project_template/project_name/settings/base.py:117 msgid "Simplified Chinese" msgstr "" -#: allianceauth/authentication/models.py:99 +#: allianceauth/authentication/models.py:98 #: allianceauth/menu/templates/menu/menu-user.html:42 msgid "Language" msgstr "" -#: allianceauth/authentication/models.py:104 +#: allianceauth/authentication/models.py:103 #: allianceauth/templates/allianceauth/night-toggle.html:6 msgid "Night Mode" msgstr "" -#: allianceauth/authentication/models.py:108 +#: allianceauth/authentication/models.py:107 #: allianceauth/menu/templates/menu/menu-user.html:46 msgid "Theme" msgstr "" -#: allianceauth/authentication/models.py:125 +#: allianceauth/authentication/models.py:124 #, python-format msgid "State changed to: %s" msgstr "" -#: allianceauth/authentication/models.py:126 +#: allianceauth/authentication/models.py:125 #, python-format msgid "Your user's state is now: %(state)s" msgstr "" @@ -167,9 +167,9 @@ msgstr "" #: allianceauth/authentication/templates/authentication/dashboard_characters.html:22 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:89 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:23 -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:31 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:32 #: allianceauth/hrapplications/templates/hrapplications/view.html:61 -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:32 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:33 msgid "Name" msgstr "" @@ -179,7 +179,7 @@ msgid "Corp" msgstr "" #: allianceauth/authentication/templates/authentication/dashboard_characters.html:24 -#: allianceauth/corputils/templates/corputils/corpstats.html:125 +#: allianceauth/corputils/templates/corputils/corpstats.html:126 #: allianceauth/hrapplications/templates/hrapplications/view.html:63 msgid "Alliance" msgstr "" @@ -192,43 +192,43 @@ msgstr "" msgid "State:" msgstr "" -#: allianceauth/authentication/templates/authentication/tokens.html:6 -#: allianceauth/authentication/templates/authentication/tokens.html:10 +#: allianceauth/authentication/templates/authentication/tokens.html:7 +#: allianceauth/authentication/templates/authentication/tokens.html:11 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62 msgid "Token Management" msgstr "" -#: allianceauth/authentication/templates/authentication/tokens.html:16 +#: allianceauth/authentication/templates/authentication/tokens.html:17 msgid "" "This page is a best attempt, but backups or database logs can still contain " -"your tokens. Always revoke tokens on https://community.eveonline.com/support/" -"third-party-applications/ where possible." -msgstr "" - -#: allianceauth/authentication/templates/authentication/tokens.html:22 -msgid "Scopes" +"your tokens. Always revoke tokens on https://developers.eveonline.com/" +"authorized-apps where possible." msgstr "" #: allianceauth/authentication/templates/authentication/tokens.html:23 +msgid "Scopes" +msgstr "" + +#: allianceauth/authentication/templates/authentication/tokens.html:24 #: allianceauth/hrapplications/templates/hrapplications/management.html:37 #: allianceauth/hrapplications/templates/hrapplications/management.html:124 #: allianceauth/hrapplications/templates/hrapplications/management.html:168 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:35 #: allianceauth/hrapplications/templates/hrapplications/view.html:94 -#: allianceauth/srp/templates/srp/data.html:82 +#: allianceauth/srp/templates/srp/data.html:83 #: allianceauth/srp/templates/srp/management.html:53 msgid "Actions" msgstr "" -#: allianceauth/authentication/templates/authentication/tokens.html:24 -#: allianceauth/corputils/templates/corputils/corpstats.html:123 -#: allianceauth/corputils/templates/corputils/corpstats.html:163 -#: allianceauth/corputils/templates/corputils/corpstats.html:210 -#: allianceauth/corputils/templates/corputils/search.html:16 +#: allianceauth/authentication/templates/authentication/tokens.html:25 +#: allianceauth/corputils/templates/corputils/corpstats.html:124 +#: allianceauth/corputils/templates/corputils/corpstats.html:164 +#: allianceauth/corputils/templates/corputils/corpstats.html:211 +#: allianceauth/corputils/templates/corputils/search.html:17 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:36 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:41 -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:29 -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:28 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:55 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:118 msgid "Character" @@ -267,49 +267,49 @@ msgstr "" msgid "Invalid or expired activation link." msgstr "" -#: allianceauth/authentication/views.py:158 +#: allianceauth/authentication/views.py:157 #, python-format msgid "" "Cannot change main character to %(char)s: character owned by a different " "account." msgstr "" -#: allianceauth/authentication/views.py:165 +#: allianceauth/authentication/views.py:164 #, python-format msgid "Changed main character to %s" msgstr "" -#: allianceauth/authentication/views.py:179 +#: allianceauth/authentication/views.py:178 #, python-format msgid "Added %(name)s to your account." msgstr "" -#: allianceauth/authentication/views.py:181 +#: allianceauth/authentication/views.py:180 #, python-format msgid "Failed to add %(name)s to your account: they already have an account." msgstr "" -#: allianceauth/authentication/views.py:226 +#: allianceauth/authentication/views.py:225 msgid "" "Unable to authenticate as the selected character. Please log in with the " "main character associated with this account." msgstr "" -#: allianceauth/authentication/views.py:293 +#: allianceauth/authentication/views.py:292 msgid "Registration token has expired." msgstr "" -#: allianceauth/authentication/views.py:354 +#: allianceauth/authentication/views.py:353 msgid "" "Sent confirmation email. Please follow the link to confirm your email " "address." msgstr "" -#: allianceauth/authentication/views.py:360 +#: allianceauth/authentication/views.py:359 msgid "Confirmed your email address. Please login to continue." msgstr "" -#: allianceauth/authentication/views.py:366 +#: allianceauth/authentication/views.py:365 msgid "Registration of new accounts is not allowed at this time." msgstr "" @@ -334,39 +334,39 @@ msgstr "" msgid "Search all corporations..." msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:45 +#: allianceauth/corputils/templates/corputils/corpstats.html:46 msgid "Mains" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:59 +#: allianceauth/corputils/templates/corputils/corpstats.html:60 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:34 msgid "Members" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:73 +#: allianceauth/corputils/templates/corputils/corpstats.html:74 msgid "Unregistered" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:79 +#: allianceauth/corputils/templates/corputils/corpstats.html:80 msgid "Last update:" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:85 +#: allianceauth/corputils/templates/corputils/corpstats.html:86 msgid "Update Now" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:100 +#: allianceauth/corputils/templates/corputils/corpstats.html:101 msgid "Main character" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:101 +#: allianceauth/corputils/templates/corputils/corpstats.html:102 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:29 msgid "Registered characters" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:124 -#: allianceauth/corputils/templates/corputils/search.html:17 -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:30 +#: allianceauth/corputils/templates/corputils/corpstats.html:125 +#: allianceauth/corputils/templates/corputils/search.html:18 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 #: allianceauth/hrapplications/templates/hrapplications/management.html:35 #: allianceauth/hrapplications/templates/hrapplications/management.html:122 #: allianceauth/hrapplications/templates/hrapplications/management.html:166 @@ -375,16 +375,16 @@ msgstr "" msgid "Corporation" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:141 -#: allianceauth/corputils/templates/corputils/corpstats.html:177 -#: allianceauth/corputils/templates/corputils/corpstats.html:190 -#: allianceauth/corputils/templates/corputils/corpstats.html:222 -#: allianceauth/corputils/templates/corputils/search.html:30 +#: allianceauth/corputils/templates/corputils/corpstats.html:142 +#: allianceauth/corputils/templates/corputils/corpstats.html:178 +#: allianceauth/corputils/templates/corputils/corpstats.html:191 +#: allianceauth/corputils/templates/corputils/corpstats.html:223 +#: allianceauth/corputils/templates/corputils/search.html:31 msgid "Killboard" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:165 -#: allianceauth/corputils/templates/corputils/search.html:19 +#: allianceauth/corputils/templates/corputils/corpstats.html:166 +#: allianceauth/corputils/templates/corputils/search.html:20 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:32 #: allianceauth/hrapplications/templates/hrapplications/management.html:121 #: allianceauth/hrapplications/templates/hrapplications/management.html:165 @@ -393,21 +393,21 @@ msgstr "" msgid "Main Character" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:166 -#: allianceauth/corputils/templates/corputils/search.html:20 +#: allianceauth/corputils/templates/corputils/corpstats.html:167 +#: allianceauth/corputils/templates/corputils/search.html:21 msgid "Main Corporation" msgstr "" -#: allianceauth/corputils/templates/corputils/corpstats.html:167 -#: allianceauth/corputils/templates/corputils/search.html:21 +#: allianceauth/corputils/templates/corputils/corpstats.html:168 +#: allianceauth/corputils/templates/corputils/search.html:22 msgid "Main Alliance" msgstr "" -#: allianceauth/corputils/templates/corputils/search.html:8 +#: allianceauth/corputils/templates/corputils/search.html:9 msgid "Search Results" msgstr "" -#: allianceauth/corputils/templates/corputils/search.html:18 +#: allianceauth/corputils/templates/corputils/search.html:19 msgid "zKillboard" msgstr "" @@ -419,6 +419,26 @@ msgstr "" msgid "Failed to gather corporation statistics with selected token." msgstr "" +#: allianceauth/crontab/models.py:13 +msgid "Minute Offset" +msgstr "" + +#: allianceauth/crontab/models.py:14 +msgid "Hour Offset" +msgstr "" + +#: allianceauth/crontab/models.py:15 +msgid "Day of Month Offset" +msgstr "" + +#: allianceauth/crontab/models.py:16 +msgid "Month of Year Offset" +msgstr "" + +#: allianceauth/crontab/models.py:17 +msgid "Day of Week Offset" +msgstr "" + #: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36 #: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47 msgid "Custom CSS" @@ -517,9 +537,9 @@ msgid "Delete fat" msgstr "" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:35 -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:36 #: allianceauth/hrapplications/templates/hrapplications/view.html:41 -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:30 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 msgid "User" msgstr "" @@ -527,7 +547,7 @@ msgstr "" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:42 #: allianceauth/optimer/form.py:13 allianceauth/timerboard/form.py:37 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:17 -#: allianceauth/timerboard/templates/timerboard/timertable.html:9 +#: allianceauth/timerboard/templates/timerboard/timertable.html:10 msgid "System" msgstr "" @@ -542,7 +562,7 @@ msgstr "" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:44 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:92 #: allianceauth/templates/allianceauth/top-menu.html:23 -#: allianceauth/timerboard/templates/timerboard/timertable.html:11 +#: allianceauth/timerboard/templates/timerboard/timertable.html:12 msgid "Eve Time" msgstr "" @@ -601,7 +621,7 @@ msgstr "" #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:74 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:90 -#: allianceauth/timerboard/templates/timerboard/timertable.html:13 +#: allianceauth/timerboard/templates/timerboard/timertable.html:14 msgid "Creator" msgstr "" @@ -709,17 +729,17 @@ msgid "" msgstr "" #: allianceauth/groupmanagement/auth_hooks.py:18 -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:17 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:18 msgid "Group Management" msgstr "" #: allianceauth/groupmanagement/auth_hooks.py:51 -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35 msgid "Groups" msgstr "" #: allianceauth/groupmanagement/forms.py:18 -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:33 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:34 msgid "Users" msgstr "" @@ -822,84 +842,84 @@ msgstr "" msgid "Date when this entry was created" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:8 -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:12 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:9 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13 msgid "Audit Log" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:17 -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:18 -#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:21 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:18 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:19 +#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:22 #: allianceauth/timerboard/templates/timerboard/index_button.html:4 msgid "Back" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:27 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:28 msgid "Date/Time" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:28 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:29 msgid "Requestor" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:31 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:32 #: allianceauth/optimer/templates/optimer/dashboard.ops.html:15 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:16 msgid "Type" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:32 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:33 #: allianceauth/notifications/templates/notifications/list_partial.html:8 #: allianceauth/optimer/templates/optimer/fleetoptable.html:20 -#: allianceauth/timerboard/templates/timerboard/timertable.html:16 +#: allianceauth/timerboard/templates/timerboard/timertable.html:17 msgid "Action" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:33 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:34 msgid "Actor" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:47 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:48 msgid "Removed" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:59 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:60 msgid "All times displayed are EVE/UTC." msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:66 +#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:67 msgid "No entries found for this group." msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:9 -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:13 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:10 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:14 msgid "Group Members" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:30 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:56 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:119 -#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:32 +#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:33 msgid "Organization" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:49 -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:75 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:50 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:76 msgid "Group leader" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:60 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:61 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:85 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:148 #: allianceauth/permissions_tool/templates/permissions_tool/audit_row.html:18 msgid "(unknown)" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:65 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:66 msgid "Remove from group" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:80 +#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:81 msgid "No group members to list." msgstr "" @@ -913,7 +933,7 @@ msgid "Join/Leave Requests" msgstr "" #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:24 -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:32 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:33 #: allianceauth/optimer/templates/optimer/fleetoptable.html:10 msgid "Description" msgstr "" @@ -923,7 +943,7 @@ msgstr "" #: allianceauth/hrapplications/templates/hrapplications/management.html:123 #: allianceauth/hrapplications/templates/hrapplications/management.html:167 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:34 -#: allianceauth/srp/templates/srp/data.html:80 +#: allianceauth/srp/templates/srp/data.html:81 msgid "Status" msgstr "" @@ -960,49 +980,49 @@ msgstr "" msgid "No groups to list." msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:7 -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:11 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:8 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:12 msgid "Available Groups" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:34 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:35 msgid "Leaders" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:36 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:37 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:57 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:120 -#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:29 +#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:30 #: allianceauth/services/modules/openfire/forms.py:6 msgid "Group" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:69 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:70 msgid "Leave" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:73 -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:88 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:74 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:89 #: allianceauth/hrapplications/templates/hrapplications/management.html:46 #: allianceauth/hrapplications/templates/hrapplications/management.html:95 #: allianceauth/hrapplications/templates/hrapplications/management.html:138 #: allianceauth/hrapplications/templates/hrapplications/management.html:182 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:46 #: allianceauth/hrapplications/templates/hrapplications/view.html:25 -#: allianceauth/srp/templates/srp/data.html:116 +#: allianceauth/srp/templates/srp/data.html:117 #: allianceauth/srp/templates/srp/management.html:87 msgid "Pending" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:79 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:80 msgid "Join" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:83 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:84 msgid "Request" msgstr "" -#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:98 +#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:99 msgid "No groups available." msgstr "" @@ -1202,7 +1222,7 @@ msgstr "" #: allianceauth/hrapplications/templates/hrapplications/management.html:185 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:48 #: allianceauth/hrapplications/templates/hrapplications/view.html:21 -#: allianceauth/srp/templates/srp/data.html:108 +#: allianceauth/srp/templates/srp/data.html:109 msgid "Approved" msgstr "" @@ -1210,7 +1230,7 @@ msgstr "" #: allianceauth/hrapplications/templates/hrapplications/management.html:143 #: allianceauth/hrapplications/templates/hrapplications/management.html:187 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:50 -#: allianceauth/srp/templates/srp/data.html:112 +#: allianceauth/srp/templates/srp/data.html:113 msgid "Rejected" msgstr "" @@ -1525,7 +1545,7 @@ msgid "Fleet Commander" msgstr "" #: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14 -#: allianceauth/srp/templates/srp/data.html:71 +#: allianceauth/srp/templates/srp/data.html:72 msgid "Additional Info" msgstr "" @@ -1576,7 +1596,7 @@ msgid "EVE Time" msgstr "" #: allianceauth/optimer/templates/optimer/fleetoptable.html:14 -#: allianceauth/timerboard/templates/timerboard/timertable.html:12 +#: allianceauth/timerboard/templates/timerboard/timertable.html:13 msgid "Local Time" msgstr "" @@ -1589,7 +1609,7 @@ msgid "Fleet Operation Management" msgstr "" #: allianceauth/optimer/templates/optimer/management.html:28 -#: allianceauth/timerboard/templates/timerboard/view.html:31 +#: allianceauth/timerboard/templates/timerboard/view.html:32 msgid "Current Eve Time:" msgstr "" @@ -1598,7 +1618,7 @@ msgid "Next Fleet Operations" msgstr "" #: allianceauth/optimer/templates/optimer/management.html:44 -#: allianceauth/timerboard/templates/timerboard/view.html:62 +#: allianceauth/timerboard/templates/timerboard/view.html:63 msgid "No upcoming timers." msgstr "" @@ -1607,7 +1627,7 @@ msgid "Past Fleet Operations" msgstr "" #: allianceauth/optimer/templates/optimer/management.html:60 -#: allianceauth/timerboard/templates/timerboard/view.html:80 +#: allianceauth/timerboard/templates/timerboard/view.html:81 msgid "No past timers." msgstr "" @@ -1635,50 +1655,50 @@ msgstr "" msgid "Saved changes to operation timer for %(opname)s." msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:6 -#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:10 -#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:16 -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:10 +#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:7 +#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:11 +#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:17 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:11 msgid "Permissions Audit" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:31 +#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:32 msgid "User / Character" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:6 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:7 msgid "Permissions Overview" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:17 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:18 msgid "Showing only applied permissions" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:18 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:19 msgid "Show All" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:20 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:21 msgid "Showing all permissions" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:21 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:22 msgid "Show Applied" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:29 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:30 msgid "App" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:30 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:31 msgid "Model" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:31 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:32 msgid "Code Name" msgstr "" -#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:35 +#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:36 msgid "States" msgstr "" @@ -1856,45 +1876,45 @@ msgstr "" msgid "Deactivated IPSuite4 account." msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:6 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:7 msgid "Mumble" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:10 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:11 msgid "Mumble History" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:22 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:23 msgid "Server Connection History" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:31 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 msgid "Displayed Name" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 msgid "Release" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:67 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 msgid "Version" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 msgid "Last Connect" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:36 msgid "Last Disconnect" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:47 -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:59 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:48 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:60 msgid "Server Connection Breakdown" msgstr "" -#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 +#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:69 msgid "Number" msgstr "" @@ -2200,7 +2220,7 @@ msgid "SRP Fleet Create" msgstr "" #: allianceauth/srp/templates/srp/add.html:11 -#: allianceauth/srp/templates/srp/data.html:11 +#: allianceauth/srp/templates/srp/data.html:12 #: allianceauth/srp/templates/srp/management.html:11 #: allianceauth/srp/templates/srp/request.html:11 #: allianceauth/srp/templates/srp/update.html:11 @@ -2223,73 +2243,73 @@ msgstr "" msgid "Give this link to the line members." msgstr "" -#: allianceauth/srp/templates/srp/data.html:7 -#: allianceauth/srp/templates/srp/data.html:38 +#: allianceauth/srp/templates/srp/data.html:8 +#: allianceauth/srp/templates/srp/data.html:39 msgid "SRP Fleet Data" msgstr "" -#: allianceauth/srp/templates/srp/data.html:16 +#: allianceauth/srp/templates/srp/data.html:17 msgid "View Fleets" msgstr "" -#: allianceauth/srp/templates/srp/data.html:25 +#: allianceauth/srp/templates/srp/data.html:26 msgid "Mark Incomplete" msgstr "" -#: allianceauth/srp/templates/srp/data.html:29 +#: allianceauth/srp/templates/srp/data.html:30 msgid "Mark Completed" msgstr "" -#: allianceauth/srp/templates/srp/data.html:47 -#: allianceauth/srp/templates/srp/data.html:138 -msgid "Total Losses:" -msgstr "" - #: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:139 +msgid "Total Losses:" +msgstr "" + +#: allianceauth/srp/templates/srp/data.html:49 +#: allianceauth/srp/templates/srp/data.html:140 #: allianceauth/srp/templates/srp/management.html:36 msgid "Total ISK Cost:" msgstr "" -#: allianceauth/srp/templates/srp/data.html:59 -#: allianceauth/srp/templates/srp/data.html:150 +#: allianceauth/srp/templates/srp/data.html:60 +#: allianceauth/srp/templates/srp/data.html:151 msgid "Are you sure you want to delete SRP requests?" msgstr "" -#: allianceauth/srp/templates/srp/data.html:69 +#: allianceauth/srp/templates/srp/data.html:70 msgid "Pilot Name" msgstr "" -#: allianceauth/srp/templates/srp/data.html:70 +#: allianceauth/srp/templates/srp/data.html:71 msgid "Killboard Link" msgstr "" -#: allianceauth/srp/templates/srp/data.html:72 +#: allianceauth/srp/templates/srp/data.html:73 msgid "Ship Type" msgstr "" -#: allianceauth/srp/templates/srp/data.html:73 +#: allianceauth/srp/templates/srp/data.html:74 msgid "Killboard Loss Amt" msgstr "" -#: allianceauth/srp/templates/srp/data.html:75 +#: allianceauth/srp/templates/srp/data.html:76 msgid "SRP ISK Cost" msgstr "" -#: allianceauth/srp/templates/srp/data.html:76 +#: allianceauth/srp/templates/srp/data.html:77 msgid "Click value to edit Enter to save & next ESC to cancel" msgstr "" -#: allianceauth/srp/templates/srp/data.html:79 +#: allianceauth/srp/templates/srp/data.html:80 msgid "Post Time" msgstr "" -#: allianceauth/srp/templates/srp/data.html:98 +#: allianceauth/srp/templates/srp/data.html:99 #: allianceauth/srp/templates/srp/management.html:70 msgid "Link" msgstr "" -#: allianceauth/srp/templates/srp/data.html:159 +#: allianceauth/srp/templates/srp/data.html:160 msgid "No SRP requests for this fleet." msgstr "" @@ -2562,7 +2582,7 @@ msgstr "" #: allianceauth/timerboard/form.py:36 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14 -#: allianceauth/timerboard/templates/timerboard/timertable.html:7 +#: allianceauth/timerboard/templates/timerboard/timertable.html:8 msgid "Details" msgstr "" @@ -2579,7 +2599,7 @@ msgid "Timer Type" msgstr "" #: allianceauth/timerboard/form.py:41 -#: allianceauth/timerboard/templates/timerboard/timertable.html:8 +#: allianceauth/timerboard/templates/timerboard/timertable.html:9 msgid "Objective" msgstr "" @@ -2613,159 +2633,141 @@ msgstr "" #: allianceauth/timerboard/models.py:15 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:39 -#: allianceauth/timerboard/templates/timerboard/timertable.html:36 msgid "Friendly" msgstr "" #: allianceauth/timerboard/models.py:16 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:34 -#: allianceauth/timerboard/templates/timerboard/timertable.html:34 msgid "Hostile" msgstr "" #: allianceauth/timerboard/models.py:17 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:44 -#: allianceauth/timerboard/templates/timerboard/timertable.html:38 msgid "Neutral" msgstr "" #: allianceauth/timerboard/models.py:24 -#: allianceauth/timerboard/templates/timerboard/timertable.html:48 msgid "POCO" msgstr "" #: allianceauth/timerboard/models.py:25 -#: allianceauth/timerboard/templates/timerboard/timertable.html:50 msgid "Orbital Skyhook" msgstr "" #: allianceauth/timerboard/models.py:26 -#: allianceauth/timerboard/templates/timerboard/timertable.html:52 -msgid "I-HUB" +msgid "Sovereignty Hub" msgstr "" #: allianceauth/timerboard/models.py:27 -#: allianceauth/timerboard/templates/timerboard/timertable.html:55 msgid "TCU" msgstr "" #: allianceauth/timerboard/models.py:28 -#: allianceauth/timerboard/templates/timerboard/timertable.html:57 msgid "POS [S]" msgstr "" #: allianceauth/timerboard/models.py:29 -#: allianceauth/timerboard/templates/timerboard/timertable.html:59 msgid "POS [M]" msgstr "" #: allianceauth/timerboard/models.py:30 -#: allianceauth/timerboard/templates/timerboard/timertable.html:61 msgid "POS [L]" msgstr "" #: allianceauth/timerboard/models.py:31 -#: allianceauth/timerboard/templates/timerboard/timertable.html:63 msgid "Astrahus" msgstr "" #: allianceauth/timerboard/models.py:32 -#: allianceauth/timerboard/templates/timerboard/timertable.html:65 msgid "Fortizar" msgstr "" #: allianceauth/timerboard/models.py:33 -#: allianceauth/timerboard/templates/timerboard/timertable.html:67 msgid "Keepstar" msgstr "" #: allianceauth/timerboard/models.py:34 -#: allianceauth/timerboard/templates/timerboard/timertable.html:69 msgid "Raitaru" msgstr "" #: allianceauth/timerboard/models.py:35 -#: allianceauth/timerboard/templates/timerboard/timertable.html:71 msgid "Azbel" msgstr "" #: allianceauth/timerboard/models.py:36 -#: allianceauth/timerboard/templates/timerboard/timertable.html:73 msgid "Sotiyo" msgstr "" #: allianceauth/timerboard/models.py:37 -#: allianceauth/timerboard/templates/timerboard/timertable.html:75 msgid "Athanor" msgstr "" #: allianceauth/timerboard/models.py:38 -#: allianceauth/timerboard/templates/timerboard/timertable.html:77 msgid "Tatara" msgstr "" #: allianceauth/timerboard/models.py:39 -msgid "Pharolux Cyno Beacon" +msgid "Cyno Beacon" msgstr "" #: allianceauth/timerboard/models.py:40 -msgid "Tenebrex Cyno Jammer" +msgid "Cyno Jammer" msgstr "" #: allianceauth/timerboard/models.py:41 -#: allianceauth/timerboard/templates/timerboard/timertable.html:83 msgid "Ansiblex Jump Gate" msgstr "" #: allianceauth/timerboard/models.py:42 -#: allianceauth/timerboard/templates/timerboard/timertable.html:85 -msgid "Moon Mining Cycle" +msgid "Mercenary Den" msgstr "" #: allianceauth/timerboard/models.py:43 -#: allianceauth/timerboard/templates/timerboard/timertable.html:87 -msgid "Metenox Moon Drill" +msgid "Moon Mining Cycle" msgstr "" #: allianceauth/timerboard/models.py:44 -#: allianceauth/timerboard/templates/timerboard/timertable.html:89 +msgid "Metenox Moon Drill" +msgstr "" + +#: allianceauth/timerboard/models.py:45 msgid "Other" msgstr "" -#: allianceauth/timerboard/models.py:51 +#: allianceauth/timerboard/models.py:52 msgid "Not Specified" msgstr "" -#: allianceauth/timerboard/models.py:52 +#: allianceauth/timerboard/models.py:53 msgid "Shield" msgstr "" -#: allianceauth/timerboard/models.py:53 +#: allianceauth/timerboard/models.py:54 msgid "Armor" msgstr "" -#: allianceauth/timerboard/models.py:54 +#: allianceauth/timerboard/models.py:55 msgid "Hull" msgstr "" -#: allianceauth/timerboard/models.py:55 +#: allianceauth/timerboard/models.py:56 msgid "Final" msgstr "" -#: allianceauth/timerboard/models.py:56 +#: allianceauth/timerboard/models.py:57 msgid "Anchoring" msgstr "" -#: allianceauth/timerboard/models.py:57 +#: allianceauth/timerboard/models.py:58 msgid "Unanchoring" msgstr "" -#: allianceauth/timerboard/models.py:58 +#: allianceauth/timerboard/models.py:59 msgid "Abandoned" msgstr "" #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7 -#: allianceauth/timerboard/templates/timerboard/view.html:53 +#: allianceauth/timerboard/templates/timerboard/view.html:54 msgid "Upcoming Timers" msgstr "" @@ -2775,7 +2777,7 @@ msgstr "" #: allianceauth/timerboard/templates/timerboard/form.html:10 #: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:10 -#: allianceauth/timerboard/templates/timerboard/view.html:13 +#: allianceauth/timerboard/templates/timerboard/view.html:14 msgid "Structure Timers" msgstr "" @@ -2799,7 +2801,7 @@ msgid "Create Timer" msgstr "" #: allianceauth/timerboard/templates/timerboard/timer_create_form.html:9 -#: allianceauth/timerboard/templates/timerboard/view.html:21 +#: allianceauth/timerboard/templates/timerboard/view.html:22 msgid "Create Structure Timer" msgstr "" @@ -2809,36 +2811,28 @@ msgstr "" msgid "Update Structure Timer" msgstr "" -#: allianceauth/timerboard/templates/timerboard/timertable.html:10 +#: allianceauth/timerboard/templates/timerboard/timertable.html:11 msgid "Structure" msgstr "" -#: allianceauth/timerboard/templates/timerboard/timertable.html:79 -msgid "Cyno Beacon" -msgstr "" - -#: allianceauth/timerboard/templates/timerboard/timertable.html:81 -msgid "Cyno Jammer" -msgstr "" - -#: allianceauth/timerboard/templates/timerboard/view.html:9 +#: allianceauth/timerboard/templates/timerboard/view.html:10 msgid "Structure Timer Management" msgstr "" -#: allianceauth/timerboard/templates/timerboard/view.html:40 +#: allianceauth/timerboard/templates/timerboard/view.html:41 msgid "Corporation Timers" msgstr "" -#: allianceauth/timerboard/templates/timerboard/view.html:71 +#: allianceauth/timerboard/templates/timerboard/view.html:72 msgid "Past Timers" msgstr "" -#: allianceauth/timerboard/views.py:85 +#: allianceauth/timerboard/views.py:175 #, python-format msgid "Added new timer in %(system)s at %(time)s." msgstr "" -#: allianceauth/timerboard/views.py:95 +#: allianceauth/timerboard/views.py:186 msgid "Saved changes to the timer." msgstr "" diff --git a/docker/.env.example b/docker/.env.example index 76958b0d..a6c71f7d 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -1,7 +1,7 @@ PROTOCOL=https:// AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN% DOMAIN=%DOMAIN% -AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.6.1 +AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.6.2a # Nginx Proxy Manager PROXY_HTTP_PORT=80 diff --git a/docker/Dockerfile b/docker/Dockerfile index 28990230..113c8b93 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,5 +1,5 @@ FROM python:3.11-slim -ARG AUTH_VERSION=v4.6.1 +ARG AUTH_VERSION=v4.6.2a ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION} ENV AUTH_USER=allianceauth ENV AUTH_GROUP=allianceauth From 4ccfe20c14c86cdf2ece3f6561b0196b7cb148b4 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 25 Feb 2025 11:52:25 +0100 Subject: [PATCH 72/85] [CHANGE] Set email to `dummy@example.net` --- allianceauth/eveonline/tests/test_providers.py | 2 +- tests/settings_all.py | 2 +- tests/settings_core.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/allianceauth/eveonline/tests/test_providers.py b/allianceauth/eveonline/tests/test_providers.py index ea8df739..e90b727b 100644 --- a/allianceauth/eveonline/tests/test_providers.py +++ b/allianceauth/eveonline/tests/test_providers.py @@ -723,5 +723,5 @@ class TestEveSwaggerProvider(TestCase): my_client = my_provider.client operation = my_client.Universe.get_universe_factions() self.assertEqual( - operation.future.request.headers['User-Agent'], 'allianceauth v1.0.0 mail@dummy.net' + operation.future.request.headers['User-Agent'], 'allianceauth v1.0.0 dummy@example.net' ) diff --git a/tests/settings_all.py b/tests/settings_all.py index 6063b972..309f9260 100644 --- a/tests/settings_all.py +++ b/tests/settings_all.py @@ -47,7 +47,7 @@ CACHES = { ESI_SSO_CLIENT_ID = "dummy" ESI_SSO_CLIENT_SECRET = "dummy" ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback" -ESI_USER_CONTACT_EMAIL = "mail@dummy.net" +ESI_USER_CONTACT_EMAIL = "dummy@example.net" ######################## # XenForo Configuration diff --git a/tests/settings_core.py b/tests/settings_core.py index b95218ed..3222f5df 100644 --- a/tests/settings_core.py +++ b/tests/settings_core.py @@ -37,4 +37,4 @@ ALLIANCEAUTH_DASHBOARD_TASK_STATISTICS_DISABLED = True # disable for tests ESI_SSO_CLIENT_ID = "dummy" ESI_SSO_CLIENT_SECRET = "dummy" ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback" -ESI_USER_CONTACT_EMAIL = "mail@dummy.net" +ESI_USER_CONTACT_EMAIL = "dummy@example.net" From faa529a55b37dec4a55716953093ac67b2cac6ea Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 25 Feb 2025 17:33:02 +0100 Subject: [PATCH 73/85] [REMOVE] Stray `a` tag from `header-nav-brand` --- .../templates/services/mumble/mumble_connection_history.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html index 024133fe..d3e4bc11 100644 --- a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html +++ b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html @@ -8,7 +8,7 @@ {% endblock page_title %} {% block header_nav_brand %} - {% trans "Mumble History" %} - {{ mumble_url }} + {% trans "Mumble History" %} - {{ mumble_url }} {% endblock header_nav_brand %} {% block header_nav_collapse_left %} From 5559ce5fbb7a0545aa68451132413dcdf21d9af2 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 25 Feb 2025 18:01:58 +0100 Subject: [PATCH 74/85] [CHANGE] Return empty field when no datetime available --- .../services/mumble/mumble_connection_history.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html index 024133fe..8ba78bbe 100644 --- a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html +++ b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html @@ -105,6 +105,10 @@ { data: 'last_connect', render: (data) => { + if (data === null) { + return ''; + } + return moment(data).utc().format(MUMBLESTATS_DATETIME_FORMAT); }, className: 'text-end', @@ -112,6 +116,10 @@ { data: 'last_disconnect', render: (data) => { + if (data === null) { + return ''; + } + return moment(data).utc().format(MUMBLESTATS_DATETIME_FORMAT); }, className: 'text-end', From 8e9a53c4944977dc6cf9ebc8c2a89f0cc8ddcfd8 Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Tue, 25 Feb 2025 18:03:17 +0100 Subject: [PATCH 75/85] [CHANGE] Localze datetime output --- .../services/mumble/mumble_connection_history.html | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html index 8ba78bbe..3f166fd3 100644 --- a/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html +++ b/allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html @@ -84,10 +84,11 @@ {% include "bundles/moment-js.html" with locale=True %} {% get_datatables_language_static LANGUAGE_CODE as DT_LANG_PATH %} + {% get_momentjs_language_code LANGUAGE_CODE as MOMENTJS_LCODE %}