diff --git a/atst/domain/csp/file_uploads.py b/atst/domain/csp/file_uploads.py index be6f2cae..bfc47689 100644 --- a/atst/domain/csp/file_uploads.py +++ b/atst/domain/csp/file_uploads.py @@ -6,6 +6,9 @@ class Uploader: def generate_token(self): pass + def generate_download_link(self, object_name, filename): + pass + def object_name(self): return str(uuid4()) @@ -17,6 +20,9 @@ class MockUploader(Uploader): def get_token(self): return ({}, self.object_name()) + def generate_download_link(self, object_name, filename): + return "" + class AzureUploader(Uploader): def __init__(self, config): @@ -53,6 +59,21 @@ class AzureUploader(Uploader): ) return ({"token": sas_token}, object_name) + def generate_download_link(self, object_name, filename): + account = CloudStorageAccount( + account_name=self.account_name, account_key=self.storage_key + ) + bbs = account.create_block_blob_service() + sas_token = bbs.generate_blob_shared_access_signature( + self.container_name, + object_name, + permission=BlobPermissions.READ, + expiry=datetime.utcnow() + self.timeout, + content_disposition=f"attachment; filename={filename}", + protocol="https" + ) + return bbs.make_blob_url(self.container_name, object_name, protocol="https", sas_token=sas_token) + class AwsUploader(Uploader): def __init__(self, config): diff --git a/atst/routes/task_orders/new.py b/atst/routes/task_orders/new.py index 201a6923..a953f619 100644 --- a/atst/routes/task_orders/new.py +++ b/atst/routes/task_orders/new.py @@ -17,8 +17,9 @@ from atst.models.permissions import Permissions from atst.utils.flash import formatted_flash as flash -def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, form=None): - render_args = {} +def render_task_orders_edit(template, portfolio_id=None, task_order_id=None, form=None, extra_args=None): + render_args = extra_args or {} + if task_order_id: task_order = TaskOrders.get(task_order_id) portfolio_id = task_order.portfolio_id @@ -114,10 +115,14 @@ def edit(task_order_id): @task_orders_bp.route("/task_orders//form/step_1") @user_can(Permissions.CREATE_TASK_ORDER, message="view task order form") def form_step_one_add_pdf(portfolio_id=None, task_order_id=None): + (token, object_name) = current_app.uploader.get_token() + extra_args = {"token": token, "object_name": object_name} + return render_task_orders_edit( "task_orders/step_1.html", portfolio_id=portfolio_id, task_order_id=task_order_id, + extra_args=extra_args, ) @@ -219,11 +224,19 @@ def submit_form_step_three_add_clins(task_order_id): def form_step_four_review(task_order_id): task_order = TaskOrders.get(task_order_id) + (token, object_name) = current_app.uploader.get_token() + extra_args = { + "token": token, + "object_name": object_name, + "pdf_download_url": current_app.uploader.generate_download_link(task_order.pdf.object_name, task_order.pdf.filename) + } + if task_order.is_completed == False: raise NoAccessError("task order form review") return render_task_orders_edit( - "task_orders/step_4.html", task_order_id=task_order_id + "task_orders/step_4.html", task_order_id=task_order_id, + extra_args=extra_args, ) diff --git a/js/lib/upload.js b/js/lib/upload.js index f2c5440b..50fe3edd 100644 --- a/js/lib/upload.js +++ b/js/lib/upload.js @@ -43,6 +43,14 @@ class AzureUploader { fileReader.readAsText(file) }) } + + downloadUrl(objectName) { + const blobService = Azure.createBlobServiceWithSas( + `https://${this.accountName}.blob.core.windows.net`, + this.sasToken + ) + return blobService.getUrl(this.containerName, objectName, this.sasToken) + } } class AwsUploader { @@ -58,6 +66,7 @@ class AwsUploader { }) form.append('file', file) form.set('x-amz-meta-filename', file.name) + form.set('Content-Type', 'application/pdf') const response = await fetch(this.presignedPost.url, { method: 'POST', diff --git a/templates/fragments/task_order_review.html b/templates/fragments/task_order_review.html index 563f9169..d9d69f04 100644 --- a/templates/fragments/task_order_review.html +++ b/templates/fragments/task_order_review.html @@ -13,7 +13,7 @@
{{ 'task_orders.review.pdf_title' | translate }}
- + {{ Icon('check-circle-solid') }} {{ task_order.pdf.filename }}