コード例 #1
0
ファイル: test_export_tools.py プロジェクト: cmwaura/onadata
    def test_parse_request_export_options(self):
        request = self.factory.get('/export_async',
                                   data={
                                       "do_not_split_select_multiples":
                                       "false",
                                       "remove_group_name": "false",
                                       "include_labels": "false",
                                       "include_labels_only": "false",
                                       "include_images": "false"
                                   })

        options = parse_request_export_options(request.GET)

        self.assertEqual(options['split_select_multiples'], True)
        self.assertEqual(options['include_labels'], False)
        self.assertEqual(options['include_labels_only'], False)
        self.assertEqual(options['remove_group_name'], False)
        self.assertEqual(options['include_images'], False)

        request = self.factory.get('/export_async',
                                   data={
                                       "do_not_split_select_multiples": "true",
                                       "remove_group_name": "true",
                                       "include_labels": "true",
                                       "include_labels_only": "true",
                                       "include_images": "true"
                                   })

        options = parse_request_export_options(request.GET)

        self.assertEqual(options['split_select_multiples'], False)
        self.assertEqual(options['include_labels'], True)
        self.assertEqual(options['include_labels_only'], True)
        self.assertEqual(options['remove_group_name'], True)
        self.assertEqual(options['include_images'], True)
コード例 #2
0
ファイル: xform_viewset.py プロジェクト: babacar/onadata
    def export_async(self, request, *args, **kwargs):
        job_uuid = request.query_params.get('job_uuid')
        export_type = request.query_params.get('format')
        query = request.query_params.get("query")
        xform = self.get_object()

        token = request.query_params.get('token')
        meta = request.query_params.get('meta')
        data_id = request.query_params.get('data_id')
        options = parse_request_export_options(request.query_params)

        options.update({
            'meta': meta,
            'token': token,
            'data_id': data_id,
        })
        if query:
            options.update({'query': query})

        if request.query_params.get('format') in ['csvzip', 'savzip']:
            # Overide renderer and mediatype because all response are
            # suppose to be in json
            # TODO: Avoid overiding the format query param for export type
            #  DRF uses format to select the renderer
            self.request.accepted_renderer = renderers.JSONRenderer()
            self.request.accepted_mediatype = 'application/json'

        if job_uuid:
            try:
                resp = get_async_response(job_uuid, request, xform)
            except Export.DoesNotExist:
                # if this does not exist retry it against the primary
                try:
                    with use_master:
                        resp = get_async_response(job_uuid, request, xform)
                except NameError:
                    resp = get_async_response(job_uuid, request, xform)
        else:
            resp = process_async_export(request, xform, export_type, options)

            if isinstance(resp, HttpResponseRedirect):
                payload = {
                    "details": _("Google authorization needed"),
                    "url": resp.url
                }
                return Response(data=payload,
                                status=status.HTTP_403_FORBIDDEN,
                                content_type="application/json")

        self.etag_data = '{}'.format(timezone.now())

        return Response(data=resp,
                        status=status.HTTP_202_ACCEPTED,
                        content_type="application/json")
コード例 #3
0
ファイル: test_export_tools.py プロジェクト: onaio/onadata
    def test_parse_request_export_options(self):
        request = self.factory.get(
            '/export_async',
            data={
                "binary_select_multiples": "true",
                "do_not_split_select_multiples": "false",
                "remove_group_name": "false",
                "include_labels": "false",
                "include_labels_only": "false",
                "include_images": "false"
            })

        options = parse_request_export_options(request.GET)

        self.assertEqual(options['split_select_multiples'], True)
        self.assertEqual(options['binary_select_multiples'], True)
        self.assertEqual(options['include_labels'], False)
        self.assertEqual(options['include_labels_only'], False)
        self.assertEqual(options['remove_group_name'], False)
        self.assertEqual(options['include_images'], False)

        request = self.factory.get(
            '/export_async',
            data={
                "do_not_split_select_multiples": "true",
                "remove_group_name": "true",
                "include_labels": "true",
                "include_labels_only": "true",
                "include_images": "true"
            })

        options = parse_request_export_options(request.GET)

        self.assertEqual(options['split_select_multiples'], False)
        self.assertEqual(options['include_labels'], True)
        self.assertEqual(options['include_labels_only'], True)
        self.assertEqual(options['remove_group_name'], True)
        self.assertEqual(options['include_images'], True)
コード例 #4
0
    def export_async(self, request, *args, **kwargs):
        job_uuid = request.query_params.get('job_uuid')
        export_type = request.query_params.get('format')
        query = request.query_params.get("query")
        xform = self.get_object()

        token = request.query_params.get('token')
        meta = request.query_params.get('meta')
        data_id = request.query_params.get('data_id')
        options = parse_request_export_options(request.query_params)

        options.update({
            'meta': meta,
            'token': token,
            'data_id': data_id,
        })
        if query:
            options.update({'query': query})

        if job_uuid:
            try:
                resp = get_async_response(job_uuid, request, xform)
            except Export.DoesNotExist:
                # if this does not exist retry it against the primary
                try:
                    with use_master:
                        resp = get_async_response(job_uuid, request, xform)
                except NameError:
                    resp = get_async_response(job_uuid, request, xform)
        else:
            resp = process_async_export(request, xform, export_type, options)

            if isinstance(resp, HttpResponseRedirect):
                payload = {
                    "details": _("Google authorization needed"),
                    "url": resp.url
                }
                return Response(data=payload,
                                status=status.HTTP_403_FORBIDDEN,
                                content_type="application/json")

        self.etag_data = '{}'.format(timezone.now())

        return Response(data=resp,
                        status=status.HTTP_202_ACCEPTED,
                        content_type="application/json")
コード例 #5
0
ファイル: xform_viewset.py プロジェクト: onaio/onadata
    def export_async(self, request, *args, **kwargs):
        job_uuid = request.query_params.get('job_uuid')
        export_type = request.query_params.get('format')
        query = request.query_params.get("query")
        xform = self.get_object()

        token = request.query_params.get('token')
        meta = request.query_params.get('meta')
        data_id = request.query_params.get('data_id')
        options = parse_request_export_options(request.query_params)

        options.update({
            'meta': meta,
            'token': token,
            'data_id': data_id,
        })
        if query:
            options.update({'query': query})

        if job_uuid:
            try:
                resp = get_async_response(job_uuid, request, xform)
            except Export.DoesNotExist:
                # if this does not exist retry it against the primary
                try:
                    with use_master:
                        resp = get_async_response(job_uuid, request, xform)
                except NameError:
                    resp = get_async_response(job_uuid, request, xform)
        else:
            resp = process_async_export(request, xform, export_type, options)

            if isinstance(resp, HttpResponseRedirect):
                payload = {
                    "details": _("Google authorization needed"),
                    "url": resp.url
                }
                return Response(data=payload,
                                status=status.HTTP_403_FORBIDDEN,
                                content_type="application/json")

        self.etag_data = '{}'.format(timezone.now())

        return Response(data=resp,
                        status=status.HTTP_202_ACCEPTED,
                        content_type="application/json")
コード例 #6
0
ファイル: api_export_tools.py プロジェクト: zerxis/onadata
def custom_response_handler(request,
                            xform,
                            query,
                            export_type,
                            token=None,
                            meta=None,
                            dataview=False,
                            filename=None):
    """
    Returns a HTTP response with export file for download.
    """
    export_type = _get_export_type(export_type)
    if export_type in EXTERNAL_EXPORT_TYPES and \
            (token is not None) or (meta is not None):
        export_type = Export.EXTERNAL_EXPORT

    options = parse_request_export_options(request.query_params)

    dataview_pk = hasattr(dataview, 'pk') and dataview.pk
    options["dataview_pk"] = dataview_pk

    if dataview:
        columns_with_hxl = get_columns_with_hxl(xform.survey.get('children'))

        if columns_with_hxl:
            options['include_hxl'] = include_hxl_row(dataview.columns,
                                                     list(columns_with_hxl))
    try:
        query = filter_queryset_xform_meta_perms_sql(xform, request.user,
                                                     query)
    except NoRecordsPermission:
        return Response(data=json.dumps(
            {"details": _("You don't have permission")}),
                        status=status.HTTP_403_FORBIDDEN,
                        content_type="application/json")

    if query:
        options['query'] = query

    remove_group_name = options.get("remove_group_name")

    export_id = request.query_params.get("export_id")

    if export_id:
        export = get_object_or_404(Export, id=export_id, xform=xform)
    else:
        if export_type == Export.GOOGLE_SHEETS_EXPORT:

            return Response(data=json.dumps(
                {"details": _("Sheets export only supported in async mode")}),
                            status=status.HTTP_403_FORBIDDEN,
                            content_type="application/json")

        # check if we need to re-generate,
        # we always re-generate if a filter is specified
        def _new_export():
            return _generate_new_export(request,
                                        xform,
                                        query,
                                        export_type,
                                        dataview_pk=dataview_pk)

        if should_create_new_export(xform,
                                    export_type,
                                    options,
                                    request=request):
            export = _new_export()
        else:
            export = newest_export_for(xform, export_type, options)

            if not export.filename and not export.error_message:
                export = _new_export()

        log_export(request, xform, export_type)

        if export_type == Export.EXTERNAL_EXPORT:
            return external_export_response(export)

    if export.filename is None and export.error_message:
        raise exceptions.ParseError(export.error_message)

    # get extension from file_path, exporter could modify to
    # xlsx if it exceeds limits
    _path, ext = os.path.splitext(export.filename)
    ext = ext[1:]

    show_date = True
    if filename is None and export.status == Export.SUCCESSFUL:
        filename = _generate_filename(request,
                                      xform,
                                      remove_group_name,
                                      dataview_pk=dataview_pk)
    else:
        show_date = False
    response = response_with_mimetype_and_name(Export.EXPORT_MIMES[ext],
                                               filename,
                                               extension=ext,
                                               show_date=show_date,
                                               file_path=export.filepath)

    return response
コード例 #7
0
ファイル: api_export_tools.py プロジェクト: zerxis/onadata
def _generate_new_export(request,
                         xform,
                         query,
                         export_type,
                         dataview_pk=False):
    query = _set_start_end_params(request, query)
    extension = _get_extension_from_export_type(export_type)

    options = {
        "extension": extension,
        "username": xform.user.username,
        "id_string": xform.id_string,
    }
    if query:
        options['query'] = query

    options["dataview_pk"] = dataview_pk
    if export_type == Export.GOOGLE_SHEETS_EXPORT:
        options['google_credentials'] = \
            _get_google_credential(request).to_json()

    try:
        if export_type == Export.EXTERNAL_EXPORT:
            options['token'] = request.GET.get('token')
            options['data_id'] = request.GET.get('data_id')
            options['meta'] = request.GET.get('meta')

            export = generate_external_export(export_type,
                                              xform.user.username,
                                              xform.id_string,
                                              None,
                                              options,
                                              xform=xform)
        elif export_type == Export.OSM_EXPORT:
            export = generate_osm_export(export_type,
                                         xform.user.username,
                                         xform.id_string,
                                         None,
                                         options,
                                         xform=xform)
        elif export_type == Export.ZIP_EXPORT:
            export = generate_attachments_zip_export(export_type,
                                                     xform.user.username,
                                                     xform.id_string,
                                                     None,
                                                     options,
                                                     xform=xform)
        elif export_type == Export.KML_EXPORT:
            export = generate_kml_export(export_type,
                                         xform.user.username,
                                         xform.id_string,
                                         None,
                                         options,
                                         xform=xform)
        else:
            options.update(parse_request_export_options(request.query_params))

            export = generate_export(export_type, xform, None, options)

        audit = {"xform": xform.id_string, "export_type": export_type}
        log.audit_log(
            log.Actions.EXPORT_CREATED, request.user, xform.user,
            _("Created %(export_type)s export on '%(id_string)s'.") % {
                'id_string': xform.id_string,
                'export_type': export_type.upper()
            }, audit, request)
    except NoRecordsFoundError:
        raise Http404(_("No records found to export"))
    except J2XException as e:
        # j2x exception
        return async_status(FAILED, str(e))
    except SPSSIOError as e:
        raise exceptions.ParseError(str(e))
    else:
        return export