From 6e22eafb05eabd5f2d7cec97ca6b36f6126294f2 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Wed, 22 Jan 2025 10:04:37 -0300 Subject: [PATCH] Add sort_order field to Peer model and create a default order --- wgwadmlibrary/tools.py | 19 +++++++++++++++++-- wireguard/migrations/0025_peer_sort_order.py | 18 ++++++++++++++++++ wireguard/models.py | 1 + wireguard_peer/views.py | 3 ++- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 wireguard/migrations/0025_peer_sort_order.py diff --git a/wgwadmlibrary/tools.py b/wgwadmlibrary/tools.py index 0780033..ebd08b2 100644 --- a/wgwadmlibrary/tools.py +++ b/wgwadmlibrary/tools.py @@ -2,6 +2,7 @@ import ipaddress, re import subprocess from wireguard.models import Peer, WireGuardInstance from user_manager.models import UserAcl +from django.db.models import Max def user_has_access_to_instance(user_acl: UserAcl, instance: WireGuardInstance): @@ -35,7 +36,7 @@ def user_allowed_instances(user_acl: UserAcl): def user_allowed_peers(user_acl: UserAcl, instance: WireGuardInstance): if not user_acl.peer_groups.exists(): - return Peer.objects.filter(wireguard_instance=instance).order_by('name') + return Peer.objects.filter(wireguard_instance=instance).order_by('sort_order') peers_from_direct = Peer.objects.filter( wireguard_instance=instance, @@ -47,7 +48,7 @@ def user_allowed_peers(user_acl: UserAcl, instance: WireGuardInstance): wireguard_instance__peergroup__in=user_acl.peer_groups.filter(server_instance=instance) ) - return peers_from_direct.union(peers_from_instance).order_by('name') + return peers_from_direct.union(peers_from_instance).order_by('sort_order') def is_valid_ip_or_hostname(value): @@ -82,3 +83,17 @@ def list_network_interfaces(): interfaces.append(interface_name) return interfaces + + +def default_sort_peers(wireguard_instance: WireGuardInstance): + unsorted_peers = Peer.objects.filter(wireguard_instance=wireguard_instance, sort_order=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 + if unsorted_peers: + new_sort_order = highest_sort_order + 1 + for peer in unsorted_peers: + peer.sort_order = new_sort_order + peer.save() + new_sort_order += 1 + return unsorted_peers \ No newline at end of file diff --git a/wireguard/migrations/0025_peer_sort_order.py b/wireguard/migrations/0025_peer_sort_order.py new file mode 100644 index 0000000..0985a65 --- /dev/null +++ b/wireguard/migrations/0025_peer_sort_order.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1.5 on 2025-01-22 12:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wireguard', '0024_alter_peergroup_uuid'), + ] + + operations = [ + migrations.AddField( + model_name='peer', + name='sort_order', + field=models.IntegerField(default=0), + ), + ] diff --git a/wireguard/models.py b/wireguard/models.py index 37d8493..6ce12be 100644 --- a/wireguard/models.py +++ b/wireguard/models.py @@ -80,6 +80,7 @@ class Peer(models.Model): private_key = models.CharField(max_length=100, blank=True, null=True) persistent_keepalive = models.IntegerField(default=25) wireguard_instance = models.ForeignKey(WireGuardInstance, on_delete=models.CASCADE) + sort_order = models.IntegerField(default=0) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) diff --git a/wireguard_peer/views.py b/wireguard_peer/views.py index ee18408..9882eab 100644 --- a/wireguard_peer/views.py +++ b/wireguard_peer/views.py @@ -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 +from wgwadmlibrary.tools import user_has_access_to_peer, user_has_access_to_instance, user_allowed_instances, user_allowed_peers, default_sort_peers from django.http import Http404 from wireguard_peer.forms import PeerAllowedIPForm, PeerForm @@ -60,6 +60,7 @@ def view_wireguard_peer_list(request): current_instance = wireguard_instances.first() if current_instance not in wireguard_instances: raise Http404 + default_sort_peers(current_instance) peer_list = user_allowed_peers(user_acl, current_instance) else: current_instance = None