Update bug When I click on "Create backup task," it doesn’t seem to work. The console shows this error: "Uncaught ReferenceError: backupType is not defined."

This commit is contained in:
petrunetworking 2025-02-03 22:32:36 +02:00
parent a730057a6b
commit 9f26425a4f
2 changed files with 99 additions and 100 deletions

View file

@ -1,5 +1,6 @@
from django.contrib import messages from django.contrib import messages
from django.db.models import Sum from django.db.models import Sum
from django.http import JsonResponse
from django.utils import timezone from django.utils import timezone
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
@ -227,48 +228,44 @@ def view_create_instant_backup_task(request):
messages.success(request, 'Backup task created successfully') messages.success(request, 'Backup task created successfully')
return redirect(router_details_url) return redirect(router_details_url)
@login_required() @login_required
def view_create_instant_backup_multiple_routers(request): def view_create_instant_backup_multiple_routers(request):
# Check user permissions if request.method == 'POST':
if not UserAcl.objects.filter(user=request.user).filter(user_level__gte=20).exists(): if not UserAcl.objects.filter(user=request.user, user_level__gte=20).exists():
uuid = request.GET.get('uuid') return JsonResponse({'error': 'Permission denied.'}, status=403)
if uuid:
router_details_url = f'/router/details/?uuid={uuid}'
messages.warning(request, 'Sorry, you do not have permission to create instant backup. Please contact your system administrator if you believe this is an error.')
return redirect(router_details_url)
else:
messages.warning(request, 'Sorry, you do not have permission to create instant backup. Please contact your system administrator if you believe this is an error.')
return redirect('/router/list/')
# Get UUIDs from the request uuids = request.POST.getlist('routers[]') # Ajustat pentru a primi lista corect
uuids = request.GET.getlist('uuid') # Changed to getlist for multiple UUIDs
if not uuids:
messages.warning(request, 'At least one UUID is required for Create Backup Task')
return redirect('/router/list/')
# Loop through each UUID and process the backup if not uuids:
for uuid in uuids: return JsonResponse({'error': 'No routers selected.'}, status=400)
router = get_object_or_404(Router, uuid=uuid)
router_details_url = f'/router/details/?uuid={router.uuid}'
# Check for existing backup tasks results = []
if RouterBackup.objects.filter(router=router, success=False, error=False).exists(): for uuid in uuids:
messages.warning(request, f'Backup task not created for {router.name}| Active router backup task already exists') router = get_object_or_404(Router, uuid=uuid)
continue # Skip to the next router
if router.routerstatus.backup_lock is not None: if RouterBackup.objects.filter(router=router, success=False, error=False).exists():
messages.warning(request, f'Backup task not created for {router.name}| Router backup is currently locked') results.append({'router': router.name, 'status': 'active backup task exists'})
continue # Skip to the next router continue
if not router.backup_profile: if router.routerstatus.backup_lock:
messages.warning(request, f'Backup task not created for {router.name}| Router has no backup profile') results.append({'router': router.name, 'status': 'backup locked'})
continue # Skip to the next router continue
router_backup = RouterBackup.objects.create(router=router, schedule_time=timezone.now(), schedule_type='instant') if not router.backup_profile:
results.append({'router': router.name, 'status': 'no backup profile'})
continue
# Update backup lock status router_backup = RouterBackup.objects.create(
router.routerstatus.backup_lock = router_backup.schedule_time router=router,
router.routerstatus.save() schedule_time=timezone.now(),
messages.success(request, f'Backup task created successfully for {router.name}') schedule_type='instant'
)
return redirect('/router/list/') router.routerstatus.backup_lock = router_backup.schedule_time
router.routerstatus.save()
results.append({'router': router.name, 'status': 'backup started'})
return JsonResponse({'results': results})
return JsonResponse({'error': 'Invalid request method.'}, status=405)

View file

@ -27,18 +27,14 @@
<th>Auth</th> <th>Auth</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for router in router_list %} {% for router in router_list %}
<tr {% if not router.enabled %}style="text-decoration: line-through;"{% endif %}> <tr {% if not router.enabled %}style="text-decoration: line-through;"{% endif %}>
<td><input type="checkbox" class="router-checkbox" data-uuid="{{ router.uuid }}"></td> <td><input type="checkbox" class="router-checkbox" data-uuid="{{ router.uuid }}"></td>
<td> <td><a href="/router/details/?uuid={{ router.uuid }}">{{ router.name }}</a></td>
<a href="/router/details/?uuid={{ router.uuid }}">{{ router.name }}</a>
</td>
<td>{{ router.get_router_type_display }}</td> <td>{{ router.get_router_type_display }}</td>
<td>{{ router.address }}</td> <td>{{ router.address }}</td>
<td id="status-{{ router.uuid }}"> <td id="status-{{ router.uuid }}">
{% if router.monitoring %} {% if router.monitoring %}
{% if router.routerstatus.status_online %} {% if router.routerstatus.status_online %}
@ -52,16 +48,14 @@
</td> </td>
<td> <td>
{% if router.router_type != 'monitoring' %} {% if router.router_type != 'monitoring' %}
{% if router.backup_profile %} {% if router.backup_profile %}
{{ router.backup_profile }} {% if router.routerstatus.last_backup_failed %}<i class="fas fa-exclamation-triangle text-danger" title="Last backup failed to complete"></i>{% endif %} {{ router.backup_profile }} {% if router.routerstatus.last_backup_failed %}<i class="fas fa-exclamation-triangle text-danger" title="Last backup failed to complete"></i>{% endif %}
{% else %} {% else %}
<i class="fas fa-exclamation-triangle text-warning" title="No backup profile selected"></i> <i class="fas fa-exclamation-triangle text-warning" title="No backup profile selected"></i>
{% endif %} {% endif %}
{% endif %} {% endif %}
</td> </td>
<td> <td>{{ router.routergroup_set.count }}</td>
{{ router.routergroup_set.count }}
</td>
<td class="min-width"> <td class="min-width">
{% if router.router_type != 'monitoring' %} {% if router.router_type != 'monitoring' %}
{% if router.ssh_key %} {% if router.ssh_key %}
@ -80,20 +74,20 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<a href="/router/manage/" class="btn btn-primary">Add Router</a>
<a href="/router/import_tool/" class="btn btn-outline-primary">Import tool</a>
</div> </div>
<div class="row mb-3">
<div class="col-lg-12 text-right">
<div class="btn-group" role="group">
<a href="/router/manage/" class="btn btn-primary">Add Router</a>
<a href="/router/import_tool/" class="btn btn-warning">Import Tool</a>
<button id="select-all" class="btn btn-outline-success"><i class="fas fa-check-square"></i> Select All</button>
<button id="select-none" class="btn btn-outline-danger"><i class="fas fa-square"></i> Select None</button>
<button id="create-backup" class="btn btn-warning" style="display: none;">Create Backup Task</button>
</div>
</div>
</div> </div>
<div class="form-group mb-0" id="backup-type-container" style="display: none;">
</div> </div>
<button id="create-backup" class="btn btn-warning mr-2" style="display: none;">Create Backup Task</button>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -166,49 +160,57 @@
}); });
</script> </script>
<script> <script>
$(document).ready(function() { $(document).ready(function() {
$('.router-checkbox').prop('checked', false); $('.router-checkbox').prop('checked', false);
// Check checkbox change event
$('.router-checkbox').change(function() {
var checkedCount = $('.router-checkbox:checked').length;
// Show the backup type selector and the backup button only if 2 or more routers are selected $('#select-all').click(function() {
if (checkedCount >= 2) { $('.router-checkbox').prop('checked', true).trigger('change');
$('#backup-type-container').show(); // Show the backup type dropdown });
$('#create-backup').show(); // Show the backup button
} else { $('#select-none').click(function() {
$('#backup-type-container').hide(); // Hide the backup type dropdown $('.router-checkbox').prop('checked', false).trigger('change');
$('#create-backup').hide(); // Hide the backup button });
$('.router-checkbox').change(function() {
var checkedCount = $('.router-checkbox:checked').length;
$('#create-backup').toggle(checkedCount >= 1);
});
$('#create-backup').click(function() {
var selectedRouters = $('.router-checkbox:checked').map(function() {
return $(this).data('uuid');
}).get();
$.ajax({
url: '/router/create_instant_backup/multiple/',
method: 'POST',
data: {
routers: selectedRouters,
csrfmiddlewaretoken: '{{ csrf_token }}'
},
success: function(response) {
let messages = response.results.map(item => `${item.router}: ${item.status}`).join('\n');
// Create success toast
$(document).Toasts('create', {
class: 'bg-success',
title: 'Backup Status',
body: 'The following routers were backed up: ' + messages,
delay: 10000,
autohide: true
});
},
error: function(xhr) {
// Create error toast
$(document).Toasts('create', {
class: 'bg-danger',
title: 'Error',
body: 'Error: ' + xhr.responseJSON.error,
delay: 10000,
autohide: true
});
} }
}); });
// Backup button click event
$('#create-backup').click(function() {
var selectedRouters = [];
$('.router-checkbox:checked').each(function() {
selectedRouters.push($(this).data('uuid')); // Collect UUIDs of selected routers
});
// Perform the backup operation (AJAX or redirect)
alert('Creating ' + backupType + ' backup for routers: ' + selectedRouters.join(', '));
// Example AJAX request
$.ajax({
url: '/router/create_instant_backup/multiple/',
method: 'POST',
data: {
routers: selectedRouters,
csrfmiddlewaretoken: '{{ csrf_token }}' // Ensure CSRF token is included for Django
},
success: function(response) {
alert('Backup started for selected routers');
},
error: function(xhr, status, error) {
alert('Error starting backup: ' + error);
}
});
});
}); });
});
</script> </script>
{% endblock %} {% endblock %}