Skip to content

Commit 135af26

Browse files
authored
Merge pull request #2452 from onaio/optimize-attachments-endpoint
Optimize attachments endpoint
2 parents c9ff6f7 + 58fbee8 commit 135af26

File tree

6 files changed

+36
-11
lines changed

6 files changed

+36
-11
lines changed

onadata/apps/api/tests/viewsets/test_briefcase_viewset.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,8 @@ def test_view_downloadSubmission(self):
301301
text = f.read()
302302
for var in ((u'{{submissionDate}}',
303303
instance.date_created.isoformat()),
304-
(u'{{form_id}}', str(self.xform.id))):
304+
(u'{{form_id}}', str(self.xform.id)),
305+
(u'{{media_id}}', str(self.attachment.id))):
305306
text = text.replace(*var)
306307
self.assertContains(response, instanceId, status_code=200)
307308
self.assertMultiLineEqual(response.content.decode('utf-8'), text)
@@ -466,7 +467,8 @@ def test_view_downloadSubmission_no_xmlns(self, mock_get_object):
466467
text = f.read()
467468
for var in ((u'{{submissionDate}}',
468469
instance.date_created.isoformat()),
469-
(u'{{form_id}}', str(self.xform.id))):
470+
(u'{{form_id}}', str(self.xform.id)),
471+
(u'{{media_id}}', str(self.attachment.id))):
470472
text = text.replace(*var)
471473
self.assertNotIn(
472474
'transportation id="transportation_2011_07_25"'
@@ -521,7 +523,8 @@ def test_view_downloadSubmission_multiple_nodes(self, mock_get_object):
521523
text = f.read()
522524
for var in ((u'{{submissionDate}}',
523525
instance.date_created.isoformat()),
524-
(u'{{form_id}}', str(self.xform.id))):
526+
(u'{{form_id}}', str(self.xform.id)),
527+
(u'{{media_id}}', str(self.attachment.id))):
525528
text = text.replace(*var)
526529
self.assertContains(response, instanceId, status_code=200)
527530

onadata/apps/logger/templates/downloadSubmission.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
{% for media in media_files %}<mediaFile>
77
<filename>{{ media.name|safe }}</filename>
88
<hash>md5:{{ media.file_hash }}</hash>
9-
<downloadUrl>{{ host }}{% url "attachment_url" 'original' %}?media_file={{ media.media_file.name|safe }}</downloadUrl>
9+
<downloadUrl>{{ host }}{% url "attachment_url" 'original' %}?media_file={{ media.media_file.name|safe }}&amp;attachment_id={{ media.pk|stringformat:"d" }}</downloadUrl>
1010
</mediaFile>{% endfor %}
1111
</submission>

onadata/apps/logger/tests/test_briefcase_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ def test_view_downloadSubmission(self):
223223
for var in (
224224
("{{submissionDate}}", instance.date_created.isoformat()),
225225
("{{form_id}}", str(self.xform.id)),
226+
("{{media_id}}", str(self.attachment.id)),
226227
):
227228
text = text.replace(*var)
228-
229229
self.assertContains(response, instanceId, status_code=200)
230230
self.assertMultiLineEqual(response.content.decode("utf-8"), text)
231231

onadata/apps/main/tests/fixtures/transportation/view/downloadSubmission.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
<mediaFile>
77
<filename>1335783522563.jpg</filename>
88
<hash>md5:2ca0d22073a9b6b4ebe51368b08da60c</hash>
9-
<downloadUrl>http://testserver/attachment/original?media_file=bob/attachments/{{form_id}}_transportation_2011_07_25/1335783522563.jpg</downloadUrl>
9+
<downloadUrl>http://testserver/attachment/original?media_file=bob/attachments/{{form_id}}_transportation_2011_07_25/1335783522563.jpg&amp;attachment_id={{media_id}}</downloadUrl>
1010
</mediaFile>
1111
</submission>

onadata/apps/viewer/tests/test_attachment_url.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,24 @@ def test_attachment_has_mimetype(self):
4343
attachment = Attachment.objects.all().reverse()[0]
4444
self.assertEqual(attachment.mimetype, 'image/jpeg')
4545

46+
def test_attachment_url_w_media_id(self):
47+
"""Test attachment url with attachment id"""
48+
self.assertEqual(
49+
Attachment.objects.count(), self.attachment_count + 1)
50+
response = self.client.get(
51+
self.url, {"attachment_id": self.attachment.id})
52+
self.assertEqual(response.status_code, 302) # redirects to amazon
53+
54+
# pylint: disable=invalid-name
55+
def test_attachment_url_w_media_id_no_redirect(self):
56+
"""Test attachment url with attachment id no redirect"""
57+
self.assertEqual(
58+
Attachment.objects.count(), self.attachment_count + 1)
59+
response = self.client.get(
60+
self.url, {"attachment_id": self.attachment.id,
61+
'no_redirect': 'true'})
62+
self.assertEqual(response.status_code, 200) # no redirects to amazon
63+
4664
def tearDown(self):
4765
path = os.path.join(settings.MEDIA_ROOT, self.user.username)
4866
for root, dirs, files in os.walk(path, topdown=False):

onadata/apps/viewer/views.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -866,13 +866,17 @@ def attachment_url(request, size="medium"):
866866
"""
867867
media_file = request.GET.get("media_file")
868868
no_redirect = request.GET.get("no_redirect")
869-
if not media_file:
870-
return HttpResponseNotFound(_("Attachment not found"))
869+
attachment_id = request.GET.get("attachment_id")
871870

872-
result = Attachment.objects.filter(media_file=media_file).order_by()[0:1]
873-
if not result:
871+
if not media_file and not attachment_id:
874872
return HttpResponseNotFound(_("Attachment not found"))
875-
attachment = result[0]
873+
if attachment_id:
874+
attachment = get_object_or_404(Attachment, pk=attachment_id)
875+
else:
876+
result = Attachment.objects.filter(media_file=media_file).order_by()[0:1]
877+
if not result:
878+
return HttpResponseNotFound(_("Attachment not found"))
879+
attachment = result[0]
876880

877881
if size == "original" and no_redirect == "true":
878882
response = response_with_mimetype_and_name(

0 commit comments

Comments
 (0)