def test_get_presigned_url(self, get_client): client = Mock() get_client.return_value = client test_url = "http://s3/run_uid/file.txt" expected_key = "run_uid/file.txt" expected_bucket = 'test_bucket' with self.settings(AWS_BUCKET_NAME=expected_bucket): get_presigned_url(download_url=test_url) client.generate_presigned_url.assert_called_with('get_object', Params={ 'Bucket': expected_bucket, 'Key': expected_key }, ExpiresIn=300) with self.settings(AWS_BUCKET_NAME=expected_bucket): get_presigned_url(download_url=test_url, client=client) client.generate_presigned_url.assert_called_with('get_object', Params={ 'Bucket': expected_bucket, 'Key': expected_key }, ExpiresIn=300)
def download(request): """ Logs and redirects a dataset download request :return: A redirect to the direct download URL provided in the URL query string """ current_user = request.user if current_user is None: return HttpResponse(status=401) download_uid = request.GET.get("uid") try: downloadable = FileProducingTaskResult.objects.select_related( "export_task__export_provider_task__provider", "export_task__export_provider_task__run" ).get(uid=download_uid) if not downloadable.user_can_download(current_user): return HttpResponse( status=401, content=f"The user: {current_user.username} does not have permission to download it." ) except FileProducingTaskResult.DoesNotExist: return HttpResponse(status=400, content="Download not found for requested id value.") user_download = UserDownload.objects.create(user=current_user, downloadable=downloadable) user_download.save() if getattr(settings, "USE_S3", False): url = get_presigned_url(downloadable.download_url) else: url = request.build_absolute_uri(downloadable.download_url) logger.info("Redirecting to {0}".format(url)) return redirect(url)
def download(request): """ Logs and redirects a dataset download request :return: A redirect to the direct download URL provided in the URL query string """ download_uid = request.GET.get('uid') try: downloadable = FileProducingTaskResult.objects.get(uid=download_uid) except FileProducingTaskResult.DoesNotExist: return HttpResponse(status=400, content="Download not found for requested id value.") current_user = request.user if current_user is None: return HttpResponse(status=401) user = User.objects.get(username=current_user) user_download = UserDownload.objects.create(user=user, downloadable=downloadable) user_download.save() if getattr(settings, 'USE_S3', False): url = get_presigned_url(downloadable.download_url) else: url = request.build_absolute_uri(downloadable.download_url) logger.info("Redirecting to {0}".format(url)) return redirect(url)
def download(request): """ Logs and redirects a dataset download request :return: A redirect to the direct download URL provided in the URL query string """ download_uid = request.GET.get('uid') try: downloadable = FileProducingTaskResult.objects.get(uid=download_uid) except FileProducingTaskResult.DoesNotExist: return HttpResponse( status=400, content="Download not found for requested id value.") current_user = request.user if current_user is None: return HttpResponse(status=401) user = User.objects.get(username=current_user) user_download = UserDownload.objects.create(user=user, downloadable=downloadable) user_download.save() if getattr(settings, 'USE_S3', False): url = get_presigned_url(downloadable.download_url) else: url = request.build_absolute_uri(downloadable.download_url) logger.info("Redirecting to {0}".format(url)) return redirect(url)
def test_get_presigned_url(self, get_client): client = Mock() get_client.return_value = client test_url = "http://s3/run_uid/file.txt" expected_key = "run_uid/file.txt" expected_bucket = 'test_bucket' with self.settings(AWS_BUCKET_NAME=expected_bucket): get_presigned_url(download_url=test_url) client.generate_presigned_url.assert_called_with('get_object', Params={'Bucket': expected_bucket, 'Key': expected_key}, ExpiresIn=300) with self.settings(AWS_BUCKET_NAME=expected_bucket): get_presigned_url(download_url=test_url, client=client) client.generate_presigned_url.assert_called_with('get_object', Params={'Bucket': expected_bucket, 'Key': expected_key}, ExpiresIn=300)
def get_zipfile_url(self, obj): request = self.context['request'] if not obj.zipfile_url: return None if obj.zipfile_url.startswith('http'): if getattr(settings, 'USE_S3', False): return get_presigned_url(download_url=obj.zipfile_url) else: return obj.zipfile_url # get full URL path from current request uri = request.build_absolute_uri() uri = list(urlparse(uri)) # modify path, query parmas, and fragment on the URI to match zipfile URL path = os.path.join(settings.EXPORT_MEDIA_ROOT, obj.zipfile_url) uri[2] = path # path uri[4] = None # fragment uri[5] = None # query return urlunparse(uri)
def get_url(self, obj): request = self.context['request'] if getattr(settings, 'USE_S3', False): return get_presigned_url(download_url=obj.download_url) else: return request.build_absolute_uri(obj.download_url)