Compare commits

..

4 Commits

Author SHA1 Message Date
Ariel Rin
7edb870028 Translate django.po in zh-Hans
69% of minimum 50% translated source file: 'django.po'
on 'zh-Hans'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-04-24 17:22:06 +00:00
Ariel Rin
b7ffe21c63 Translate django.po in zh-Hans
68% of minimum 50% translated source file: 'django.po'
on 'zh-Hans'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-04-24 16:11:34 +00:00
Ariel Rin
7ba29250bc Translate django.po in es
83% of minimum 50% translated source file: 'django.po'
on 'es'.

Sync of partially translated files: 
untranslated content is included with an empty translation 
or source language content depending on file format
2025-04-05 17:36:41 +00:00
Ariel Rin
1051e9298a Translate django.po in uk
100% translated source file: 'django.po'
on 'uk'.
2025-03-15 10:23:13 +00:00
97 changed files with 307 additions and 607 deletions

View File

@@ -1,15 +1,15 @@
# Alliance Auth
[![License](https://img.shields.io/badge/license-GPLv2-green)](https://pypi.org/project/allianceauth/)
[![Python Versions](https://img.shields.io/pypi/pyversions/allianceauth)](https://pypi.org/project/allianceauth/)
[![Django Versions](https://img.shields.io/pypi/djversions/allianceauth?label=django)](https://pypi.org/project/allianceauth/)
[![Stable AA 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)
[![license](https://img.shields.io/badge/license-GPLv2-green)](https://pypi.org/project/allianceauth/)
[![python](https://img.shields.io/pypi/pyversions/allianceauth)](https://pypi.org/project/allianceauth/)
[![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)](https://allianceauth.readthedocs.io/?badge=latest)
[![Test Coverage Report](https://gitlab.com/allianceauth/allianceauth/badges/master/coverage.svg)](https://gitlab.com/allianceauth/allianceauth/commits/master)
[![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)
A flexible authentication platform for EVE Online to help in-game organizations manage access to applications and services. AA provides both, a stable core, and a robust framework for community development and custom applications.
An auth system for EVE Online to help in-game organizations manage online service access.
## Content
@@ -22,17 +22,17 @@ A flexible authentication platform for EVE Online to help in-game organizations
## Overview
Alliance Auth (AA) is a platform that helps Eve Online organizations efficiently manage access to applications and services.
Alliance Auth (AA) is a web site that helps Eve Online organizations efficiently manage access to applications and services.
Main features:
- Automatically grants or revokes user access to external services (e.g.: Discord, Mumble) based on the user's current membership to [a variety of EVE Online affiliation](https://allianceauth.readthedocs.io/en/latest/features/core/states/) and [groups](https://allianceauth.readthedocs.io/en/latest/features/core/groups/)
- Automatically grants or revokes user access to external services (e.g. Discord, Mumble) and web apps (e.g. SRP requests) based on the user's current membership to [in-game organizations](https://allianceauth.readthedocs.io/en/latest/features/core/states/) and [groups](https://allianceauth.readthedocs.io/en/latest/features/core/groups/)
- Provides a central web site where users can directly access web apps (e.g. SRP requests, Fleet Schedule) and manage their access to external services and groups.
- Includes a set of connectors (called ["Services"](https://allianceauth.readthedocs.io/en/latest/features/services/)) for integrating access management with many popular external applications / services like Discord, Mumble, Teamspeak 3, SMF and others
- Includes a set of connectors (called ["services"](https://allianceauth.readthedocs.io/en/latest/features/services/)) for integrating access management with many popular external applications / services like Discord, Mumble, Teamspeak 3, SMF and others
- Includes a set of web [Apps](https://allianceauth.readthedocs.io/en/latest/features/apps/) which add many useful functions, e.g.: fleet schedule, timer board, SRP request management, fleet activity tracker
- Includes a set of web [apps](https://allianceauth.readthedocs.io/en/latest/features/apps/) which add many useful functions, e.g.: fleet schedule, timer board, SRP request management, fleet activity tracker
- Can be easily extended with additional services and apps. Many are provided by the community and can be found here: [Community Creations](https://gitlab.com/allianceauth/community-creations)
@@ -42,15 +42,9 @@ For further details about AA - including an installation guide and a full list o
## Screenshot
Here is an example of the Alliance Auth web site with a mixture of Services, Apps and Community Creations enabled:
Here is an example of the Alliance Auth web site with some plug-ins apps and services enabled:
### Flatly Theme
![Flatly Theme](docs/_static/images/promotion/SampleInstallation-Flatly.png)
### Darkly Theme
![Darkly Theme](docs/_static/images/promotion/SampleInstallation-Darkly.png)
![screenshot](https://i.imgur.com/2tnX9kD.png)
## Support

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

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class AnalyticsConfig(AppConfig):
name = 'allianceauth.analytics'
label = 'analytics'
verbose_name = _('Analytics')

View File

@@ -1,12 +1,10 @@
from django.apps import AppConfig
from django.core.checks import register, Tags
from django.utils.translation import gettext_lazy as _
class AuthenticationConfig(AppConfig):
name = "allianceauth.authentication"
label = "authentication"
verbose_name = _("Authentication")
def ready(self):
from allianceauth.authentication import checks, signals # noqa: F401

View File

@@ -1,5 +1,4 @@
import logging
from typing import ClassVar
from django.contrib.auth.models import User, Permission
from django.db import models, transaction
@@ -28,7 +27,7 @@ class State(models.Model):
help_text="Factions to whose members this state is available.")
public = models.BooleanField(default=False, help_text="Make this state available to any character.")
objects: ClassVar[StateManager] = StateManager()
objects = StateManager()
class Meta:
ordering = ['-priority']
@@ -138,10 +137,8 @@ class UserProfile(models.Model):
sender=self.__class__, user=self.user, state=self.state
)
def __str__(self) -> str:
def __str__(self):
return str(self.user)
class CharacterOwnership(models.Model):
class Meta:
default_permissions = ('change', 'delete')
@@ -151,7 +148,7 @@ class CharacterOwnership(models.Model):
owner_hash = models.CharField(max_length=28, unique=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='character_ownerships')
objects: ClassVar[CharacterOwnershipManager] = CharacterOwnershipManager()
objects = CharacterOwnershipManager()
def __str__(self):
return f"{self.user}: {self.character}"

View File

@@ -31,7 +31,7 @@
<tr>
<td style="white-space:initial;">
{% for s in t.scopes.all %}
<span class="badge text-bg-secondary">{{ s.name }}</span>
<span class="badge bg-secondary">{{ s.name }}</span>
{% endfor %}
</td>

View File

@@ -1,24 +1,24 @@
{% load theme_tags %}
{% load static %}
<!DOCTYPE html>
<html lang="en" {% theme_html_tags %}>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- End Required meta tags -->
<meta name="description" content="">
<meta name="author" content="">
<!-- TODO Bundle all the site specific stuff up into its own template for easy override -->
<meta property="og:title" content="{{ SITE_NAME }}">
<meta property="og:image" content="{{ SITE_URL }}{% static 'allianceauth/icons/apple-touch-icon.png' %}">
<meta property="og:description" content="Alliance Auth - An auth system for EVE Online to help in-game organizations manage online service access.">
<!-- Meta tags -->
{% include 'allianceauth/opengraph.html' %}
{% include 'allianceauth/icons.html' %}
<!-- Meta tags -->
<title>{% block title %}{% block page_title %}{% endblock page_title %} - {{ SITE_NAME }}{% endblock title %}</title>
{% theme_css %}
{% include 'bundles/fontawesome.html' %}
{% include 'bundles/auth-framework-css.html' %}
{% block extra_include %}
{% endblock %}

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class CorpUtilsConfig(AppConfig):
name = 'allianceauth.corputils'
label = 'corputils'
verbose_name = _('Corporation Stats')

View File

@@ -1,6 +1,5 @@
import logging
import os
from typing import ClassVar
from allianceauth.authentication.models import CharacterOwnership, UserProfile
from bravado.exception import HTTPForbidden
@@ -41,9 +40,9 @@ class CorpStats(models.Model):
verbose_name = "corp stats"
verbose_name_plural = "corp stats"
objects: ClassVar[CorpStatsManager] = CorpStatsManager()
objects = CorpStatsManager()
def __str__(self) -> str:
def __str__(self):
return f"{self.__class__.__name__} for {self.corp}"
def update(self):

View File

@@ -138,7 +138,7 @@
<td style="width: 30%;">{{ alt.corporation_name }}</td>
<td style="width: 30%;">{{ alt.alliance_name|default_if_none:"" }}</td>
<td style="width: 5%;">
<a href="https://zkillboard.com/character/{{ alt.character_id }}/" class="badge text-bg-danger" target="_blank">
<a href="https://zkillboard.com/character/{{ alt.character_id }}/" class="badge bg-danger" target="_blank">
{% translate "Killboard" %}
</a>
</td>
@@ -175,7 +175,7 @@
<td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member }}"></td>
<td>{{ member }}</td>
<td>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge text-bg-danger" target="_blank">{% translate "Killboard" %}</a>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a>
</td>
<td>{{ member.character_ownership.user.profile.main_character.character_name }}</td>
<td>{{ member.character_ownership.user.profile.main_character.corporation_name }}</td>
@@ -188,7 +188,7 @@
<td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member.character_name }}"></td>
<td>{{ member.character_name }}</td>
<td>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge text-bg-danger" target="_blank">{% translate "Killboard" %}</a>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a>
</td>
<td></td>
<td></td>
@@ -219,7 +219,7 @@
<td><img src="{{ member.portrait_url }}" class="img-circle" alt="{{ member.character_name }}"></td>
<td>{{ member.character_name }}</td>
<td>
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge text-bg-danger" target="_blank">
<a href="https://zkillboard.com/character/{{ member.character_id }}/" class="badge bg-danger" target="_blank">
{% translate "Killboard" %}
</a>
</td>

View File

@@ -28,7 +28,7 @@
<td><img src="{{ result.1.portrait_url }}" class="img-circle" alt="{{ result.1.character_name }}"></td>
<td>{{ result.1.character_name }}</td>
<td >{{ result.0.corp.corporation_name }}</td>
<td><a href="https://zkillboard.com/character/{{ result.1.character_id }}/" class="badge text-bg-danger" target="_blank">{% translate "Killboard" %}</a></td>
<td><a href="https://zkillboard.com/character/{{ result.1.character_id }}/" class="badge bg-danger" target="_blank">{% translate "Killboard" %}</a></td>
<td>{{ result.1.main_character.character_name }}</td>
<td>{{ result.1.main_character.corporation_name }}</td>
<td>{{ result.1.main_character.alliance_name }}</td>

View File

@@ -3,7 +3,6 @@ Crontab App Config
"""
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class CrontabConfig(AppConfig):
@@ -13,4 +12,3 @@ class CrontabConfig(AppConfig):
name = "allianceauth.crontab"
label = "crontab"
verbose_name = _("Crontab")

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class EveonlineConfig(AppConfig):
name = 'allianceauth.eveonline'
label = 'eveonline'
verbose_name = _('EVE Online')

View File

@@ -1,11 +1,9 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class EveAutogroupsConfig(AppConfig):
name = 'allianceauth.eveonline.autogroups'
label = 'eve_autogroups'
verbose_name = _('EVE Online Autogroups')
def ready(self):
import allianceauth.eveonline.autogroups.signals

View File

@@ -1,5 +1,4 @@
import logging
from typing import ClassVar
from django.db import models, transaction
from django.contrib.auth.models import Group, User
from django.core.exceptions import ObjectDoesNotExist
@@ -39,13 +38,13 @@ class AutogroupsConfigManager(models.Manager):
"""
if state is None:
state = user.profile.state
for config in self.filter(states=state):
# grant user new groups for their state
config.update_group_membership_for_user(user)
for config in self.exclude(states=state):
# ensure user does not have groups from previous state
config.remove_user_from_alliance_groups(user)
config.remove_user_from_corp_groups(user)
for config in self.filter(states=state):
# grant user new groups for their state
config.update_group_membership_for_user(user)
class AutogroupsConfig(models.Model):
@@ -79,7 +78,7 @@ class AutogroupsConfig(models.Model):
max_length=10, default='', blank=True,
help_text='Any spaces in the group name will be replaced with this.')
objects: ClassVar[AutogroupsConfigManager] = AutogroupsConfigManager()
objects = AutogroupsConfigManager()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

View File

@@ -1,4 +1,3 @@
from allianceauth.eveonline.models import EveCorporationInfo
from django.test import TestCase
from allianceauth.tests.auth_utils import AuthUtils
@@ -74,51 +73,3 @@ class AutogroupsConfigManagerTestCase(TestCase):
AutogroupsConfig.objects.update_groups_for_user(member)
self.assertTrue(update_groups.called)
def test_update_group_membership_corp_in_two_configs(self):
# given
member = AuthUtils.create_member('test member')
AuthUtils.add_main_character_2(
member,
character_id='1234',
name='test character',
corp_id='2345',
corp_name='corp name',
corp_ticker='TIKK',
)
corp = EveCorporationInfo.objects.create(
corporation_id='2345',
corporation_name='corp name',
corporation_ticker='TIKK',
member_count=10,
)
member_state = AuthUtils.get_member_state()
member_config = AutogroupsConfig.objects.create(corp_groups=True)
member_config.states.add(member_state)
blue_state = AuthUtils.get_blue_state()
blue_state.member_corporations.add(corp)
blue_config = AutogroupsConfig.objects.create(corp_groups=True)
blue_config.states.add(blue_state)
member.profile.state = blue_state
member.profile.save()
AutogroupsConfig.objects.update_groups_for_user(member)
# Checks before test that the role is correctly applied
group = blue_config.get_corp_group(corp)
self.assertIn(group, member.groups.all())
# when
blue_state.member_corporations.remove(corp)
member_state.member_corporations.add(corp)
member.profile.state = member_state
member.profile.save()
# then
AutogroupsConfig.objects.update_groups_for_user(member)
group = member_config.get_corp_group(corp)
self.assertIn(group, member.groups.all())

View File

@@ -14,10 +14,10 @@ class EveCharacterProviderManager:
class EveCharacterManager(models.Manager):
provider = EveCharacterProviderManager()
def create_character(self, character_id) -> models.Model:
def create_character(self, character_id):
return self.create_character_obj(self.provider.get_character(character_id))
def create_character_obj(self, character: providers.Character) -> models.Model:
def create_character_obj(self, character: providers.Character):
return self.create(
character_id=character.id,
character_name=character.name,

View File

@@ -1,5 +1,5 @@
import logging
from typing import ClassVar, Union
from typing import Union
from django.core.exceptions import ObjectDoesNotExist
from django.db import models
@@ -75,8 +75,8 @@ class EveAllianceInfo(models.Model):
alliance_ticker = models.CharField(max_length=254)
executor_corp_id = models.PositiveIntegerField()
objects: ClassVar[EveAllianceManager] = EveAllianceManager()
provider: ClassVar[EveAllianceProviderManager] = EveAllianceProviderManager()
objects = EveAllianceManager()
provider = EveAllianceProviderManager()
class Meta:
indexes = [models.Index(fields=['executor_corp_id',])]
@@ -147,7 +147,7 @@ class EveCorporationInfo(models.Model):
EveAllianceInfo, blank=True, null=True, on_delete=models.SET_NULL
)
objects: ClassVar[EveCorporationManager] = EveCorporationManager()
objects = EveCorporationManager()
provider = EveCorporationProviderManager()
class Meta:
@@ -214,7 +214,7 @@ class EveCharacter(models.Model):
faction_id = models.PositiveIntegerField(blank=True, null=True, default=None)
faction_name = models.CharField(max_length=254, blank=True, null=True, default='')
objects: ClassVar[EveCharacterManager] = EveCharacterManager()
objects = EveCharacterManager()
provider = EveCharacterProviderManager()
class Meta:

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class FatConfig(AppConfig):
name = 'allianceauth.fleetactivitytracking'
label = 'fleetactivitytracking'
verbose_name = _('Fleet Activity Tracking')

View File

@@ -36,7 +36,7 @@
<th class="text-center">{% translate "Character" %}</th>
<th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "Ship" %}</th>
<th class="text-center">{% translate "EVE time" %}</th>
<th class="text-center">{% translate "Eve Time" %}</th>
<th></th>
</tr>

View File

@@ -72,7 +72,7 @@
<tr>
<th class="text-center">{% translate "Fleet" %}</th>
<th class="text-center">{% translate "Creator" %}</th>
<th class="text-center">{% translate "EVE time" %}</th>
<th class="text-center">{% translate "Eve Time" %}</th>
<th class="text-center">{% translate "Duration" %}</th>
<th class="text-center">{% translate "Edit" %}</th>
</tr>
@@ -80,7 +80,7 @@
{% for link in created_fats %}
<tr>
<td class="text-center">
<a href="{% url 'fatlink:click' link.hash %}" class="badge text-bg-primary">
<a href="{% url 'fatlink:click' link.hash %}" class="badge bg-primary">
{{ link.fleet }}
</a>
</td>

View File

@@ -41,7 +41,7 @@
<th scope="col" class="text-center">{% translate "Character" %}</th>
<th scope="col" class="text-center">{% translate "System" %}</th>
<th scope="col" class="text-center">{% translate "Ship" %}</th>
<th scope="col" class="text-center">{% translate "EVE time" %}</th>
<th scope="col" class="text-center">{% translate "Eve Time" %}</th>
</tr>
{% for fat in fats %}
@@ -89,7 +89,7 @@
<th scope="col" class="text-center">{% translate "Name" %}</th>
<th scope="col" class="text-center">{% translate "Creator" %}</th>
<th scope="col" class="text-center">{% translate "Fleet" %}</th>
<th scope="col" class="text-center">{% translate "EVE time" %}</th>
<th scope="col" class="text-center">{% translate "Eve Time" %}</th>
<th scope="col" class="text-center">{% translate "Duration" %}</th>
<th scope="col" class="text-center">{% translate "Edit" %}</th>
</tr>
@@ -97,7 +97,7 @@
{% for link in fatlinks %}
<tr>
<td class="text-center">
<a href="{% url 'fatlink:click' link.hash %}" class="badge text-bg-primary">{{ link.fleet }}</a>
<a href="{% url 'fatlink:click' link.hash %}" class="badge bg-primary">{{ link.fleet }}</a>
</td>
<td class="text-center">{{ link.creator.username }}</td>
<td class="text-center">{{ link.fleet }}</td>

View File

@@ -3,7 +3,6 @@ Framework App Config
"""
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class FrameworkConfig(AppConfig):
@@ -13,4 +12,3 @@ class FrameworkConfig(AppConfig):
name = "allianceauth.framework"
label = "framework"
verbose_name = _("Framework")

View File

@@ -5,24 +5,6 @@
* to be used throughout Alliance Auth and its Community Apps
*/
/* General
------------------------------------------------------------------------------------- */
@media all {
.navbar-toggler.collapsed {
transform: rotate(180deg);
}
ul#nav-right:has(li) + ul#nav-right-character-control > li:first-child {
display: list-item !important;
}
}
@media all and (max-width: 991px) {
ul#nav-left:has(li) + ul#nav-right + ul#nav-right-character-control > li:first-child {
display: list-item !important;
}
}
/* Bootstrap fixes
------------------------------------------------------------------------------------- */
@media all {

View File

@@ -2,14 +2,12 @@
{# {% include "framework/header/page-header.html" with title="Foobar" subtitle="Barfoo" %}#}
{% if title %}
<header class="aa-page-header mb-3">
<h1 class="page-header text-center">
{{ title }}
<h1 class="page-header text-center mb-3">
{{ title }}
{% if subtitle %}
<br>
<small class="text-muted">{{ subtitle }}</small>
{% endif %}
</h1>
</header>
{% if subtitle %}
<br>
<small class="text-muted">{{ subtitle }}</small>
{% endif %}
</h1>
{% endif %}

View File

@@ -1,11 +1,10 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class GroupManagementConfig(AppConfig):
name = 'allianceauth.groupmanagement'
label = 'groupmanagement'
verbose_name = _('Group Management')
verbose_name = 'Group Management'
def ready(self):
from . import signals # noqa: F401

View File

@@ -39,12 +39,12 @@
<td>
{% if group.authgroup.hidden %}
<span class="badge text-bg-info">{% translate "Hidden" %}</span>
<span class="badge bg-info">{% translate "Hidden" %}</span>
{% endif %}
{% if group.authgroup.open %}
<span class="badge text-bg-success">{% translate "Open" %}</span>
<span class="badge bg-success">{% translate "Open" %}</span>
{% else %}
<span class="badge text-bg-secondary">{% translate "Requestable" %}</span>
<span class="badge bg-secondary">{% translate "Requestable" %}</span>
{% endif %}
</td>

View File

@@ -17,7 +17,7 @@
<li class="nav-item">
<a class="nav-link" href="{% url 'groupmanagement:management' %}">{% translate "Group Management" %}
{% if req_count %}
<span class="badge text-bg-secondary">{{ req_count }}</span>
<span class="badge bg-secondary">{{ req_count }}</span>
{% endif %}
</a>
</li>
@@ -33,8 +33,8 @@
<th>{% translate "Description" %}</th>
<th>
{% translate "Leaders" %}<br>
<span class="my-1 me-1 fw-lighter badge text-bg-primary">{% translate "User" %}</span>
<span class="my-1 me-1 fw-lighter badge text-bg-secondary">{% translate "Group" %}</span>
<span class="my-1 me-1 fw-lighter badge bg-primary">{% translate "User" %}</span>
<span class="my-1 me-1 fw-lighter badge bg-secondary">{% translate "Group" %}</span>
</th>
<th></th>
</tr>
@@ -53,13 +53,13 @@
{% if g.group.authgroup.group_leaders.all.count %}
{% for leader in g.group.authgroup.group_leaders.all %}
{% if leader.profile.main_character %}
<span class="my-1 me-1 badge text-bg-primary">{{leader.profile.main_character}}</span>
<span class="my-1 me-1 badge bg-primary">{{leader.profile.main_character}}</span>
{% endif %}
{% endfor %}
{% endif %}
{% 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 text-bg-secondary">{{group.name}}</span>
<span class="my-1 me-1 badge bg-secondary">{{group.name}}</span>
{% endfor %}
{% endif %}
</td>

View File

@@ -19,7 +19,7 @@
{% translate "Join Requests" %}
{% if acceptrequests %}
<span class="badge text-bg-secondary">{{ acceptrequests|length }}</span>
<span class="badge bg-secondary">{{ acceptrequests|length }}</span>
{% endif %}
</a>
</li>
@@ -30,7 +30,7 @@
{% translate "Leave Requests" %}
{% if leaverequests %}
<span class="badge text-bg-secondary">{{ leaverequests|length }}</span>
<span class="badge bg-secondary">{{ leaverequests|length }}</span>
{% endif %}
</a>
</li>

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class HRApplicationsConfig(AppConfig):
name = 'allianceauth.hrapplications'
label = 'hrapplications'
verbose_name = _('HR Applications')

View File

@@ -1,4 +1,3 @@
from typing import ClassVar
from django.contrib.auth.models import User
from django.db import models
from sortedm2m.fields import SortedManyToManyField
@@ -41,7 +40,7 @@ class Application(models.Model):
reviewer_character = models.ForeignKey(EveCharacter, on_delete=models.SET_NULL, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
objects: ClassVar[ApplicationManager] = ApplicationManager()
objects = ApplicationManager()
def __str__(self):
return str(self.user) + " Application To " + str(self.form)

View File

@@ -43,11 +43,11 @@
<td class="text-center">{{ personal_app.form.corp.corporation_name }}</td>
<td class="text-center">
{% if personal_app.approved == None %}
<div class="badge text-bg-warning">{% translate "Pending" %}</div>
<div class="badge bg-warning">{% translate "Pending" %}</div>
{% elif personal_app.approved == True %}
<div class="badge text-bg-success">{% translate "Approved" %}</div>
<div class="badge bg-success">{% translate "Approved" %}</div>
{% else %}
<div class="badge text-bg-danger">{% translate "Rejected" %}</div>
<div class="badge bg-danger">{% translate "Rejected" %}</div>
{% endif %}
</td>
<td class="text-center">
@@ -133,14 +133,14 @@
<td class="text-center">
{% if app.approved == None %}
{% if app.reviewer_str %}
<div class="badge text-bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div>
<div class="badge bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div>
{% else %}
<div class="badge text-bg-warning">{% translate "Pending" %}</div>
<div class="badge bg-warning">{% translate "Pending" %}</div>
{% endif %}
{% elif app.approved == True %}
<div class="badge text-bg-success">{% translate "Approved" %}</div>
<div class="badge bg-success">{% translate "Approved" %}</div>
{% else %}
<div class="badge text-bg-danger">{% translate "Rejected" %}</div>
<div class="badge bg-danger">{% translate "Rejected" %}</div>
{% endif %}
</td>
<td class="text-center">
@@ -177,14 +177,14 @@
<td class="text-center">
{% if app.approved == None %}
{% if app.reviewer_str %}
<div class="badge text-bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div>
<div class="badge bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div>
{% else %}
<div class="badge text-bg-warning">{% translate "Pending" %}</div>
<div class="badge bg-warning">{% translate "Pending" %}</div>
{% endif %}
{% elif app.approved == True %}
<div class="badge text-bg-success">{% translate "Approved" %}</div>
<div class="badge bg-success">{% translate "Approved" %}</div>
{% else %}
<div class="badge text-bg-danger">{% translate "Rejected" %}</div>
<div class="badge bg-danger">{% translate "Rejected" %}</div>
{% endif %}
</td>
<td class="text-center">

View File

@@ -43,11 +43,11 @@
<td>{{ app.form.corp }}</td>
<td class="text-center">
{% if app.approved == None %}
<div class="badge text-bg-warning">{% translate "Pending" %}</div>
<div class="badge bg-warning">{% translate "Pending" %}</div>
{% elif app.approved == True %}
<div class="badge text-bg-success">{% translate "Approved" %}</div>
<div class="badge bg-success">{% translate "Approved" %}</div>
{% else %}
<div class="badge text-bg-danger">{% translate "Rejected" %}</div>
<div class="badge bg-danger">{% translate "Rejected" %}</div>
{% endif %}
</td>
<td class="text-end">

View File

@@ -31,7 +31,7 @@
</div>
<div class="card mb-3">
<div class="card-header text-bg-info">
<div class="card-header bg-info">
<div class="card-title mb-0">{% translate "Applicant" %}</div>
</div>
@@ -50,7 +50,7 @@
</div>
<div class="card mb-3">
<div class="card-header text-bg-info">
<div class="card-header bg-info">
<div class="card-title mb-0">{% translate "Characters" %}</div>
</div>

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-24 16:55+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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,10 +18,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: allianceauth/analytics/apps.py:8
msgid "Analytics"
msgstr ""
#: allianceauth/analytics/models.py:22
msgid "Google Analytics Universal"
msgstr ""
@@ -30,10 +26,6 @@ msgstr ""
msgid "Google Analytics V4"
msgstr ""
#: allianceauth/authentication/apps.py:9
msgid "Authentication"
msgstr ""
#: allianceauth/authentication/constants.py:6
msgid ""
"This software has exceeded the error limit for ESI. If you are a user, "
@@ -43,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 ""
@@ -56,91 +48,91 @@ msgstr ""
msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
#: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:106
#: allianceauth/authentication/models.py:70
#: allianceauth/project_template/project_name/settings/base.py:105
msgid "English"
msgstr ""
#: allianceauth/authentication/models.py:73
#: allianceauth/authentication/models.py:71
msgid "Czech"
msgstr ""
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:108
#: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:107
msgid "German"
msgstr ""
#: allianceauth/authentication/models.py:75
#: allianceauth/project_template/project_name/settings/base.py:109
#: allianceauth/authentication/models.py:73
#: allianceauth/project_template/project_name/settings/base.py:108
msgid "Spanish"
msgstr ""
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:110
#: allianceauth/authentication/models.py:74
#: allianceauth/project_template/project_name/settings/base.py:109
msgid "Italian"
msgstr ""
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:111
#: allianceauth/authentication/models.py:75
#: allianceauth/project_template/project_name/settings/base.py:110
msgid "Japanese"
msgstr ""
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:112
#: allianceauth/authentication/models.py:76
#: allianceauth/project_template/project_name/settings/base.py:111
msgid "Korean"
msgstr ""
#: allianceauth/authentication/models.py:77
#: allianceauth/project_template/project_name/settings/base.py:112
msgid "French"
msgstr ""
#: allianceauth/authentication/models.py:78
#: allianceauth/project_template/project_name/settings/base.py:115
msgid "Russian"
msgstr ""
#: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:113
msgid "French"
msgstr ""
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:116
msgid "Russian"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:114
msgid "Dutch"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:115
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:114
msgid "Polish"
msgstr ""
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:117
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:116
msgid "Ukrainian"
msgstr ""
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:118
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:117
msgid "Simplified Chinese"
msgstr ""
#: allianceauth/authentication/models.py:100
#: allianceauth/authentication/models.py:98
#: allianceauth/menu/templates/menu/menu-user.html:42
msgid "Language"
msgstr ""
#: allianceauth/authentication/models.py:105
#: allianceauth/authentication/models.py:103
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr ""
#: allianceauth/authentication/models.py:109
#: allianceauth/authentication/models.py:107
#: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme"
msgstr ""
#: allianceauth/authentication/models.py:126
#: allianceauth/authentication/models.py:124
#, python-format
msgid "State changed to: %s"
msgstr ""
#: allianceauth/authentication/models.py:127
#: allianceauth/authentication/models.py:125
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr ""
@@ -275,53 +267,53 @@ 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 ""
#: allianceauth/corputils/apps.py:8 allianceauth/corputils/auth_hooks.py:12
#: allianceauth/corputils/auth_hooks.py:12
msgid "Corporation Stats"
msgstr ""
@@ -427,10 +419,6 @@ msgstr ""
msgid "Failed to gather corporation statistics with selected token."
msgstr ""
#: allianceauth/crontab/apps.py:16
msgid "Crontab"
msgstr ""
#: allianceauth/crontab/models.py:13
msgid "Minute Offset"
msgstr ""
@@ -464,15 +452,6 @@ msgstr ""
msgid "This CSS will be added to the site after the default CSS."
msgstr ""
#: allianceauth/eveonline/apps.py:8
msgid "EVE Online"
msgstr ""
#: allianceauth/eveonline/autogroups/apps.py:8
msgid "EVE Online Autogroups"
msgstr ""
#: allianceauth/fleetactivitytracking/apps.py:8
#: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkcreate.html:11
@@ -582,11 +561,9 @@ msgstr ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:75
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:44
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:92
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/templates/allianceauth/top-menu.html:23
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
#: allianceauth/timerboard/templates/timerboard/timertable.html:12
msgid "EVE time"
msgid "Eve Time"
msgstr ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:49
@@ -751,11 +728,6 @@ msgid ""
"character needs to be online."
msgstr ""
#: allianceauth/framework/apps.py:16
msgid "Framework"
msgstr ""
#: allianceauth/groupmanagement/apps.py:8
#: allianceauth/groupmanagement/auth_hooks.py:18
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:18
msgid "Group Management"
@@ -984,7 +956,7 @@ msgid "Hidden"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:45
#: allianceauth/templates/allianceauth/admin-status/overview.html:15
#: allianceauth/templates/allianceauth/admin-status/overview.html:16
msgid "Open"
msgstr ""
@@ -1037,7 +1009,7 @@ msgstr ""
#: 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:120
#: allianceauth/srp/templates/srp/data.html:117
#: allianceauth/srp/templates/srp/management.html:87
msgid "Pending"
msgstr ""
@@ -1179,10 +1151,6 @@ msgstr ""
msgid "Applied to leave group %(group)s."
msgstr ""
#: allianceauth/hrapplications/apps.py:8
msgid "HR Applications"
msgstr ""
#: allianceauth/hrapplications/auth_hooks.py:15
msgid "Applications"
msgstr ""
@@ -1254,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:112
#: allianceauth/srp/templates/srp/data.html:109
msgid "Approved"
msgstr ""
@@ -1262,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:116
#: allianceauth/srp/templates/srp/data.html:113
msgid "Rejected"
msgstr ""
@@ -1377,7 +1345,7 @@ msgstr ""
msgid "children"
msgstr ""
#: allianceauth/menu/admin.py:90 allianceauth/menu/models.py:22
#: allianceauth/menu/admin.py:90 allianceauth/menu/models.py:21
msgid "text"
msgstr ""
@@ -1389,15 +1357,11 @@ msgstr ""
msgid "visible"
msgstr ""
#: allianceauth/menu/apps.py:16
msgid "Menu"
msgstr ""
#: allianceauth/menu/constants.py:16
msgid "app"
msgstr ""
#: allianceauth/menu/constants.py:17 allianceauth/menu/models.py:38
#: allianceauth/menu/constants.py:17 allianceauth/menu/models.py:37
msgid "folder"
msgstr ""
@@ -1409,47 +1373,47 @@ msgstr ""
msgid "type"
msgstr ""
#: allianceauth/menu/models.py:23
#: allianceauth/menu/models.py:22
msgid "Text to show on menu"
msgstr ""
#: allianceauth/menu/models.py:28
#: allianceauth/menu/models.py:27
msgid "order"
msgstr ""
#: allianceauth/menu/models.py:29
#: allianceauth/menu/models.py:28
msgid "Order of the menu. Lowest First"
msgstr ""
#: allianceauth/menu/models.py:39
#: allianceauth/menu/models.py:38
msgid "Folder this item is in (optional)"
msgstr ""
#: allianceauth/menu/models.py:43
#: allianceauth/menu/models.py:42
msgid "is hidden"
msgstr ""
#: allianceauth/menu/models.py:45
#: allianceauth/menu/models.py:44
msgid ""
"Hide this menu item.If this item is a folder all items under it will be "
"hidden too"
msgstr ""
#: allianceauth/menu/models.py:60
#: allianceauth/menu/models.py:59
msgid "icon classes"
msgstr ""
#: allianceauth/menu/models.py:62
#: allianceauth/menu/models.py:61
msgid ""
"Font Awesome classes to show as icon on menu, e.g. <code>fa-solid fa-house</"
"code>"
msgstr ""
#: allianceauth/menu/models.py:68
#: allianceauth/menu/models.py:67
msgid "url"
msgstr ""
#: allianceauth/menu/models.py:69
#: allianceauth/menu/models.py:68
msgid "External URL this menu items will link to"
msgstr ""
@@ -1458,7 +1422,6 @@ msgid "Add folder"
msgstr ""
#: allianceauth/menu/templates/menu/menu-notification-block.html:12
#: allianceauth/notifications/apps.py:8
#: allianceauth/notifications/templates/notifications/list.html:7
#: allianceauth/notifications/templates/notifications/list.html:11
#: allianceauth/templates/allianceauth/notifications_menu_item.html:6
@@ -1484,19 +1447,19 @@ msgstr ""
msgid "Sign In"
msgstr ""
#: allianceauth/notifications/models.py:22
#: allianceauth/notifications/models.py:21
msgid "danger"
msgstr ""
#: allianceauth/notifications/models.py:23
#: allianceauth/notifications/models.py:22
msgid "warning"
msgstr ""
#: allianceauth/notifications/models.py:24
#: allianceauth/notifications/models.py:23
msgid "info"
msgstr ""
#: allianceauth/notifications/models.py:25
#: allianceauth/notifications/models.py:24
msgid "success"
msgstr ""
@@ -1553,7 +1516,7 @@ msgstr ""
msgid "Deleted all read notifications."
msgstr ""
#: allianceauth/optimer/apps.py:8 allianceauth/optimer/auth_hooks.py:12
#: allianceauth/optimer/auth_hooks.py:12
msgid "Fleet Operations"
msgstr ""
@@ -1627,6 +1590,11 @@ msgstr ""
msgid "Form Up System"
msgstr ""
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time"
msgstr ""
#: allianceauth/optimer/templates/optimer/fleetoptable.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:13
msgid "Local Time"
@@ -1642,7 +1610,7 @@ msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:28
#: allianceauth/timerboard/templates/timerboard/view.html:32
msgid "Current EVE time:"
msgid "Current Eve Time:"
msgstr ""
#: allianceauth/optimer/templates/optimer/management.html:36
@@ -1687,7 +1655,6 @@ msgstr ""
msgid "Saved changes to operation timer for %(opname)s."
msgstr ""
#: allianceauth/permissions_tool/apps.py:8
#: 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
@@ -1744,7 +1711,7 @@ msgstr ""
msgid "Successfully set your {self.service_name} password"
msgstr ""
#: allianceauth/services/apps.py:8 allianceauth/services/auth_hooks.py:12
#: allianceauth/services/auth_hooks.py:12
msgid "Services"
msgstr ""
@@ -1808,10 +1775,6 @@ msgstr ""
msgid "Password must be at least 8 characters long."
msgstr ""
#: allianceauth/services/modules/discord/apps.py:8
msgid "Discord Service"
msgstr ""
#: allianceauth/services/modules/discord/models.py:187
msgid "Discord Account Disabled"
msgstr ""
@@ -1860,10 +1823,6 @@ msgid ""
"again."
msgstr ""
#: allianceauth/services/modules/discourse/apps.py:8
msgid "Discourse Service"
msgstr ""
#: allianceauth/services/modules/discourse/templates/services/discourse/discourse_service_ctrl.html:5
msgid "Discourse"
msgstr ""
@@ -1894,14 +1853,6 @@ msgstr ""
msgid "Invalid payload. Please contact support if this problem persists."
msgstr ""
#: allianceauth/services/modules/example/apps.py:8
msgid "Example Service"
msgstr ""
#: allianceauth/services/modules/ips4/apps.py:8
msgid "IPS4 Service"
msgstr ""
#: allianceauth/services/modules/ips4/views.py:31
msgid "Activated IPSuite4 account."
msgstr ""
@@ -1925,10 +1876,6 @@ msgstr ""
msgid "Deactivated IPSuite4 account."
msgstr ""
#: allianceauth/services/modules/mumble/apps.py:8
msgid "Mumble Service"
msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:7
msgid "Mumble"
msgstr ""
@@ -1984,10 +1931,6 @@ msgstr ""
msgid "Mumble Connection History"
msgstr ""
#: allianceauth/services/modules/openfire/apps.py:8
msgid "Openfire Service"
msgstr ""
#: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber"
msgstr ""
@@ -2039,10 +1982,6 @@ msgstr ""
msgid "Set jabber password."
msgstr ""
#: allianceauth/services/modules/phpbb3/apps.py:8
msgid "phpBB3 Service"
msgstr ""
#: allianceauth/services/modules/phpbb3/views.py:34
msgid "Activated forum account."
msgstr ""
@@ -2066,10 +2005,6 @@ msgstr ""
msgid "Set forum password."
msgstr ""
#: allianceauth/services/modules/smf/apps.py:8
msgid "SMF Service"
msgstr ""
#: allianceauth/services/modules/smf/views.py:52
msgid "Activated SMF account."
msgstr ""
@@ -2093,10 +2028,6 @@ msgstr ""
msgid "Set SMF password."
msgstr ""
#: allianceauth/services/modules/teamspeak3/apps.py:8
msgid "TeamSpeak 3 Service"
msgstr ""
#: allianceauth/services/modules/teamspeak3/forms.py:14
#, python-format
msgid "Unable to locate user %s on server"
@@ -2146,10 +2077,6 @@ msgstr ""
msgid "Reset TeamSpeak3 permission key."
msgstr ""
#: allianceauth/services/modules/xenforo/apps.py:8
msgid "Xenforo Service"
msgstr ""
#: allianceauth/services/modules/xenforo/views.py:30
msgid "Activated XenForo account."
msgstr ""
@@ -2259,7 +2186,7 @@ msgid ""
"Some services provide different options. Hover over the buttons to see more."
msgstr ""
#: allianceauth/srp/apps.py:8 allianceauth/srp/auth_hooks.py:14
#: allianceauth/srp/auth_hooks.py:14
msgid "Ship Replacement"
msgstr ""
@@ -2334,18 +2261,18 @@ msgid "Mark Completed"
msgstr ""
#: allianceauth/srp/templates/srp/data.html:48
#: allianceauth/srp/templates/srp/data.html:142
#: allianceauth/srp/templates/srp/data.html:139
msgid "Total Losses:"
msgstr ""
#: allianceauth/srp/templates/srp/data.html:49
#: allianceauth/srp/templates/srp/data.html:143
#: 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:60
#: allianceauth/srp/templates/srp/data.html:154
#: allianceauth/srp/templates/srp/data.html:151
msgid "Are you sure you want to delete SRP requests?"
msgstr ""
@@ -2377,12 +2304,12 @@ msgstr ""
msgid "Post Time"
msgstr ""
#: allianceauth/srp/templates/srp/data.html:102
#: allianceauth/srp/templates/srp/data.html:99
#: allianceauth/srp/templates/srp/management.html:70
msgid "Link"
msgstr ""
#: allianceauth/srp/templates/srp/data.html:163
#: allianceauth/srp/templates/srp/data.html:160
msgid "No SRP requests for this fleet."
msgstr ""
@@ -2566,48 +2493,52 @@ msgstr ""
msgid "Alliance Auth Notifications"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:20
#: allianceauth/templates/allianceauth/admin-status/overview.html:18
msgid "Closed"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:29
#: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:35
#: allianceauth/templates/allianceauth/admin-status/overview.html:39
msgid "Support Discord"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:49
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
#: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Software Version"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:56
#: allianceauth/templates/allianceauth/admin-status/overview.html:60
msgid "Current"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:63
#: allianceauth/templates/allianceauth/admin-status/overview.html:67
msgid "Latest Stable"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:68
#: allianceauth/templates/allianceauth/admin-status/overview.html:72
msgid "Update available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:76
#: allianceauth/templates/allianceauth/admin-status/overview.html:80
msgid "Latest Pre-Release"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:81
#: allianceauth/templates/allianceauth/admin-status/overview.html:85
msgid "Pre-Release available"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:91
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
msgid "Task Queue"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:96
#: allianceauth/templates/allianceauth/admin-status/overview.html:100
#, python-format
msgid ""
"\n"
@@ -2616,11 +2547,11 @@ msgid ""
" "
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:112
#: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running"
msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:113
#: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued"
msgstr ""
@@ -2649,13 +2580,6 @@ msgstr ""
msgid "Select Theme"
msgstr ""
#: allianceauth/timerboard/apps.py:8
#: allianceauth/timerboard/templates/timerboard/form.html:10
#: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:10
#: allianceauth/timerboard/templates/timerboard/view.html:14
msgid "Structure Timers"
msgstr ""
#: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:8
@@ -2842,10 +2766,6 @@ msgstr ""
msgid "Abandoned"
msgstr ""
#: allianceauth/timerboard/models.py:60
msgid "Theft"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:54
msgid "Upcoming Timers"
@@ -2855,6 +2775,12 @@ msgstr ""
msgid "Timer"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/form.html:10
#: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:10
#: allianceauth/timerboard/templates/timerboard/view.html:14
msgid "Structure Timers"
msgstr ""
#: allianceauth/timerboard/templates/timerboard/form.html:25
msgid "Structure Timer Details"
msgstr ""

View File

@@ -1,7 +1,6 @@
import logging
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
logger = logging.getLogger(__name__)
@@ -13,7 +12,6 @@ logger = logging.getLogger(__name__)
class MenuConfig(AppConfig):
name = "allianceauth.menu"
label = "menu"
verbose_name = _("Menu")
def ready(self):
from allianceauth.menu.core import smart_sync

View File

@@ -1,4 +1,3 @@
from typing import ClassVar
from django.db import models
from django.utils.translation import gettext_lazy as _
@@ -69,7 +68,7 @@ class MenuItem(models.Model):
help_text=_("External URL this menu items will link to"),
)
objects: ClassVar[MenuItemManager] = MenuItemManager()
objects = MenuItemManager()
def __str__(self) -> str:
return self.text

View File

@@ -27,7 +27,7 @@
</a>
{% if item.count >= 1 %}
<span class="badge text-bg-primary m-2 align-self-center{% if not item.is_folder %} me-2{% endif %}">
<span class="badge bg-primary m-2 align-self-center{% if not item.is_folder %} me-2{% endif %}">
{{ item.count }}
</span>
{% elif item.url %}

View File

@@ -2,8 +2,8 @@
{% load navactive %}
{% load auth_notifications %}
<li class="nav-item" id="menu_item_notifications">
<a class="nav-link {% navactive request 'notifications:' %}" href="{% url 'notifications:list' %}">
<li class="nav-item {% navactive request 'notifications:' %}" id="menu_item_notifications">
<a class="nav-link" href="{% url 'notifications:list' %}">
{% with unread_count=request.user|user_unread_notification_count %}
<i class="fa-solid fa-bell{% if unread_count %} text-danger{% endif %}"></i>
{% endwith %}

View File

@@ -5,7 +5,7 @@
<div class="col-auto px-0">
<div class="collapse collapse-horizontal" tabindex="-1" id="sidebar">
<div>
<div class="nav-padding navbar-dark text-bg-dark px-0 d-flex flex-column overflow-hidden vh-100 {% if not user.is_authenticated %}position-relative{% endif %}">
<div class="nav-padding navbar-dark bg-dark text-light px-0 d-flex flex-column overflow-hidden vh-100 {% if not user.is_authenticated %}position-relative{% endif %}">
{% if user.is_authenticated %}
<ul id="sidebar-menu" class="navbar-nav flex-column mb-auto overflow-auto pt-2">
<li class="d-flex flex-wrap m-2 p-2 pt-0 pb-0 mt-0 mb-0 me-0 pe-0">

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class NotificationsConfig(AppConfig):
name = 'allianceauth.notifications'
label = 'notifications'
verbose_name = _('Notifications')

View File

@@ -1,5 +1,4 @@
import logging
from typing import ClassVar
from django.db import models
from django.contrib.auth.models import User
@@ -57,7 +56,7 @@ class Notification(models.Model):
timestamp = models.DateTimeField(auto_now_add=True, db_index=True)
viewed = models.BooleanField(default=False, db_index=True)
objects: ClassVar[NotificationManager] = NotificationManager()
objects = NotificationManager()
def __str__(self) -> str:
return f"{self.user}: {self.title}"

View File

@@ -15,14 +15,14 @@
<li class="nav-item">
<a class="nav-link active" id="unread-tab" data-bs-toggle="tab" data-bs-target="#unread" type="button" role="tab" aria-controls="unread" aria-selected="true">
{% translate "Unread" %}
<span class="badge text-bg-secondary">{{ unread|length }}</span>
<span class="badge bg-secondary">{{ unread|length }}</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" id="read-tab" data-bs-toggle="tab" data-bs-target="#read" type="button" role="tab" aria-controls="read" aria-selected="false">
{% translate "Read" %}
<span class="badge text-bg-secondary">{{ read|length }}</span>
<span class="badge bg-secondary">{{ read|length }}</span>
</a>
</li>
{% endblock %}

View File

@@ -17,7 +17,7 @@
</div>
<div class="card border-{{ notif.level }}">
<div class="card-header text-bg-{{ notif.level }}">
<div class="card-header bg-{{ notif.level }}">
{{ notif.timestamp }}
{{ notif.title }}
</div>

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class OptimerConfig(AppConfig):
name = 'allianceauth.optimer'
label = 'optimer'
verbose_name = _('Fleet Operations')

View File

@@ -14,7 +14,7 @@
<th class="text-center">{% translate "Operation" %}</th>
<th class="text-center">{% translate "Type" %}</th>
<th class="text-center">{% translate "Form Up System" %}</th>
<th class="text-center">{% translate "EVE time" %}</th>
<th class="text-center">{% translate "EVE Time" %}</th>
</tr>
</thead>

View File

@@ -24,8 +24,8 @@
{% block content %}
<div>
<div class="text-center mb-3">
<div class="badge text-bg-primary text-start">
<b>{% translate "Current EVE time:" %}</b>
<div class="badge bg-primary text-start">
<b>{% translate "Current Eve Time:" %}</b>
<span id="current-time"></span>
</div>
</div>
@@ -127,8 +127,8 @@
};
/**
* Get the current EVE time as a string
* @returns {string} EVE time string
* Get the current Eve time as a string
* @returns {string} Eve time string
*/
const updateClock = () => {
document.getElementById("current-time").innerHTML = getCurrentEveTimeString();

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class PermissionsToolConfig(AppConfig):
name = 'allianceauth.permissions_tool'
label = 'permissions_tool'
verbose_name = _('Permissions Audit')

View File

@@ -61,7 +61,6 @@ CELERYBEAT_SCHEDULE = {
'esi_cleanup_token': {
'task': 'esi.tasks.cleanup_token',
'schedule': crontab(minute='0', hour='0'),
'apply_offset': True,
},
'run_model_update': {
'task': 'allianceauth.eveonline.tasks.run_model_update',

View File

@@ -1,48 +1,49 @@
[program:beat]
command = {{ celery }} -A {{ project_name }} beat
directory = {{ project_directory }}
user = allianceserver
stdout_logfile = {{ project_directory }}/log/%(program_name)s.log
stderr_logfile = {{ project_directory }}/log/%(program_name)s.log
autostart = true
autorestart = true
startsecs = 10
priority = 998
command={{ celery }} -A {{ project_name }} beat
directory={{ project_directory }}
user=allianceserver
stdout_logfile={{ project_directory }}/log/beat.log
stderr_logfile={{ project_directory }}/log/beat.log
autostart=true
autorestart=true
startsecs=10
priority=998
[program:worker]
command = {{ celery }} -A {{ project_name }} worker --pool=threads --concurrency=5 -n %(program_name)s_%(process_num)02d
directory = {{ project_directory }}
user = allianceserver
numprocs = 1
process_name = %(program_name)s_%(process_num)02d
stdout_logfile = {{ project_directory }}/log/%(program_name)s.log
stderr_logfile = {{ project_directory }}/log/%(program_name)s.log
autostart = true
autorestart = true
startsecs = 10
command={{ celery }} -A {{ project_name }} worker --pool=threads --concurrency=5 -n %(program_name)s_%(process_num)02d
directory={{ project_directory }}
user=allianceserver
numprocs=1
process_name=%(program_name)s_%(process_num)02d
stdout_logfile={{ project_directory }}/log/worker.log
stderr_logfile={{ project_directory }}/log/worker.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
killasgroup = true
priority = 998
killasgroup=true
priority=998
{% if gunicorn %}
[program:gunicorn]
user = allianceserver
directory = {{ project_directory }}
command = {{ gunicorn }} {{ project_name }}.wsgi --workers=3 --timeout 120
stdout_logfile = {{ project_directory }}/log/%(program_name)s.log
stderr_logfile = {{ project_directory }}/log/%(program_name)s.log
autostart = true
autorestart = true
stopsignal = INT
directory={{ project_directory }}
command={{ gunicorn }} {{ project_name }}.wsgi --workers=3 --timeout 120
stdout_logfile={{ project_directory }}/log/gunicorn.log
stderr_logfile={{ project_directory }}/log/gunicorn.log
autostart=true
autorestart=true
stopsignal=INT
{% endif %}
[eventlistener:memmon]
command = {{ memmon }} -p worker_00=256MB -p gunicorn=256MB
directory = {{ project_directory }}
events = TICK_60
stdout_logfile = {{ project_directory }}/log/memmon.log
stderr_logfile = {{ project_directory }}/log/memmon.log
command={{ memmon }} -p worker_00=256MB -p gunicorn=256MB
directory={{ project_directory }}
events=TICK_60
stdout_logfile={{ project_directory }}/log/memmon.log
stderr_logfile={{ project_directory }}/log/memmon.log
[group:{{ project_name }}]
programs = beat,worker{% if gunicorn %},gunicorn{% endif %}
priority = 999
programs=beat,worker{% if gunicorn %},gunicorn{% endif %}
priority=999

View File

@@ -1,11 +1,9 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class ServicesConfig(AppConfig):
name = 'allianceauth.services'
label = 'services'
verbose_name = _('Services')
def ready(self):
from . import signals

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class DiscordServiceConfig(AppConfig):
name = 'allianceauth.services.modules.discord'
label = 'discord'
verbose_name = _('Discord Service')

View File

@@ -1,5 +1,5 @@
import logging
from typing import ClassVar, Optional
from typing import Optional
from requests.exceptions import HTTPError
@@ -59,7 +59,7 @@ class DiscordUser(models.Model):
help_text='Date & time this service account was activated'
)
objects: ClassVar[DiscordUserManager] = DiscordUserManager()
objects = DiscordUserManager()
class Meta:
permissions = (

View File

@@ -439,7 +439,6 @@ class TestUserHasAccount(NoSocketsTestCase):
def test_return_false_if_user_does_not_exist(self):
my_user = User(username='Dummy')
my_user.save()
self.assertFalse(DiscordUser.objects.user_has_account(my_user))
def test_return_false_if_not_called_with_user_object(self):

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class DiscourseServiceConfig(AppConfig):
name = 'allianceauth.services.modules.discourse'
label = 'discourse'
verbose_name = _('Discourse Service')

View File

@@ -14,7 +14,7 @@
{% endblock %}
{% block active %}
<span class="badge text-bg-success">
<span class="badge bg-success">
{% translate "SSO login active" %}
</span>
{% endblock %}

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class ExampleServiceConfig(AppConfig):
name = 'allianceauth.services.modules.example'
label = 'example_service'
verbose_name = _('Example Service')

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class Ips4ServiceConfig(AppConfig):
name = 'allianceauth.services.modules.ips4'
label = 'ips4'
verbose_name = _('IPS4 Service')

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class MumbleServiceConfig(AppConfig):
name = 'allianceauth.services.modules.mumble'
label = 'mumble'
verbose_name = _('Mumble Service')

View File

@@ -1,6 +1,5 @@
import random
import string
from typing import ClassVar
from passlib.hash import bcrypt_sha256
from django.db import models
@@ -117,7 +116,7 @@ class MumbleUser(AbstractServiceModel):
help_text="Timestamp of the users Last Disconnection to Mumble"
)
objects: ClassVar[MumbleManager] = MumbleManager()
objects = MumbleManager()
def __str__(self):
return self.username

View File

@@ -48,9 +48,9 @@
</a>
{% endif %}
{% endif %}
{% if perms.mumble.view_connection_history %}
<a class="btn btn-primary" type="button" id="btnMumbleConnectionHistory" href="{% url 'mumble:connection_history' %}" title="{% translate 'Mumble Connection History' %}">
<i class="fa-solid fa-clock-rotate-left"></i> History
</a>
{% endif %}
{% if request.user.is_superuser %}
<a class="btn btn-primary" type="button" id="btnMumbleConnectionHistory" href="{% url 'mumble:connection_history' %}" title="{% translate 'Mumble Connection History' %}">
<i class="fa-solid fa-clock-rotate-left"></i> History
</a>
{% endif %}
{% endblock %}

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class OpenfireServiceConfig(AppConfig):
name = 'allianceauth.services.modules.openfire'
label = 'openfire'
verbose_name = _('Openfire Service')

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class Phpbb3ServiceConfig(AppConfig):
name = 'allianceauth.services.modules.phpbb3'
label = 'phpbb3'
verbose_name = _('phpBB3 Service')

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class SmfServiceConfig(AppConfig):
name = 'allianceauth.services.modules.smf'
label = 'smf'
verbose_name = _('SMF Service')

View File

@@ -1,11 +1,9 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class Teamspeak3ServiceConfig(AppConfig):
name = 'allianceauth.services.modules.teamspeak3'
label = 'teamspeak3'
verbose_name = _('TeamSpeak 3 Service')
def ready(self):
from . import signals

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class XenforoServiceConfig(AppConfig):
name = 'allianceauth.services.modules.xenforo'
label = 'xenforo'
verbose_name = _('Xenforo Service')

View File

@@ -1,6 +1,6 @@
{% load i18n %}
<div class="card text-center mx-2 mb-3" style="min-width: 18rem; min-height: 18rem;">
<div class="card text-center m-2" style="min-width: 18rem; min-height: 18rem;">
<div class="card-body">
<h5 class="card-title">{% block title %}{% endblock title %}</h5>

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class SRPConfig(AppConfig):
name = 'allianceauth.srp'
label = 'srp'
verbose_name = _('Ship Replacement')

View File

@@ -92,14 +92,11 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
{{ srpfleetrequest.character.alliance.alliance_ticker }}
{% endif %}
[{{ srpfleetrequest.character.corporation.corporation_ticker }}]
{{ srpfleetrequest.character.character_name }}&nbsp;
<sup>
<i class="copy-text-fa-icon far fa-copy" data-clipboard-text="{{ srpfleetrequest.character.character_name }}"></i>
</sup>
{{ srpfleetrequest.character.character_name }}&nbsp;<i class="copy-text-fa-icon far fa-copy" data-clipboard-text="{{ srpfleetrequest.character.character_name }}"></i>
</td>
<td>
<a href="{{ srpfleetrequest.killboard_link }}"
target="_blank" class="badge text-bg-warning">{% translate "Link" %}</a>
target="_blank" class="badge bg-warning">{% translate "Link" %}</a>
</td>
<td>{{ srpfleetrequest.additional_info }}</td>
<td>{{ srpfleetrequest.srp_ship_name }}</td>
@@ -108,15 +105,15 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
<td data-sort="{{ srpfleetrequest.post_time | date:"Y-m-d H:i" }}">{{ srpfleetrequest.post_time | date:"Y-M-d H:i" }}</td>
<td>
{% if srpfleetrequest.srp_status == "Approved" %}
<div class="badge text-bg-success">
<div class="badge bg-success">
{% translate "Approved" %}
</div>
{% elif srpfleetrequest.srp_status == "Rejected" %}
<div class="badge text-bg-danger">
<div class="badge bg-danger">
{% translate "Rejected" %}
</div>
{% else %}
<div class="badge text-bg-warning">
<div class="badge bg-warning">
{% translate "Pending" %}
</div>
{% endif %}
@@ -242,19 +239,13 @@ ESC to cancel{% endblocktranslate %}" id="blah"></i></th>
}
});
// Non-Orderable columns
const nonOrderableTargets = [1];
{% if perms.auth.srp_management %}
nonOrderableTargets.push(8);
{% endif %}
elementTableSrpList.DataTable({
language: {url: '{{ DT_LANG_PATH }}'},
"order": [[ 6, "asc" ]],
"paging": false,
"columnDefs": [
{
"targets": nonOrderableTargets,
"targets": [1, 8],
"orderable": false
},
{

View File

@@ -61,20 +61,20 @@
<td>{{ srpfleet.fleet_time | date:"Y-m-d H:i" }}</td>
<td>{{ srpfleet.fleet_doctrine }}</td>
<td>
<div class="badge text-bg-success">
<div class="badge bg-success">
{{ srpfleet.fleet_commander.character_name }}
</div>
</td>
<td>
{% if srpfleet.fleet_srp_aar_link %}
<a href="{{ srpfleet.fleet_srp_aar_link }}" target="_blank" class="badge text-bg-primary">{% translate "Link" %}</a>
<a href="{{ srpfleet.fleet_srp_aar_link }}" target="_blank" class="badge bg-primary">{% translate "Link" %}</a>
{% endif %}
</td>
<td>
{% if srpfleet.fleet_srp_code %}
<a class="badge text-bg-warning" href="{% url 'srp:request' srpfleet.fleet_srp_code %}">{{ srpfleet.fleet_srp_code }}</a>
<a class="badge bg-warning" href="{% url 'srp:request' srpfleet.fleet_srp_code %}">{{ srpfleet.fleet_srp_code }}</a>
{% else %}
<div class="badge text-bg-danger">
<div class="badge bg-danger">
{% translate "Disabled" %}
</div>
{% endif %}
@@ -83,17 +83,17 @@
<td>
{% if srpfleet.fleet_srp_status == "" %}
<div class="badge text-bg-warning">
<div class="badge bg-warning">
{% translate "Pending" %}
</div>
{% else %}
<div class="badge text-bg-success">
<div class="badge bg-success">
{% translate "Completed" %}
</div>
{% endif %}
</td>
<td>
<div class="badge text-bg-warning">{{ srpfleet.pending_requests }}</div>
<div class="badge bg-warning">{{ srpfleet.pending_requests }}</div>
</td>
<td class="text-end text-nowrap">
<a href="{% url 'srp:fleet' srpfleet.id %}" class="btn btn-primary btn-sm m-1" title="View">

View File

@@ -172,7 +172,7 @@ ul.list-group.list-group-horizontal > li.list-group-item {
}
}
/* EVE time in navbar
/* eve time in navbar
------------------------------------------------------------------------------------- */
@media all {
.nav-item-eve-time .eve-time-wrapper {

View File

@@ -14,7 +14,7 @@ $(document).ready(() => {
};
/**
* Start the EVE time clock in the top menu bar
* Start the Eve time clock in the top menu bar
*/
setInterval(() => {
renderClock($('.eve-time-wrapper .eve-time-clock'));

View File

@@ -28,7 +28,7 @@ const getDurationString = (duration) => { // eslint-disable-line no-unused-vars
};
/**
* returns the current EVE time as a formatted string
* returns the current eve time as a formatted string
*
* condition:
* only if moment.js is loaded before,

View File

@@ -2,7 +2,7 @@
{% load admin_status %}
<div
class="progress-bar text-bg-{{ level }} task-status-progress-bar"
class="progress-bar bg-{{ level }} task-status-progress-bar"
role="progressbar"
aria-valuenow="{% decimal_widthratio tasks_count tasks_total 100 %}"
aria-valuemin="0"

View File

@@ -12,7 +12,11 @@
<ul class="list-group">
{% for notif in notifications %}
<li class="list-group-item">
<span class="badge text-bg-success me-2">{% translate "Open" %}</span>
{% if notif.state == 'opened' %}
<span class="badge bg-success me-2">{% translate "Open" %}</span>
{% else %}
<span class="badge bg-danger me-2">{% translate "Closed" %}</span>
{% endif %}
<a href="{{ notif.web_url }}" target="_blank">#{{ notif.iid }} {{ notif.title }}</a>
</li>
{% empty %}
@@ -24,13 +28,13 @@
<div class="text-end pt-3">
<a href="https://gitlab.com/allianceauth/allianceauth/issues" target="_blank" class="me-1 text-decoration-none">
<span class="badge text-bg-danger">
<span class="badge" style="background-color: rgb(230 83 40);">
<i class="fab fa-gitlab" aria-hidden="true"></i>
{% translate 'Powered by GitLab' %}
</span>
</a>
<a href="https://discord.com/invite/fjnHAmk" target="_blank" class="text-decoration-none">
<span class="badge text-bg-info">
<span class="badge" style="background-color: rgb(110 133 211);">
<i class="fab fa-discord" aria-hidden="true"></i>
{% translate 'Support Discord' %}
</span>
@@ -58,7 +62,7 @@
</div>
</li>
<li class="list-group-item text-bg-{% if latest_patch %}success{% elif latest_minor %}warning{% else %}danger{% endif %} w-100">
<li class="list-group-item bg-{% if latest_patch %}success{% elif latest_minor %}warning{% else %}danger{% endif %} w-100">
<a class="btn h-100 w-100" href="https://gitlab.com/allianceauth/allianceauth/-/releases/v{{ latest_patch_version }}">
<h5 class="list-group-item-heading">{% translate "Latest Stable" %}</h5>
@@ -71,7 +75,7 @@
</li>
{% if latest_beta %}
<li class="list-group-item text-bg-info w-100">
<li class="list-group-item bg-info w-100">
<a class="btn h-100 w-100" href="https://gitlab.com/allianceauth/allianceauth/-/releases/v{{ latest_beta_version }}">
<h5 class="list-group-item-heading">{% translate "Latest Pre-Release" %}</h5>

View File

@@ -12,10 +12,11 @@
<!-- End Required meta tags -->
<!-- Meta tags -->
{% include 'allianceauth/opengraph.html' %}
<!-- TODO Bundle all the site specific stuff up into its own template for easy override -->
<meta name="description" content="">
<meta name="author" content="">
{% include 'allianceauth/icons.html' %}
<!-- Meta tags -->
<title>{% block title %}{% block page_title %}{% endblock page_title %} - {{ SITE_NAME }}{% endblock title %}</title>
{% theme_css %}
@@ -24,11 +25,12 @@
{% include 'bundles/auth-framework-css.html' %}
<style>
@media all {
.nav-padding {
margin-top: {% header_padding_size %} !important;
max-height: calc(100vh - {% header_padding_size %}) !important;
}
.navbar-toggler.collapsed{
transform: rotate(180deg);
}
.nav-padding {
padding-top: {% header_padding_size %} !important;
}
</style>
@@ -39,7 +41,7 @@
<body>
<!-- Top Menu, Blocks don't work in "include" tagged views -->
<nav class="navbar navbar-expand-lg navbar-dark fixed-top text-bg-primary">
<nav class="navbar navbar-expand-lg navbar-dark fixed-top bg-primary">
<div class="container-fluid justify-content-start">
<a class="navbar-brand" data-bs-toggle="collapse" data-bs-target="#sidebar" role="button">
<i class="fa-solid fa-bars ms-2 me-2"></i>
@@ -61,11 +63,6 @@
</ul>
<ul id="nav-right-character-control" class="nav navbar-nav">
<li class="nav-item ms-lg-2 py-2 py-lg-1 col-12 col-lg-auto d-none">
<div class="vr d-none d-lg-flex h-100 mx-2 text-white-50"></div>
<hr class="d-lg-none my-2 text-body text-white-50">
</li>
{% block header_nav_user_character_control %} <!-- Default to add char and swap main -->
{% include 'allianceauth/top-menu-rh-default.html' %}
{% endblock %}

View File

@@ -1,8 +0,0 @@
{% load static %}
<meta property="og:title" content="{{ SITE_NAME }}">
<meta property="og:image" content="{{ SITE_URL }}{% static 'allianceauth/icons/apple-touch-icon.png' %}">
<meta property="og:description" content="Alliance Auth - An auth system for EVE Online to help in-game organizations manage online service access.">
<meta property="og:type" content="website">
<meta property="og:site_name" content="{{ request.META.HTTP_HOST }}">
<meta property="og:url" content="{{ request.path }}">

View File

@@ -2,7 +2,7 @@
{% if user.is_authenticated %}
<li class="nav-item">
<a href="{% url 'authentication:add_character' %}" class="nav-link" title="{% translate 'Add Character' %}">
<i class="fa-solid fa-user-plus"></i>
<i class="fa-solid fa-plus"></i>
<span class="d-lg-none d-md-inline m-2">{% translate "Add Character" %}</span>
</a>
</li>

View File

@@ -20,7 +20,7 @@
<div class="collapse navbar-collapse auth-menus-collapse">
<ul class="nav navbar-nav navbar-right navbar-pills">
<li class="nav-item-eve-time">
<div class="eve-time-wrapper">{% translate "EVE time" %}: <span class="eve-time-clock"></span></div>
<div class="eve-time-wrapper">{% translate "Eve Time" %}: <span class="eve-time-clock"></span></div>
</li>
{% if user.is_authenticated %}

View File

@@ -1,3 +1,3 @@
{% load static %}
<img src="{% static 'allianceauth/images/auth-logo.svg' %}" width="{{ logo_width|default:"128px" }}" height="{% if logo_height %}{{ logo_height }}{% else %}{{ logo_width|default:"128px" }}{% endif %}" alt="{{ SITE_NAME }}">
<img src="{% static 'allianceauth/images/auth-logo.svg' %}" width="{{ logo_width|default:"128px" }}" height="{% if logo_height %}{{ logo_ }}{% else %}{{ logo_width|default:"128px" }}{% endif %}" alt="{{ SITE_NAME }}">

View File

@@ -67,26 +67,6 @@ def get_datatables_language_static(language: str) -> str:
return static_url
@register.simple_tag
def get_relative_datatables_language_path(language: str) -> str:
"""
Get the correct language code URL for DataTables (relative path to the static folder)
:param language: Django's language code
:type language: str
:return: Mapped language code
:rtype: str
"""
mapped_language = get_datatable_language_code(language)
static_url = (
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:
@@ -108,24 +88,3 @@ def get_momentjs_language_static(language: str) -> str:
)
return static_url
@register.simple_tag
def get_relative_momentjs_language_path(language: str) -> str:
"""
Get the correct language code URL for Moment.JS (relative path to the static folder)
:param language: Django's language code
:type language: str
:return: Mapped language code path
:rtype: str
"""
mapped_language = get_momentjs_language_code(language)
static_url = (
f"allianceauth/libs/moment.js/2.29.4/locale/{mapped_language}.js"
if mapped_language
else ""
)
return static_url

View File

@@ -78,13 +78,6 @@ class AuthUtils:
except State.DoesNotExist:
return cls.create_state('Member', 100, disconnect_signals=True)
@classmethod
def get_blue_state(cls):
try:
return State.objects.get(name='Blue')
except State.DoesNotExist:
return cls.create_state('Blue', 50, disconnect_signals=True)
@classmethod
def get_guest_state(cls):
cls.disconnect_signals()

View File

@@ -1,8 +1,6 @@
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class TimerBoardConfig(AppConfig):
name = 'allianceauth.timerboard'
label = 'timerboard'
verbose_name = _('Structure Timers')

View File

@@ -66,7 +66,7 @@ class TimerForm(forms.ModelForm):
future_time = datetime.timedelta(days=days_left, hours=hours_left, minutes=minutes_left)
current_time = timezone.now()
eve_time = current_time + future_time
logger.debug(f"Determined timer EVE time is {eve_time} - current time {current_time}, adding {future_time}")
logger.debug(f"Determined timer eve time is {eve_time} - current time {current_time}, adding {future_time}")
elif absolute_time:
# Use absolute time
eve_time = absolute_time

View File

@@ -1,18 +0,0 @@
# Generated by Django 4.2.16 on 2025-03-26 20:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('timerboard', '0007_alter_timer_structure'),
]
operations = [
migrations.AlterField(
model_name='timer',
name='timer_type',
field=models.CharField(choices=[('UNSPECIFIED', 'Not Specified'), ('SHIELD', 'Shield'), ('ARMOR', 'Armor'), ('HULL', 'Hull'), ('FINAL', 'Final'), ('ANCHORING', 'Anchoring'), ('UNANCHORING', 'Unanchoring'), ('ABANDONED', 'Abandoned'), ('THEFT', 'Theft')], default='UNSPECIFIED', max_length=254),
),
]

View File

@@ -57,7 +57,6 @@ class Timer(models.Model):
ANCHORING = "ANCHORING", _("Anchoring")
UNANCHORING = "UNANCHORING", _("Unanchoring")
ABANDONED = "ABANDONED", _("Abandoned")
THEFT = "THEFT", _("Theft")
details = models.CharField(max_length=254, default="")
system = models.CharField(max_length=254, default="")

View File

@@ -15,7 +15,7 @@
<th class="text-center">{% translate "Timer" %}</th>
<th class="text-center">{% translate "Type" %}</th>
<th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "EVE time" %}</th>
<th class="text-center">{% translate "EVE Time" %}</th>
</tr>
</thead>
@@ -30,17 +30,17 @@
</td>
<td class="text-center" nowrap>
{% if timer.objective == "Hostile" %}
<div class="badge text-bg-danger">
<div class="badge bg-danger">
{% translate "Hostile" %}
</div>
{% endif %}
{% if timer.objective == "Friendly" %}
<div class="badge text-bg-primary">
<div class="badge bg-primary">
{% translate "Friendly" %}
</div>
{% endif %}
{% if timer.objective == "Neutral" %}
<div class="badge text-bg-secondary">
<div class="badge bg-secondary">
{% translate "Neutral" %}
</div>
{% endif %}

View File

@@ -9,7 +9,7 @@
<th class="text-center">{% translate "Objective" %}</th>
<th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "Structure" %}</th>
<th class="text-center">{% translate "EVE time" %}</th>
<th class="text-center">{% translate "Eve Time" %}</th>
<th class="text-center">{% translate "Local Time" %}</th>
<th class="text-center">{% translate "Creator" %}</th>
@@ -21,7 +21,7 @@
<tbody>
{% for timer in timers %}
<tr class="{% if timer.important == True %}text-bg-danger bg-opacity-50{% else %}text-bg-info bg-opacity-50{% endif %}">
<tr class="{% if timer.important == True %}bg-danger bg-opacity-25{% else %}bg-info bg-opacity-25{% endif %}">
<td style="width: 150px;" class="text-center">
{{ timer.details }}
@@ -34,15 +34,15 @@
<td class="text-center">
{% comment %} Objective: Hostile (BG: Danger) {% endcomment %}
{% if timer.objective == "Hostile" %}
<div class="badge text-bg-danger">
<div class="badge bg-danger">
{% comment %} Objective: Friendly (BG: Primare) {% endcomment %}
{% elif timer.objective == "Friendly" %}
<div class="badge text-bg-primary">
<div class="badge bg-primary">
{% comment %} Objective: Neutral (BG: Secondary) {% endcomment %}
{% elif timer.objective == "Neutral" %}
<div class="badge text-bg-secondary">
<div class="badge bg-secondary">
{% endif %}
{{ timer.get_objective_display }}
@@ -54,7 +54,7 @@
</td>
<td class="text-center">
<div class="badge text-bg-{{ timer.bg_modifier }}">
<div class="badge bg-{{ timer.bg_modifier }}">
{{ timer.get_structure_display }}
</div>
</td>

View File

@@ -28,8 +28,8 @@
{% block content %}
<div class="allianceauth-timerboard">
<div class="col-lg-12 text-center mb-3">
<div class="badge text-bg-primary text-start">
<span>{% translate "Current EVE time:" %}</span>
<div class="badge bg-primary text-start">
<span>{% translate "Current Eve Time:" %}</span>
<span id="current-time"></span>
</div>
</div>

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

View File

@@ -81,7 +81,7 @@ Example implementation for a celery chain:
```python
from allianceauth.services.hooks import get_extension_logger
from celery import shared_task, group
from celery import shared_task, chain
logger = get_extension_logger(__name__)
@@ -98,23 +98,18 @@ def long_runner():
task_signature = example.si()
my_tasks.append(task_signature)
group(my_tasks).delay()
chain(my_tasks).delay()
```
In this example, we first add 10 example tasks that need to run one after the other to a list. This can be done by creating a so-called signature for a task. Those signatures are a kind of wrapper for tasks and can be used in various ways to compose work flow for tasks.
The list of task signatures is then converted to a chain and started asynchronously.
:::{note}
In this example we import group to execute all tasks independently.
If you wish to run them in order (and stop if a tasks fail) you can use `celery.chain` instead of `celery.group`
For more information on signature and work flows see the official documentation on [Canvas](https://docs.celeryproject.org/en/latest/userguide/canvas.html).
:::
:::{hint}
In our example we use ``si()``, which is a shortcut for "immutable signatures" and prevents us from having to deal with result sharing between tasks.
For more information on signature and work flows see the official documentation on `Canvas <https://docs.celeryproject.org/en/latest/userguide/canvas.html>`_.
In this context, please note that Alliance Auth currently only supports chaining because all other variants require a so-called results back, which Alliance Auth does not have.
:::