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 %}
+
+
+
+
+
+
@@ -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':