From e8f78d15745192dba542b0f774c451856f4e500e Mon Sep 17 00:00:00 2001 From: Mike Chagnon Date: Mon, 7 Oct 2024 20:19:52 -0700 Subject: [PATCH] add collection export feature --- templates/components/filter-form.html | 12 +++++++++ web/urls.py | 1 + web/views.py | 35 ++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/templates/components/filter-form.html b/templates/components/filter-form.html index 03667d5..4b9648e 100644 --- a/templates/components/filter-form.html +++ b/templates/components/filter-form.html @@ -112,6 +112,18 @@ +
+ {% csrf_token %} + +
+ + +
+
{% else %} To annotate images, please login. {% endif %} diff --git a/web/urls.py b/web/urls.py index 1a43746..f16dc8b 100644 --- a/web/urls.py +++ b/web/urls.py @@ -8,6 +8,7 @@ path('api/roi_annotations', views.roi_annotations, name='annotations'), path('api/create_label', views.create_label, name='create_label'), path('api/roi_list', views.roi_list, name='roi_list'), + path('api/export_roi_list', views.export_roi_list, name='export_roi_list'), path('api/create_or_verify_annotations', views.create_or_verify_annotations, name='create_or_verify_annotations'), path('api/move_or_copy_to_collection', views.move_or_copy_to_collection, name='move_or_copy_to_collection'), path('api/get_labels', views.get_labels, name='get_labels'), diff --git a/web/views.py b/web/views.py index 7f0f2ad..ac8e726 100644 --- a/web/views.py +++ b/web/views.py @@ -1,7 +1,10 @@ +import csv +import os +from pprint import pprint import json from django.contrib.auth.models import User -from django.http import JsonResponse, HttpResponseBadRequest, HttpResponse +from django.http import JsonResponse, HttpResponseBadRequest, HttpResponse, HttpResponseForbidden from django.shortcuts import render, get_object_or_404 from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST @@ -35,6 +38,36 @@ def index(request): 'ROI_ID_DESC': ['-roi_id'], } +def export_roi_list(request): + if not request.user.is_authenticated: + return HttpResponseForbidden() + + collection = request.POST.get('collection') + if not collection: + return HttpResponseBadRequest() + + rois = ROI.objects \ + .filter(collections__name=collection) \ + .order_by("roi_id") \ + .values_list('collections__name', 'winning_annotation__label__name', 'path') + + response = HttpResponse( + content_type="text/csv", + headers={"Content-Disposition": f'attachment; filename="{collection}-rois.csv"'}, + ) + + writer = csv.writer(response) + writer.writerow(["Collection", "Label", "Filename", "Path"]) + for roi in rois: + writer.writerow([ + roi[0], + roi[1], + os.path.basename(roi[2]), + os.path.dirname(roi[2]), + ]) + + return response + @require_POST def roi_list(request): requested_label = request.POST.get('label')