mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2026-02-10 17:16:22 +01:00
Merge branch 'master' of https://gitlab.com/allianceauth/allianceauth into v2.9.x
This commit is contained in:
@@ -448,6 +448,8 @@ class StateAdmin(admin.ModelAdmin):
|
||||
elif db_field.name == "member_alliances":
|
||||
kwargs["queryset"] = EveAllianceInfo.objects.all()\
|
||||
.order_by(Lower('alliance_name'))
|
||||
elif db_field.name == "permissions":
|
||||
kwargs["queryset"] = Permission.objects.select_related("content_type").all()
|
||||
return super().formfield_for_manytomany(db_field, request, **kwargs)
|
||||
|
||||
def has_delete_permission(self, request, obj=None):
|
||||
|
||||
@@ -32,10 +32,12 @@ class EveCharacterManager(models.Manager):
|
||||
def update_character(self, character_id):
|
||||
return self.get(character_id=character_id).update_character()
|
||||
|
||||
def get_character_by_id(self, char_id):
|
||||
if self.filter(character_id=char_id).exists():
|
||||
return self.get(character_id=char_id)
|
||||
return None
|
||||
def get_character_by_id(self, character_id: int):
|
||||
"""Return character by character ID or None if not found."""
|
||||
try:
|
||||
return self.get(character_id=character_id)
|
||||
except self.model.DoesNotExist:
|
||||
return None
|
||||
|
||||
|
||||
class EveAllianceProviderManager:
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from django.apps import apps
|
||||
from django.contrib.auth.models import Permission
|
||||
from django.contrib import admin
|
||||
from django.contrib.auth.models import Group as BaseGroup, User
|
||||
from django.db.models import Count
|
||||
@@ -122,7 +123,7 @@ class GroupAdmin(admin.ModelAdmin):
|
||||
qs = super().get_queryset(request)
|
||||
if _has_auto_groups:
|
||||
qs = qs.prefetch_related('managedalliancegroup_set', 'managedcorpgroup_set')
|
||||
qs = qs.prefetch_related('authgroup__group_leaders')
|
||||
qs = qs.prefetch_related('authgroup__group_leaders').select_related('authgroup')
|
||||
qs = qs.annotate(
|
||||
member_count=Count('user', distinct=True),
|
||||
)
|
||||
@@ -168,6 +169,11 @@ class GroupAdmin(admin.ModelAdmin):
|
||||
filter_horizontal = ('permissions',)
|
||||
inlines = (AuthGroupInlineAdmin,)
|
||||
|
||||
def formfield_for_manytomany(self, db_field, request, **kwargs):
|
||||
if db_field.name == "permissions":
|
||||
kwargs["queryset"] = Permission.objects.select_related("content_type").all()
|
||||
return super().formfield_for_manytomany(db_field, request, **kwargs)
|
||||
|
||||
|
||||
class Group(BaseGroup):
|
||||
class Meta:
|
||||
|
||||
@@ -15,6 +15,7 @@ class Teamspeak3UserAdmin(ServicesUserAdmin):
|
||||
|
||||
@admin.register(AuthTS)
|
||||
class AuthTSgroupAdmin(admin.ModelAdmin):
|
||||
change_list_template = 'admin/teamspeak3/authts/change_list.html'
|
||||
ordering = ('auth_group__name', )
|
||||
list_select_related = True
|
||||
|
||||
@@ -28,7 +29,7 @@ class AuthTSgroupAdmin(admin.ModelAdmin):
|
||||
return [x for x in obj.ts_group.all().order_by('ts_group_id')]
|
||||
|
||||
_ts_group.short_description = 'ts groups'
|
||||
#_ts_group.admin_order_field = 'profile__state'
|
||||
# _ts_group.admin_order_field = 'profile__state'
|
||||
|
||||
|
||||
@admin.register(StateGroup)
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
{% extends "admin/change_list.html" %}
|
||||
{% load i18n static %}
|
||||
|
||||
{% block object-tools-items %}
|
||||
{{ block.super }}
|
||||
<li>
|
||||
<a href="{% url 'teamspeak3:admin_update_ts3_groups' %}" class="btn btn-high">
|
||||
Update TS3 groups
|
||||
</a>
|
||||
</li>
|
||||
{% endblock %}
|
||||
@@ -216,6 +216,24 @@ class Teamspeak3ViewsTestCase(TestCase):
|
||||
self.assertEqual(ts3_user.perm_key, '123abc')
|
||||
self.assertTrue(tasks_manager.return_value.__enter__.return_value.update_groups.called)
|
||||
|
||||
@mock.patch(MODULE_PATH + '.views.Teamspeak3Tasks')
|
||||
@mock.patch(MODULE_PATH + '.views.messages')
|
||||
def test_should_update_ts_groups(self, messages, Teamspeak3Tasks):
|
||||
# given
|
||||
self.member.is_superuser = True
|
||||
self.member.is_staff = True
|
||||
self.member.save()
|
||||
self.login()
|
||||
# when
|
||||
response = self.client.get(urls.reverse('teamspeak3:admin_update_ts3_groups'))
|
||||
# then
|
||||
self.assertRedirects(
|
||||
response, urls.reverse('admin:teamspeak3_authts_changelist'),
|
||||
target_status_code=200
|
||||
)
|
||||
self.assertTrue(messages.info.called)
|
||||
self.assertTrue(Teamspeak3Tasks.run_ts3_group_update.delay.called)
|
||||
|
||||
|
||||
class Teamspeak3SignalsTestCase(TestCase):
|
||||
def setUp(self):
|
||||
|
||||
@@ -6,12 +6,14 @@ app_name = 'teamspeak3'
|
||||
|
||||
module_urls = [
|
||||
# Teamspeak3 service control
|
||||
url(r'^activate/$', views.activate_teamspeak3,
|
||||
name='activate'),
|
||||
url(r'^deactivate/$', views.deactivate_teamspeak3,
|
||||
name='deactivate'),
|
||||
url(r'^reset_perm/$', views.reset_teamspeak3_perm,
|
||||
name='reset_perm'),
|
||||
url(r'^activate/$', views.activate_teamspeak3, name='activate'),
|
||||
url(r'^deactivate/$', views.deactivate_teamspeak3, name='deactivate'),
|
||||
url(r'^reset_perm/$', views.reset_teamspeak3_perm, name='reset_perm'),
|
||||
url(
|
||||
r'^admin_update_ts3_groups/$',
|
||||
views.admin_update_ts3_groups,
|
||||
name='admin_update_ts3_groups'
|
||||
),
|
||||
|
||||
# Teamspeak Urls
|
||||
url(r'^verify/$', views.verify_teamspeak3, name='verify'),
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import logging
|
||||
|
||||
from django.contrib import messages
|
||||
from django.contrib.admin.views.decorators import staff_member_required
|
||||
from django.contrib.auth.decorators import login_required, permission_required
|
||||
from django.shortcuts import render, redirect
|
||||
from django.conf import settings
|
||||
@@ -98,3 +99,11 @@ def reset_teamspeak3_perm(request):
|
||||
logger.error("Unsuccessful attempt to reset TS3 permission key for user %s" % request.user)
|
||||
messages.error(request, _('An error occurred while processing your TeamSpeak3 account.'))
|
||||
return redirect("services:services")
|
||||
|
||||
|
||||
@login_required
|
||||
@staff_member_required
|
||||
def admin_update_ts3_groups(request):
|
||||
Teamspeak3Tasks.run_ts3_group_update.delay()
|
||||
messages.info(request, "Started updating TS3 server groups...")
|
||||
return redirect("admin:teamspeak3_authts_changelist")
|
||||
|
||||
@@ -30,15 +30,7 @@
|
||||
<div class="row" id="site-body-wrapper">
|
||||
{% include 'allianceauth/side-menu.html' %}
|
||||
<div class="col-sm-10">
|
||||
{% if messages %}
|
||||
<br>
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{{ message.level_tag }}">{{ message }}</div>
|
||||
{% if not forloop.last %}
|
||||
<br>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% include 'allianceauth/messages.html' %}
|
||||
{% block content %}
|
||||
{% endblock content %}
|
||||
</div>
|
||||
|
||||
20
allianceauth/templates/allianceauth/messages.html
Normal file
20
allianceauth/templates/allianceauth/messages.html
Normal file
@@ -0,0 +1,20 @@
|
||||
{% if messages %}
|
||||
<br>
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{{ message.level_tag }} alert-dismissible" role="alert">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
{% if message.level_tag == "info" %}
|
||||
<i class="fas fa-info-circle"></i>
|
||||
{% elif message.level_tag == "success" %}
|
||||
<i class="fas fa-check-circle"></i>
|
||||
{% elif message.level_tag == "warning" %}
|
||||
<i class="fas fa-exclamation-circle"></i>
|
||||
{% elif message.level_tag == "danger" %}
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
{% endif %}
|
||||
{{ message }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
Reference in New Issue
Block a user