From 9f943b4ca702d44adaea0cb7b8518f869049d435 Mon Sep 17 00:00:00 2001 From: Mike Chagnon Date: Thu, 14 May 2026 19:58:11 -0700 Subject: [PATCH 1/2] add ability to delete hard delete a dataset --- ifcbdb/secure/urls.py | 2 ++ ifcbdb/secure/views.py | 23 +++++++++++++++++++ .../templates/secure/dataset-management.html | 22 +----------------- ifcbdb/templates/secure/edit-dataset.html | 19 +++++++++++++++ 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/ifcbdb/secure/urls.py b/ifcbdb/secure/urls.py index 08c72f3d..7b97b07a 100644 --- a/ifcbdb/secure/urls.py +++ b/ifcbdb/secure/urls.py @@ -49,6 +49,8 @@ path('api/sync/', views.sync_dataset, name='sync_dataset'), path('api/sync/status/', views.sync_dataset_status, name='sync_dataset_status'), path('api/sync/cancel/', views.sync_cancel, name='sync_cancel'), + path('api/dataset//bin-count', views.dataset_bin_count, name='dataset_bin_count'), + path('api/delete-dataset/', views.delete_dataset, name='delete_dataset'), path('api/metadata-upload/status', views.metadata_upload_status, name='metadata_upload_status'), path('api/metadata-upload/cancel', views.metadata_upload_cancel, name="metadata_upload_cancel"), path('api/toggle-skip', views.toggle_skip, name='toggle_skip'), diff --git a/ifcbdb/secure/views.py b/ifcbdb/secure/views.py index 11c6c668..172401a4 100644 --- a/ifcbdb/secure/views.py +++ b/ifcbdb/secure/views.py @@ -243,6 +243,29 @@ def edit_dataset(request, id): }) +@login_required +def dataset_bin_count(request, dataset_id): + if not auth.is_admin(request.user): + return HttpResponseForbidden() + + dataset = get_object_or_404(Dataset, pk=dataset_id) + + return JsonResponse({ + "bin_count": dataset.bins.count(), + }) + + +@require_POST +def delete_dataset(request, dataset_id): + if not auth.is_admin(request.user): + return HttpResponseForbidden() + + dataset = get_object_or_404(Dataset, pk=dataset_id) + dataset.delete() + + return JsonResponse({}) + + @login_required def edit_directory(request, dataset_id, id): if not auth.is_admin(request.user): diff --git a/ifcbdb/templates/secure/dataset-management.html b/ifcbdb/templates/secure/dataset-management.html index ca94378e..39710c00 100644 --- a/ifcbdb/templates/secure/dataset-management.html +++ b/ifcbdb/templates/secure/dataset-management.html @@ -37,27 +37,7 @@ - - - + {% endblock %} {% block scripts %} From bf3a6d172a0dc31a82750ad0e2052b18a1a0ab28 Mon Sep 17 00:00:00 2001 From: Mike Chagnon Date: Sat, 16 May 2026 20:34:15 -0700 Subject: [PATCH 2/2] allow captains and manages to delete a dataset --- ifcbdb/secure/views.py | 11 +++++- ifcbdb/templates/secure/edit-dataset.html | 45 ++++++++++++----------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/ifcbdb/secure/views.py b/ifcbdb/secure/views.py index 172401a4..04b97005 100644 --- a/ifcbdb/secure/views.py +++ b/ifcbdb/secure/views.py @@ -245,11 +245,14 @@ def edit_dataset(request, id): @login_required def dataset_bin_count(request, dataset_id): - if not auth.is_admin(request.user): + if not auth.can_manage_datasets(request.user): return HttpResponseForbidden() dataset = get_object_or_404(Dataset, pk=dataset_id) + if not auth.is_admin(request.user) and not TeamDataset.objects.filter(dataset=dataset).exists(): + return HttpResponseForbidden() + return JsonResponse({ "bin_count": dataset.bins.count(), }) @@ -257,10 +260,14 @@ def dataset_bin_count(request, dataset_id): @require_POST def delete_dataset(request, dataset_id): - if not auth.is_admin(request.user): + if not auth.can_manage_datasets(request.user): return HttpResponseForbidden() dataset = get_object_or_404(Dataset, pk=dataset_id) + + if not auth.is_admin(request.user) and not TeamDataset.objects.filter(dataset=dataset).exists(): + return HttpResponseForbidden() + dataset.delete() return JsonResponse({}) diff --git a/ifcbdb/templates/secure/edit-dataset.html b/ifcbdb/templates/secure/edit-dataset.html index e9c21f3f..e9381b2a 100644 --- a/ifcbdb/templates/secure/edit-dataset.html +++ b/ifcbdb/templates/secure/edit-dataset.html @@ -16,8 +16,10 @@ {% if dataset.id > 0 %}Edit Dataset {{ dataset.title }}{% else %}Add New Dataset{% endif %}
- {% if dataset.id > 0 and request.user.is_superuser %} + {% if dataset.id > 0 %} + {% endif %} + {% if dataset.id > 0 and request.user.is_superuser %} Manage directories {% endif %}
@@ -181,6 +183,7 @@ var _csrf = "{{ csrf_token }}"; {% if dataset.id > 0 and request.user.is_superuser %} + function dataset_sync_status() { $.getJSON("{% url 'secure:sync_dataset_status' dataset.id %}", function(data) { if(data.state == 'LOCKED') { // job hasn't started yet @@ -226,21 +229,6 @@ } }); } - $('#id_name').keyup(function(){ - let $name_field = $('#id_name'); - let name = $name_field.val() - if(name.indexOf(" ")!=-1){ - name = name.split(" ").join(""); - $name_field.val(name) - } - - let $name_message_el = $('#id_name_message') - let message = 'The URL to this dataset will be: '; - message += $name_message_el.data('default-href'); - message += '' + name +''; - $name_message_el.html(message); - - }) $('#sync-button').click(function() { var payload = { @@ -274,10 +262,27 @@ }); }, 10); + {% endif %} + + $('#id_name').keyup(function(){ + let $name_field = $('#id_name'); + let name = $name_field.val() + if(name.indexOf(" ")!=-1){ + name = name.split(" ").join(""); + $name_field.val(name) + } + + let $name_message_el = $('#id_name_message') + let message = 'The URL to this dataset will be: '; + message += $name_message_el.data('default-href'); + message += '' + name +''; + $name_message_el.html(message); + }); + $("#delete-dataset-btn").click(function() { - $.getJSON("{% url 'secure:dataset_bin_count' dataset.id %}", function(data) { + $.getJSON("/secure/api/dataset/{{ dataset.id }}/bin-count", function(data) { const warning = data.bin_count > 0 - ? `This dataset has ${data.bin_count} bin${data.bin_count === 1 ? '' : 's'} associated with it. Those bins may become orphaned if they are not associated with any other datasets` + ? `This dataset contains ${data.bin_count} bin${data.bin_count === 1 ? '' : 's'} which may become orphaned if they are not associated with any other datasets` : "This dataset does not have any bins and can be safely deleted"; if (!confirm("Are you sure you want to delete this dataset?\n\n" + warning)) { @@ -285,13 +290,11 @@ } const payload = { csrfmiddlewaretoken: _csrf }; - $.post("{% url 'secure:delete_dataset' dataset.id %}", payload, function() { + $.post("/secure/api/delete-dataset/{{ dataset.id }}", payload, function() { window.location.href = "{% url 'secure:dataset-management' %}"; }); }); }); - - {% endif %} {% endblock %} \ No newline at end of file