mirror of
https://github.com/eduardogsilva/wireguard_webadmin.git
synced 2025-03-18 18:14:02 +00:00
Added peer sorting functionality
This commit is contained in:
parent
6e22eafb05
commit
7ecf111fbe
@ -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>
|
||||
|
@ -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
|
@ -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':
|
||||
|
@ -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 *
|
||||
|
@ -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'),
|
||||
|
Loading…
Reference in New Issue
Block a user