Compare commits

..

11 Commits

Author SHA1 Message Date
Aaron Kable
3e7d810bb9 Merge branch 'group-manager' into 'master'
[Feature] Group Management - Async Join/Leave and Datatables

See merge request allianceauth/allianceauth!1784
2026-01-02 02:43:29 +00:00
Ariel Rin
99c65d2a5d Merge branch 'helpful-comments' into 'master'
[ADD] Some helpful comments

See merge request allianceauth/allianceauth!1780
2026-01-02 02:43:08 +00:00
Ariel Rin
55125a8ff3 Merge branch 'missing-logo' into 'master'
[ADD] Missing logo to list of available SVG logos

See merge request allianceauth/allianceauth!1781
2026-01-02 02:35:23 +00:00
Ariel Rin
2fd0fcdbcb Merge branch 'notifications_fix' into 'master'
[Fix] wrong delete read url

See merge request allianceauth/allianceauth!1783
2026-01-02 02:35:11 +00:00
Swashman
2fe7bcf20e [Fix] wrong delete read url 2026-01-02 02:35:11 +00:00
Aaron Kable
0c0f2fd5ba minor fixes 2025-12-21 15:30:26 +08:00
Aaron Kable
b32f4ab243 Async Join/Leave, and Datatables 2025-12-21 15:21:27 +08:00
Ariel Rin
70f314e578 Merge branch 'development-team' into 'master'
[CHANGE] Update development team

See merge request allianceauth/allianceauth!1782
2025-12-10 08:57:02 +00:00
Peter Pfeufer
bc1b1c3a8f [CHANGE] Update development team 2025-12-10 09:40:47 +01:00
Peter Pfeufer
453512db64 [ADD] Missing logo to list of available SVG logos 2025-11-23 14:02:30 +01:00
Peter Pfeufer
4047159fd1 [ADD] Some helpful comments
Since this is one of the most occurring issues when editing `local.py`
2025-11-22 22:29:24 +01:00
7 changed files with 174 additions and 21 deletions

View File

@@ -63,7 +63,6 @@ Here is an example of the Alliance Auth web site with a mixture of Services, App
- [Aaron Kable](https://gitlab.com/aaronkable/) - [Aaron Kable](https://gitlab.com/aaronkable/)
- [Ariel Rin](https://gitlab.com/soratidus999/) - [Ariel Rin](https://gitlab.com/soratidus999/)
- [Col Crunch](https://gitlab.com/colcrunch/) - [Col Crunch](https://gitlab.com/colcrunch/)
- [Erik Kalkoken](https://gitlab.com/ErikKalkoken/)
- [Rounon Dax](https://gitlab.com/ppfeufer) - [Rounon Dax](https://gitlab.com/ppfeufer)
- [snipereagle1](https://gitlab.com/mckernanin) - [snipereagle1](https://gitlab.com/mckernanin)
@@ -71,6 +70,7 @@ Here is an example of the Alliance Auth web site with a mixture of Services, App
- [Adarnof](https://gitlab.com/adarnof/) - [Adarnof](https://gitlab.com/adarnof/)
- [Basraah](https://gitlab.com/basraah/) - [Basraah](https://gitlab.com/basraah/)
- [Erik Kalkoken](https://gitlab.com/ErikKalkoken/)
### Beta Testers / Bug Fixers ### Beta Testers / Bug Fixers

View File

@@ -43,19 +43,19 @@
</li> </li>
{% endblock header_nav_collapse_left %} {% endblock header_nav_collapse_left %}
{% block content %} {% block content %}
<div class="tab-content"> <div class="tab-content">
<div id="add" class="tab-pane active"> <div id="add" class="tab-pane active">
{% if acceptrequests %} {% if acceptrequests %}
<div class="table-responsive"> <div>
<table class="table"> <table id="table-add" class="table table-responsive">
<thead> <thead>
<tr> <tr>
<th>{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
<th>{% translate "Organization" %}</th> <th>{% translate "Organization" %}</th>
<th>{% translate "Group" %}</th> <th>{% translate "Group" %}</th>
<th></th> <th></th>
<th>{% translate "Corporation" %}</th>
</tr> </tr>
</thead> </thead>
@@ -89,13 +89,24 @@
<td>{{ acceptrequest.group.name }}</td> <td>{{ acceptrequest.group.name }}</td>
<td class="text-end"> <td class="text-end">
<a href="{% url 'groupmanagement:accept_request' acceptrequest.id %}" class="btn btn-success"> <div class="spinner-border spinner-border-sm mt-2 btns-join-{{acceptrequest.id}} d-none" role="status">
<span class="sr-only">Loading...</span>
</div>
<a id="{{acceptrequest.id}}" class="btn btn-success join-accept btns-join-{{acceptrequest.id}}">
{% translate "Accept" %} {% translate "Accept" %}
</a> </a>
<a href="{% url 'groupmanagement:reject_request' acceptrequest.id %}" class="btn btn-danger"> <a id="{{acceptrequest.id}}" class="btn btn-danger join-reject btns-join-{{acceptrequest.id}}">
{% translate "Reject" %} {% translate "Reject" %}
</a> </a>
</td> </td>
<td>
{% if acceptrequest.main_char %}
{{ acceptrequest.main_char.corporation_name }}
{% else %}
{% translate "(unknown)" %}
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@@ -111,14 +122,15 @@
{% if not show_leave_tab %} {% if not show_leave_tab %}
<div id="leave" class="tab-pane"> <div id="leave" class="tab-pane">
{% if leaverequests %} {% if leaverequests %}
<div class="table-responsive"> <div>
<table class="table"> <table id="table-rem" class="table table-responsive">
<thead> <thead>
<tr> <tr>
<th>{% translate "Character" %}</th> <th>{% translate "Character" %}</th>
<th>{% translate "Organization" %}</th> <th>{% translate "Organization" %}</th>
<th>{% translate "Group" %}</th> <th>{% translate "Group" %}</th>
<th></th> <th></th>
<th>{% translate "Corporation" %}</th>
</tr> </tr>
</thead> </thead>
@@ -152,14 +164,23 @@
<td>{{ leaverequest.group.name }}</td> <td>{{ leaverequest.group.name }}</td>
<td class="text-end"> <td class="text-end">
<a href="{% url 'groupmanagement:leave_accept_request' leaverequest.id %}" class="btn btn-success"> <div class="spinner-border spinner-border-sm mt-2 btns-leave-{{leaverequest.id}} d-none" role="status">
<span class="sr-only">Loading...</span>
</div>
<a id="{{leaverequest.id}}" class="btn btn-success accept leave-accept btns-leave-{{leaverequest.id}}">
{% translate "Accept" %} {% translate "Accept" %}
</a> </a>
<a id="{{leaverequest.id}}" class="btn btn-danger reject leave-reject btns-leave-{{leaverequest.id}}">
<a href="{% url 'groupmanagement:leave_reject_request' leaverequest.id %}" class="btn btn-danger">
{% translate "Reject" %} {% translate "Reject" %}
</a> </a>
</td> </td>
<td>
{% if leaverequest.main_char %}
{{ leaverequest.main_char.corporation_name }}
{% else %}
{% translate "(unknown)" %}
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@@ -172,3 +193,138 @@
{% endif %} {% endif %}
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %}
{% include 'bundles/datatables-js-bs5.html' %}
{% include "bundles/filterdropdown-js.html" %}
<script>
$(document).ready(function () {
let tableAdd = $("#table-add").DataTable({
filterDropDown: {
columns: [
{
idx: 4,
},
{
idx: 2,
}
],
bootstrap: true,
bootstrap_version: 5
},
columnDefs: [
{
target: 4,
visible: false,
},
],
paging: false,
responsive: true,
pageLength: -1
});
let tableRem = $("#table-rem").DataTable({
filterDropDown: {
columns: [
{
idx: 4,
},
{
idx: 2,
}
],
bootstrap: true,
bootstrap_version: 5
},
columnDefs: [
{
target: 4,
visible: false,
},
],
paging: false,
responsive: true,
pageLength: -1
});
// URL's for fetch requests
let acceptJoinURL = "{% url 'groupmanagement:accept_request' 0 %}";
acceptJoinURL = acceptJoinURL.substring(0, acceptJoinURL.length-2);
let rejectJoinURL = "{% url 'groupmanagement:reject_request' 0 %}";
rejectJoinURL = rejectJoinURL.substring(0, rejectJoinURL.length-2);
let acceptLeaveURL = "{% url 'groupmanagement:leave_accept_request' 0 %}";
acceptLeaveURL = acceptLeaveURL.substring(0, acceptLeaveURL.length-2);
let rejectLeaveURL = "{% url 'groupmanagement:leave_reject_request' 0 %}";
rejectLeaveURL = rejectLeaveURL.substring(0, rejectLeaveURL.length-2);
function removeRow(table, classLookup){
let btn = $(classLookup);
table.row($(btn[0]).parents('tr')).remove().draw();
}
function toggleButtons(classLookup){
let elems = document.querySelectorAll(classLookup);
elems.forEach(
function(e) {
e.classList.toggle('d-none');
}
);
}
function hitAuth(classLookup, table, URL){
toggleButtons(classLookup);
fetch(URL)
.then(response => {
if (!response.ok) {
toggleButtons(classLookup);
return
}
removeRow(table, classLookup)
})
.catch(error => {
toggleButtons(classLookup);
return;
});
toggleButtons(classLookup);
}
let acceptJoinButtons = document.querySelectorAll(".join-accept");
acceptJoinButtons.forEach(function(elem) {
elem.addEventListener("click", function(event) {
url = `${acceptJoinURL}${event.target.id}/`
let elemClass = `.btns-join-${event.target.id}`
hitAuth(elemClass, tableAdd, url)
});
});
let rejectJoinButtons = document.querySelectorAll(".join-reject");
rejectJoinButtons.forEach(function(elem) {
elem.addEventListener("click", function(event) {
url = `${rejectJoinURL}${event.target.id}/`
let elemClass = `.btns-join-${event.target.id}`
hitAuth(elemClass, tableAdd, url)
});
});
let acceptLeaveButtons = document.querySelectorAll(".leave-accept");
acceptLeaveButtons.forEach(function(elem) {
elem.addEventListener("click", function(event) {
url = `${acceptLeaveURL}${event.target.id}/`
let elemClass = `.btns-leave-${event.target.id}`
hitAuth(elemClass, tableRem, url)
});
});
let rejectLeaveButtons = document.querySelectorAll(".leave-reject");
rejectLeaveButtons.forEach(function(elem) {
elem.addEventListener("click", function(event) {
url = `${rejectLeaveURL}${event.target.id}/`
let elemClass = `.btns-leave-${event.target.id}`
hitAuth(elemClass, tableRem, url)
});
});
});
</script>
{% endblock extra_javascript %}
{% block extra_css %}
{% include 'bundles/datatables-css-bs5.html' %}
{% endblock %}

View File

@@ -33,7 +33,7 @@
{% include "framework/header/nav-collapse-icon.html" with fa_icon="fa-solid fa-check-double" url=nav_item_link title=nav_item_title icon_on_mobile=True %} {% include "framework/header/nav-collapse-icon.html" with fa_icon="fa-solid fa-check-double" url=nav_item_link title=nav_item_title icon_on_mobile=True %}
{% translate "Delete all read notifications" as nav_item_title %} {% translate "Delete all read notifications" as nav_item_title %}
{% url "notifications:mark_all_read" as nav_item_link %} {% url "notifications:delete_all_read" as nav_item_link %}
{% include "framework/header/nav-collapse-icon.html" with fa_icon="fa-solid fa-trash-can" url=nav_item_link title=nav_item_title icon_on_mobile=True %} {% include "framework/header/nav-collapse-icon.html" with fa_icon="fa-solid fa-trash-can" url=nav_item_link title=nav_item_title icon_on_mobile=True %}
{% endblock %} {% endblock %}

View File

@@ -57,10 +57,10 @@ DATABASES['default'] = {
# CCP's developer portal # CCP's developer portal
# Logging in to auth requires the publicData scope (can be overridden through the # Logging in to auth requires the publicData scope (can be overridden through the
# LOGIN_TOKEN_SCOPES setting). Other apps may require more (see their docs). # LOGIN_TOKEN_SCOPES setting). Other apps may require more (see their docs).
ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback" # Do NOT change this line!
ESI_SSO_CLIENT_ID = '' ESI_SSO_CLIENT_ID = ''
ESI_SSO_CLIENT_SECRET = '' ESI_SSO_CLIENT_SECRET = ''
ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback" ESI_USER_CONTACT_EMAIL = '' # A server maintainer that CCP can contact in case of issues.
ESI_USER_CONTACT_EMAIL = '' # A server maintainer that CCP can contact in case of issues.
# By default, emails are validated before new users can log in. # By default, emails are validated before new users can log in.
# It's recommended to use a free service like SparkPost or Elastic Email to send email. # It's recommended to use a free service like SparkPost or Elastic Email to send email.

View File

@@ -17,9 +17,7 @@ DATABASES["default"] = {
"PASSWORD": os.environ.get("AA_DB_PASSWORD"), "PASSWORD": os.environ.get("AA_DB_PASSWORD"),
"HOST": os.environ.get("AA_DB_HOST"), "HOST": os.environ.get("AA_DB_HOST"),
"PORT": os.environ.get("AA_DB_PORT", "3306"), "PORT": os.environ.get("AA_DB_PORT", "3306"),
"OPTIONS": { "OPTIONS": {"charset": os.environ.get("AA_DB_CHARSET", "utf8mb4")},
"charset": os.environ.get("AA_DB_CHARSET", "utf8mb4")
}
} }
# Register an application at https://developers.eveonline.com for Authentication # Register an application at https://developers.eveonline.com for Authentication
@@ -27,10 +25,9 @@ DATABASES["default"] = {
# to https://example.com/sso/callback substituting your domain for example.com # to https://example.com/sso/callback substituting your domain for example.com
# Logging in to auth requires the publicData scope (can be overridden through the # Logging in to auth requires the publicData scope (can be overridden through the
# LOGIN_TOKEN_SCOPES setting). Other apps may require more (see their docs). # LOGIN_TOKEN_SCOPES setting). Other apps may require more (see their docs).
ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback" # Do NOT change this line!
ESI_SSO_CLIENT_ID = os.environ.get("ESI_SSO_CLIENT_ID") ESI_SSO_CLIENT_ID = os.environ.get("ESI_SSO_CLIENT_ID")
ESI_SSO_CLIENT_SECRET = os.environ.get("ESI_SSO_CLIENT_SECRET") ESI_SSO_CLIENT_SECRET = os.environ.get("ESI_SSO_CLIENT_SECRET")
ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback"
ESI_USER_CONTACT_EMAIL = os.environ.get( ESI_USER_CONTACT_EMAIL = os.environ.get(
"ESI_USER_CONTACT_EMAIL" "ESI_USER_CONTACT_EMAIL"
) # A server maintainer that CCP can contact in case of issues. ) # A server maintainer that CCP can contact in case of issues.
@@ -70,7 +67,6 @@ INSTALLED_APPS += [
# 'allianceauth.permissions_tool', # 'allianceauth.permissions_tool',
# 'allianceauth.srp', # 'allianceauth.srp',
# 'allianceauth.timerboard', # 'allianceauth.timerboard',
# https://allianceauth.readthedocs.io/en/latest/features/services/index.html # https://allianceauth.readthedocs.io/en/latest/features/services/index.html
# 'allianceauth.services.modules.discord', # 'allianceauth.services.modules.discord',
# 'allianceauth.services.modules.discourse', # 'allianceauth.services.modules.discourse',

View File

@@ -28,6 +28,7 @@ The following icons are available in the Alliance Auth SVG sprite:
- `aa-logo`: The Alliance Auth logo - `aa-logo`: The Alliance Auth logo
- `aa-loading-spinner`: A loading spinner icon - `aa-loading-spinner`: A loading spinner icon
- `aa-mumble-logo`: The Mumble logo
### Alliance Auth Logo ### Alliance Auth Logo

View File

@@ -20,8 +20,8 @@ Make the following changes in your auth project's settings file (`local.py`):
# Be sure to set the callback URLto https://example.com/discord/callback/ # Be sure to set the callback URLto https://example.com/discord/callback/
# substituting your domain for example.com in Discord's developer portal # substituting your domain for example.com in Discord's developer portal
# (Be sure to add the trailing slash) # (Be sure to add the trailing slash)
DISCORD_CALLBACK_URL = f"{SITE_URL}/discord/callback/" # Do NOT change this line!
DISCORD_GUILD_ID = '' DISCORD_GUILD_ID = ''
DISCORD_CALLBACK_URL = f"{SITE_URL}/discord/callback/"
DISCORD_APP_ID = '' DISCORD_APP_ID = ''
DISCORD_APP_SECRET = '' DISCORD_APP_SECRET = ''
DISCORD_BOT_TOKEN = '' DISCORD_BOT_TOKEN = ''