Added peer sorting functionality

This commit is contained in:
Eduardo Silva 2025-01-22 11:53:56 -03:00
parent 6e22eafb05
commit 7ecf111fbe
5 changed files with 77 additions and 10 deletions

View File

@ -28,10 +28,21 @@
{% else %}
{{ peer.public_key|slice:":16" }}{% if peer.public_key|length > 16 %}...{% endif %}
{% endif %}
</h5><span>
<a href="javascript:void(0);" onclick="openImageLightbox('/tools/download_peer_config/?uuid={{ peer.uuid }}&format=qrcode');"><i class="fas fa-qrcode"></i></a>
<a href="/tools/download_peer_config/?uuid={{ peer.uuid }}"><i class="fas fa-download"></i></a>
<a href="/peer/manage/?peer={{ peer.uuid }}"><i class="far fa-edit"></i></a></span>
</h5>
<span>
{% if user_acl.user_level >= 30 %}
<div class="d-inline-flex flex-column">
<a href="/peer/sort/?peer={{ peer.uuid }}&direction=up" style="line-height:0px"><i class="fas fa-sort-up"></i></a>
<div style="overflow:hidden;margin-top: -9px">
<a href="/peer/sort/?peer={{ peer.uuid }}&direction=down" style="position:relative;top:-11px"><i class="fas fa-sort-down"></i></a>
</div>
</div>
{% endif %}
<a href="javascript:void(0);" onclick="openImageLightbox('/tools/download_peer_config/?uuid={{ peer.uuid }}&format=qrcode');"><i class="fas fa-qrcode"></i></a>
<a href="/tools/download_peer_config/?uuid={{ peer.uuid }}"><i class="fas fa-download"></i></a>
<a href="/peer/manage/?peer={{ peer.uuid }}"><i class="far fa-edit"></i></a>
</span>
</div>
{% comment %}This needs to be improved{% endcomment %}
<p>

View File

@ -86,7 +86,7 @@ def list_network_interfaces():
def default_sort_peers(wireguard_instance: WireGuardInstance):
unsorted_peers = Peer.objects.filter(wireguard_instance=wireguard_instance, sort_order=0).order_by('created')
unsorted_peers = Peer.objects.filter(wireguard_instance=wireguard_instance, sort_order__lte=0).order_by('created')
highest_sort_order = Peer.objects.filter(wireguard_instance=wireguard_instance).aggregate(Max('sort_order'))['sort_order__max']
if not highest_sort_order:
highest_sort_order = 0
@ -96,4 +96,21 @@ def default_sort_peers(wireguard_instance: WireGuardInstance):
peer.sort_order = new_sort_order
peer.save()
new_sort_order += 1
return unsorted_peers
return unsorted_peers
def deduplicate_sort_order(wireguard_instance: WireGuardInstance):
peers = Peer.objects.filter(wireguard_instance=wireguard_instance)
for peer in peers:
duplicated_peers = peers.filter(sort_order=peer.sort_order).exclude(uuid=peer.uuid)
for duplicated_peer in duplicated_peers:
duplicated_peer.sort_order = 0
duplicated_peer.save()
return peers
def check_sort_order_conflict(peer: Peer):
peers = Peer.objects.filter(wireguard_instance=peer.wireguard_instance, sort_order=peer.sort_order).exclude(uuid=peer.uuid)
if peers.exists():
return True
return False

View File

@ -6,7 +6,7 @@ from django.contrib import messages
from django.db.models import Max
import subprocess
import ipaddress
from wgwadmlibrary.tools import user_has_access_to_peer, user_has_access_to_instance, user_allowed_instances, user_allowed_peers, default_sort_peers
from wgwadmlibrary.tools import user_has_access_to_peer, user_has_access_to_instance, user_allowed_instances, user_allowed_peers, default_sort_peers, deduplicate_sort_order, check_sort_order_conflict
from django.http import Http404
from wireguard_peer.forms import PeerAllowedIPForm, PeerForm
@ -71,10 +71,48 @@ def view_wireguard_peer_list(request):
if user_has_access_to_instance(user_acl, current_instance):
add_peer_enabled = True
context = {'page_title': page_title, 'wireguard_instances': wireguard_instances, 'current_instance': current_instance, 'peer_list': peer_list, 'pending_changes_warning': pending_changes_warning, 'add_peer_enabled': add_peer_enabled}
context = {'page_title': page_title, 'wireguard_instances': wireguard_instances, 'current_instance': current_instance, 'peer_list': peer_list, 'pending_changes_warning': pending_changes_warning, 'add_peer_enabled': add_peer_enabled, 'user_acl': user_acl}
return render(request, 'wireguard/wireguard_peer_list.html', context)
@login_required
def view_wireguard_peer_sort(request):
if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=30).exists():
return render(request, 'access_denied.html', {'page_title': 'Access Denied'})
peer = get_object_or_404(Peer, uuid=request.GET.get('peer'))
# check if the current sort order is duplicated with another peer
if check_sort_order_conflict(peer):
deduplicate_sort_order(peer.wireguard_instance)
redirect_url = f'/peer/list/?uuid={peer.wireguard_instance.uuid}#peer-{peer.public_key}'
direction = request.GET.get('direction')
sort_order_changed = False
if direction == 'up':
previous_peer = Peer.objects.filter(wireguard_instance=peer.wireguard_instance, sort_order__lt=peer.sort_order).order_by('-sort_order').first()
if previous_peer:
peer.sort_order, previous_peer.sort_order = previous_peer.sort_order, peer.sort_order
peer.save()
previous_peer.save()
sort_order_changed = True
else:
messages.warning(request, 'Cannot move peer up|Peer is already at the top.')
elif direction == 'down':
next_peer = Peer.objects.filter(wireguard_instance=peer.wireguard_instance, sort_order__gt=peer.sort_order).order_by('sort_order').first()
if next_peer:
peer.sort_order, next_peer.sort_order = next_peer.sort_order, peer.sort_order
peer.save()
next_peer.save()
sort_order_changed = True
else:
messages.warning(request, 'Cannot move peer down|Peer is already at the bottom.')
if sort_order_changed:
# check if the new sort order is duplicated with another peer
if check_sort_order_conflict(peer):
deduplicate_sort_order(peer.wireguard_instance)
return redirect(redirect_url)
@login_required
def view_wireguard_peer_manage(request):
if request.method == 'POST':

View File

@ -134,6 +134,6 @@ STATICFILES_DIRS = [
DNS_CONFIG_FILE = '/etc/dnsmasq/wireguard_webadmin_dns.conf'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
WIREGUARD_WEBADMIN_VERSION = 9701
WIREGUARD_WEBADMIN_VERSION = 9702
from wireguard_webadmin.production_settings import *

View File

@ -17,7 +17,7 @@ Including another URLconf
from django.contrib import admin
from django.urls import path
from wireguard.views import view_welcome, view_wireguard_status, view_wireguard_manage_instance
from wireguard_peer.views import view_wireguard_peer_list, view_wireguard_peer_manage, view_manage_ip_address
from wireguard_peer.views import view_wireguard_peer_list, view_wireguard_peer_manage, view_manage_ip_address, view_wireguard_peer_sort
from console.views import view_console
from user_manager.views import view_user_list, view_manage_user, view_peer_group_list, view_peer_group_manage
from accounts.views import view_create_first_user, view_login, view_logout
@ -36,6 +36,7 @@ urlpatterns = [
path('dns/manage_static_host/', view_manage_static_host, name='manage_static_host'),
path('dns/manage_settings/', view_manage_dns_settings, name='manage_dns_settings'),
path('peer/list/', view_wireguard_peer_list, name='wireguard_peer_list'),
path('peer/sort/', view_wireguard_peer_sort, name='wireguard_peer_sort'),
path('peer/manage/', view_wireguard_peer_manage, name='wireguard_peer_manage'),
path('peer/manage_ip_address/', view_manage_ip_address, name='manage_ip_address'),
path('console/', view_console, name='console'),