Skip to content

Commit

Permalink
create file approve & reject urls
Browse files Browse the repository at this point in the history
  • Loading branch information
madwort committed Mar 27, 2024
1 parent 3bb45af commit 3ca8617
Show file tree
Hide file tree
Showing 4 changed files with 167 additions and 0 deletions.
10 changes: 10 additions & 0 deletions airlock/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,16 @@
airlock.views.request_contents,
name="request_contents",
),
path(
"requests/approve/<str:request_id>/<path:path>",
airlock.views.file_approve,
name="file_approve",
),
path(
"requests/reject/<str:request_id>/<path:path>",
airlock.views.file_reject,
name="file_reject",
),
path(
"requests/release/<str:request_id>",
airlock.views.request_release_files,
Expand Down
4 changes: 4 additions & 0 deletions airlock/views/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from .auth import login, logout
from .request import (
file_approve,
file_reject,
request_contents,
request_index,
request_reject,
Expand All @@ -19,6 +21,8 @@
"login",
"logout",
"index",
"file_approve",
"file_reject",
"request_contents",
"request_index",
"request_reject",
Expand Down
41 changes: 41 additions & 0 deletions airlock/views/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,47 @@ def request_reject(request, request_id):

@instrument(func_attributes={"release_request": "request_id"})
@require_http_methods(["POST"])
def file_approve(request, request_id, path: str):
release_request = get_release_request_or_raise(request.user, request_id)

try:
relpath = release_request.get_request_file(path).relpath
except bll.FileNotFound:
raise Http404()

try:
bll.approve_file(release_request, relpath, request.user)
except bll.ApprovalPermissionDenied as exc:
raise PermissionDenied(str(exc))

messages.success(request, "File has been approved")
# TODO: this should go to the previous page (file view?)
return redirect(release_request.get_url())


@instrument(kwarg_attributes={"release_request": "request_id"})
@require_http_methods(["POST"])
def file_reject(request, request_id, path: str):
release_request = get_release_request_or_raise(request.user, request_id)

try:
relpath = release_request.get_request_file(path).relpath
except bll.FileNotFound:
raise Http404()

try:
bll.reject_file(release_request, relpath, request.user)
except bll.ApprovalPermissionDenied as exc:
raise PermissionDenied(str(exc))

# TODO: should this be messages.error() ?
messages.success(request, "File has been rejected")
# TODO: this should go to the previous page (file view?)
return redirect(release_request.get_url())


@instrument(kwarg_attributes={"release_request": "request_id"})
@require_http_methods(["POST"])
def request_release_files(request, request_id):
release_request = get_release_request_or_raise(request.user, request_id)

Expand Down
112 changes: 112 additions & 0 deletions tests/integration/views/test_request.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from io import BytesIO
from pathlib import PurePosixPath as UrlPath

import pytest
import requests

from airlock.business_logic import (
AuditEventType,
FileReviewStatus,
RequestFileType,
RequestStatus,
UrlPath,
Expand Down Expand Up @@ -376,6 +378,116 @@ def test_request_submit_not_author(airlock_client):
assert persisted_request.status == RequestStatus.PENDING


@pytest.mark.parametrize("review", [("approve"), ("reject")])
def test_file_review_bad_user(airlock_client, review):
workspace = "test1"
airlock_client.login(workspaces=[workspace], output_checker=False)
author = factories.create_user("author", [workspace], False)
release_request = factories.create_release_request(
workspace,
user=author,
status=RequestStatus.SUBMITTED,
)
path = "path/test.txt"
factories.write_request_file(release_request, "group", path, contents="test")

response = airlock_client.post(
f"/requests/{review}/{release_request.id}/group/{path}"
)
assert response.status_code == 403
relpath = UrlPath(path)
assert (
len(
factories.bll.get_release_request(release_request.id, author)
.filegroups["group"]
.files[relpath]
.reviews
)
== 0
)


@pytest.mark.parametrize("review", [("approve"), ("reject")])
def test_file_review_bad_file(airlock_client, review):
airlock_client.login(output_checker=True)
author = factories.create_user("author", ["test1"], False)
release_request = factories.create_release_request(
"test1",
user=author,
status=RequestStatus.SUBMITTED,
)
path = "path/test.txt"
factories.write_request_file(release_request, "group", path, contents="test")

bad_path = "path/bad.txt"
response = airlock_client.post(
f"/requests/{review}/{release_request.id}/group/{bad_path}"
)
assert response.status_code == 404
relpath = UrlPath(path)
assert (
len(
factories.bll.get_release_request(release_request.id, author)
.filegroups["group"]
.files[relpath]
.reviews
)
== 0
)


def test_file_approve(airlock_client):
airlock_client.login(output_checker=True)
author = factories.create_user("author", ["test1"], False)
release_request = factories.create_release_request(
"test1",
user=author,
status=RequestStatus.SUBMITTED,
)
path = "path/test.txt"
factories.write_request_file(release_request, "group", path, contents="test")

response = airlock_client.post(
f"/requests/approve/{release_request.id}/group/{path}"
)
assert response.status_code == 302
relpath = UrlPath(path)
review = (
factories.bll.get_release_request(release_request.id, author)
.filegroups["group"]
.files[relpath]
.reviews[0]
)
assert review.status == FileReviewStatus.APPROVED
assert review.reviewer == "testuser"


def test_file_reject(airlock_client):
airlock_client.login(output_checker=True)
author = factories.create_user("author", ["test1"], False)
release_request = factories.create_release_request(
"test1",
user=author,
status=RequestStatus.SUBMITTED,
)
path = "path/test.txt"
factories.write_request_file(release_request, "group", path, contents="test")

response = airlock_client.post(
f"/requests/reject/{release_request.id}/group/{path}"
)
assert response.status_code == 302
relpath = UrlPath(path)
review = (
factories.bll.get_release_request(release_request.id, author)
.filegroups["group"]
.files[relpath]
.reviews[0]
)
assert review.status == FileReviewStatus.REJECTED
assert review.reviewer == "testuser"


def test_request_reject_output_checker(airlock_client):
airlock_client.login(output_checker=True)
author = factories.create_user("author", ["test1"], False)
Expand Down

0 comments on commit 3ca8617

Please sign in to comment.