Exemplo n.º 1
0
def export_results(request):

    total = int(request.GET.get("total", 0))
    format = request.GET.get("format", "tilecsv")
    download_limit = settings.SEARCH_EXPORT_IMMEDIATE_DOWNLOAD_THRESHOLD
    if total > download_limit and format != "geojson":
        celery_worker_running = task_management.check_if_celery_available()
        if celery_worker_running is True:
            request_values = dict(request.GET)
            request_values["path"] = request.get_full_path()
            result = tasks.export_search_results.apply_async(
                (request.user.id, request_values, format),
                link=tasks.update_user_task_record.s(),
                link_error=tasks.log_error.s())
            message = _("{total} instances have been submitted for export. \
                Click the Bell icon to check for a link to download your data"
                        ).format(**locals())
            return JSONResponse({"success": True, "message": message})
        else:
            message = _(
                "Your search exceeds the {download_limit} instance download limit. Please refine your search"
            ).format(**locals())
            return JSONResponse({"success": False, "message": message})
    elif format == "tilexl":
        exporter = SearchResultsExporter(search_request=request)
        export_files, export_info = exporter.export(format)
        wb = export_files[0]["outputfile"]
        with NamedTemporaryFile() as tmp:
            wb.save(tmp.name)
            tmp.seek(0)
            stream = tmp.read()
            export_files[0]["outputfile"] = tmp
            return zip_utils.zip_response(
                export_files, zip_file_name=f"{settings.APP_NAME}_export.zip")
    else:
        exporter = SearchResultsExporter(search_request=request)
        export_files, export_info = exporter.export(format)

        if len(export_files) == 0 and format == "shp":
            message = _(
                "Either no instances were identified for export or no resources have exportable geometry nodes\
                Please confirm that the models of instances you would like to export have geometry nodes and that\
                those nodes are set as exportable")
            dest = StringIO()
            dest.write(message)
            export_files.append({"name": "error.txt", "outputfile": dest})
        return zip_utils.zip_response(
            export_files, zip_file_name=f"{settings.APP_NAME}_export.zip")
Exemplo n.º 2
0
 def download_files(self, request):
     try:
         tileids = jsonparser.loads(request.GET.get("tiles", None))
         nodeid = request.GET.get("node", None)
         tiles = Tile.objects.filter(pk__in=tileids)
         files = sum(
             [[{
                 "name":
                 file["name"],
                 "outputfile":
                 models.File.objects.get(pk=file["file_id"]).path
             } for file in tile.data[nodeid]] for tile in tiles],
             [],
         )
         response = arches_zip.zip_response(files,
                                            "file-viewer-download.zip")
         return response
     except TypeError as e:
         logger.error("Tile id array required to download files.")
         return JSONErrorResponse(_("Request Failed"), _(e))