mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-08 20:10:17 +02:00
Compare commits
10 Commits
180bc7ca64
...
8a20125152
Author | SHA1 | Date | |
---|---|---|---|
|
8a20125152 | ||
|
12250ef0c2 | ||
|
bde9802583 | ||
|
1b30b86d2b | ||
|
0707b9b98c | ||
|
b22a379db2 | ||
|
bb2e0aabbc | ||
|
449991d846 | ||
|
dd42c2b074 | ||
|
abff1b0add |
@ -1,17 +1,15 @@
|
||||
{% load i18n %}
|
||||
|
||||
<div class="dropdown">
|
||||
<form action="{% url 'set_language' %}" method="post">
|
||||
{% csrf_token %}
|
||||
<form class="dropdown-item" action="{% url 'set_language' %}" method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
<select class="form-select" onchange="this.form.submit()" class="form-control" id="lang-select" name="language">
|
||||
{% get_available_languages as LANGUAGES %}
|
||||
<select class="form-select" onchange="this.form.submit()" class="form-control" id="lang-select" name="language">
|
||||
{% get_available_languages as LANGUAGES %}
|
||||
|
||||
{% for lang_code, lang_name in LANGUAGES %}
|
||||
<option lang="{{ lang_code }}" value="{{ lang_code }}"{% if lang_code == LANGUAGE_CODE %} selected{% endif %}>
|
||||
{{ lang_code|language_name_local|capfirst }} ({{ lang_code }})
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</form>
|
||||
</div>
|
||||
{% for lang_code, lang_name in LANGUAGES %}
|
||||
<option lang="{{ lang_code }}" value="{{ lang_code }}"{% if lang_code == LANGUAGE_CODE %} selected{% endif %}>
|
||||
{{ lang_code|language_name_local|capfirst }} ({{ lang_code }})
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</form>
|
||||
|
@ -14,6 +14,16 @@ class EveCharacterProviderManager:
|
||||
class EveCharacterManager(models.Manager):
|
||||
provider = EveCharacterProviderManager()
|
||||
|
||||
def exclude_biomassed(self):
|
||||
"""
|
||||
Get a queryset of EveCharacter objects, excluding the "Doomheim" corporation (1000001).
|
||||
|
||||
:return:
|
||||
:rtype:
|
||||
"""
|
||||
|
||||
return self.exclude(corporation_id=1000001)
|
||||
|
||||
def create_character(self, character_id) -> models.Model:
|
||||
return self.create_character_obj(self.provider.get_character(character_id))
|
||||
|
||||
|
@ -10,24 +10,39 @@ from allianceauth.authentication.models import CharacterOwnership
|
||||
from allianceauth.eveonline.models import EveCharacter
|
||||
|
||||
|
||||
def get_all_characters_from_user(user: User) -> list:
|
||||
def get_all_characters_from_user(user: User, main_first: bool = False) -> list:
|
||||
"""
|
||||
Get all characters from a user or an empty list
|
||||
when no characters are found for the user or the user is None
|
||||
Get all characters from a user
|
||||
This function retrieves all characters associated with a given user, optionally ordering them
|
||||
with the main character first.
|
||||
If the user is None, an empty list is returned.
|
||||
|
||||
:param user:
|
||||
:type user:
|
||||
:return:
|
||||
:rtype:
|
||||
:param user: The user whose characters are to be retrieved
|
||||
:type user: User
|
||||
:param main_first: If True, the main character will be listed first
|
||||
:type main_first: bool
|
||||
:return: A list of EveCharacter objects associated with the user
|
||||
:rtype: list[EveCharacter]
|
||||
"""
|
||||
|
||||
if user is None:
|
||||
return []
|
||||
|
||||
try:
|
||||
characters = [
|
||||
char.character for char in CharacterOwnership.objects.filter(user=user)
|
||||
]
|
||||
if main_first:
|
||||
characters = [
|
||||
char.character
|
||||
for char in CharacterOwnership.objects.filter(user=user).order_by(
|
||||
"-character__userprofile", "character__character_name"
|
||||
)
|
||||
]
|
||||
else:
|
||||
characters = [
|
||||
char.character
|
||||
for char in CharacterOwnership.objects.filter(user=user).order_by(
|
||||
"character__character_name"
|
||||
)
|
||||
]
|
||||
except AttributeError:
|
||||
return []
|
||||
|
||||
|
@ -2,28 +2,51 @@
|
||||
{% load evelinks %}
|
||||
{% load theme_tags %}
|
||||
|
||||
<div id="aa-user-info" class="w-100 d-flex flex-column justify-content-center align-items-center text-center py-1 border-top border-secondary {% if not user.is_authenticated %}position-absolute bottom-0{% endif %}">
|
||||
<div
|
||||
id="aa-user-info"
|
||||
class="w-100 d-flex flex-column justify-content-center align-items-center text-center py-1 border-top border-secondary {% if not user.is_authenticated %}position-absolute bottom-0{% endif %}"
|
||||
>
|
||||
<div class="d-flex mb-0 w-100">
|
||||
<div class="p-2 position-relative m-2">
|
||||
{% if user.is_authenticated %}
|
||||
{% with request.user.profile.main_character as main %}
|
||||
<img class="rounded-circle" src="{{ main.character_id|character_portrait_url:64 }}" alt="{{ main.character_name }}">
|
||||
<img class="rounded-circle position-absolute bottom-0 start-0" src="{{ main.corporation_logo_url_32 }}" alt="{{ main.corporation_name }}">
|
||||
<img
|
||||
class="rounded-circle"
|
||||
src="{{ main.character_id|character_portrait_url:64 }}"
|
||||
alt="{{ main.character_name }}"
|
||||
>
|
||||
|
||||
<img
|
||||
class="rounded-circle position-absolute bottom-0 start-0"
|
||||
src="{{ main.corporation_logo_url_32 }}"
|
||||
alt="{{ main.corporation_name }}"
|
||||
>
|
||||
|
||||
{% if main.alliance_id %}
|
||||
<img class="rounded-circle position-absolute bottom-0 end-0" src="{{ main.alliance_logo_url_32 }}" alt="{{ main.alliance_name }}">
|
||||
<img
|
||||
class="rounded-circle position-absolute bottom-0 end-0"
|
||||
src="{{ main.alliance_logo_url_32 }}"
|
||||
alt="{{ main.alliance_name }}"
|
||||
>
|
||||
{% elif main.faction_id %}
|
||||
<img class="rounded-circle position-absolute bottom-0 end-0" src="{{ main.faction_logo_url_32 }}" alt="{{ main.faction_name }}">
|
||||
<img
|
||||
class="rounded-circle position-absolute bottom-0 end-0"
|
||||
src="{{ main.faction_logo_url_32 }}"
|
||||
alt="{{ main.faction_name }}"
|
||||
>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
{% include "bundles/image-auth-logo.html" with logo_width="64px" %}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="align-self-center text-start">
|
||||
{% if user.is_authenticated %}
|
||||
{% with request.user.profile.main_character as main %}
|
||||
<h5 class="m-0">{{ main.character_name }}</h5>
|
||||
<p class="m-0 small">{{ main.corporation_name }}</p>
|
||||
|
||||
{% if main.alliance_id %}
|
||||
<p class="m-0 small">{{ main.alliance_name }}</p>
|
||||
{% elif main.faction_id %}
|
||||
@ -34,56 +57,106 @@
|
||||
<h5 class="m-0">{{ SITE_NAME }}</h5>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<div class="ms-auto dropup">
|
||||
<button type="button" class="h-100 btn" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fa-solid fa-gear fa-fw text-light"></i>
|
||||
</button>
|
||||
|
||||
<ul class="dropdown-menu" style="min-width: 200px;">
|
||||
<li><h6 class="dropdown-header">{% translate "Language" %}</h6></li>
|
||||
<li>
|
||||
<a class="dropdown-item">{% include "public/lang_select.html" %}</a>
|
||||
</li>
|
||||
<li><h6 class="dropdown-header">{% translate "Theme" %}</h6></li>
|
||||
|
||||
<li>
|
||||
<a class="dropdown-item">
|
||||
{% theme_select %}
|
||||
</a>
|
||||
{% include "public/lang_select.html" %}
|
||||
</li>
|
||||
|
||||
{% theme_select %}
|
||||
|
||||
{% if user.is_superuser %}
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><h6 class="dropdown-header">{% translate "Super User" %}</h6></li>
|
||||
|
||||
<li>
|
||||
<a class="dropdown-item" href="https://allianceauth.readthedocs.io/" title="Alliance Auth Documentation"><i class="fa-solid fa-book fa-fw"></i> Alliance Auth Documentation</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="https://discord.gg/fjnHAmk" title="Alliance Auth Discord"><i class="fa-brands fa-discord fa-fw"></i> Alliance Auth Discord</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="dropdown-item" href="https://gitlab.com/allianceauth/allianceauth" title="Alliance Auth Git"><i class="fa-brands fa-gitlab fa-fw"></i> Alliance Auth Git</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if user.is_staff %}
|
||||
<li>
|
||||
<a class="dropdown-item" href="{% url 'admin:index' %}">
|
||||
<i class="fa-solid fa-gear fa-fw"></i> {% translate "Admin" %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
{% if user.is_authenticated %}
|
||||
<li>
|
||||
<a class="dropdown-item" href="{% url 'authentication:token_management' %}">
|
||||
<i class="fa-solid fa-user-lock fa-fw"></i> Token Management
|
||||
<a
|
||||
class="dropdown-item"
|
||||
href="https://allianceauth.readthedocs.io/"
|
||||
title="{% translate 'Alliance Auth Documentation' %}"
|
||||
>
|
||||
<i class="fa-solid fa-book fa-fw"></i>
|
||||
{% translate "Alliance Auth Documentation" %}
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="dropdown-item text-danger" href="{% url 'logout' %}" title="{% translate 'Sign Out' %}"><i class="fa-solid fa-right-from-bracket fa-fw "></i> {% translate 'Sign Out' %}</a>
|
||||
<a
|
||||
class="dropdown-item"
|
||||
href="https://discord.gg/fjnHAmk"
|
||||
title="{% translate 'Alliance Auth Discord' %}"
|
||||
>
|
||||
<i class="fa-brands fa-discord fa-fw"></i>
|
||||
{% translate "Alliance Auth Discord" %}
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a
|
||||
class="dropdown-item"
|
||||
href="https://gitlab.com/allianceauth/allianceauth"
|
||||
title="{% translate 'Alliance Auth Git' %}"
|
||||
>
|
||||
<i class="fa-brands fa-gitlab fa-fw"></i>
|
||||
{% translate "Alliance Auth Git" %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if user.is_staff %}
|
||||
<li>
|
||||
<a
|
||||
class="dropdown-item"
|
||||
href="{% url 'admin:index' %}"
|
||||
title="{% translate 'Admin' %}"
|
||||
>
|
||||
<i class="fa-solid fa-gear fa-fw"></i>
|
||||
{% translate "Admin" %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
|
||||
{% if user.is_authenticated %}
|
||||
<li>
|
||||
<a
|
||||
class="dropdown-item"
|
||||
href="{% url 'authentication:token_management' %}"
|
||||
title="{% translate 'Token Management' %}"
|
||||
>
|
||||
<i class="fa-solid fa-user-lock fa-fw"></i>
|
||||
{% translate "Token Management" %}
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a
|
||||
class="dropdown-item text-danger"
|
||||
href="{% url 'logout' %}"
|
||||
title="{% translate 'Sign Out' %}"
|
||||
>
|
||||
<i class="fa-solid fa-right-from-bracket fa-fw"></i>
|
||||
{% translate 'Sign Out' %}
|
||||
</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li>
|
||||
<a class="dropdown-item text-success" href="{% url 'authentication:login' %}" title="{% translate 'Sign In' %}"> <i class="fa-solid fa-right-to-bracket fa-fw "></i> {% translate 'Sign In' %}</a>
|
||||
<a
|
||||
class="dropdown-item text-success"
|
||||
href="{% url 'authentication:login' %}"
|
||||
title="{% translate 'Sign In' %}"
|
||||
>
|
||||
<i class="fa-solid fa-right-to-bracket fa-fw"></i>
|
||||
{% translate 'Sign In' %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
@ -675,7 +675,7 @@ class DiscordClient:
|
||||
)
|
||||
logger.debug('%s: response:\n%s', uid, r.text)
|
||||
if not r.ok:
|
||||
logger.warning(
|
||||
logger.error(
|
||||
'%s: Discord API returned error code %d and this response: %s',
|
||||
uid,
|
||||
r.status_code,
|
||||
|
@ -1,13 +1,21 @@
|
||||
{% load i18n %}
|
||||
|
||||
<form action="{% url 'theme' %}?next={{ next|urlencode }}" method="post">
|
||||
{% csrf_token %}
|
||||
{% if themes|length > 1 %}
|
||||
<li><h6 class="dropdown-header">{% translate "Theme" %}</h6></li>
|
||||
|
||||
<select name="theme" class="form-select" aria-label="" onchange="this.form.submit()">
|
||||
<option selected>{% translate "Select Theme" %}</option>
|
||||
<li>
|
||||
<form class="dropdown-item" action="{% url 'theme' %}?next={{ next|urlencode }}" method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for theme in themes %}
|
||||
<option value="{{ theme.get_name }}"{% if selected_theme.name == theme.name %} selected="selected"{% endif %}>{{ theme.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</form>
|
||||
<select name="theme" class="form-select" onchange="this.form.submit()">
|
||||
<option selected>{% translate "Select Theme" %}</option>
|
||||
|
||||
{% for theme in themes %}
|
||||
<option value="{{ theme.get_name }}"{% if selected_theme.name == theme.name %} selected="selected"{% endif %}>
|
||||
{{ theme.name }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</form>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
@ -43,7 +43,7 @@ if the `EveCharacter` has no user.
|
||||
|
||||
### get_all_characters_from_user
|
||||
|
||||
This is to get all character objects (`EveCharacter`) of a user.
|
||||
This is to get all character objects (`EveCharacter`) of a user (alphabetically sorted).
|
||||
|
||||
Given we have a `User` object called `my_user` and we want to get all characters:
|
||||
|
||||
@ -51,12 +51,16 @@ Given we have a `User` object called `my_user` and we want to get all characters
|
||||
# Alliance Auth
|
||||
from allianceauth.framework.api.user import get_all_characters_from_user
|
||||
|
||||
characters = get_all_characters_from_user(user=my_user)
|
||||
characters = get_all_characters_from_user(user=my_user, main_first=False)
|
||||
```
|
||||
|
||||
Now, `characters` is a `list` containing all `EveCharacter` objects of the user.
|
||||
If the user is `None`, an empty `list` will be returned.
|
||||
|
||||
The second parameter `main_first` is optional and defaults to `False`.
|
||||
If set to `True`, the function will return the main character as the first
|
||||
item in the list of characters.
|
||||
|
||||
### get_main_character_from_user
|
||||
|
||||
This is to get the main character object (`EveCharacter`) of a user.
|
||||
|
Loading…
x
Reference in New Issue
Block a user