Compare commits

...

54 Commits

Author SHA1 Message Date
Joel Falknau
a650f0730e Version Bump 4.7.0 2025-05-24 17:28:41 +10:00
Ariel Rin
63eb9edc9c Merge branch 'readme' into 'master'
Feedback Wanted - Update Readme

See merge request allianceauth/allianceauth!1696
2025-05-24 06:23:06 +00:00
Ariel Rin
d6e1eb9792 Feedback Wanted - Update Readme 2025-05-24 06:23:06 +00:00
Ariel Rin
b459f96e6b Merge branch 'autogroup-multiple-configs' into 'master'
[Fix] Multiple AutoGroupsConfig will override each others

See merge request allianceauth/allianceauth!1722
2025-05-24 04:05:28 +00:00
Ariel Rin
bf32f2c1ef Merge branch 'fix-instance-must-be-saved' into 'master'
Fix discord test errror

See merge request allianceauth/allianceauth!1723
2025-05-24 04:04:27 +00:00
Ariel Rin
7ca67ebaae Merge branch 'fix-active-class' into 'master'
[FIX] Active class on notification icon

See merge request allianceauth/allianceauth!1724
2025-05-24 04:00:59 +00:00
Peter Pfeufer
fa32f87a35 [FIX] Active class on notification icon 2025-05-22 09:21:05 +02:00
T'rahk Rokym
a630015451 Fix error on one of my tox settings
ValueError: Model instances passed to related filters must be saved.
2025-05-21 21:52:40 +02:00
T'rahk Rokym
bf43f59232 Fix the role distribution if several configs hold the same corporation/alliance 2025-05-21 21:29:21 +02:00
Ariel Rin
54910746e3 Merge branch 'bootstrap-class-fixes' into 'master'
[FIX] BG color classes

See merge request allianceauth/allianceauth!1716
2025-05-06 02:03:56 +00:00
Ariel Rin
07ae68333d Merge branch 'improve-add-character-icon' into 'master'
[CHANGE] Better "Add Character" Icon

See merge request allianceauth/allianceauth!1720
2025-05-06 02:03:50 +00:00
Ariel Rin
69e70a4c9b Merge branch '1426-fix-srp-datatable-warning' into 'master'
[FIX] SRP Datatable Warning about incorrect column count

Closes #1426

See merge request allianceauth/allianceauth!1721
2025-05-06 02:03:44 +00:00
Peter Pfeufer
b55f11ee74 [FIX] SRP Datatable Warning about incorrect column count
This was triggered by an incorrect column count due to missing permissions, or not taking missing permissions into account when loading the page and setting up the non-orderable columns.

Fixes #1426
2025-05-05 01:49:40 +02:00
Peter Pfeufer
94ee3c0203 [CHANGE] Better "Add Character" Icon 2025-05-02 01:06:26 +02:00
Peter Pfeufer
25cf329a50 [FIX] BG color classes
Use `text-bg-*` instead of just `bg-*` to make use of Bootstraps native text color selection for those backgrounds.
2025-04-29 07:39:11 +02:00
Ariel Rin
b02827cb3f Merge branch 'translations_7f31a07ccd4e4a66b1dd7b6bc2dbddb5' into 'master'
Updates for project Alliance Auth

See merge request allianceauth/allianceauth!1699
2025-04-29 02:57:50 +00:00
Ariel Rin
2bcc0570ad Updates for project Alliance Auth 2025-04-29 02:57:50 +00:00
Ariel Rin
a3ea0c65a1 Merge branch 'timerboard-skyhooks' into 'master'
Add a new `theft` timer type for skyhooks

See merge request allianceauth/allianceauth!1708
2025-04-29 02:52:38 +00:00
Ariel Rin
5e526da11c Merge branch 'add-apply_offset-to-esi_cleanup_token-task' into 'master'
[ADD] `apply_offset` to `esi_cleanup_token` task

See merge request allianceauth/allianceauth!1709
2025-04-29 02:49:56 +00:00
Ariel Rin
5c79265f90 Merge branch 'services-grid' into 'master'
[FIX] Top margin for service controls

See merge request allianceauth/allianceauth!1711
2025-04-29 02:48:11 +00:00
Ariel Rin
eb0134e716 Merge branch 'menu-separator' into 'master'
[ADD] Menu separator

See merge request allianceauth/allianceauth!1712
2025-04-29 02:48:00 +00:00
Ariel Rin
afde1f4729 Merge branch 'typehint-object-managers' into 'master'
Typehint object managers

See merge request allianceauth/allianceauth!1713
2025-04-29 02:47:12 +00:00
Ariel Rin
5c6dda0eac Typehint object managers 2025-04-29 02:47:11 +00:00
Ariel Rin
af453bc772 Merge branch 'aa_i18n-addition' into 'master'
[ADD] Temaplatetag for path relative to `static`

See merge request allianceauth/allianceauth!1714
2025-04-29 02:46:56 +00:00
Ariel Rin
e13674e886 Merge branch 'translatable-app-names' into 'master'
[CHANGE] Made app names translatable in Django admin

See merge request allianceauth/allianceauth!1715
2025-04-29 02:45:48 +00:00
Ariel Rin
e3e856b826 Merge branch 'admin-overview' into 'master'
Remove unused {% if %} tag

See merge request allianceauth/allianceauth!1718
2025-04-29 02:42:35 +00:00
T'rahk Rokym
9d1cd23a8f Remove unused {% if %} tag 2025-04-21 16:50:04 +02:00
Peter Pfeufer
148f7c116f [CHANGE] Made app names translatable in Django admin 2025-04-10 07:08:16 +02:00
Peter Pfeufer
33e7134d6f [ADD] Temaplatetag for path relative to static
AA-GDPR needs this
2025-04-09 20:54:51 +02:00
Peter Pfeufer
fb799551aa [CHANGE] Move what ever is possible to our framework CSS 2025-04-06 22:22:54 +02:00
Peter Pfeufer
7b95051fe1 [ADD] Menu separator
Between `#nav-right` and `#nav-right-character-control`. Only visible when `#nav-right` has menu items.
2025-04-06 22:01:54 +02:00
Peter Pfeufer
efb6a6db4f [FIX] Top margin for service controls 2025-04-05 23:49:58 +02:00
Peter Pfeufer
478aa1aa12 [ADD] apply_offset to esi_cleanup_token task 2025-04-03 00:59:04 +02:00
T'rahk Rokym
751e55ed6c Add a new theft timer type for skyhooks 2025-03-26 22:09:43 +01:00
Ariel Rin
9dad53f763 Merge branch 'master' into 'master'
Switch the doc example to use group instead of chain for long running tasks

See merge request allianceauth/allianceauth!1703
2025-03-26 01:48:29 +00:00
Ariel Rin
2d57064a7a Merge branch 'supervisor-config-template-updates' into 'master'
[CHANGE] Update supervisor.conf template

See merge request allianceauth/allianceauth!1700
2025-03-26 01:47:58 +00:00
Ariel Rin
833d12cf66 Merge branch 'opengraph-template' into 'master'
[ADD] Opengraph Template

See merge request allianceauth/allianceauth!1701
2025-03-26 01:47:35 +00:00
Ariel Rin
7b56caa4cb Merge branch 'perms_fix' into 'master'
Use the mumble.view_connection_history perm not superuser for Mumble service statistics

See merge request allianceauth/allianceauth!1702
2025-03-26 01:47:12 +00:00
Ariel Rin
5752644122 Merge branch 'fix-logo-height' into 'master'
[FIX] `logo_height` variable name

See merge request allianceauth/allianceauth!1704
2025-03-26 01:46:12 +00:00
Ariel Rin
cadc0cb534 Merge branch 'page-header' into 'master'
[CHANGE] Wrap page header in `header` element

See merge request allianceauth/allianceauth!1705
2025-03-26 01:46:04 +00:00
Ariel Rin
dcdab5ae1f Merge branch 'fix-spelling' into 'master'
[FIX] Spelling (It's EVE time, not Eve time)

See merge request allianceauth/allianceauth!1706
2025-03-26 01:45:58 +00:00
Ariel Rin
d64e896288 Merge branch 'fix-scrollbar-positioning' into 'master'
[FIX] Scrollbar positioning in content area

See merge request allianceauth/allianceauth!1707
2025-03-26 01:45:38 +00:00
Peter Pfeufer
500d8ede32 [FIX] Scrollbar positioning in content area 2025-03-24 17:47:40 +01:00
Peter Pfeufer
f4c5c7f6db [FIX] Spelling (It's EVE time, not Eve time) 2025-03-24 15:14:30 +01:00
Peter Pfeufer
43e1be4032 [CHANGE] Move margin class to header element 2025-03-24 14:49:51 +01:00
Peter Pfeufer
702def2a4d [CHANGE] Wrap page header in header element 2025-03-24 13:34:11 +01:00
Peter Pfeufer
a34baf4154 [FIX] logo_height variable name 2025-03-22 17:37:10 +01:00
r0kym
4de0774f15 Switch the doc example to use group instead of chain for long running tasks 2025-03-20 18:47:19 +01:00
Aaron Kable
83d2dfc7d9 use the view_connection_history perm not superuser 2025-03-20 19:11:08 +08:00
Peter Pfeufer
c93afd2d68 [ADD] Site name and URL 2025-03-18 21:40:47 +01:00
Peter Pfeufer
b7bacd11af [CHANGE] Bring public base templkate in line with the non-public version 2025-03-18 18:30:00 +01:00
Peter Pfeufer
f26835fae0 [ADD] Opengraph Template for easier override 2025-03-18 18:29:22 +01:00
Peter Pfeufer
4edb7cb678 [CHANGE] Assignment format to INI style
The supervisor.conf file uses INI style, so the format should reflect this.
2025-03-16 10:15:36 +01:00
Peter Pfeufer
2ce9ba997f [CHANGE] Update supervisor.conf template
Use `%(program_name)s` variable for logfile names, which makes it easier to avoid possible copy/paste issues and mistakes.
2025-03-16 10:11:27 +01:00
100 changed files with 725 additions and 416 deletions

View File

@@ -1,15 +1,15 @@
# Alliance Auth # Alliance Auth
[![license](https://img.shields.io/badge/license-GPLv2-green)](https://pypi.org/project/allianceauth/) [![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/) [![Python Versions](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/) [![Django Versions](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/) [![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) [![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) [![Documentation Status](https://readthedocs.org/projects/allianceauth/badge/?version=latest)](https://allianceauth.readthedocs.io/?badge=latest)
[![coverage report](https://gitlab.com/allianceauth/allianceauth/badges/master/coverage.svg)](https://gitlab.com/allianceauth/allianceauth/commits/master) [![Test 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) [![Chat on Discord](https://img.shields.io/discord/399006117012832262.svg)](https://discord.gg/fjnHAmk)
An auth system for EVE Online to help in-game organizations manage online service access. 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.
## Content ## Content
@@ -22,17 +22,17 @@ An auth system for EVE Online to help in-game organizations manage online servic
## Overview ## Overview
Alliance Auth (AA) is a web site that helps Eve Online organizations efficiently manage access to applications and services. Alliance Auth (AA) is a platform that helps Eve Online organizations efficiently manage access to applications and services.
Main features: Main features:
- 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/) - 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/)
- 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. - 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) - 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,9 +42,15 @@ For further details about AA - including an installation guide and a full list o
## Screenshot ## Screenshot
Here is an example of the Alliance Auth web site with some plug-ins apps and services enabled: Here is an example of the Alliance Auth web site with a mixture of Services, Apps and Community Creations enabled:
![screenshot](https://i.imgur.com/2tnX9kD.png) ### Flatly Theme
![Flatly Theme](docs/_static/images/promotion/SampleInstallation-Flatly.png)
### Darkly Theme
![Darkly Theme](docs/_static/images/promotion/SampleInstallation-Darkly.png)
## Support ## Support

View File

@@ -5,7 +5,7 @@ manage online service access.
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.
__version__ = '4.6.4' __version__ = '4.7.0'
__title__ = 'Alliance Auth' __title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth' __url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = f'{__title__} v{__version__}' NAME = f'{__title__} v{__version__}'

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,24 +1,24 @@
{% load theme_tags %} {% load theme_tags %}
{% load static %} {% load static %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en" {% theme_html_tags %}>
<head> <head>
<!-- Required meta tags -->
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content=""> <!-- End Required meta tags -->
<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' %} {% include 'allianceauth/icons.html' %}
<!-- Meta tags -->
<title>{% block title %}{% block page_title %}{% endblock page_title %} - {{ SITE_NAME }}{% endblock title %}</title> <title>{% block title %}{% block page_title %}{% endblock page_title %} - {{ SITE_NAME }}{% endblock title %}</title>
{% theme_css %} {% theme_css %}
{% include 'bundles/fontawesome.html' %} {% include 'bundles/fontawesome.html' %}
{% include 'bundles/auth-framework-css.html' %}
{% block extra_include %} {% block extra_include %}
{% endblock %} {% endblock %}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,4 @@
from allianceauth.eveonline.models import EveCorporationInfo
from django.test import TestCase from django.test import TestCase
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
@@ -73,3 +74,51 @@ class AutogroupsConfigManagerTestCase(TestCase):
AutogroupsConfig.objects.update_groups_for_user(member) AutogroupsConfig.objects.update_groups_for_user(member)
self.assertTrue(update_groups.called) 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): class EveCharacterManager(models.Manager):
provider = EveCharacterProviderManager() provider = EveCharacterProviderManager()
def create_character(self, character_id): def create_character(self, character_id) -> models.Model:
return self.create_character_obj(self.provider.get_character(character_id)) return self.create_character_obj(self.provider.get_character(character_id))
def create_character_obj(self, character: providers.Character): def create_character_obj(self, character: providers.Character) -> models.Model:
return self.create( return self.create(
character_id=character.id, character_id=character.id,
character_name=character.name, character_name=character.name,

View File

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

View File

@@ -1,6 +1,8 @@
from django.apps import AppConfig from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class FatConfig(AppConfig): class FatConfig(AppConfig):
name = 'allianceauth.fleetactivitytracking' name = 'allianceauth.fleetactivitytracking'
label = '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 "Character" %}</th>
<th class="text-center">{% translate "System" %}</th> <th class="text-center">{% translate "System" %}</th>
<th class="text-center">{% translate "Ship" %}</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> <th></th>
</tr> </tr>

View File

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

View File

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

View File

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

View File

@@ -5,6 +5,24 @@
* to be used throughout Alliance Auth and its Community Apps * 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 /* Bootstrap fixes
------------------------------------------------------------------------------------- */ ------------------------------------------------------------------------------------- */
@media all { @media all {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,4 @@
from typing import ClassVar
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import models from django.db import models
from sortedm2m.fields import SortedManyToManyField from sortedm2m.fields import SortedManyToManyField
@@ -40,7 +41,7 @@ class Application(models.Model):
reviewer_character = models.ForeignKey(EveCharacter, on_delete=models.SET_NULL, blank=True, null=True) reviewer_character = models.ForeignKey(EveCharacter, on_delete=models.SET_NULL, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
objects = ApplicationManager() objects: ClassVar[ApplicationManager] = ApplicationManager()
def __str__(self): def __str__(self):
return str(self.user) + " Application To " + str(self.form) 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">{{ personal_app.form.corp.corporation_name }}</td>
<td class="text-center"> <td class="text-center">
{% if personal_app.approved == None %} {% if personal_app.approved == None %}
<div class="badge bg-warning">{% translate "Pending" %}</div> <div class="badge text-bg-warning">{% translate "Pending" %}</div>
{% elif personal_app.approved == True %} {% elif personal_app.approved == True %}
<div class="badge bg-success">{% translate "Approved" %}</div> <div class="badge text-bg-success">{% translate "Approved" %}</div>
{% else %} {% else %}
<div class="badge bg-danger">{% translate "Rejected" %}</div> <div class="badge text-bg-danger">{% translate "Rejected" %}</div>
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">
@@ -133,14 +133,14 @@
<td class="text-center"> <td class="text-center">
{% if app.approved == None %} {% if app.approved == None %}
{% if app.reviewer_str %} {% if app.reviewer_str %}
<div class="badge bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div> <div class="badge text-bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div>
{% else %} {% else %}
<div class="badge bg-warning">{% translate "Pending" %}</div> <div class="badge text-bg-warning">{% translate "Pending" %}</div>
{% endif %} {% endif %}
{% elif app.approved == True %} {% elif app.approved == True %}
<div class="badge bg-success">{% translate "Approved" %}</div> <div class="badge text-bg-success">{% translate "Approved" %}</div>
{% else %} {% else %}
<div class="badge bg-danger">{% translate "Rejected" %}</div> <div class="badge text-bg-danger">{% translate "Rejected" %}</div>
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">
@@ -177,14 +177,14 @@
<td class="text-center"> <td class="text-center">
{% if app.approved == None %} {% if app.approved == None %}
{% if app.reviewer_str %} {% if app.reviewer_str %}
<div class="badge bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div> <div class="badge text-bg-info">{% translate "Reviewer:" %} {{ app.reviewer_str }}</div>
{% else %} {% else %}
<div class="badge bg-warning">{% translate "Pending" %}</div> <div class="badge text-bg-warning">{% translate "Pending" %}</div>
{% endif %} {% endif %}
{% elif app.approved == True %} {% elif app.approved == True %}
<div class="badge bg-success">{% translate "Approved" %}</div> <div class="badge text-bg-success">{% translate "Approved" %}</div>
{% else %} {% else %}
<div class="badge bg-danger">{% translate "Rejected" %}</div> <div class="badge text-bg-danger">{% translate "Rejected" %}</div>
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">

View File

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

View File

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

View File

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

View File

@@ -8,7 +8,7 @@
# Fegpawn Kaundur, 2023 # Fegpawn Kaundur, 2023
# frank1210 <francolopez_16@hotmail.com>, 2023 # frank1210 <francolopez_16@hotmail.com>, 2023
# Joel Falknau <ozirascal@gmail.com>, 2023 # Joel Falknau <ozirascal@gmail.com>, 2023
# trenus, 2023 # trenus, 2025
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
@@ -17,7 +17,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-25 19:17+1000\n" "POT-Creation-Date: 2025-02-25 19:17+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: trenus, 2023\n" "Last-Translator: trenus, 2025\n"
"Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/es/)\n" "Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -64,7 +64,7 @@ msgstr "Inglés"
#: allianceauth/authentication/models.py:71 #: allianceauth/authentication/models.py:71
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Checo"
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:107 #: allianceauth/project_template/project_name/settings/base.py:107
@@ -104,22 +104,22 @@ msgstr "Ruso"
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Dutch" msgid "Dutch"
msgstr "" msgstr "Holandés"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Polish" msgid "Polish"
msgstr "" msgstr "Polaco"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:116
msgid "Ukrainian" msgid "Ukrainian"
msgstr "" msgstr "Ucraniano"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:117 #: allianceauth/project_template/project_name/settings/base.py:117
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "" msgstr "Chino Simplificado"
#: allianceauth/authentication/models.py:98 #: allianceauth/authentication/models.py:98
#: allianceauth/menu/templates/menu/menu-user.html:42 #: allianceauth/menu/templates/menu/menu-user.html:42
@@ -134,7 +134,7 @@ msgstr "Modo Nocturno"
#: allianceauth/authentication/models.py:107 #: allianceauth/authentication/models.py:107
#: allianceauth/menu/templates/menu/menu-user.html:46 #: allianceauth/menu/templates/menu/menu-user.html:46
msgid "Theme" msgid "Theme"
msgstr "" msgstr "Tema"
#: allianceauth/authentication/models.py:124 #: allianceauth/authentication/models.py:124
#, python-format #, python-format
@@ -195,17 +195,17 @@ msgstr "Allianza"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:5 #: allianceauth/authentication/templates/authentication/dashboard_groups.html:5
msgid "Membership" msgid "Membership"
msgstr "" msgstr "Membresía"
#: allianceauth/authentication/templates/authentication/dashboard_groups.html:10 #: allianceauth/authentication/templates/authentication/dashboard_groups.html:10
msgid "State:" msgid "State:"
msgstr "" msgstr "Estado:"
#: allianceauth/authentication/templates/authentication/tokens.html:7 #: allianceauth/authentication/templates/authentication/tokens.html:7
#: allianceauth/authentication/templates/authentication/tokens.html:11 #: allianceauth/authentication/templates/authentication/tokens.html:11
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62 #: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:62
msgid "Token Management" msgid "Token Management"
msgstr "" msgstr "Gestión de Tokens"
#: allianceauth/authentication/templates/authentication/tokens.html:17 #: allianceauth/authentication/templates/authentication/tokens.html:17
msgid "" msgid ""
@@ -346,7 +346,7 @@ msgstr "Corporaciones"
#: allianceauth/corputils/templates/corputils/base.html:35 #: allianceauth/corputils/templates/corputils/base.html:35
msgid "Add corporation" msgid "Add corporation"
msgstr "" msgstr "Añadir corporación"
#: allianceauth/corputils/templates/corputils/base.html:51 #: allianceauth/corputils/templates/corputils/base.html:51
msgid "Search all corporations..." msgid "Search all corporations..."
@@ -371,11 +371,11 @@ msgstr "Ultima Actualizacion:"
#: allianceauth/corputils/templates/corputils/corpstats.html:86 #: allianceauth/corputils/templates/corputils/corpstats.html:86
msgid "Update Now" msgid "Update Now"
msgstr "" msgstr "Actualizar Ahora"
#: allianceauth/corputils/templates/corputils/corpstats.html:101 #: allianceauth/corputils/templates/corputils/corpstats.html:101
msgid "Main character" msgid "Main character"
msgstr "" msgstr "Personaje principal"
#: allianceauth/corputils/templates/corputils/corpstats.html:102 #: allianceauth/corputils/templates/corputils/corpstats.html:102
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:29 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:29
@@ -549,7 +549,7 @@ msgstr "Editar Fatlink"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:21 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:21
msgid "Are you sure?" msgid "Are you sure?"
msgstr "" msgstr "¿Estás seguro?"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
msgid "Delete fat" msgid "Delete fat"
@@ -692,7 +692,7 @@ msgstr "Promedio de participacion"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:6
msgid "Fatlink Statistics" msgid "Fatlink Statistics"
msgstr "" msgstr "Estadísticas Fatlink"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:32 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:32
msgid "Ticker" msgid "Ticker"
@@ -1940,19 +1940,19 @@ msgstr "Cuenta IPSuite4 desactivada."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:7 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:7
msgid "Mumble" msgid "Mumble"
msgstr "" msgstr "Mumble"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:11 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:11
msgid "Mumble History" msgid "Mumble History"
msgstr "" msgstr "Historial de Mumble"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:23 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:23
msgid "Server Connection History" msgid "Server Connection History"
msgstr "" msgstr "Historial de Conexiones al Servidor"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Displayed Name" msgid "Displayed Name"
msgstr "" msgstr "Nombre Visualizado"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
msgid "Release" msgid "Release"
@@ -1961,24 +1961,24 @@ msgstr ""
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Version" msgid "Version"
msgstr "" msgstr "Versión"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Connect" msgid "Last Connect"
msgstr "" msgstr "Última Conexión"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:36 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:36
msgid "Last Disconnect" msgid "Last Disconnect"
msgstr "" msgstr "Última Desconexión"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:48 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:48
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:60 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:60
msgid "Server Connection Breakdown" msgid "Server Connection Breakdown"
msgstr "" msgstr "Desglose de la Conexión al Servidor"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:69 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:69
msgid "Number" msgid "Number"
msgstr "" msgstr "Número"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26 #: allianceauth/services/templates/services/service_password.html:26
@@ -1987,11 +1987,11 @@ msgstr "Cambiar Contraseña"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:46
msgid "Connect" msgid "Connect"
msgstr "" msgstr "Conectar"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History" msgid "Mumble Connection History"
msgstr "" msgstr "Historia de Conexión Mumble"
#: allianceauth/services/modules/openfire/auth_hooks.py:27 #: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber" msgid "Jabber"
@@ -2214,7 +2214,7 @@ msgstr "Cambiar contraseña en %(service_name)s"
#: allianceauth/services/templates/services/service_status.html:5 #: allianceauth/services/templates/services/service_status.html:5
msgid "Enabled" msgid "Enabled"
msgstr "" msgstr "Habilitado"
#: allianceauth/services/templates/services/service_status.html:7 #: allianceauth/services/templates/services/service_status.html:7
#: allianceauth/srp/templates/srp/management.html:78 #: allianceauth/srp/templates/srp/management.html:78
@@ -2299,11 +2299,11 @@ msgstr "Crear SRP"
#: allianceauth/srp/templates/srp/add.html:26 #: allianceauth/srp/templates/srp/add.html:26
msgid "SRP fleet details" msgid "SRP fleet details"
msgstr "" msgstr "Detalles de la flota SRP"
#: allianceauth/srp/templates/srp/add.html:40 #: allianceauth/srp/templates/srp/add.html:40
msgid "Create SRP fleet" msgid "Create SRP fleet"
msgstr "" msgstr "Crear flota SRP"
#: allianceauth/srp/templates/srp/add.html:46 #: allianceauth/srp/templates/srp/add.html:46
msgid "Give this link to the line members." msgid "Give this link to the line members."
@@ -2316,7 +2316,7 @@ msgstr "Informacion de SRP de la flota"
#: allianceauth/srp/templates/srp/data.html:17 #: allianceauth/srp/templates/srp/data.html:17
msgid "View Fleets" msgid "View Fleets"
msgstr "" msgstr "Ver Flotas"
#: allianceauth/srp/templates/srp/data.html:26 #: allianceauth/srp/templates/srp/data.html:26
msgid "Mark Incomplete" msgid "Mark Incomplete"
@@ -2435,11 +2435,11 @@ msgstr "Crear solicitud de SRP"
#: allianceauth/srp/templates/srp/request.html:22 #: allianceauth/srp/templates/srp/request.html:22
msgid "Your SRP request" msgid "Your SRP request"
msgstr "" msgstr "Tu solicitud SRP"
#: allianceauth/srp/templates/srp/request.html:35 #: allianceauth/srp/templates/srp/request.html:35
msgid "Create SRP request" msgid "Create SRP request"
msgstr "" msgstr "Crear solicitud SRP"
#: allianceauth/srp/templates/srp/update.html:7 #: allianceauth/srp/templates/srp/update.html:7
#: allianceauth/srp/templates/srp/update.html:16 #: allianceauth/srp/templates/srp/update.html:16
@@ -2456,7 +2456,7 @@ msgstr "No existe el SRP para esa flota"
#: allianceauth/srp/templates/srp/update.html:40 #: allianceauth/srp/templates/srp/update.html:40
msgid "Update AAR link" msgid "Update AAR link"
msgstr "" msgstr "Actualizar enlace AAR"
#: allianceauth/srp/views.py:85 #: allianceauth/srp/views.py:85
#, python-format #, python-format
@@ -2568,7 +2568,7 @@ msgstr "Cerrado"
#: allianceauth/templates/allianceauth/admin-status/overview.html:24 #: allianceauth/templates/allianceauth/admin-status/overview.html:24
msgid "No notifications at this time" msgid "No notifications at this time"
msgstr "" msgstr "No hay notificaciones en este momento"
#: allianceauth/templates/allianceauth/admin-status/overview.html:33 #: allianceauth/templates/allianceauth/admin-status/overview.html:33
msgid "Powered by GitLab" msgid "Powered by GitLab"
@@ -2617,11 +2617,11 @@ msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:116 #: allianceauth/templates/allianceauth/admin-status/overview.html:116
msgid "running" msgid "running"
msgstr "" msgstr "ejecutando"
#: allianceauth/templates/allianceauth/admin-status/overview.html:117 #: allianceauth/templates/allianceauth/admin-status/overview.html:117
msgid "queued" msgid "queued"
msgstr "" msgstr "en cola"
#: allianceauth/templates/allianceauth/top-menu-admin.html:19 #: allianceauth/templates/allianceauth/top-menu-admin.html:19
msgid "AA Documentation" msgid "AA Documentation"
@@ -2646,7 +2646,7 @@ msgstr "Navegacion"
#: allianceauth/theme/templates/theme/theme_select.html:7 #: allianceauth/theme/templates/theme/theme_select.html:7
msgid "Select Theme" msgid "Select Theme"
msgstr "" msgstr "Seleccionar tema"
#: allianceauth/timerboard/form.py:36 #: allianceauth/timerboard/form.py:36
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:14
@@ -2677,7 +2677,7 @@ msgstr ""
#: allianceauth/timerboard/form.py:43 #: allianceauth/timerboard/form.py:43
msgid "Date and Time" msgid "Date and Time"
msgstr "" msgstr "Fecha y hora"
#: allianceauth/timerboard/form.py:44 #: allianceauth/timerboard/form.py:44
msgid "Days Remaining" msgid "Days Remaining"
@@ -2744,35 +2744,35 @@ msgstr ""
#: allianceauth/timerboard/models.py:31 #: allianceauth/timerboard/models.py:31
msgid "Astrahus" msgid "Astrahus"
msgstr "" msgstr "Astrahus"
#: allianceauth/timerboard/models.py:32 #: allianceauth/timerboard/models.py:32
msgid "Fortizar" msgid "Fortizar"
msgstr "" msgstr "Fortizar"
#: allianceauth/timerboard/models.py:33 #: allianceauth/timerboard/models.py:33
msgid "Keepstar" msgid "Keepstar"
msgstr "" msgstr "Keepstar"
#: allianceauth/timerboard/models.py:34 #: allianceauth/timerboard/models.py:34
msgid "Raitaru" msgid "Raitaru"
msgstr "" msgstr "Raitaru"
#: allianceauth/timerboard/models.py:35 #: allianceauth/timerboard/models.py:35
msgid "Azbel" msgid "Azbel"
msgstr "" msgstr "Azbel"
#: allianceauth/timerboard/models.py:36 #: allianceauth/timerboard/models.py:36
msgid "Sotiyo" msgid "Sotiyo"
msgstr "" msgstr "Sotiyo"
#: allianceauth/timerboard/models.py:37 #: allianceauth/timerboard/models.py:37
msgid "Athanor" msgid "Athanor"
msgstr "" msgstr "Athanor"
#: allianceauth/timerboard/models.py:38 #: allianceauth/timerboard/models.py:38
msgid "Tatara" msgid "Tatara"
msgstr "" msgstr "Tatara"
#: allianceauth/timerboard/models.py:39 #: allianceauth/timerboard/models.py:39
msgid "Cyno Beacon" msgid "Cyno Beacon"
@@ -2832,7 +2832,7 @@ msgstr "Desanclando"
#: allianceauth/timerboard/models.py:59 #: allianceauth/timerboard/models.py:59
msgid "Abandoned" msgid "Abandoned"
msgstr "" msgstr "Abandonado"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:54 #: allianceauth/timerboard/templates/timerboard/view.html:54
@@ -2906,17 +2906,19 @@ msgstr "Se guardaron los cambios en el timer."
#: allianceauth/views.py:55 #: allianceauth/views.py:55
msgid "Bad Request" msgid "Bad Request"
msgstr "" msgstr "Mala solicitud"
#: allianceauth/views.py:57 allianceauth/views.py:87 #: allianceauth/views.py:57 allianceauth/views.py:87
msgid "" msgid ""
"Auth encountered an error processing your request, please try again. If the " "Auth encountered an error processing your request, please try again. If the "
"error persists, please contact the administrators." "error persists, please contact the administrators."
msgstr "" msgstr ""
"Auth ha encontrado un error al procesar su solicitud, por favor inténtelo de"
" nuevo. Si el error persiste, póngase en contacto con los administradores."
#: allianceauth/views.py:65 #: allianceauth/views.py:65
msgid "Permission Denied" msgid "Permission Denied"
msgstr "" msgstr "Permiso Denegado"
#: allianceauth/views.py:67 #: allianceauth/views.py:67
msgid "" msgid ""
@@ -2926,14 +2928,16 @@ msgstr ""
#: allianceauth/views.py:75 #: allianceauth/views.py:75
msgid "Page Not Found" msgid "Page Not Found"
msgstr "" msgstr "Página No Encontrada"
#: allianceauth/views.py:77 #: allianceauth/views.py:77
msgid "" msgid ""
"Page does not exist. If you believe this is in error please contact the " "Page does not exist. If you believe this is in error please contact the "
"administrators. " "administrators. "
msgstr "" msgstr ""
"La página no existe. Si cree que se trata de un error, póngase en contacto "
"con los administradores. "
#: allianceauth/views.py:85 #: allianceauth/views.py:85
msgid "Internal Server Error" msgid "Internal Server Error"
msgstr "" msgstr "Error Interno del Servidor"

View File

@@ -7,6 +7,7 @@
# Kristof Swensen, 2023 # Kristof Swensen, 2023
# Денис Ивченко, 2024 # Денис Ивченко, 2024
# Andrii Yukhymchak, 2024 # Andrii Yukhymchak, 2024
# Bandera Primary, 2025
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
@@ -15,7 +16,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-25 19:17+1000\n" "POT-Creation-Date: 2025-02-25 19:17+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Andrii Yukhymchak, 2024\n" "Last-Translator: Bandera Primary, 2025\n"
"Language-Team: Ukrainian (https://app.transifex.com/alliance-auth/teams/107430/uk/)\n" "Language-Team: Ukrainian (https://app.transifex.com/alliance-auth/teams/107430/uk/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -67,7 +68,7 @@ msgstr "Англійська"
#: allianceauth/authentication/models.py:71 #: allianceauth/authentication/models.py:71
msgid "Czech" msgid "Czech"
msgstr "" msgstr "Чеська"
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:107 #: allianceauth/project_template/project_name/settings/base.py:107
@@ -107,12 +108,12 @@ msgstr "Російська"
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Dutch" msgid "Dutch"
msgstr "" msgstr "Нідерландська"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Polish" msgid "Polish"
msgstr "" msgstr "Польська"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:116
@@ -122,7 +123,7 @@ msgstr "Українська"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:117 #: allianceauth/project_template/project_name/settings/base.py:117
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "" msgstr "Cпрощена китайська"
#: allianceauth/authentication/models.py:98 #: allianceauth/authentication/models.py:98
#: allianceauth/menu/templates/menu/menu-user.html:42 #: allianceauth/menu/templates/menu/menu-user.html:42
@@ -216,6 +217,9 @@ msgid ""
"your tokens. Always revoke tokens on " "your tokens. Always revoke tokens on "
"https://developers.eveonline.com/authorized-apps where possible." "https://developers.eveonline.com/authorized-apps where possible."
msgstr "" msgstr ""
"Тут ви може видалити токени, але резервні копії або логи бази даних все ще "
"можуть містити їх. Завжди анульовуйте токени на "
"https://developers.eveonline.com/authorized-apps, коли є можливість."
#: allianceauth/authentication/templates/authentication/tokens.html:23 #: allianceauth/authentication/templates/authentication/tokens.html:23
msgid "Scopes" msgid "Scopes"
@@ -446,36 +450,36 @@ msgstr "Не вдалося зібрати статистику корпорац
#: allianceauth/crontab/models.py:13 #: allianceauth/crontab/models.py:13
msgid "Minute Offset" msgid "Minute Offset"
msgstr "" msgstr "Зміщення хвилини"
#: allianceauth/crontab/models.py:14 #: allianceauth/crontab/models.py:14
msgid "Hour Offset" msgid "Hour Offset"
msgstr "" msgstr "Зміщення години"
#: allianceauth/crontab/models.py:15 #: allianceauth/crontab/models.py:15
msgid "Day of Month Offset" msgid "Day of Month Offset"
msgstr "" msgstr "Зміщення дня місяця"
#: allianceauth/crontab/models.py:16 #: allianceauth/crontab/models.py:16
msgid "Month of Year Offset" msgid "Month of Year Offset"
msgstr "" msgstr "Зміщення місяця року"
#: allianceauth/crontab/models.py:17 #: allianceauth/crontab/models.py:17
msgid "Day of Week Offset" msgid "Day of Week Offset"
msgstr "" msgstr "Зміщення дня тижня"
#: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36 #: allianceauth/custom_css/apps.py:13 allianceauth/custom_css/models.py:36
#: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47 #: allianceauth/custom_css/models.py:37 allianceauth/custom_css/models.py:47
msgid "Custom CSS" msgid "Custom CSS"
msgstr "" msgstr "Користувацький CSS"
#: allianceauth/custom_css/models.py:25 #: allianceauth/custom_css/models.py:25
msgid "Your custom CSS" msgid "Your custom CSS"
msgstr "" msgstr "Ваш користувацький CSS"
#: allianceauth/custom_css/models.py:26 #: allianceauth/custom_css/models.py:26
msgid "This CSS will be added to the site after the default CSS." msgid "This CSS will be added to the site after the default CSS."
msgstr "" msgstr "Цей CSS буде додано до сайту після базового CSS."
#: allianceauth/fleetactivitytracking/auth_hooks.py:10 #: allianceauth/fleetactivitytracking/auth_hooks.py:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:10
@@ -1951,45 +1955,45 @@ msgstr "Деактивовано обліковий запис IPSuite4."
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:7 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:7
msgid "Mumble" msgid "Mumble"
msgstr "" msgstr "Mumble"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:11 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:11
msgid "Mumble History" msgid "Mumble History"
msgstr "" msgstr "Історія Mumble"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:23 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:23
msgid "Server Connection History" msgid "Server Connection History"
msgstr "" msgstr "Історія підключень до сервера"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:32
msgid "Displayed Name" msgid "Displayed Name"
msgstr "" msgstr "Відображене ім'я"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:33
msgid "Release" msgid "Release"
msgstr "" msgstr "Реліз"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:34
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:68
msgid "Version" msgid "Version"
msgstr "" msgstr "Версія"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:35
msgid "Last Connect" msgid "Last Connect"
msgstr "" msgstr "Останнє підключення"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:36 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:36
msgid "Last Disconnect" msgid "Last Disconnect"
msgstr "" msgstr "Останнє відключення"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:48 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:48
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:60 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:60
msgid "Server Connection Breakdown" msgid "Server Connection Breakdown"
msgstr "" msgstr "Розбір підключення до сервера"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:69 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_connection_history.html:69
msgid "Number" msgid "Number"
msgstr "" msgstr "Кількість"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:28
#: allianceauth/services/templates/services/service_password.html:26 #: allianceauth/services/templates/services/service_password.html:26
@@ -2002,7 +2006,7 @@ msgstr "Підєднатись"
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:52
msgid "Mumble Connection History" msgid "Mumble Connection History"
msgstr "" msgstr "Історія підключень до Mumble"
#: allianceauth/services/modules/openfire/auth_hooks.py:27 #: allianceauth/services/modules/openfire/auth_hooks.py:27
msgid "Jabber" msgid "Jabber"
@@ -2740,11 +2744,11 @@ msgstr "POCO"
#: allianceauth/timerboard/models.py:25 #: allianceauth/timerboard/models.py:25
msgid "Orbital Skyhook" msgid "Orbital Skyhook"
msgstr "" msgstr "Орбітальний скайхук"
#: allianceauth/timerboard/models.py:26 #: allianceauth/timerboard/models.py:26
msgid "Sovereignty Hub" msgid "Sovereignty Hub"
msgstr "" msgstr "Суверенітетний хаб"
#: allianceauth/timerboard/models.py:27 #: allianceauth/timerboard/models.py:27
msgid "TCU" msgid "TCU"
@@ -2808,7 +2812,7 @@ msgstr "Мост Ансіблекс"
#: allianceauth/timerboard/models.py:42 #: allianceauth/timerboard/models.py:42
msgid "Mercenary Den" msgid "Mercenary Den"
msgstr "" msgstr "Кубло найманців"
#: allianceauth/timerboard/models.py:43 #: allianceauth/timerboard/models.py:43
msgid "Moon Mining Cycle" msgid "Moon Mining Cycle"
@@ -2816,7 +2820,7 @@ msgstr "Цикл видобутку супутника"
#: allianceauth/timerboard/models.py:44 #: allianceauth/timerboard/models.py:44
msgid "Metenox Moon Drill" msgid "Metenox Moon Drill"
msgstr "" msgstr "Бур Метенокс"
#: allianceauth/timerboard/models.py:45 #: allianceauth/timerboard/models.py:45
msgid "Other" msgid "Other"
@@ -2852,7 +2856,7 @@ msgstr "Зняття з якорю"
#: allianceauth/timerboard/models.py:59 #: allianceauth/timerboard/models.py:59
msgid "Abandoned" msgid "Abandoned"
msgstr "" msgstr "Покинуто"
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:7
#: allianceauth/timerboard/templates/timerboard/view.html:54 #: allianceauth/timerboard/templates/timerboard/view.html:54

View File

@@ -8,6 +8,7 @@
# 85b931f94c2441449e78b527e0a313ae_baf2e99 <639a60f913241ffb1c9bd90bc93a541f_869335>, 2023 # 85b931f94c2441449e78b527e0a313ae_baf2e99 <639a60f913241ffb1c9bd90bc93a541f_869335>, 2023
# Aaron BuBu <351793078@qq.com>, 2023 # Aaron BuBu <351793078@qq.com>, 2023
# Joel Falknau <ozirascal@gmail.com>, 2023 # Joel Falknau <ozirascal@gmail.com>, 2023
# Aika Yu, 2025
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
@@ -16,7 +17,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-25 19:17+1000\n" "POT-Creation-Date: 2025-02-25 19:17+1000\n"
"PO-Revision-Date: 2023-11-08 13:50+0000\n" "PO-Revision-Date: 2023-11-08 13:50+0000\n"
"Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2023\n" "Last-Translator: Aika Yu, 2025\n"
"Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n" "Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -61,7 +62,7 @@ msgstr "英语"
#: allianceauth/authentication/models.py:71 #: allianceauth/authentication/models.py:71
msgid "Czech" msgid "Czech"
msgstr "" msgstr "捷克语"
#: allianceauth/authentication/models.py:72 #: allianceauth/authentication/models.py:72
#: allianceauth/project_template/project_name/settings/base.py:107 #: allianceauth/project_template/project_name/settings/base.py:107
@@ -101,22 +102,22 @@ msgstr "俄语"
#: allianceauth/authentication/models.py:79 #: allianceauth/authentication/models.py:79
#: allianceauth/project_template/project_name/settings/base.py:113 #: allianceauth/project_template/project_name/settings/base.py:113
msgid "Dutch" msgid "Dutch"
msgstr "" msgstr "荷兰语"
#: allianceauth/authentication/models.py:80 #: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:114 #: allianceauth/project_template/project_name/settings/base.py:114
msgid "Polish" msgid "Polish"
msgstr "" msgstr "波兰语"
#: allianceauth/authentication/models.py:81 #: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:116 #: allianceauth/project_template/project_name/settings/base.py:116
msgid "Ukrainian" msgid "Ukrainian"
msgstr "" msgstr "乌克兰语"
#: allianceauth/authentication/models.py:82 #: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:117 #: allianceauth/project_template/project_name/settings/base.py:117
msgid "Simplified Chinese" msgid "Simplified Chinese"
msgstr "" msgstr "简体中文"
#: allianceauth/authentication/models.py:98 #: allianceauth/authentication/models.py:98
#: allianceauth/menu/templates/menu/menu-user.html:42 #: allianceauth/menu/templates/menu/menu-user.html:42
@@ -283,7 +284,7 @@ msgstr "不能修改主角色为%(char)s这个角色被另一个账户所拥
#: allianceauth/authentication/views.py:164 #: allianceauth/authentication/views.py:164
#, python-format #, python-format
msgid "Changed main character to %s" msgid "Changed main character to %s"
msgstr "" msgstr "修改主角色为%s"
#: allianceauth/authentication/views.py:178 #: allianceauth/authentication/views.py:178
#, python-format #, python-format
@@ -359,11 +360,11 @@ msgstr "最后一次更新"
#: allianceauth/corputils/templates/corputils/corpstats.html:86 #: allianceauth/corputils/templates/corputils/corpstats.html:86
msgid "Update Now" msgid "Update Now"
msgstr "" msgstr "立刻更新"
#: allianceauth/corputils/templates/corputils/corpstats.html:101 #: allianceauth/corputils/templates/corputils/corpstats.html:101
msgid "Main character" msgid "Main character"
msgstr "" msgstr "主要角色"
#: allianceauth/corputils/templates/corputils/corpstats.html:102 #: allianceauth/corputils/templates/corputils/corpstats.html:102
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:29 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:29
@@ -536,7 +537,7 @@ msgstr "编辑一个PAP"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:21 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:21
msgid "Are you sure?" msgid "Are you sure?"
msgstr "" msgstr "是否确认?"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:22
msgid "Delete fat" msgid "Delete fat"
@@ -575,7 +576,7 @@ msgstr "EVE时间"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:49 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:49
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:52 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:52
msgid "Docked in" msgid "Docked in"
msgstr "" msgstr "停靠在"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:6
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:6
@@ -711,11 +712,11 @@ msgstr "记录中找不到已创建的PAP链接"
#: allianceauth/fleetactivitytracking/views.py:218 #: allianceauth/fleetactivitytracking/views.py:218
msgid "Character does not exist" msgid "Character does not exist"
msgstr "" msgstr "角色不存在"
#: allianceauth/fleetactivitytracking/views.py:221 #: allianceauth/fleetactivitytracking/views.py:221
msgid "User does not exist" msgid "User does not exist"
msgstr "" msgstr "用户不存在"
#: allianceauth/fleetactivitytracking/views.py:299 #: allianceauth/fleetactivitytracking/views.py:299
msgid "Fleet participation registered." msgid "Fleet participation registered."
@@ -935,7 +936,7 @@ msgstr "用户组成员"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:13 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:13
msgid "Join/Leave Requests" msgid "Join/Leave Requests"
msgstr "" msgstr "加入/退出申请"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:24 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:24
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:33 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:33
@@ -1444,13 +1445,13 @@ msgstr "管理员"
#: allianceauth/menu/templates/menu/menu-user.html:82 #: allianceauth/menu/templates/menu/menu-user.html:82
msgid "Sign Out" msgid "Sign Out"
msgstr "" msgstr "登出"
#: allianceauth/menu/templates/menu/menu-user.html:86 #: allianceauth/menu/templates/menu/menu-user.html:86
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:17 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:17
#: allianceauth/templates/allianceauth/top-menu-rh-default.html:18 #: allianceauth/templates/allianceauth/top-menu-rh-default.html:18
msgid "Sign In" msgid "Sign In"
msgstr "" msgstr "登入"
#: allianceauth/notifications/models.py:21 #: allianceauth/notifications/models.py:21
msgid "danger" msgid "danger"
@@ -1494,7 +1495,7 @@ msgstr "标题"
#: allianceauth/notifications/templates/notifications/list_partial.html:28 #: allianceauth/notifications/templates/notifications/list_partial.html:28
msgid "No notifications." msgid "No notifications."
msgstr "" msgstr "暂无通知"
#: allianceauth/notifications/templates/notifications/view.html:5 #: allianceauth/notifications/templates/notifications/view.html:5
#: allianceauth/notifications/templates/notifications/view.html:9 #: allianceauth/notifications/templates/notifications/view.html:9
@@ -1584,7 +1585,7 @@ msgstr ""
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:7 #: allianceauth/optimer/templates/optimer/dashboard.ops.html:7
msgid "Upcoming Fleets" msgid "Upcoming Fleets"
msgstr "" msgstr "接下来的队"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:14 #: allianceauth/optimer/templates/optimer/dashboard.ops.html:14
msgid "Operation" msgid "Operation"
@@ -1598,7 +1599,7 @@ msgstr "集结点"
#: allianceauth/optimer/templates/optimer/dashboard.ops.html:17 #: allianceauth/optimer/templates/optimer/dashboard.ops.html:17
#: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18 #: allianceauth/timerboard/templates/timerboard/dashboard.timers.html:18
msgid "EVE Time" msgid "EVE Time"
msgstr "" msgstr "EVE时间"
#: allianceauth/optimer/templates/optimer/fleetoptable.html:14 #: allianceauth/optimer/templates/optimer/fleetoptable.html:14
#: allianceauth/timerboard/templates/timerboard/timertable.html:13 #: allianceauth/timerboard/templates/timerboard/timertable.html:13
@@ -1793,17 +1794,17 @@ msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26 #: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:26
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:22
msgid "Activate" msgid "Activate"
msgstr "" msgstr "激活"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32 #: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:34
msgid "Reset Password" msgid "Reset Password"
msgstr "" msgstr "重置密码"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38 #: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:38
#: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40 #: allianceauth/services/modules/mumble/templates/services/mumble/mumble_service_ctrl.html:40
msgid "Deactivate" msgid "Deactivate"
msgstr "" msgstr "停用"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:45 #: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:45
msgid "Link Discord Server" msgid "Link Discord Server"
@@ -1820,7 +1821,7 @@ msgstr "在处理你的Discord账户时出错。"
#: allianceauth/services/modules/discord/views.py:102 #: allianceauth/services/modules/discord/views.py:102
msgid "Your Discord account has been successfully activated." msgid "Your Discord account has been successfully activated."
msgstr "" msgstr "你的discord账户已成功停用"
#: allianceauth/services/modules/discord/views.py:108 #: allianceauth/services/modules/discord/views.py:108
msgid "" msgid ""
@@ -2232,7 +2233,7 @@ msgstr "补损舰队创建"
#: allianceauth/srp/templates/srp/request.html:11 #: allianceauth/srp/templates/srp/request.html:11
#: allianceauth/srp/templates/srp/update.html:11 #: allianceauth/srp/templates/srp/update.html:11
msgid "Ship Replacement Program" msgid "Ship Replacement Program"
msgstr "" msgstr "补损"
#: allianceauth/srp/templates/srp/add.html:20 #: allianceauth/srp/templates/srp/add.html:20
msgid "Create SRP Fleet" msgid "Create SRP Fleet"
@@ -2257,7 +2258,7 @@ msgstr "舰队补损信息"
#: allianceauth/srp/templates/srp/data.html:17 #: allianceauth/srp/templates/srp/data.html:17
msgid "View Fleets" msgid "View Fleets"
msgstr "" msgstr "查看舰队"
#: allianceauth/srp/templates/srp/data.html:26 #: allianceauth/srp/templates/srp/data.html:26
msgid "Mark Incomplete" msgid "Mark Incomplete"
@@ -2374,11 +2375,11 @@ msgstr "创建补损请求"
#: allianceauth/srp/templates/srp/request.html:22 #: allianceauth/srp/templates/srp/request.html:22
msgid "Your SRP request" msgid "Your SRP request"
msgstr "" msgstr "你的补损请求"
#: allianceauth/srp/templates/srp/request.html:35 #: allianceauth/srp/templates/srp/request.html:35
msgid "Create SRP request" msgid "Create SRP request"
msgstr "" msgstr "创建补损请求"
#: allianceauth/srp/templates/srp/update.html:7 #: allianceauth/srp/templates/srp/update.html:7
#: allianceauth/srp/templates/srp/update.html:16 #: allianceauth/srp/templates/srp/update.html:16
@@ -2387,7 +2388,7 @@ msgstr "上传战报链接"
#: allianceauth/srp/templates/srp/update.html:22 #: allianceauth/srp/templates/srp/update.html:22
msgid "After Action Report" msgid "After Action Report"
msgstr "" msgstr "战报"
#: allianceauth/srp/templates/srp/update.html:31 #: allianceauth/srp/templates/srp/update.html:31
msgid "SRP Fleet Does Not Exist" msgid "SRP Fleet Does Not Exist"
@@ -2395,7 +2396,7 @@ msgstr "补损舰队不存在啊,老哥你在好好看看?"
#: allianceauth/srp/templates/srp/update.html:40 #: allianceauth/srp/templates/srp/update.html:40
msgid "Update AAR link" msgid "Update AAR link"
msgstr "" msgstr "更新战报链接"
#: allianceauth/srp/views.py:85 #: allianceauth/srp/views.py:85
#, python-format #, python-format

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,7 +5,7 @@
<div class="col-auto px-0"> <div class="col-auto px-0">
<div class="collapse collapse-horizontal" tabindex="-1" id="sidebar"> <div class="collapse collapse-horizontal" tabindex="-1" id="sidebar">
<div> <div>
<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 %}"> <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 %}">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<ul id="sidebar-menu" class="navbar-nav flex-column mb-auto overflow-auto pt-2"> <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"> <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,6 +1,8 @@
from django.apps import AppConfig from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class NotificationsConfig(AppConfig): class NotificationsConfig(AppConfig):
name = 'allianceauth.notifications' name = 'allianceauth.notifications'
label = 'notifications' label = 'notifications'
verbose_name = _('Notifications')

View File

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

View File

@@ -15,14 +15,14 @@
<li class="nav-item"> <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"> <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" %} {% translate "Unread" %}
<span class="badge bg-secondary">{{ unread|length }}</span> <span class="badge text-bg-secondary">{{ unread|length }}</span>
</a> </a>
</li> </li>
<li class="nav-item"> <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"> <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" %} {% translate "Read" %}
<span class="badge bg-secondary">{{ read|length }}</span> <span class="badge text-bg-secondary">{{ read|length }}</span>
</a> </a>
</li> </li>
{% endblock %} {% endblock %}

View File

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

View File

@@ -1,6 +1,8 @@
from django.apps import AppConfig from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class OptimerConfig(AppConfig): class OptimerConfig(AppConfig):
name = 'allianceauth.optimer' name = 'allianceauth.optimer'
label = '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 "Operation" %}</th>
<th class="text-center">{% translate "Type" %}</th> <th class="text-center">{% translate "Type" %}</th>
<th class="text-center">{% translate "Form Up System" %}</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> </tr>
</thead> </thead>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -48,9 +48,9 @@
</a> </a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if request.user.is_superuser %} {% 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' %}"> <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 <i class="fa-solid fa-clock-rotate-left"></i> History
</a> </a>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -61,20 +61,20 @@
<td>{{ srpfleet.fleet_time | date:"Y-m-d H:i" }}</td> <td>{{ srpfleet.fleet_time | date:"Y-m-d H:i" }}</td>
<td>{{ srpfleet.fleet_doctrine }}</td> <td>{{ srpfleet.fleet_doctrine }}</td>
<td> <td>
<div class="badge bg-success"> <div class="badge text-bg-success">
{{ srpfleet.fleet_commander.character_name }} {{ srpfleet.fleet_commander.character_name }}
</div> </div>
</td> </td>
<td> <td>
{% if srpfleet.fleet_srp_aar_link %} {% if srpfleet.fleet_srp_aar_link %}
<a href="{{ srpfleet.fleet_srp_aar_link }}" target="_blank" class="badge bg-primary">{% translate "Link" %}</a> <a href="{{ srpfleet.fleet_srp_aar_link }}" target="_blank" class="badge text-bg-primary">{% translate "Link" %}</a>
{% endif %} {% endif %}
</td> </td>
<td> <td>
{% if srpfleet.fleet_srp_code %} {% if srpfleet.fleet_srp_code %}
<a class="badge bg-warning" href="{% url 'srp:request' srpfleet.fleet_srp_code %}">{{ srpfleet.fleet_srp_code }}</a> <a class="badge text-bg-warning" href="{% url 'srp:request' srpfleet.fleet_srp_code %}">{{ srpfleet.fleet_srp_code }}</a>
{% else %} {% else %}
<div class="badge bg-danger"> <div class="badge text-bg-danger">
{% translate "Disabled" %} {% translate "Disabled" %}
</div> </div>
{% endif %} {% endif %}
@@ -83,17 +83,17 @@
<td> <td>
{% if srpfleet.fleet_srp_status == "" %} {% if srpfleet.fleet_srp_status == "" %}
<div class="badge bg-warning"> <div class="badge text-bg-warning">
{% translate "Pending" %} {% translate "Pending" %}
</div> </div>
{% else %} {% else %}
<div class="badge bg-success"> <div class="badge text-bg-success">
{% translate "Completed" %} {% translate "Completed" %}
</div> </div>
{% endif %} {% endif %}
</td> </td>
<td> <td>
<div class="badge bg-warning">{{ srpfleet.pending_requests }}</div> <div class="badge text-bg-warning">{{ srpfleet.pending_requests }}</div>
</td> </td>
<td class="text-end text-nowrap"> <td class="text-end text-nowrap">
<a href="{% url 'srp:fleet' srpfleet.id %}" class="btn btn-primary btn-sm m-1" title="View"> <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 { @media all {
.nav-item-eve-time .eve-time-wrapper { .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(() => { setInterval(() => {
renderClock($('.eve-time-wrapper .eve-time-clock')); 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: * condition:
* only if moment.js is loaded before, * only if moment.js is loaded before,

View File

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

View File

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

View File

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

View File

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

View File

@@ -20,7 +20,7 @@
<div class="collapse navbar-collapse auth-menus-collapse"> <div class="collapse navbar-collapse auth-menus-collapse">
<ul class="nav navbar-nav navbar-right navbar-pills"> <ul class="nav navbar-nav navbar-right navbar-pills">
<li class="nav-item-eve-time"> <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> </li>
{% if user.is_authenticated %} {% if user.is_authenticated %}

View File

@@ -1,3 +1,3 @@
{% load static %} {% load static %}
<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 }}"> <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 }}">

View File

@@ -67,6 +67,26 @@ def get_datatables_language_static(language: str) -> str:
return static_url 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 @register.simple_tag
def get_momentjs_language_static(language: str) -> str: def get_momentjs_language_static(language: str) -> str:
@@ -88,3 +108,24 @@ def get_momentjs_language_static(language: str) -> str:
) )
return static_url 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,6 +78,13 @@ class AuthUtils:
except State.DoesNotExist: except State.DoesNotExist:
return cls.create_state('Member', 100, disconnect_signals=True) 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 @classmethod
def get_guest_state(cls): def get_guest_state(cls):
cls.disconnect_signals() cls.disconnect_signals()

View File

@@ -1,6 +1,8 @@
from django.apps import AppConfig from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class TimerBoardConfig(AppConfig): class TimerBoardConfig(AppConfig):
name = 'allianceauth.timerboard' name = 'allianceauth.timerboard'
label = '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) future_time = datetime.timedelta(days=days_left, hours=hours_left, minutes=minutes_left)
current_time = timezone.now() current_time = timezone.now()
eve_time = current_time + future_time 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: elif absolute_time:
# Use absolute time # Use absolute time
eve_time = absolute_time eve_time = absolute_time

View File

@@ -0,0 +1,18 @@
# 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,6 +57,7 @@ class Timer(models.Model):
ANCHORING = "ANCHORING", _("Anchoring") ANCHORING = "ANCHORING", _("Anchoring")
UNANCHORING = "UNANCHORING", _("Unanchoring") UNANCHORING = "UNANCHORING", _("Unanchoring")
ABANDONED = "ABANDONED", _("Abandoned") ABANDONED = "ABANDONED", _("Abandoned")
THEFT = "THEFT", _("Theft")
details = models.CharField(max_length=254, default="") details = models.CharField(max_length=254, default="")
system = 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 "Timer" %}</th>
<th class="text-center">{% translate "Type" %}</th> <th class="text-center">{% translate "Type" %}</th>
<th class="text-center">{% translate "System" %}</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> </tr>
</thead> </thead>
@@ -30,17 +30,17 @@
</td> </td>
<td class="text-center" nowrap> <td class="text-center" nowrap>
{% if timer.objective == "Hostile" %} {% if timer.objective == "Hostile" %}
<div class="badge bg-danger"> <div class="badge text-bg-danger">
{% translate "Hostile" %} {% translate "Hostile" %}
</div> </div>
{% endif %} {% endif %}
{% if timer.objective == "Friendly" %} {% if timer.objective == "Friendly" %}
<div class="badge bg-primary"> <div class="badge text-bg-primary">
{% translate "Friendly" %} {% translate "Friendly" %}
</div> </div>
{% endif %} {% endif %}
{% if timer.objective == "Neutral" %} {% if timer.objective == "Neutral" %}
<div class="badge bg-secondary"> <div class="badge text-bg-secondary">
{% translate "Neutral" %} {% translate "Neutral" %}
</div> </div>
{% endif %} {% endif %}

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@@ -81,7 +81,7 @@ Example implementation for a celery chain:
```python ```python
from allianceauth.services.hooks import get_extension_logger from allianceauth.services.hooks import get_extension_logger
from celery import shared_task, chain from celery import shared_task, group
logger = get_extension_logger(__name__) logger = get_extension_logger(__name__)
@@ -98,18 +98,23 @@ def long_runner():
task_signature = example.si() task_signature = example.si()
my_tasks.append(task_signature) my_tasks.append(task_signature)
chain(my_tasks).delay() group(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. 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. 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} :::{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. 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. 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.
::: :::