Skip to content

Commit

Permalink
Add business logic layer FileReview
Browse files Browse the repository at this point in the history
  • Loading branch information
madwort committed Mar 15, 2024
1 parent 14a516e commit 94658ca
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 8 deletions.
30 changes: 27 additions & 3 deletions airlock/business_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,29 @@ def set_filegroups_from_dict(self, attrs):
self.filegroups = self._filegroups_from_dict(attrs)


@dataclass(frozen=True)
class FileReview:
"""
Represents a review of a file in the context of a release request
"""

file: RequestFile
reviewer: User
status: FileApprovalStatus
created_at: datetime
updated_at: datetime
release_request: ReleaseRequest

@classmethod
def from_dict(cls, attrs):
# TODO implement
return cls(
**{k: v for k, v in attrs.items() if k != "release_request"},
release_request=ReleaseRequest.from_dict(attrs.get("release_request", ())),
# files=[RequestFile.from_dict(value) for value in attrs.get("files", ())],
)


class DataAccessLayerProtocol:
"""
Placeholder for a structural type class we can use to define what a data access
Expand Down Expand Up @@ -507,9 +530,10 @@ def release_files(self, request: ReleaseRequest, user: User):
self.set_status(request, RequestStatus.RELEASED, user)

def get_file_approvals(self, release_request: ReleaseRequest):
# TODO: return BusinessLogicLayer.FileReview not LocalDB.FileReview
return bll._dal.get_file_approvals(release_request.id)

return [
FileReview.from_dict(r)
for r in bll._dal.get_file_approvals(release_request.id)
]

def _verify_permission_to_review_file(self, release_request: ReleaseRequest, user: User, path: Path):
if release_request.status != RequestStatus.SUBMITTED:
Expand Down
23 changes: 20 additions & 3 deletions local_db/data_access.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,17 +41,32 @@ def _filegroup(self, filegroup_metadata: FileGroupMetadata):
return dict(
name=filegroup_metadata.name,
files=[
dict(relpath=Path(file_metadata.relpath))
self._file(file_metadata)
for file_metadata in filegroup_metadata.request_files.all()
],
)

def _file(self, file_metadata: RequestFileMetadata):
"""Convert a RequestFileMetadata to a dict"""
return dict(relpath=Path(file_metadata.relpath))

def _get_filegroups(self, metadata: RequestMetadata):
return {
group_metadata.name: self._filegroup(group_metadata)
for group_metadata in metadata.filegroups.all()
}

def _filereview(self, file_review: FileReview):
"""Convert a FileReview object into a dict"""
return dict(
release_request=self._request(file_review.file.filegroup.request),
file=self._file(file_review.file),
reviewer=file_review.reviewer,
status=file_review.status,
created_at=file_review.created_at,
updated_at=file_review.updated_at,
)

def _get_or_create_filegroupmetadata(self, request_id: str, group_name: str):
metadata = self._find_metadata(request_id)
groupmetadata, _ = FileGroupMetadata.objects.get_or_create(
Expand Down Expand Up @@ -121,8 +136,10 @@ def add_file_to_request(self, request_id, relpath: Path, group_name: str):


def get_file_approvals(self, request_id):
# TODO: return dict
return FileReview.objects.filter(file__filegroup__request_id=request_id).all()
return [
self._filereview(r)
for r in FileReview.objects.filter(file__filegroup__request_id=request_id).all()
]


def approve_file(self, request_id, user, relpath):
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/test_business_logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.conf import settings

import old_api
from airlock.business_logic import BusinessLogicLayer, RequestStatus, UrlPath, Workspace, FileApprovalStatus
from airlock.business_logic import BusinessLogicLayer, RequestStatus, UrlPath, Workspace, FileApprovalStatus, FileReview
from airlock.users import User
from tests import factories

Expand Down Expand Up @@ -501,6 +501,7 @@ def test_approve_file(bll):

assert len(bll.get_file_approvals(release_request)) == 1
assert bll.get_file_approvals(release_request)[0].status == FileApprovalStatus.APPROVED
assert type(bll.get_file_approvals(release_request)[0]) == FileReview


def test_reject_file(bll):
Expand Down Expand Up @@ -544,4 +545,3 @@ def test_approve_then_reject_file(bll):

assert len(bll.get_file_approvals(release_request)) == 1
assert bll.get_file_approvals(release_request)[0].status == FileApprovalStatus.REJECTED

0 comments on commit 94658ca

Please sign in to comment.