Factor out queries
This commit is contained in:
parent
5ab1ce9cdc
commit
e35c60aa67
64
atst/domain/workspaces/query.py
Normal file
64
atst/domain/workspaces/query.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
|
from atst.database import db
|
||||||
|
from atst.domain.exceptions import NotFoundError
|
||||||
|
from atst.models.workspace import Workspace
|
||||||
|
from atst.models.workspace_role import WorkspaceRole
|
||||||
|
|
||||||
|
|
||||||
|
class Query(object):
|
||||||
|
|
||||||
|
model = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def resource_name(cls):
|
||||||
|
return cls.model.__class__.lower()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(cls, **kwargs):
|
||||||
|
# pylint: disable=E1102
|
||||||
|
return cls.model(**kwargs)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls, id_):
|
||||||
|
try:
|
||||||
|
resource = db.session.query(cls.model).filter_by(id=id_).one()
|
||||||
|
return resource
|
||||||
|
except NoResultFound:
|
||||||
|
raise NotFoundError(cls.resource_name)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_all(cls):
|
||||||
|
return db.session.query(cls.model).all()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def add_and_commit(cls, resource):
|
||||||
|
db.session.add(resource)
|
||||||
|
db.session.commit()
|
||||||
|
return resource
|
||||||
|
|
||||||
|
|
||||||
|
class WorkspaceQuery(Query):
|
||||||
|
model = Workspace
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_by_request(cls, request):
|
||||||
|
try:
|
||||||
|
workspace = db.session.query(Workspace).filter_by(request=request).one()
|
||||||
|
except NoResultFound:
|
||||||
|
raise NotFoundError("workspace")
|
||||||
|
|
||||||
|
return workspace
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_for_user(cls, user):
|
||||||
|
return (
|
||||||
|
db.session.query(Workspace)
|
||||||
|
.join(WorkspaceRole)
|
||||||
|
.filter(WorkspaceRole.user == user)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create_workspace_role(cls, user, role, workspace):
|
||||||
|
return WorkspaceRole(user=user, role=role, workspace=workspace)
|
@ -1,14 +1,10 @@
|
|||||||
from sqlalchemy.orm.exc import NoResultFound
|
|
||||||
|
|
||||||
from atst.database import db
|
|
||||||
from atst.models.workspace import Workspace
|
|
||||||
from atst.models.workspace_role import WorkspaceRole
|
|
||||||
from atst.domain.exceptions import NotFoundError
|
|
||||||
from atst.domain.roles import Roles
|
from atst.domain.roles import Roles
|
||||||
from atst.domain.authz import Authorization
|
from atst.domain.authz import Authorization
|
||||||
from atst.models.permissions import Permissions
|
from atst.models.permissions import Permissions
|
||||||
from atst.domain.users import Users
|
from atst.domain.users import Users
|
||||||
from atst.domain.workspace_users import WorkspaceUsers
|
from atst.domain.workspace_users import WorkspaceUsers
|
||||||
|
|
||||||
|
from .query import WorkspaceQuery
|
||||||
from .scopes import ScopedWorkspace
|
from .scopes import ScopedWorkspace
|
||||||
|
|
||||||
|
|
||||||
@ -16,17 +12,14 @@ class Workspaces(object):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def create(cls, request, name=None):
|
def create(cls, request, name=None):
|
||||||
name = name or request.id
|
name = name or request.id
|
||||||
workspace = Workspace(request=request, name=name)
|
workspace = WorkspaceQuery.create(request=request, name=name)
|
||||||
Workspaces._create_workspace_role(request.creator, workspace, "owner")
|
Workspaces._create_workspace_role(request.creator, workspace, "owner")
|
||||||
|
WorkspaceQuery.add_and_commit(workspace)
|
||||||
db.session.add(workspace)
|
|
||||||
db.session.commit()
|
|
||||||
|
|
||||||
return workspace
|
return workspace
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get(cls, user, workspace_id):
|
def get(cls, user, workspace_id):
|
||||||
workspace = Workspaces._get(workspace_id)
|
workspace = WorkspaceQuery.get(workspace_id)
|
||||||
Authorization.check_workspace_permission(
|
Authorization.check_workspace_permission(
|
||||||
user, workspace, Permissions.VIEW_WORKSPACE, "get workspace"
|
user, workspace, Permissions.VIEW_WORKSPACE, "get workspace"
|
||||||
)
|
)
|
||||||
@ -35,7 +28,7 @@ class Workspaces(object):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_for_update(cls, user, workspace_id):
|
def get_for_update(cls, user, workspace_id):
|
||||||
workspace = Workspaces._get(workspace_id)
|
workspace = WorkspaceQuery.get(workspace_id)
|
||||||
Authorization.check_workspace_permission(
|
Authorization.check_workspace_permission(
|
||||||
user, workspace, Permissions.ADD_APPLICATION_IN_WORKSPACE, "add project"
|
user, workspace, Permissions.ADD_APPLICATION_IN_WORKSPACE, "add project"
|
||||||
)
|
)
|
||||||
@ -44,16 +37,11 @@ class Workspaces(object):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_by_request(cls, request):
|
def get_by_request(cls, request):
|
||||||
try:
|
return WorkspaceQuery.get_by_request(request)
|
||||||
workspace = db.session.query(Workspace).filter_by(request=request).one()
|
|
||||||
except NoResultFound:
|
|
||||||
raise NotFoundError("workspace")
|
|
||||||
|
|
||||||
return workspace
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_with_members(cls, user, workspace_id):
|
def get_with_members(cls, user, workspace_id):
|
||||||
workspace = Workspaces._get(workspace_id)
|
workspace = WorkspaceQuery.get(workspace_id)
|
||||||
Authorization.check_workspace_permission(
|
Authorization.check_workspace_permission(
|
||||||
user,
|
user,
|
||||||
workspace,
|
workspace,
|
||||||
@ -63,27 +51,12 @@ class Workspaces(object):
|
|||||||
|
|
||||||
return workspace
|
return workspace
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get_many(cls, user):
|
|
||||||
workspaces = (
|
|
||||||
db.session.query(Workspace)
|
|
||||||
.join(WorkspaceRole)
|
|
||||||
.filter(WorkspaceRole.user == user)
|
|
||||||
.all()
|
|
||||||
)
|
|
||||||
return workspaces
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def for_user(cls, user):
|
def for_user(cls, user):
|
||||||
if Authorization.has_atat_permission(user, Permissions.VIEW_WORKSPACE):
|
if Authorization.has_atat_permission(user, Permissions.VIEW_WORKSPACE):
|
||||||
workspaces = db.session.query(Workspace).all()
|
workspaces = WorkspaceQuery.get_all()
|
||||||
else:
|
else:
|
||||||
workspaces = (
|
workspaces = WorkspaceQuery.get_for_user(user)
|
||||||
db.session.query(Workspace)
|
|
||||||
.join(WorkspaceRole)
|
|
||||||
.filter(WorkspaceRole.user == user)
|
|
||||||
.all()
|
|
||||||
)
|
|
||||||
return workspaces
|
return workspaces
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -122,15 +95,6 @@ class Workspaces(object):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def _create_workspace_role(cls, user, workspace, role_name):
|
def _create_workspace_role(cls, user, workspace, role_name):
|
||||||
role = Roles.get(role_name)
|
role = Roles.get(role_name)
|
||||||
workspace_role = WorkspaceRole(user=user, role=role, workspace=workspace)
|
workspace_role = WorkspaceQuery.create_workspace_role(user, role, workspace)
|
||||||
db.session.add(workspace_role)
|
WorkspaceQuery.add_and_commit(workspace_role)
|
||||||
return workspace_role
|
return workspace_role
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def _get(cls, workspace_id):
|
|
||||||
try:
|
|
||||||
workspace = db.session.query(Workspace).filter_by(id=workspace_id).one()
|
|
||||||
except NoResultFound:
|
|
||||||
raise NotFoundError("workspace")
|
|
||||||
|
|
||||||
return workspace
|
|
||||||
|
@ -63,18 +63,6 @@ def test_workspaces_get_ensures_user_is_in_workspace(workspace, workspace_owner)
|
|||||||
Workspaces.get(outside_user, workspace.id)
|
Workspaces.get(outside_user, workspace.id)
|
||||||
|
|
||||||
|
|
||||||
def test_workspaces_get_many_with_no_workspaces():
|
|
||||||
workspaces = Workspaces.get_many(UserFactory.build())
|
|
||||||
assert workspaces == []
|
|
||||||
|
|
||||||
|
|
||||||
def test_workspaces_get_many_returns_a_users_workspaces(workspace, workspace_owner):
|
|
||||||
# random workspace
|
|
||||||
Workspaces.create(RequestFactory.create())
|
|
||||||
|
|
||||||
assert Workspaces.get_many(workspace_owner) == [workspace]
|
|
||||||
|
|
||||||
|
|
||||||
def test_get_for_update_allows_owner(workspace, workspace_owner):
|
def test_get_for_update_allows_owner(workspace, workspace_owner):
|
||||||
Workspaces.get_for_update(workspace_owner, workspace.id)
|
Workspaces.get_for_update(workspace_owner, workspace.id)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user