Compare commits

...

44 Commits

Author SHA1 Message Date
Joel Falknau
156e7c891e document cron offsetting 2024-12-30 18:57:09 +10:00
Joel Falknau
6f2f39d7fa shift to custom Scheduler 2024-12-30 18:12:11 +10:00
Joel Falknau
a66aa6de80 rename submodule properly 2024-12-29 22:19:51 +10:00
Joel Falknau
d12d6e7cdb move to its own module 2024-12-29 22:04:52 +10:00
Joel Falknau
7022cb7050 not relevant comment 2024-12-29 15:14:29 +10:00
Joel Falknau
30a79362f4 remove development note 2024-12-29 15:13:13 +10:00
Joel Falknau
c3fa8acd8e Tweak migrations to use random function not preset 2024-12-29 15:05:53 +10:00
Joel Falknau
8fd1411f09 shift schedule to ready() in order to access DB 2024-12-29 14:51:57 +10:00
Joel Falknau
1aa90adac3 Cron Offset Module 2024-12-29 14:51:33 +10:00
Joel Falknau
7033406ba6 Version Bump 4.5.0 2024-12-10 13:07:03 +10:00
Ariel Rin
6b395ca1d4 Merge branch 'executableflag' into 'master'
Executableflag

See merge request allianceauth/allianceauth!1667
2024-12-09 23:57:02 +00:00
Ariel Rin
795a7e006f Merge branch 'randomdelay' into 'master'
Spread esi tasks over 10 minutes

See merge request allianceauth/allianceauth!1666
2024-12-09 23:56:13 +00:00
Ariel Rin
2a894cd62c Merge branch 'dockermariadbcnf' into 'master'
DockerMariaDB Config Template

See merge request allianceauth/allianceauth!1668
2024-12-09 23:54:33 +00:00
Ariel Rin
9ada26e849 DockerMariaDB Config Template 2024-12-09 23:54:33 +00:00
Ariel Rin
7120b3956c Merge branch 'group_display' into 'master'
fix group display for Groups that are Group Leaders

See merge request allianceauth/allianceauth!1670
2024-12-09 23:54:18 +00:00
root
4da67cfaf6 fix group display for Groups that are Group Leaders 2024-12-08 13:01:59 -06:00
Joel Falknau
0a940810bd dont need this now the flag is set correctly, more consistent 2024-12-05 11:49:54 +10:00
Joel Falknau
a868438492 force these flags on setup 2024-12-05 11:49:32 +10:00
Joel Falknau
dc1ed8c570 +x 2024-12-05 11:48:45 +10:00
Joel Falknau
8489f204dd fix test patch 2024-12-04 22:10:06 +10:00
Ariel Rin
1478588016 Merge branch 'add-js-type' into 'master'
[ADD] `js_type` parameter to allow JS modules to be loaded

See merge request allianceauth/allianceauth!1664
2024-12-04 11:24:21 +00:00
Ariel Rin
a16eb4b7f7 Merge branch 'image-overflow-fix' into 'master'
[FIX] Prevent images from overflowing their parent element

See merge request allianceauth/allianceauth!1665
2024-12-04 11:23:38 +00:00
Joel Falknau
292fb7b29d Add docs for smoothing out task execution 2024-12-04 18:35:07 +10:00
Joel Falknau
c6890dd2c6 Spread esi tasks over 10 minutes 2024-12-04 18:01:01 +10:00
Ariel Rin
702564d15e correct top level indentation to be able to be directly copy-pasteable 2024-12-03 09:50:55 +00:00
Peter Pfeufer
cef2e86ea1 [FIX] Prevent images from overflowing their parent element 2024-11-26 22:28:35 +01:00
Peter Pfeufer
50681b023b [CHANGE] Move the if inside the script tag
Makes the code better readable and maintainable.
2024-11-23 01:55:04 +01:00
Peter Pfeufer
2822775fb8 [ADD] js_type parameter to allow JS modules to be loaded 2024-11-22 15:01:32 +01:00
Ariel Rin
ef7c8be7b5 Merge branch 'fix/default-collation' into 'master'
Fix Different collations being used by docker and baremetal installations

See merge request allianceauth/allianceauth!1662
2024-11-17 01:57:59 +00:00
Ariel Rin
d639617eba Merge branch 'master' into 'master'
Celery documentation improvements

See merge request allianceauth/allianceauth!1663
2024-11-17 01:57:05 +00:00
r0kym
2125192f72 Fix typo in the long-running tasks example 2024-11-15 15:13:25 +01:00
r0kym
8d63801b00 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
2024-11-15 15:12:03 +01:00
Matteo Ghia
e053fb7d96 also in baremetal docs 2024-11-09 12:45:59 +01:00
Matteo Ghia
ae7ed5c297 add default keyword required by mariadb 2024-11-09 12:45:31 +01:00
Matteo Ghia
d624ba4427 set default collation in startup script 2024-11-09 12:01:57 +01:00
Joel Falknau
164cd4fbb2 Merge branch 'master' of gitlab.com:allianceauth/allianceauth 2024-11-08 12:48:21 +10:00
Joel Falknau
94b52c850e Version Bump 4.4.2 2024-11-08 12:47:55 +10:00
Ariel Rin
4d19ceb388 Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1660
2024-11-08 02:43:11 +00:00
Ariel Rin
9a64728311 Updates for project Alliance Auth 2024-11-08 02:43:11 +00:00
Ariel Rin
dcc0c78daf Merge branch 'fix-language-selector' into 'master'
[FIX] Language selector

See merge request allianceauth/allianceauth!1661
2024-11-08 02:17:30 +00:00
Peter Pfeufer
5507c30af4 [CHANGE] Use language local name 2024-11-07 10:49:31 +01:00
Peter Pfeufer
66b97835d4 [FIX] Language selector 2024-10-22 21:20:00 +02:00
Ariel Rin
fd66a7cb20 Merge branch 'fix-mumble-chart-font-color' into 'master'
[FIX] Make chart labels better readable for darker themes

See merge request allianceauth/allianceauth!1659
2024-10-22 02:14:36 +00:00
Peter Pfeufer
c0f0f8db73 [FIX] Make chart labels better readable for darker themes 2024-10-21 05:35:22 +02:00
40 changed files with 954 additions and 67 deletions

View File

@@ -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.5.0'
__title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = f'{__title__} v{__version__}'

View File

@@ -1,5 +1,4 @@
from django.apps import AppConfig
from django.core.checks import Warning, Error, register
class AllianceAuthConfig(AppConfig):

View File

@@ -5,11 +5,11 @@
{% csrf_token %}
<select class="form-select" onchange="this.form.submit()" class="form-control" id="lang-select" name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% get_available_languages as LANGUAGES %}
{% for language in languages %}
<option lang="{{ language.code }}" value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local|capfirst }} ({{ language.code }})
{% for lang_code, lang_name in LANGUAGES %}
<option lang="{{ lang_code }}" value="{{ lang_code }}"{% if lang_code == LANGUAGE_CODE %} selected{% endif %}>
{{ lang_code|language_name_local|capfirst }} ({{ lang_code }})
</option>
{% endfor %}
</select>

View File

@@ -0,0 +1,3 @@
"""
Alliance Auth Crontab Utilities
"""

View File

@@ -0,0 +1,14 @@
"""
Crontab App Config
"""
from django.apps import AppConfig
class CrontabConfig(AppConfig):
"""
Crontab App Config
"""
name = "allianceauth.crontab"
label = "crontab"

View File

@@ -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"

View File

@@ -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)

View File

View File

@@ -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")

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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:

View File

@@ -13,6 +13,15 @@
}
}
/* Image overflow fix
------------------------------------------------------------------------------------- */
@media all {
img {
max-width: 100%;
height: auto;
}
}
/* Side Navigation
------------------------------------------------------------------------------------- */
@media all {

View File

@@ -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 %}
<span class="my-1 me-1 badge bg-secondary">{{group.name}}</span>
{% endfor %}

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 "재버"

View File

@@ -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"

View File

@@ -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 <ozirascal@gmail.com>, 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"

View File

@@ -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"

View File

@@ -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 <ozirascal@gmail.com>, 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"

View File

@@ -43,13 +43,14 @@ INSTALLED_APPS = [
'allianceauth.theme.flatly',
'allianceauth.theme.materia',
"allianceauth.custom_css",
'allianceauth.crontab',
]
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',
@@ -62,10 +63,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',
@@ -73,6 +76,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)

View File

@@ -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

View File

@@ -14,8 +14,10 @@ class ThemeHook:
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"):
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 `<html>` 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__}"

View File

@@ -4,7 +4,13 @@
{% include theme.js_template %}
{% else %}
{% for x in theme.js %}
<script src="{{ x.url }}" integrity="{{ x.integrity }}" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script
{% if x.js_type %}type="{{ x.js_type }}"{% endif %}
src="{{ x.url }}"
integrity="{{ x.integrity }}"
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
{% endfor %}
{% endif %}
<!-- allianceauth.theme.{{ theme.name }} JS Ends-->

View File

@@ -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.5.0
# Nginx Proxy Manager
PROXY_HTTP_PORT=80

View File

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

View File

@@ -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

0
docker/conf/redis_healthcheck.sh Normal file → Executable file
View File

View File

@@ -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
@@ -83,7 +84,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:

View File

@@ -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

View File

@@ -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 DEFAULT COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON alliance_auth.* TO 'aauth'@'%';
GRANT
SELECT,

View File

@@ -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
@@ -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()
```
@@ -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?
@@ -168,6 +170,94 @@ 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 <https://docs.celeryproject.org/en/stable/reference/celery.app.task.html#celery.app.task.Task.apply_async>`_ 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
### Apply Offset
`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
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 <https://docs.celeryq.dev/en/latest/userguide/calling.html#eta-and-countdown>
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.
<https://docs.celeryq.dev/en/latest/userguide/tasks.html#Task.rate_limit>
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 +282,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.

View File

@@ -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 DEFAULT COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON alliance_auth . * TO 'allianceserver'@'localhost';
```