5
5
6
6
import requests
7
7
from django .conf import settings
8
- from django .http import Http404
8
+ from django .http import Http404 , HttpResponseRedirect
9
9
from django .utils .translation import gettext_lazy as t
10
10
from pymongo .errors import OperationFailure
11
11
from rest_framework import (
@@ -188,6 +188,16 @@ class DataViewSet(AssetNestedObjectViewsetMixin, NestedViewSetMixin,
188
188
>
189
189
> curl -X GET https://[kpi]/api/v2/assets/aSAvYreNzVEkrWg5Gdcvg/data/234/enketo/edit/?return_url=false
190
190
191
+ To redirect (HTTP 302) to the Enketo editing URL, use the `…/enketo/redirect/edit/` endpoint:
192
+
193
+ <pre class="prettyprint">
194
+ <b>GET</b> /api/v2/assets/<code>{uid}</code>/data/<code>{id}</code>/enketo/redirect/edit/?return_url=false
195
+ </pre>
196
+
197
+ > Example
198
+ >
199
+ > curl -X GET https://[kpi]/api/v2/assets/aSAvYreNzVEkrWg5Gdcvg/data/234/enketo/redirect/edit/?return_url=false
200
+
191
201
View-only version of current submission
192
202
193
203
Return a URL to display the filled submission in view-only mode in the Enketo UI.
@@ -200,6 +210,16 @@ class DataViewSet(AssetNestedObjectViewsetMixin, NestedViewSetMixin,
200
210
>
201
211
> curl -X GET https://[kpi]/api/v2/assets/aSAvYreNzVEkrWg5Gdcvg/data/234/enketo/view/
202
212
213
+ To redirect (HTTP 302) to the Enketo viewing URL, use the `…/enketo/redirect/view/` endpoint:
214
+
215
+ <pre class="prettyprint">
216
+ <b>GET</b> /api/v2/assets/<code>{uid}</code>/data/<code>{id}</code>/enketo/redirect/view/?return_url=false
217
+ </pre>
218
+
219
+ > Example
220
+ >
221
+ > curl -X GET https://[kpi]/api/v2/assets/aSAvYreNzVEkrWg5Gdcvg/data/234/enketo/redirect/view/?return_url=false
222
+
203
223
### Duplicate submission
204
224
205
225
Duplicates the data of a submission
@@ -435,7 +455,7 @@ def duplicate(self, request, pk, *args, **kwargs):
435
455
methods = ['GET' ],
436
456
renderer_classes = [renderers .JSONRenderer ],
437
457
permission_classes = [EditLinkSubmissionPermission ],
438
- url_path = '(enketo/)?edit' ,
458
+ url_path = '(( enketo/)|(enketo/redirect/) )?edit' ,
439
459
)
440
460
def enketo_edit (self , request , pk , * args , ** kwargs ):
441
461
submission_id = positive_int (pk )
@@ -447,18 +467,19 @@ def enketo_edit(self, request, pk, *args, **kwargs):
447
467
EnketoSessionAuthentication .prepare_response_with_csrf_cookie (
448
468
request , enketo_response
449
469
)
450
- return enketo_response
470
+ return self . _handle_enketo_redirect ( request , enketo_response , * args , ** kwargs )
451
471
452
472
@action (
453
473
detail = True ,
454
474
methods = ['GET' ],
455
475
renderer_classes = [renderers .JSONRenderer ],
456
476
permission_classes = [ViewSubmissionPermission ],
457
- url_path = 'enketo/view' ,
477
+ url_path = 'enketo/(redirect/)? view' ,
458
478
)
459
479
def enketo_view (self , request , pk , * args , ** kwargs ):
460
480
submission_id = positive_int (pk )
461
- return self ._get_enketo_link (request , submission_id , 'view' )
481
+ enketo_response = self ._get_enketo_link (request , submission_id , 'view' )
482
+ return self ._handle_enketo_redirect (request , enketo_response , * args , ** kwargs )
462
483
463
484
def get_queryset (self ):
464
485
# This method is needed when pagination is activated and renderer is
@@ -796,3 +817,13 @@ def _get_enketo_link(
796
817
'version_uid' : version_uid ,
797
818
}
798
819
)
820
+
821
+ def _handle_enketo_redirect (self , request , enketo_response , * args , ** kwargs ):
822
+ if request .path .strip ('/' ).split ('/' )[- 2 ] == 'redirect' :
823
+ try :
824
+ enketo_url = enketo_response .data ['url' ]
825
+ except KeyError :
826
+ pass
827
+ else :
828
+ return HttpResponseRedirect (enketo_url )
829
+ return enketo_response
0 commit comments