From 763f6cb99a8a393122769cd6a2b96fa0a4e15498 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Tue, 17 Jun 2025 15:21:09 -0300 Subject: [PATCH] add "Manage Router Groups" feature with UI, actions for adding/removing routers from groups, and integration into router list --- router_manager/views.py | 61 +++++++++++++++ routerfleet/urls.py | 3 +- .../router_manager/manage_router_groups.html | 76 +++++++++++++++++++ templates/router_manager/router_list.html | 13 ++++ 4 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 templates/router_manager/manage_router_groups.html diff --git a/router_manager/views.py b/router_manager/views.py index 65f2ac3..601510d 100644 --- a/router_manager/views.py +++ b/router_manager/views.py @@ -301,6 +301,67 @@ def view_create_instant_backup_multiple_routers(request): return JsonResponse({'error': 'Invalid request method.'}, status=405) +@login_required +def view_manage_router_groups_multiple(request): + if not UserAcl.objects.filter(user=request.user, user_level__gte=20).exists(): + return render(request, 'access_denied.html', {'page_title': 'Access Denied'}) + + if request.method == 'POST': + router_uuids = request.POST.getlist('router_uuids') + add_group_uuid = request.POST.get('add_group') + remove_group_uuid = request.POST.get('remove_group') + + if not router_uuids: + messages.warning(request, 'No routers selected') + return redirect('router_list') + + # Validate that the same group is not selected for both add and remove + if add_group_uuid and remove_group_uuid and add_group_uuid == remove_group_uuid: + messages.warning(request, 'Cannot add and remove from the same group') + return redirect('router_list') + + routers = Router.objects.filter(uuid__in=router_uuids) + + # Process add to group + if add_group_uuid: + try: + group = RouterGroup.objects.get(uuid=add_group_uuid) + for router in routers: + group.routers.add(router) + messages.success(request, f'Added {routers.count()} router(s) to group {group.name}') + except RouterGroup.DoesNotExist: + messages.error(request, 'Group not found') + + # Process remove from group + if remove_group_uuid: + try: + group = RouterGroup.objects.get(uuid=remove_group_uuid) + for router in routers: + group.routers.remove(router) + messages.success(request, f'Removed {routers.count()} router(s) from group {group.name}') + except RouterGroup.DoesNotExist: + messages.error(request, 'Group not found') + + return redirect('router_list') + + # GET request - display form + router_uuids = request.GET.getlist('routers[]') + if not router_uuids: + messages.warning(request, 'No routers selected') + return redirect('router_list') + + routers = Router.objects.filter(uuid__in=router_uuids) + groups = RouterGroup.objects.all().order_by('name') + + context = { + 'routers': routers, + 'groups': groups, + 'page_title': 'Manage Router Groups', + } + + return render(request, 'router_manager/manage_router_groups.html', context) + + def view_cron_update_router_information(request): data = {'status': 'success'} refresh_interval = 24 #hours diff --git a/routerfleet/urls.py b/routerfleet/urls.py index 5b38b94..491d645 100644 --- a/routerfleet/urls.py +++ b/routerfleet/urls.py @@ -6,7 +6,7 @@ from dashboard.views import view_dashboard, view_status,backup_statistics_data,r from integration_manager.views import view_wireguard_webadmin_launcher, view_manage_wireguard_integration, view_launch_wireguard_webadmin from user_manager.views import view_manage_user, view_user_list from accounts.views import view_login, view_logout, view_create_first_user -from router_manager.views import view_create_instant_backup_multiple_routers, view_router_list, view_manage_router, view_router_group_list, view_ssh_key_list, view_manage_router_group, view_manage_sshkey, view_router_details, view_create_instant_backup_task, view_router_availability, view_cron_update_router_information +from router_manager.views import view_create_instant_backup_multiple_routers, view_router_list, view_manage_router, view_router_group_list, view_ssh_key_list, view_manage_router_group, view_manage_sshkey, view_router_details, view_create_instant_backup_task, view_router_availability, view_cron_update_router_information, view_manage_router_groups_multiple from backup.views import view_backup_profile_list, view_manage_backup_profile, view_backup_list, view_backup_details, view_debug_run_backups, view_compare_backups, view_backup_download, view_backup_delete from monitoring.views import view_export_router_list, view_update_router_status, view_router_config_timestamp, view_router_last_status_change from backup_data.views import view_generate_backup_schedule, view_create_backup_tasks, view_perform_backup_tasks, view_housekeeping @@ -38,6 +38,7 @@ urlpatterns = [ path('router/manage_sshkey/', view_manage_sshkey, name='manage_sshkey'), path('router/create_instant_backup/', view_create_instant_backup_task, name='create_instant_backup_task'), path('router/create_instant_backup/multiple/', view_create_instant_backup_multiple_routers, name='create_instant_backup_multiple'), + path('router/manage_groups/multiple/', view_manage_router_groups_multiple, name='manage_router_groups_multiple'), path('router/import_tool/', view_import_tool_list, name='import_tool_list'), path('router/import_tool/csv/', view_import_csv_file, name='import_csv_file'), path('router/import_tool/details/', view_import_details, name='import_details'), diff --git a/templates/router_manager/manage_router_groups.html b/templates/router_manager/manage_router_groups.html new file mode 100644 index 0000000..dd9ebf9 --- /dev/null +++ b/templates/router_manager/manage_router_groups.html @@ -0,0 +1,76 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+
+
+

Manage Router Groups

+
+
+
+ {% csrf_token %} +
+
+

Selected Routers:

+
    + {% for router in routers %} +
  • {{ router.name }}
  • + + {% endfor %} +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + Cancel +
+
+
+
+
+
+
+{% endblock %} + +{% block custom_page_scripts %} + +{% endblock %} diff --git a/templates/router_manager/router_list.html b/templates/router_manager/router_list.html index a211271..a85fc5b 100644 --- a/templates/router_manager/router_list.html +++ b/templates/router_manager/router_list.html @@ -260,6 +260,7 @@ + @@ -478,8 +479,10 @@ $(document).ready(function() { var checkedCount = table.$('.router-checkbox:checked').length; if (checkedCount >= 1) { $('#create-backup').show(); + $('#manage-groups').show(); } else { $('#create-backup').hide(); + $('#manage-groups').hide(); } }); @@ -542,6 +545,16 @@ $(document).ready(function() { } }); }); + + $('#manage-groups').on('click', function(e) { + e.preventDefault(); + var selectedRouters = table.$('.router-checkbox:checked').map(function() { + return $(this).data('uuid'); + }).get(); + + // Redirect to the manage groups page with the selected routers + window.location.href = '/router/manage_groups/multiple/?routers[]=' + selectedRouters.join('&routers[]='); + }); });