mirror of
https://github.com/eduardogsilva/wireguard_webadmin.git
synced 2025-04-19 00:45:16 +00:00
Added peer sorting functionality
This commit is contained in:
parent
6e22eafb05
commit
7ecf111fbe
@ -28,10 +28,21 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
{{ peer.public_key|slice:":16" }}{% if peer.public_key|length > 16 %}...{% endif %}
|
{{ peer.public_key|slice:":16" }}{% if peer.public_key|length > 16 %}...{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</h5><span>
|
</h5>
|
||||||
<a href="javascript:void(0);" onclick="openImageLightbox('/tools/download_peer_config/?uuid={{ peer.uuid }}&format=qrcode');"><i class="fas fa-qrcode"></i></a>
|
<span>
|
||||||
<a href="/tools/download_peer_config/?uuid={{ peer.uuid }}"><i class="fas fa-download"></i></a>
|
{% if user_acl.user_level >= 30 %}
|
||||||
<a href="/peer/manage/?peer={{ peer.uuid }}"><i class="far fa-edit"></i></a></span>
|
<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>
|
</div>
|
||||||
{% comment %}This needs to be improved{% endcomment %}
|
{% comment %}This needs to be improved{% endcomment %}
|
||||||
<p>
|
<p>
|
||||||
|
@ -86,7 +86,7 @@ def list_network_interfaces():
|
|||||||
|
|
||||||
|
|
||||||
def default_sort_peers(wireguard_instance: WireGuardInstance):
|
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']
|
highest_sort_order = Peer.objects.filter(wireguard_instance=wireguard_instance).aggregate(Max('sort_order'))['sort_order__max']
|
||||||
if not highest_sort_order:
|
if not highest_sort_order:
|
||||||
highest_sort_order = 0
|
highest_sort_order = 0
|
||||||
@ -97,3 +97,20 @@ def default_sort_peers(wireguard_instance: WireGuardInstance):
|
|||||||
peer.save()
|
peer.save()
|
||||||
new_sort_order += 1
|
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
|
from django.db.models import Max
|
||||||
import subprocess
|
import subprocess
|
||||||
import ipaddress
|
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 django.http import Http404
|
||||||
from wireguard_peer.forms import PeerAllowedIPForm, PeerForm
|
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):
|
if user_has_access_to_instance(user_acl, current_instance):
|
||||||
add_peer_enabled = True
|
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)
|
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
|
@login_required
|
||||||
def view_wireguard_peer_manage(request):
|
def view_wireguard_peer_manage(request):
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
|
@ -134,6 +134,6 @@ STATICFILES_DIRS = [
|
|||||||
DNS_CONFIG_FILE = '/etc/dnsmasq/wireguard_webadmin_dns.conf'
|
DNS_CONFIG_FILE = '/etc/dnsmasq/wireguard_webadmin_dns.conf'
|
||||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
|
||||||
WIREGUARD_WEBADMIN_VERSION = 9701
|
WIREGUARD_WEBADMIN_VERSION = 9702
|
||||||
|
|
||||||
from wireguard_webadmin.production_settings import *
|
from wireguard_webadmin.production_settings import *
|
||||||
|
@ -17,7 +17,7 @@ Including another URLconf
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
from wireguard.views import view_welcome, view_wireguard_status, view_wireguard_manage_instance
|
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 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 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
|
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_static_host/', view_manage_static_host, name='manage_static_host'),
|
||||||
path('dns/manage_settings/', view_manage_dns_settings, name='manage_dns_settings'),
|
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/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/', view_wireguard_peer_manage, name='wireguard_peer_manage'),
|
||||||
path('peer/manage_ip_address/', view_manage_ip_address, name='manage_ip_address'),
|
path('peer/manage_ip_address/', view_manage_ip_address, name='manage_ip_address'),
|
||||||
path('console/', view_console, name='console'),
|
path('console/', view_console, name='console'),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user