diff --git a/web/startScan/templates/startScan/schedule_scan_list.html b/web/startScan/templates/startScan/schedule_scan_list.html index 012b5427..f575a27b 100644 --- a/web/startScan/templates/startScan/schedule_scan_list.html +++ b/web/startScan/templates/startScan/schedule_scan_list.html @@ -23,9 +23,29 @@ Scheduled Scans
+
+
+
+
+ {% if user|can:'initiate_scans_subscans' %} + + {% endif %} +
+
+
+
+
+
+
+
+
+ {% csrf_token %} + @@ -38,6 +58,7 @@ Scheduled Scans {% for task in scheduled_tasks %} + {% with task_name=task.name|split:":" %} {% endwith %} @@ -79,6 +100,7 @@ Scheduled Scans {% endfor %}
Serial Number Description Frequency Last Run
{{ task.id }}{{ task_name.0 }}
+
@@ -88,20 +110,89 @@ Scheduled Scans // var e; $(document).ready(function() { var scheduled_scan_table = $('#scheduled_scan_table').DataTable({ + headerCallback: function(e, a, t, n, s) { + e.getElementsByTagName("th")[0].innerHTML='
\nc
\n' + }, "oLanguage": { - "oPaginate": { "sPrevious": '', "sNext": '' }, - "sInfo": "Showing page _PAGE_ of _PAGES_", - "sSearch": '', - "sSearchPlaceholder": "Search...", - "sLengthMenu": "Results : _MENU_", + "oPaginate": { "sPrevious": '', "sNext": '' }, + "sInfo": "Showing page _PAGE_ of _PAGES_", + "sSearch": '', + "sSearchPlaceholder": "Search...", + "sLengthMenu": "Results : _MENU_", }, + "columnDefs":[ + { + "targets":0, "width":"20px", "className":"", "orderable":!1, render:function(e, a, t, n) { + return'
\nc
' + }, + + } + ], "lengthMenu": [5, 10, 20, 30, 50, 100], - "pageLength": 10, + "pageLength": 20, + "order": [[3, 'desc']], "dom": "<'dt--top-section'<'row'<'col-12 col-sm-6 d-flex justify-content-sm-start justify-content-center mt-sm-0 mt-3'f><'col-12 col-sm-6 d-flex justify-content-sm-end justify-content-center'l>>>" + - "<'table-responsive'tr>" + - "<'dt--bottom-section d-sm-flex justify-content-sm-between text-center'<'dt--pages-count mb-sm-0 mb-3'i><'dt--pagination'p>>", + "<'table-responsive'tr>" + + "<'dt--bottom-section d-sm-flex justify-content-sm-between text-center'<'dt--pages-count mb-sm-0 mb-3'i><'dt--pagination'p>>", }); multiCheck(scheduled_scan_table); }); +function mainCheckBoxSelected(checkbox) { + if (checkbox.checked) { + $("#delete_multiple_scheduled_button").removeClass("disabled"); + $(".targets_checkbox").prop('checked', true); + } else { + $("#delete_multiple_scheduled_button").addClass("disabled"); + $(".targets_checkbox").prop('checked', false); + } +} + +function checkedCount() { + // this function will count the number of boxes checked + item = document.getElementsByClassName("targets_checkbox"); + count = 0; + for (var i = 0; i < item.length; i++) { + if (item[i].checked) { + count++; + } + } + return count; +} + +function toggleMultipleTargetButton() { + if (checkedCount() > 0) { + $("#delete_multiple_scheduled_button").removeClass("disabled"); + } else { + $("#delete_multiple_scheduled_button").addClass("disabled"); + } +} + +function deleteMultipleScheduledScan() { + if (!checkedCount()) { + swal({ + title: '', + text: "Oops! You haven't selected any scheduled scan to delete.", + type: 'error', + padding: '2em' + }) + } else { + // atleast one target is selected + swal.queue([{ + title: 'Are you sure you want to delete ' + checkedCount() + ' Scheduled Scans?', + text: "This action is irreversible.\nThis will stop all the selected scheduled scans.", + type: 'warning', + showCancelButton: true, + confirmButtonText: 'Delete', + padding: '2em', + showLoaderOnConfirm: true, + preConfirm: function() { + deleteForm = document.getElementById("scheduled_scan_history_form"); + deleteForm.action = "../delete/multiple/scheduled"; + deleteForm.submit(); + } + }]) + } +} + {% endblock page_level_script %} diff --git a/web/startScan/urls.py b/web/startScan/urls.py index 7ff6a57d..9ad4ab72 100644 --- a/web/startScan/urls.py +++ b/web/startScan/urls.py @@ -106,6 +106,10 @@ urlpatterns = [ '/delete/multiple', views.delete_scans, name='delete_multiple_scans'), + path( + '/delete/multiple/scheduled', + views.delete_scheduled_scans, + name='delete_multiple_scheduled_scans'), path( '/stop/multiple', views.stop_scans, diff --git a/web/startScan/views.py b/web/startScan/views.py index 94b9ef21..de1c6a37 100644 --- a/web/startScan/views.py +++ b/web/startScan/views.py @@ -685,6 +685,22 @@ def delete_scheduled_task(request, id): return JsonResponse(messageData) +@has_permission_decorator(PERM_MODIFY_SCAN_RESULTS, redirect_url=FOUR_OH_FOUR_URL) +def delete_scheduled_scans(request, slug): + if request.method == "POST": + for key, value in request.POST.items(): + if key == 'csrfmiddlewaretoken': + continue + print(value) + scan = get_object_or_404(PeriodicTask, id=value) + scan.delete() + messages.add_message( + request, + messages.INFO, + 'Multiple scheduled scans successfully deleted!') + return HttpResponseRedirect(reverse('scheduled_scan_view', kwargs={'slug': slug})) + + @has_permission_decorator(PERM_MODIFY_SCAN_RESULTS, redirect_url=FOUR_OH_FOUR_URL) def change_scheduled_task_status(request, id): if request.method == 'POST':