From 641e52381909e8b7fe05aeaf1a3a392246d1b221 Mon Sep 17 00:00:00 2001 From: Becky Smith Date: Wed, 28 Aug 2024 10:14:26 +0100 Subject: [PATCH 01/15] Move file browser templates into workspace and request direcories Just move the files around for now, in preparation for getting rid of the request/workspace context switches --- .../file_browser/{ => file_content}/csv.html | 0 .../{ => file_content}/plaintext.html | 0 .../file_browser/{ => file_content}/text.html | 0 .../file_browser/{ => request}/directory.html | 0 .../templates/file_browser/request/file.html | 210 ++++++++++++++++++ .../file_browser/{ => request}/group.html | 0 .../file_browser/{ => request}/index.html | 0 .../file_browser/{ => request}/request.html | 0 .../file_browser/workspace/directory.html | 96 ++++++++ .../file_browser/{ => workspace}/file.html | 0 .../file_browser/workspace/index.html | 78 +++++++ .../{ => workspace}/workspace.html | 0 12 files changed, 384 insertions(+) rename airlock/templates/file_browser/{ => file_content}/csv.html (100%) rename airlock/templates/file_browser/{ => file_content}/plaintext.html (100%) rename airlock/templates/file_browser/{ => file_content}/text.html (100%) rename airlock/templates/file_browser/{ => request}/directory.html (100%) create mode 100644 airlock/templates/file_browser/request/file.html rename airlock/templates/file_browser/{ => request}/group.html (100%) rename airlock/templates/file_browser/{ => request}/index.html (100%) rename airlock/templates/file_browser/{ => request}/request.html (100%) create mode 100644 airlock/templates/file_browser/workspace/directory.html rename airlock/templates/file_browser/{ => workspace}/file.html (100%) create mode 100644 airlock/templates/file_browser/workspace/index.html rename airlock/templates/file_browser/{ => workspace}/workspace.html (100%) diff --git a/airlock/templates/file_browser/csv.html b/airlock/templates/file_browser/file_content/csv.html similarity index 100% rename from airlock/templates/file_browser/csv.html rename to airlock/templates/file_browser/file_content/csv.html diff --git a/airlock/templates/file_browser/plaintext.html b/airlock/templates/file_browser/file_content/plaintext.html similarity index 100% rename from airlock/templates/file_browser/plaintext.html rename to airlock/templates/file_browser/file_content/plaintext.html diff --git a/airlock/templates/file_browser/text.html b/airlock/templates/file_browser/file_content/text.html similarity index 100% rename from airlock/templates/file_browser/text.html rename to airlock/templates/file_browser/file_content/text.html diff --git a/airlock/templates/file_browser/directory.html b/airlock/templates/file_browser/request/directory.html similarity index 100% rename from airlock/templates/file_browser/directory.html rename to airlock/templates/file_browser/request/directory.html diff --git a/airlock/templates/file_browser/request/file.html b/airlock/templates/file_browser/request/file.html new file mode 100644 index 00000000..e3ed4609 --- /dev/null +++ b/airlock/templates/file_browser/request/file.html @@ -0,0 +1,210 @@ +{% fragment as buttons %} +
+ {% if context == "workspace" and workspace.is_active %} + {% if add_file %} +
+ {% if path_item.workspace_status.value == "UPDATED" %} + {% #button type="submit" name="action" value="update_files" variant="success" %} + Update File in Request + {% /button %} + {% else %} + {% #button type="submit" name="action" value="add_files" variant="success" %} + Add File to Request + {% /button %} + {% endif %} + + + {% csrf_token %} +
+
+ {% elif path_item.workspace_status.value == "RELEASED" %} + {% #button type="button" disabled=True tooltip="This file has already been released" id="add-file-modal-button-disabled" %} + Add File to Request + {% /button %} + {% elif path_item.workspace_status.value == "UNDER_REVIEW" %} + {% #button type="button" disabled=True tooltip="This file has already been added to the current request" id="add-file-modal-button-disabled" %} + Add File to Request + {% /button %} + {% elif not path_item.is_valid %} + {% #button type="button" disabled=True tooltip="This file type cannot be added to a request" id="add-file-modal-button-disabled" %} + Add File to Request + {% /button %} + {% elif current_request and not current_request.is_editing %} + {% #button type="button" disabled=True tooltip="The current request is under review and cannot be modified." id="add-file-modal-button-disabled" %} + {% if path_item.workspace_status.value == "UPDATED" %} + Update File in Request + {% else %} + Add File to Request + {% endif %} + {% /button %} + {% else %} + {% #button type="button" disabled=True tooltip="You do not have permission to add this file to a request" id="add-file-modal-button-disabled" %} + Add File to Request + {% /button %} + {% endif %} + {% elif context == "request" %} + {% if path_item.is_supporting %} + + + Supporting + {% tooltip content="This is a supporting file and will not be released." %} + + {% elif path_item.is_withdrawn %} + + + Withdrawn + {% tooltip content="This file has been withdrawn and will not be released." %} + + {% endif %} + + {% if path_item.is_output %} + {% with decision=path_item.request_status.decision %} +
+ Decision: + + {{ decision.description }} + + +
+ {% endwith %} + {% endif %} + + {% if is_author %} + {% if workspace.is_active %} + {% if path_item.is_output and file_withdraw_url %} +
+ {% csrf_token %} + + {% #button type="submit" id="withdraw-file-button" tooltip="Withdraw this file from this request" variant="warning" %}Withdraw from Request{% /button %} +
+ {% endif %} + {% endif %} + {% elif is_output_checker %} + {% if path_item.is_output %} +
+ {% with vote=path_item.request_status.vote %} + {% if vote %} + Your review: + + {{ vote.description }} + + + {% endif %} + {% endwith %} +
+ {% endif %} + + {% if voting_buttons.show %} +
+ {% if voting_buttons.approve.disabled %} + + {% else %} +
+ {% csrf_token %} + +
+ {% endif %} + + + {% if voting_buttons.request_changes.disabled %} + + {% else %} +
+ {% csrf_token %} + +
+ {% endif %} + + {% if voting_buttons.reset_review.disabled %} + + {% else %} +
+ {% csrf_token %} + +
+ {% endif %} + +
+ {% endif %} + {% endif %} + + {% #modal id="group-context" button_text="View Context" %} + {% include "file_browser/request/group.html" %} + {% /modal %} + {% endif %} + + + + + +
+ + More… + + + + + + +
+
+
+{% endfragment %} + +{% #card id="fileCard" title=path_item.name container=True custom_button=buttons %} +
+ +
+{% /card %} diff --git a/airlock/templates/file_browser/group.html b/airlock/templates/file_browser/request/group.html similarity index 100% rename from airlock/templates/file_browser/group.html rename to airlock/templates/file_browser/request/group.html diff --git a/airlock/templates/file_browser/index.html b/airlock/templates/file_browser/request/index.html similarity index 100% rename from airlock/templates/file_browser/index.html rename to airlock/templates/file_browser/request/index.html diff --git a/airlock/templates/file_browser/request.html b/airlock/templates/file_browser/request/request.html similarity index 100% rename from airlock/templates/file_browser/request.html rename to airlock/templates/file_browser/request/request.html diff --git a/airlock/templates/file_browser/workspace/directory.html b/airlock/templates/file_browser/workspace/directory.html new file mode 100644 index 00000000..f1c22cc1 --- /dev/null +++ b/airlock/templates/file_browser/workspace/directory.html @@ -0,0 +1,96 @@ +{% load django_vite %} +{% load static %} + + + + +{% fragment as buttons %} + {% if context == "workspace" and workspace.is_active %} + {% if path_item.children %} + {% if multiselect_add %} +
+
+ {% #button type="submit" name="action" value="add_files" variant="success" form="multiselect_form"%} + Add Files to Request + {% /button %} + {% #button type="submit" name="action" value="update_files" variant="success" form="multiselect_form"%} + Update Files in Request + {% /button %} +
+
+
+ {% elif current_request and current_request.status_owner != "AUTHOR" %} + {% #button type="button" disabled=True tooltip="The current request is under review and cannot be modified." id="add-file-modal-button-disabled" %} + Add Files to Request + {% /button %} + {% else %} + {% #button type="button" disabled=True tooltip="You do not have permission to add files to a request" id="add-file-modal-button-disabled" %} + Add Files to Request + {% /button %} + {% endif %} + {% endif %} + {% elif context == "request" and multiselect_withdraw %} +
+
+ {% #button type="submit" name="action" value="withdraw_files" variant="warning" form="multiselect_form"%}Withdraw Files from Request{% /button %} +
+
+
+ {% endif %} +{% endfragment %} + + +{% #card title=path_item.name container=True custom_button=buttons %} + {% if not path_item.children %} + This directory is empty + {% else %} +
+ + {% csrf_token %} + + + {% include "file_browser/_includes/directory_table/"|add:context|add:".html" %} + +
+ + {% vite_asset "assets/src/scripts/components.js" app="job_server" %} + + + + {% endif %} +{% /card %} diff --git a/airlock/templates/file_browser/file.html b/airlock/templates/file_browser/workspace/file.html similarity index 100% rename from airlock/templates/file_browser/file.html rename to airlock/templates/file_browser/workspace/file.html diff --git a/airlock/templates/file_browser/workspace/index.html b/airlock/templates/file_browser/workspace/index.html new file mode 100644 index 00000000..9d127433 --- /dev/null +++ b/airlock/templates/file_browser/workspace/index.html @@ -0,0 +1,78 @@ +{% extends "base.html" %} + +{% load static %} +{% load django_vite %} +{% load django_htmx %} + +{% block metatitle %}{{ title }} | Airlock{% endblock metatitle %} + +{% block extra_styles %} + + +{% endblock extra_styles %} + +{% block content %} + {% if context == "request" %} + {% #airlock_header context=context release_request=release_request title=title workspace=workspace %} + + ← Request overview + + {% /airlock_header %} + + {% if request_action_required %} +
+ {% #alert variant="warning" title="Action required" dismissible=True %} + {{ request_action_required }} + {% /alert %} +
+ {% endif %} + + {% else %} + {% #airlock_header context=context current_request=current_request title=title workspace=workspace return_url=return_url %} + {% /airlock_header %} + {% endif %} + +{% endblock content %} + +{% block full_width_content %} +
+
+
    + {% include "file_browser/tree.html" with path=root.fake_parent %} +
+
+
+ {% include "file_browser/contents.html" %} +
+
+{% endblock full_width_content %} + +{% block extra_js %} + + {% django_htmx_script %} + +{% endblock %} diff --git a/airlock/templates/file_browser/workspace.html b/airlock/templates/file_browser/workspace/workspace.html similarity index 100% rename from airlock/templates/file_browser/workspace.html rename to airlock/templates/file_browser/workspace/workspace.html From 6670f026f4e06716c49ac0e9814da968dedb4dc0 Mon Sep 17 00:00:00 2001 From: Becky Smith Date: Wed, 28 Aug 2024 10:36:41 +0100 Subject: [PATCH 02/15] Update workspace views to use reorganised templates This also involves updating the contents.html to generate the correct includes template from the path_item type. --- airlock/renderers.py | 8 ++++---- airlock/templates/file_browser/contents.html | 13 ------------- .../templates/file_browser/workspace/contents.html | 5 +++++ .../workspace/{directory.html => dir.html} | 0 airlock/templates/file_browser/workspace/index.html | 2 +- airlock/views/workspace.py | 4 ++-- tests/integration/views/test_workspace.py | 6 +++--- 7 files changed, 15 insertions(+), 23 deletions(-) delete mode 100644 airlock/templates/file_browser/contents.html create mode 100644 airlock/templates/file_browser/workspace/contents.html rename airlock/templates/file_browser/workspace/{directory.html => dir.html} (100%) diff --git a/airlock/renderers.py b/airlock/renderers.py index 49962841..8faa73cc 100644 --- a/airlock/renderers.py +++ b/airlock/renderers.py @@ -119,7 +119,7 @@ def headers(self): class CSVRenderer(Renderer): - template = RendererTemplate.from_name("file_browser/csv.html") + template = RendererTemplate.from_name("file_browser/file_content/csv.html") is_text: ClassVar[bool] = True def context(self): @@ -134,7 +134,7 @@ def context(self): class TextRenderer(Renderer): - template = RendererTemplate.from_name("file_browser/text.html") + template = RendererTemplate.from_name("file_browser/file_content/text.html") is_text: ClassVar[bool] = True def context(self): @@ -145,11 +145,11 @@ def context(self): class PlainTextRenderer(TextRenderer): - template = RendererTemplate.from_name("file_browser/plaintext.html") + template = RendererTemplate.from_name("file_browser/file_content/plaintext.html") class InvalidFileRenderer(Renderer): - template = RendererTemplate.from_name("file_browser/text.html") + template = RendererTemplate.from_name("file_browser/file_content/text.html") def context(self): return { diff --git a/airlock/templates/file_browser/contents.html b/airlock/templates/file_browser/contents.html deleted file mode 100644 index e5a89500..00000000 --- a/airlock/templates/file_browser/contents.html +++ /dev/null @@ -1,13 +0,0 @@ -
- {% if path_item.type.name == "FILEGROUP" %} - {% include "file_browser/group.html" with inline=False %} - {% elif path_item.type.name == "DIR" %} - {% include "file_browser/directory.html" %} - {% elif path_item.type.name == "FILE" %} - {% include "file_browser/file.html" %} - {% elif path_item.type.name == "WORKSPACE" %} - {% include "file_browser/workspace.html" %} - {% elif path_item.type.name == "REQUEST" %} - {% include "file_browser/request.html" %} - {% endif %} -
diff --git a/airlock/templates/file_browser/workspace/contents.html b/airlock/templates/file_browser/workspace/contents.html new file mode 100644 index 00000000..17a7a234 --- /dev/null +++ b/airlock/templates/file_browser/workspace/contents.html @@ -0,0 +1,5 @@ +
+ {% with "file_browser/workspace/"|add:path_item.type.name.lower|add:".html" as template %} + {% include template %} + {% endwith %} +
diff --git a/airlock/templates/file_browser/workspace/directory.html b/airlock/templates/file_browser/workspace/dir.html similarity index 100% rename from airlock/templates/file_browser/workspace/directory.html rename to airlock/templates/file_browser/workspace/dir.html diff --git a/airlock/templates/file_browser/workspace/index.html b/airlock/templates/file_browser/workspace/index.html index 9d127433..1f13ebfe 100644 --- a/airlock/templates/file_browser/workspace/index.html +++ b/airlock/templates/file_browser/workspace/index.html @@ -66,7 +66,7 @@
- {% include "file_browser/contents.html" %} + {% include "file_browser/workspace/contents.html" %}
{% endblock full_width_content %} diff --git a/airlock/views/workspace.py b/airlock/views/workspace.py index 6c7c246f..6fbb2929 100644 --- a/airlock/views/workspace.py +++ b/airlock/views/workspace.py @@ -57,11 +57,11 @@ def workspace_index(request): @instrument(func_attributes={"workspace": "workspace_name"}) def workspace_view(request, workspace_name: str, path: str = ""): workspace = get_workspace_or_raise(request.user, workspace_name) - template = "file_browser/index.html" + template = "file_browser/workspace/index.html" selected_only = False if request.htmx: - template = "file_browser/contents.html" + template = "file_browser/workspace/contents.html" selected_only = True tree = get_workspace_tree(workspace, path, selected_only) diff --git a/tests/integration/views/test_workspace.py b/tests/integration/views/test_workspace.py index 3d610b86..611f5a6b 100644 --- a/tests/integration/views/test_workspace.py +++ b/tests/integration/views/test_workspace.py @@ -155,7 +155,7 @@ def test_workspace_view_with_file(airlock_client): response = airlock_client.get("/workspaces/view/workspace/file.txt") assert response.status_code == 200 assert workspace.get_contents_url(UrlPath("file.txt")) in response.rendered_content - assert response.template_name == "file_browser/index.html" + assert response.template_name == "file_browser/workspace/index.html" assert "HX-Request" in response.headers["Vary"] @@ -193,7 +193,7 @@ def test_workspace_view_with_updated_file(bll, airlock_client, request_status): assert response.status_code == 200 assert workspace.get_contents_url(UrlPath("file.txt")) in response.rendered_content assert "Update File in Request" in response.rendered_content - assert response.template_name == "file_browser/index.html" + assert response.template_name == "file_browser/workspace/index.html" assert "HX-Request" in response.headers["Vary"] @@ -206,7 +206,7 @@ def test_workspace_view_with_file_htmx(airlock_client): ) assert response.status_code == 200 assert workspace.get_contents_url(UrlPath("file.txt")) in response.rendered_content - assert response.template_name == "file_browser/contents.html" + assert response.template_name == "file_browser/workspace/contents.html" assert '
- {% include "file_browser/contents.html" %} + {% include "file_browser/request/contents.html" %}
{% endblock full_width_content %} diff --git a/airlock/views/request.py b/airlock/views/request.py index fa678d7e..82dc2c94 100644 --- a/airlock/views/request.py +++ b/airlock/views/request.py @@ -84,11 +84,11 @@ def request_view(request, request_id: str, path: str = ""): release_request = get_release_request_or_raise(request.user, request_id) relpath = UrlPath(path) - template = "file_browser/index.html" + template = "file_browser/request/index.html" selected_only = False if request.htmx: - template = "file_browser/contents.html" + template = "file_browser/request/contents.html" selected_only = True tree = get_request_tree(release_request, request.user, relpath, selected_only) diff --git a/tests/integration/views/test_request.py b/tests/integration/views/test_request.py index 59dff0bb..7cf52a21 100644 --- a/tests/integration/views/test_request.py +++ b/tests/integration/views/test_request.py @@ -143,7 +143,7 @@ def test_request_view_with_file(airlock_client, filetype): release_request.get_contents_url(UrlPath("group/file.txt")) in response.rendered_content ) - assert response.template_name == "file_browser/index.html" + assert response.template_name == "file_browser/request/index.html" def test_request_view_with_file_htmx(airlock_client): @@ -161,7 +161,7 @@ def test_request_view_with_file_htmx(airlock_client): release_request.get_contents_url(UrlPath("group/file.txt")) in response.rendered_content ) - assert response.template_name == "file_browser/contents.html" + assert response.template_name == "file_browser/request/contents.html" assert '