Skip to content

Commit b6ff146

Browse files
authored
Adding an export creation api (#168)
* Adding an export creation api * Adding more export format information to list api * Cast export id to int * Code formatting * listing export formats using GET instead of POST * using serializer for export formats
1 parent 4f7ec37 commit b6ff146

File tree

3 files changed

+68
-3
lines changed

3 files changed

+68
-3
lines changed

imagetagger/imagetagger/annotations/serializers.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from rest_framework.serializers import ModelSerializer, SerializerMethodField
1+
from rest_framework.serializers import ModelSerializer, SerializerMethodField, CharField
22

3-
from .models import Annotation, AnnotationType, Verification
3+
from .models import Annotation, AnnotationType, Verification, ExportFormat
44
from imagetagger.images.serializers import ImageSerializer
55

66

@@ -39,3 +39,15 @@ class Meta:
3939

4040
annotation_type = AnnotationTypeSerializer(read_only=True)
4141
image = ImageSerializer(read_only=True)
42+
43+
44+
class ExportFormatInfoSerializer(ModelSerializer):
45+
team_name = CharField(source='team.name')
46+
47+
class Meta:
48+
model = ExportFormat
49+
fields = (
50+
'name',
51+
'id',
52+
'team_name',
53+
)

imagetagger/imagetagger/annotations/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
url(r'^export/(\d+)/auth/$', views.export_auth, name='export_auth'),
1111
url(r'^export/(\d+)/download/$', views.download_export, name='download_export'),
1212
url(r'^export/(\d+)/$', views.create_export, name='create_export'),
13+
url(r'^api/export/create/$', views.api_create_export, name='api_create_export'),
14+
url(r'^api/export_format/list/$', views.api_get_export_formats, name='api_get_export_formats'),
1315
url(r'^manage/annotation/(\d+)/$', views.manage_annotations, name='manage_annotations'),
1416
url(r'^manage/delete/(\d+)/$', views.delete_annotations, name='delete_annotations'),
1517
url(r'^(\d+)/delete/$', views.delete_annotation, name='delete_annotation'),

imagetagger/imagetagger/annotations/views.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from imagetagger.annotations.forms import ExportFormatCreationForm, ExportFormatEditForm
1919
from imagetagger.annotations.models import Annotation, AnnotationType, Export, \
2020
Verification, ExportFormat
21-
from imagetagger.annotations.serializers import AnnotationSerializer, AnnotationTypeSerializer
21+
from imagetagger.annotations.serializers import AnnotationSerializer, AnnotationTypeSerializer, ExportFormatInfoSerializer
2222
from imagetagger.images.models import Image, ImageSet
2323
from imagetagger.users.models import Team
2424

@@ -921,3 +921,54 @@ def api_blurred_concealed_annotation(request) -> Response:
921921
return Response({
922922
'detail': 'you updated the last annotation',
923923
}, status=HTTP_200_OK)
924+
925+
926+
@login_required
927+
@api_view(['POST'])
928+
def api_create_export(request) -> Response:
929+
try:
930+
image_set_id = int(request.data['imageset_id'])
931+
export_format_id = int(request.data['export_format_id'])
932+
except (KeyError, TypeError, ValueError):
933+
raise ParseError
934+
935+
imageset = get_object_or_404(ImageSet, id=image_set_id)
936+
if imageset.has_perm('create_export', request.user):
937+
format = get_object_or_404(ExportFormat, id=export_format_id)
938+
export_text, annotation_count, export_filename = export_format(format, imageset)
939+
940+
export = Export(image_set=imageset,
941+
user=request.user,
942+
annotation_count=annotation_count,
943+
export_text=export_text,
944+
format=format)
945+
export.save()
946+
export.filename = export_filename.replace('%%exportid', str(export.id))
947+
export.save()
948+
949+
return Response({
950+
'detail': 'export created successfully.',
951+
'export_id': export.id,
952+
}, status=HTTP_201_CREATED)
953+
return Response({
954+
'detail': 'permission for exporting annotations in this image set missing.',
955+
}, status=HTTP_403_FORBIDDEN)
956+
957+
958+
@login_required
959+
@api_view(['GET'])
960+
def api_get_export_formats(request) -> Response:
961+
user_teams = Team.objects.filter(members=request.user)
962+
export_formats = ExportFormat.objects.filter(Q(public=True) | Q(team__in=user_teams))
963+
serializer = ExportFormatInfoSerializer(
964+
export_formats,
965+
many=True,
966+
context={
967+
'request': request,
968+
}
969+
)
970+
return Response({
971+
'detail': 'your user has access to the following export formats',
972+
'export_formats': serializer.data,
973+
}, status=HTTP_200_OK)
974+

0 commit comments

Comments
 (0)