From 977f59cd1dd45e9e17448355491f4a3f7928f96d Mon Sep 17 00:00:00 2001 From: Becky Smith Date: Fri, 2 Aug 2024 15:09:23 +0100 Subject: [PATCH] Move all the enums to their own module We have a lot of enums in Airlock. In addition to reducing the size of business_logic_layer.py, moving them to their own modules avoids circular imports when various different modules need to use them. Note: the one enum in old_api/schema.py is left where it is, as we expect to replace old_api at some point in the (nearish?) future. --- airlock/business_logic.py | 163 ++-------------- airlock/enums.py | 174 ++++++++++++++++++ airlock/file_browser_api.py | 16 +- airlock/forms.py | 3 +- airlock/types.py | 15 -- airlock/views/request.py | 10 +- airlock/views/workspace.py | 14 +- local_db/data_access.py | 4 +- .../migrations/0002_requestmetadata_status.py | 4 +- .../0005_requestfilemetadata_filetype.py | 4 +- local_db/migrations/0006_filereview.py | 6 +- ...g_type_alter_filereview_status_and_more.py | 12 +- .../0018_filegroupcomment_visibility.py | 6 +- local_db/models.py | 2 +- tests/factories.py | 6 +- tests/functional/test_code_pages.py | 2 +- tests/functional/test_e2e.py | 3 +- tests/functional/test_request_pages.py | 2 +- tests/integration/views/test_request.py | 4 +- tests/integration/views/test_workspace.py | 7 +- tests/local_db/test_data_access.py | 4 +- tests/unit/test_business_logic.py | 11 +- tests/unit/test_file_browser_api.py | 7 +- tests/unit/test_notifications.py | 3 +- tests/unit/test_permissions.py | 2 +- 25 files changed, 248 insertions(+), 236 deletions(-) create mode 100644 airlock/enums.py diff --git a/airlock/business_logic.py b/airlock/business_logic.py index cbebed94..13cf10ae 100644 --- a/airlock/business_logic.py +++ b/airlock/business_logic.py @@ -7,7 +7,6 @@ import shutil from dataclasses import dataclass, field from datetime import datetime -from enum import Enum from functools import cached_property from pathlib import Path from typing import Any, Protocol, Self, Sequence, cast @@ -20,6 +19,18 @@ import old_api from airlock import exceptions, permissions, renderers +from airlock.enums import ( + AuditEventType, + NotificationEventType, + RequestFileDecision, + RequestFileType, + RequestFileVote, + RequestStatus, + RequestStatusOwner, + ReviewTurnPhase, + Visibility, + WorkspaceFileStatus, +) from airlock.lib.git import ( GitError, list_files_from_repo, @@ -27,7 +38,7 @@ read_file_from_repo, ) from airlock.notifications import send_notification_event -from airlock.types import FileMetadata, UrlPath, WorkspaceFileStatus +from airlock.types import FileMetadata, UrlPath from airlock.users import User from airlock.utils import is_valid_file_type @@ -37,67 +48,6 @@ logger = logging.getLogger(__name__) -class RequestStatus(Enum): - """Status for release Requests""" - - # author set statuses - PENDING = "PENDING" - SUBMITTED = "SUBMITTED" - WITHDRAWN = "WITHDRAWN" - # output checker set statuses - APPROVED = "APPROVED" - REJECTED = "REJECTED" - PARTIALLY_REVIEWED = "PARTIALLY_REVIEWED" - REVIEWED = "REVIEWED" - RETURNED = "RETURNED" - RELEASED = "RELEASED" - - def description(self): - if self == RequestStatus.PARTIALLY_REVIEWED: - return "ONE REVIEW SUBMITTED" - if self == RequestStatus.REVIEWED: - return "ALL REVIEWS SUBMITTED" - return self.name - - -class RequestStatusOwner(Enum): - """Who can write to a request in this state.""" - - AUTHOR = "AUTHOR" - REVIEWER = "REVIEWER" - SYSTEM = "SYSTEM" - - -class RequestFileType(Enum): - OUTPUT = "output" - SUPPORTING = "supporting" - WITHDRAWN = "withdrawn" - CODE = "code" - - -class RequestFileVote(Enum): - """An individual output checker's vote on a specific file.""" - - APPROVED = "APPROVED" - CHANGES_REQUESTED = "CHANGES_REQUESTED" - UNDECIDED = "UNDECIDED" # set on CHANGES_REQUESTED files by Airlock when a request is re-submitted - - def description(self): - return self.name.replace("_", " ").title() - - -class RequestFileDecision(Enum): - """The current state of all user reviews on this file.""" - - CHANGES_REQUESTED = "CHANGES_REQUESTED" - APPROVED = "APPROVED" - CONFLICTED = "CONFLICTED" - INCOMPLETE = "INCOMPLETE" - - def description(self): # pragma: nocover - return self.name.replace("_", " ").title() - - @dataclass class RequestFileStatus: """The current visible decision and inidividual vote for a specific user.""" @@ -107,93 +57,6 @@ class RequestFileStatus: vote: RequestFileVote | None -class Visibility(Enum): - """The visibility of comments.""" - - # only visible to output-checkers - PRIVATE = "PRIVATE" - # visible to all - PUBLIC = "PUBLIC" - - @classmethod - def choices(cls): - return { - Visibility.PRIVATE: "Only visible to output-checkers", - Visibility.PUBLIC: "Visible to all users", - } - - # These will be for tooltips once those are working inside of pills - def description(self): # pragma: no cover - return self.choices()[self] - - def blinded_description(self): # pragma: no cover - return "Only visible to you until two reviews have been completed" - - -class ReviewTurnPhase(Enum): - """What phase is the request in.""" - - # author's phase - AUTHOR = "AUTHOR" - # can only see your own votes/comments - INDEPENDENT = "INDEPENDENT" - # output-checkers can see all votes/comments - CONSOLIDATING = "CONSOLIDATING" - # can see everything - COMPLETE = "COMPLETE" - - -class AuditEventType(Enum): - """Audit log events. - - Note that the string values are stored in the local_db database via - AuditEvent.type. Any changes to values will require a database migration. - See eg #562. - """ - - # file access - WORKSPACE_FILE_VIEW = "WORKSPACE_FILE_VIEW" - REQUEST_FILE_VIEW = "REQUEST_FILE_VIEW" - REQUEST_FILE_DOWNLOAD = "REQUEST_FILE_DOWNLOAD" - - # request status - REQUEST_CREATE = "REQUEST_CREATE" - REQUEST_SUBMIT = "REQUEST_SUBMIT" - REQUEST_WITHDRAW = "REQUEST_WITHDRAW" - REQUEST_REVIEW = "REQUEST_REVIEW" - REQUEST_APPROVE = "REQUEST_APPROVE" - REQUEST_REJECT = "REQUEST_REJECT" - REQUEST_RETURN = "REQUEST_RETURN" - REQUEST_RELEASE = "REQUEST_RELEASE" - - # request edits - REQUEST_EDIT = "REQUEST_EDIT" - REQUEST_COMMENT = "REQUEST_COMMENT" - REQUEST_COMMENT_DELETE = "REQUEST_COMMENT_DELETE" - - # request file status - REQUEST_FILE_ADD = "REQUEST_FILE_ADD" - REQUEST_FILE_UPDATE = "REQUEST_FILE_UPDATE" - REQUEST_FILE_WITHDRAW = "REQUEST_FILE_WITHDRAW" - REQUEST_FILE_APPROVE = "REQUEST_FILE_APPROVE" - REQUEST_FILE_REQUEST_CHANGES = "REQUEST_FILE_REQUEST_CHANGES" - REQUEST_FILE_RESET_REVIEW = "REQUEST_FILE_RESET_REVIEW" - REQUEST_FILE_UNDECIDED = "REQUEST_FILE_UNDECIDED" - REQUEST_FILE_RELEASE = "REQUEST_FILE_RELEASE" - - -class NotificationEventType(Enum): - REQUEST_SUBMITTED = "request_submitted" - REQUEST_WITHDRAWN = "request_withdrawn" - REQUEST_PARTIALLY_REVIEWED = "request_partially_reviewed" - REQUEST_REVIEWED = "request_reviewed" - REQUEST_APPROVED = "request_approved" - REQUEST_RELEASED = "request_released" - REQUEST_REJECTED = "request_rejected" - REQUEST_RETURNED = "request_returned" - REQUEST_RESUBMITTED = "request_resubmitted" - - READONLY_EVENTS = { AuditEventType.WORKSPACE_FILE_VIEW, AuditEventType.REQUEST_FILE_VIEW, diff --git a/airlock/enums.py b/airlock/enums.py new file mode 100644 index 00000000..0b92437d --- /dev/null +++ b/airlock/enums.py @@ -0,0 +1,174 @@ +from enum import Enum + + +class WorkspaceFileStatus(Enum): + """Possible states of a workspace file.""" + + # Workspace path states + UNRELEASED = "UNRELEASED" + UNDER_REVIEW = "UNDER_REVIEW" + RELEASED = "RELEASED" + CONTENT_UPDATED = "UPDATED" + WITHDRAWN = "WITHDRAWN" + + def formatted(self): + return self.value.title().replace("_", " ") + + +class RequestStatus(Enum): + """Status for release Requests""" + + # author set statuses + PENDING = "PENDING" + SUBMITTED = "SUBMITTED" + WITHDRAWN = "WITHDRAWN" + # output checker set statuses + APPROVED = "APPROVED" + REJECTED = "REJECTED" + PARTIALLY_REVIEWED = "PARTIALLY_REVIEWED" + REVIEWED = "REVIEWED" + RETURNED = "RETURNED" + RELEASED = "RELEASED" + + def description(self): + if self == RequestStatus.PARTIALLY_REVIEWED: + return "ONE REVIEW SUBMITTED" + if self == RequestStatus.REVIEWED: + return "ALL REVIEWS SUBMITTED" + return self.name + + +class RequestFileVote(Enum): + """An individual output checker's vote on a specific file.""" + + APPROVED = "APPROVED" + CHANGES_REQUESTED = "CHANGES_REQUESTED" + UNDECIDED = "UNDECIDED" # set on CHANGES_REQUESTED files by Airlock when a request is re-submitted + + def description(self): + return self.name.replace("_", " ").title() + + +class RequestStatusOwner(Enum): + """Who can write to a request in this state.""" + + AUTHOR = "AUTHOR" + REVIEWER = "REVIEWER" + SYSTEM = "SYSTEM" + + +class RequestFileType(Enum): + OUTPUT = "output" + SUPPORTING = "supporting" + WITHDRAWN = "withdrawn" + CODE = "code" + + +class RequestFileDecision(Enum): + """The current state of all user reviews on this file.""" + + CHANGES_REQUESTED = "CHANGES_REQUESTED" + APPROVED = "APPROVED" + CONFLICTED = "CONFLICTED" + INCOMPLETE = "INCOMPLETE" + + def description(self): # pragma: nocover + return self.name.replace("_", " ").title() + + +class Visibility(Enum): + """The visibility of comments.""" + + # only visible to output-checkers + PRIVATE = "PRIVATE" + # visible to all + PUBLIC = "PUBLIC" + + @classmethod + def choices(cls): + return { + Visibility.PRIVATE: "Only visible to output-checkers", + Visibility.PUBLIC: "Visible to all users", + } + + # These will be for tooltips once those are working inside of pills + def description(self): # pragma: no cover + return self.choices()[self] + + def blinded_description(self): # pragma: no cover + return "Only visible to you until two reviews have been completed" + + +class ReviewTurnPhase(Enum): + """What phase is the request in.""" + + # author's phase + AUTHOR = "AUTHOR" + # can only see your own votes/comments + INDEPENDENT = "INDEPENDENT" + # output-checkers can see all votes/comments + CONSOLIDATING = "CONSOLIDATING" + # can see everything + COMPLETE = "COMPLETE" + + +class AuditEventType(Enum): + """Audit log events. + + Note that the string values are stored in the local_db database via + AuditEvent.type. Any changes to values will require a database migration. + See eg #562. + """ + + # file access + WORKSPACE_FILE_VIEW = "WORKSPACE_FILE_VIEW" + REQUEST_FILE_VIEW = "REQUEST_FILE_VIEW" + REQUEST_FILE_DOWNLOAD = "REQUEST_FILE_DOWNLOAD" + + # request status + REQUEST_CREATE = "REQUEST_CREATE" + REQUEST_SUBMIT = "REQUEST_SUBMIT" + REQUEST_WITHDRAW = "REQUEST_WITHDRAW" + REQUEST_REVIEW = "REQUEST_REVIEW" + REQUEST_APPROVE = "REQUEST_APPROVE" + REQUEST_REJECT = "REQUEST_REJECT" + REQUEST_RETURN = "REQUEST_RETURN" + REQUEST_RELEASE = "REQUEST_RELEASE" + + # request edits + REQUEST_EDIT = "REQUEST_EDIT" + REQUEST_COMMENT = "REQUEST_COMMENT" + REQUEST_COMMENT_DELETE = "REQUEST_COMMENT_DELETE" + + # request file status + REQUEST_FILE_ADD = "REQUEST_FILE_ADD" + REQUEST_FILE_UPDATE = "REQUEST_FILE_UPDATE" + REQUEST_FILE_WITHDRAW = "REQUEST_FILE_WITHDRAW" + REQUEST_FILE_APPROVE = "REQUEST_FILE_APPROVE" + REQUEST_FILE_REQUEST_CHANGES = "REQUEST_FILE_REQUEST_CHANGES" + REQUEST_FILE_RESET_REVIEW = "REQUEST_FILE_RESET_REVIEW" + REQUEST_FILE_UNDECIDED = "REQUEST_FILE_UNDECIDED" + REQUEST_FILE_RELEASE = "REQUEST_FILE_RELEASE" + + +class NotificationEventType(Enum): + REQUEST_SUBMITTED = "request_submitted" + REQUEST_WITHDRAWN = "request_withdrawn" + REQUEST_PARTIALLY_REVIEWED = "request_partially_reviewed" + REQUEST_REVIEWED = "request_reviewed" + REQUEST_APPROVED = "request_approved" + REQUEST_RELEASED = "request_released" + REQUEST_REJECTED = "request_rejected" + REQUEST_RETURNED = "request_returned" + REQUEST_RESUBMITTED = "request_resubmitted" + + +class PathType(Enum): + """Types of PathItems in a tree.""" + + FILE = "file" + DIR = "directory" + WORKSPACE = "workspace" + REQUEST = "request" + FILEGROUP = "filegroup" + REPO = "repo" diff --git a/airlock/file_browser_api.py b/airlock/file_browser_api.py index 6d833ea8..4d9c91fb 100644 --- a/airlock/file_browser_api.py +++ b/airlock/file_browser_api.py @@ -3,7 +3,6 @@ import os from dataclasses import dataclass, field from datetime import UTC, datetime -from enum import Enum from pathlib import Path from airlock.business_logic import ( @@ -12,26 +11,15 @@ CodeRepo, ReleaseRequest, RequestFileStatus, - RequestFileType, Workspace, ) -from airlock.types import FileMetadata, UrlPath, WorkspaceFileStatus +from airlock.enums import PathType, RequestFileType, WorkspaceFileStatus +from airlock.types import FileMetadata, UrlPath from airlock.users import User from airlock.utils import is_valid_file_type from services.tracing import instrument -class PathType(Enum): - """Types of PathItems in a tree.""" - - FILE = "file" - DIR = "directory" - WORKSPACE = "workspace" - REQUEST = "request" - FILEGROUP = "filegroup" - REPO = "repo" - - @dataclass class PathItem: """ diff --git a/airlock/forms.py b/airlock/forms.py index 99b03091..80d7f038 100644 --- a/airlock/forms.py +++ b/airlock/forms.py @@ -1,7 +1,8 @@ from django import forms from django.forms.formsets import BaseFormSet, formset_factory -from airlock.business_logic import FileGroup, RequestFileType, Visibility +from airlock.business_logic import FileGroup +from airlock.enums import RequestFileType, Visibility class ListField(forms.Field): diff --git a/airlock/types.py b/airlock/types.py index c70bc6f1..76c1e894 100644 --- a/airlock/types.py +++ b/airlock/types.py @@ -2,7 +2,6 @@ import hashlib from dataclasses import dataclass -from enum import Enum from functools import cached_property from pathlib import Path, PurePosixPath from typing import TYPE_CHECKING, Any @@ -20,20 +19,6 @@ class UrlPath(PurePosixPath): ... UrlPath = PurePosixPath -class WorkspaceFileStatus(Enum): - """Possible states of a workspace file.""" - - # Workspace path states - UNRELEASED = "UNRELEASED" - UNDER_REVIEW = "UNDER_REVIEW" - RELEASED = "RELEASED" - CONTENT_UPDATED = "UPDATED" - WITHDRAWN = "WITHDRAWN" - - def formatted(self): - return self.value.title().replace("_", " ") - - @dataclass class FileMetadata: """Represents the base properties of file metadata. diff --git a/airlock/views/request.py b/airlock/views/request.py index 4d307cc3..9a5ea8a4 100644 --- a/airlock/views/request.py +++ b/airlock/views/request.py @@ -15,14 +15,8 @@ from opentelemetry import trace from airlock import exceptions, permissions -from airlock.business_logic import ( - ROOT_PATH, - RequestFileType, - RequestFileVote, - RequestStatus, - Visibility, - bll, -) +from airlock.business_logic import ROOT_PATH, bll +from airlock.enums import RequestFileType, RequestFileVote, RequestStatus, Visibility from airlock.file_browser_api import get_request_tree from airlock.forms import GroupCommentDeleteForm, GroupCommentForm, GroupEditForm from airlock.types import UrlPath diff --git a/airlock/views/workspace.py b/airlock/views/workspace.py index 4ba0ef6c..e7fe1aad 100644 --- a/airlock/views/workspace.py +++ b/airlock/views/workspace.py @@ -10,13 +10,15 @@ from opentelemetry import trace from airlock import exceptions, permissions -from airlock.business_logic import ( - RequestFileType, - bll, -) +from airlock.business_logic import bll +from airlock.enums import RequestFileType, WorkspaceFileStatus from airlock.file_browser_api import get_workspace_tree -from airlock.forms import AddFileForm, FileTypeFormSet, MultiselectForm -from airlock.types import UrlPath, WorkspaceFileStatus +from airlock.forms import ( + AddFileForm, + FileTypeFormSet, + MultiselectForm, +) +from airlock.types import UrlPath from airlock.views.helpers import ( display_form_errors, display_multiple_messages, diff --git a/local_db/data_access.py b/local_db/data_access.py index 822702b9..09ed8a59 100644 --- a/local_db/data_access.py +++ b/local_db/data_access.py @@ -4,9 +4,11 @@ from airlock import exceptions from airlock.business_logic import ( AuditEvent, - AuditEventType, BusinessLogicLayer, DataAccessLayerProtocol, +) +from airlock.enums import ( + AuditEventType, RequestFileType, RequestFileVote, RequestStatus, diff --git a/local_db/migrations/0002_requestmetadata_status.py b/local_db/migrations/0002_requestmetadata_status.py index 3703dabd..c3f8bcfe 100644 --- a/local_db/migrations/0002_requestmetadata_status.py +++ b/local_db/migrations/0002_requestmetadata_status.py @@ -2,7 +2,7 @@ from django.db import migrations -import airlock.business_logic +import airlock.enums import local_db.models @@ -16,7 +16,7 @@ class Migration(migrations.Migration): model_name="requestmetadata", name="status", field=local_db.models.EnumField( - default=airlock.business_logic.RequestStatus["PENDING"] + default=airlock.enums.RequestStatus["PENDING"] ), ), ] diff --git a/local_db/migrations/0005_requestfilemetadata_filetype.py b/local_db/migrations/0005_requestfilemetadata_filetype.py index 64068dcc..c6542d9c 100644 --- a/local_db/migrations/0005_requestfilemetadata_filetype.py +++ b/local_db/migrations/0005_requestfilemetadata_filetype.py @@ -2,7 +2,7 @@ from django.db import migrations -import airlock.business_logic +import airlock.enums import local_db.models @@ -16,7 +16,7 @@ class Migration(migrations.Migration): model_name="requestfilemetadata", name="filetype", field=local_db.models.EnumField( - default=airlock.business_logic.RequestFileType["OUTPUT"] + default=airlock.enums.RequestFileType["OUTPUT"] ), ), ] diff --git a/local_db/migrations/0006_filereview.py b/local_db/migrations/0006_filereview.py index aa1cb7a4..f413e027 100644 --- a/local_db/migrations/0006_filereview.py +++ b/local_db/migrations/0006_filereview.py @@ -4,7 +4,7 @@ import django.utils.timezone from django.db import migrations, models -import airlock.business_logic +import airlock.enums import local_db.models @@ -30,9 +30,7 @@ class Migration(migrations.Migration): ( "status", local_db.models.EnumField( - default=airlock.business_logic.RequestFileVote[ - "CHANGES_REQUESTED" - ] + default=airlock.enums.RequestFileVote["CHANGES_REQUESTED"] ), ), ("created_at", models.DateTimeField(default=django.utils.timezone.now)), diff --git a/local_db/migrations/0009_alter_auditlog_type_alter_filereview_status_and_more.py b/local_db/migrations/0009_alter_auditlog_type_alter_filereview_status_and_more.py index 079b24de..ee68a314 100644 --- a/local_db/migrations/0009_alter_auditlog_type_alter_filereview_status_and_more.py +++ b/local_db/migrations/0009_alter_auditlog_type_alter_filereview_status_and_more.py @@ -2,7 +2,7 @@ from django.db import migrations -import airlock.business_logic +import airlock.enums import local_db.models @@ -15,22 +15,22 @@ class Migration(migrations.Migration): migrations.AlterField( model_name="auditlog", name="type", - field=local_db.models.EnumField(enum=airlock.business_logic.AuditEventType), + field=local_db.models.EnumField(enum=airlock.enums.AuditEventType), ), migrations.AlterField( model_name="filereview", name="status", field=local_db.models.EnumField( - default=airlock.business_logic.RequestFileVote["CHANGES_REQUESTED"], - enum=airlock.business_logic.RequestFileVote, + default=airlock.enums.RequestFileVote["CHANGES_REQUESTED"], + enum=airlock.enums.RequestFileVote, ), ), migrations.AlterField( model_name="requestfilemetadata", name="filetype", field=local_db.models.EnumField( - default=airlock.business_logic.RequestFileType["OUTPUT"], - enum=airlock.business_logic.RequestFileType, + default=airlock.enums.RequestFileType["OUTPUT"], + enum=airlock.enums.RequestFileType, ), ), ] diff --git a/local_db/migrations/0018_filegroupcomment_visibility.py b/local_db/migrations/0018_filegroupcomment_visibility.py index 56323ad2..f08352b3 100644 --- a/local_db/migrations/0018_filegroupcomment_visibility.py +++ b/local_db/migrations/0018_filegroupcomment_visibility.py @@ -2,7 +2,7 @@ from django.db import migrations -import airlock.business_logic +import airlock.enums import local_db.models @@ -16,8 +16,8 @@ class Migration(migrations.Migration): model_name="filegroupcomment", name="visibility", field=local_db.models.EnumField( - default=airlock.business_logic.Visibility.PUBLIC, - enum=airlock.business_logic.Visibility, + default=airlock.enums.Visibility.PUBLIC, + enum=airlock.enums.Visibility, ), preserve_default=False, ), diff --git a/local_db/models.py b/local_db/models.py index 7a2b6aeb..ccb026d9 100644 --- a/local_db/models.py +++ b/local_db/models.py @@ -9,7 +9,7 @@ # it's not really worth it from ulid import ulid # type: ignore -from airlock.business_logic import ( +from airlock.enums import ( AuditEventType, RequestFileType, RequestFileVote, diff --git a/tests/factories.py b/tests/factories.py index a9412485..b78a83ff 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -16,11 +16,13 @@ CodeRepo, ReleaseRequest, RequestFile, + Workspace, + bll, +) +from airlock.enums import ( RequestFileType, RequestFileVote, RequestStatus, - Workspace, - bll, ) from airlock.lib.git import ensure_git_init from airlock.types import UrlPath diff --git a/tests/functional/test_code_pages.py b/tests/functional/test_code_pages.py index a3c83039..8ee24ff5 100644 --- a/tests/functional/test_code_pages.py +++ b/tests/functional/test_code_pages.py @@ -3,7 +3,7 @@ import pytest from playwright.sync_api import expect -from airlock.business_logic import RequestStatus +from airlock.enums import RequestStatus from tests import factories diff --git a/tests/functional/test_e2e.py b/tests/functional/test_e2e.py index 90daf3a9..7d7879a2 100644 --- a/tests/functional/test_e2e.py +++ b/tests/functional/test_e2e.py @@ -2,7 +2,8 @@ from playwright.sync_api import expect -from airlock.business_logic import RequestStatus, bll +from airlock.business_logic import bll +from airlock.enums import RequestStatus from airlock.types import UrlPath from tests import factories diff --git a/tests/functional/test_request_pages.py b/tests/functional/test_request_pages.py index 1976055d..9c4344d6 100644 --- a/tests/functional/test_request_pages.py +++ b/tests/functional/test_request_pages.py @@ -1,7 +1,7 @@ import pytest from playwright.sync_api import expect -from airlock.business_logic import RequestStatus +from airlock.enums import RequestStatus from tests import factories from tests.functional.conftest import login_as_user diff --git a/tests/integration/views/test_request.py b/tests/integration/views/test_request.py index e41dd945..7ed45cd1 100644 --- a/tests/integration/views/test_request.py +++ b/tests/integration/views/test_request.py @@ -4,14 +4,14 @@ import requests from airlock import exceptions -from airlock.business_logic import ( +from airlock.business_logic import bll +from airlock.enums import ( AuditEventType, RequestFileType, RequestFileVote, RequestStatus, RequestStatusOwner, Visibility, - bll, ) from airlock.types import UrlPath from tests import factories diff --git a/tests/integration/views/test_workspace.py b/tests/integration/views/test_workspace.py index 3b969bf8..a029d683 100644 --- a/tests/integration/views/test_workspace.py +++ b/tests/integration/views/test_workspace.py @@ -3,11 +3,8 @@ from django.contrib.messages.api import get_messages from django.urls import reverse -from airlock.business_logic import ( - Project, - RequestFileType, - RequestStatus, -) +from airlock.business_logic import Project +from airlock.enums import RequestFileType, RequestStatus from airlock.types import UrlPath from tests import factories from tests.conftest import get_trace diff --git a/tests/local_db/test_data_access.py b/tests/local_db/test_data_access.py index 6be58774..c8cc2d6d 100644 --- a/tests/local_db/test_data_access.py +++ b/tests/local_db/test_data_access.py @@ -1,8 +1,8 @@ import pytest from airlock import exceptions -from airlock.business_logic import ( - AuditEvent, +from airlock.business_logic import AuditEvent +from airlock.enums import ( AuditEventType, RequestStatus, Visibility, diff --git a/tests/unit/test_business_logic.py b/tests/unit/test_business_logic.py index 82452d27..81737f60 100644 --- a/tests/unit/test_business_logic.py +++ b/tests/unit/test_business_logic.py @@ -15,22 +15,25 @@ from airlock import exceptions from airlock.business_logic import ( AuditEvent, - AuditEventType, BusinessLogicLayer, CodeRepo, Comment, DataAccessLayerProtocol, - NotificationEventType, ReleaseRequest, + Workspace, +) +from airlock.enums import ( + AuditEventType, + NotificationEventType, RequestFileDecision, RequestFileType, RequestFileVote, RequestStatus, ReviewTurnPhase, Visibility, - Workspace, + WorkspaceFileStatus, ) -from airlock.types import UrlPath, WorkspaceFileStatus +from airlock.types import UrlPath from airlock.users import User from tests import factories diff --git a/tests/unit/test_file_browser_api.py b/tests/unit/test_file_browser_api.py index 6679eb1b..3bdea1ca 100644 --- a/tests/unit/test_file_browser_api.py +++ b/tests/unit/test_file_browser_api.py @@ -3,18 +3,19 @@ import pytest from django.template.loader import render_to_string -from airlock.business_logic import ( +from airlock.enums import ( + PathType, RequestFileDecision, RequestFileVote, RequestStatus, + WorkspaceFileStatus, ) from airlock.file_browser_api import ( - PathType, get_code_tree, get_request_tree, get_workspace_tree, ) -from airlock.types import UrlPath, WorkspaceFileStatus +from airlock.types import UrlPath from tests import factories from tests.conftest import get_trace diff --git a/tests/unit/test_notifications.py b/tests/unit/test_notifications.py index 396947bc..12e2d177 100644 --- a/tests/unit/test_notifications.py +++ b/tests/unit/test_notifications.py @@ -2,7 +2,8 @@ import requests -from airlock.business_logic import BusinessLogicLayer, RequestStatus +from airlock.business_logic import BusinessLogicLayer +from airlock.enums import RequestStatus from airlock.notifications import send_notification_event diff --git a/tests/unit/test_permissions.py b/tests/unit/test_permissions.py index 2bad4d40..69707ec7 100644 --- a/tests/unit/test_permissions.py +++ b/tests/unit/test_permissions.py @@ -1,7 +1,7 @@ import pytest from airlock import exceptions, permissions -from airlock.business_logic import RequestStatus +from airlock.enums import RequestStatus from tests import factories