Updates to workspace role permissions, invitations

This commit is contained in:
dandds
2018-10-30 15:22:07 -04:00
parent 4255dbe292
commit 848bbf9c12
16 changed files with 232 additions and 201 deletions

View File

@@ -3,6 +3,7 @@ from sqlalchemy.orm.exc import NoResultFound
from atst.database import db
from atst.models.invitation import Invitation, Status as InvitationStatus
from atst.domain.workspace_users import WorkspaceUsers
from .exceptions import NotFoundError
@@ -30,9 +31,9 @@ class Invitations(object):
return invite
@classmethod
def create(cls, workspace, inviter, user):
def create(cls, workspace_role, inviter, user):
invite = Invitation(
workspace=workspace,
workspace_role=workspace_role,
inviter=inviter,
user=user,
status=InvitationStatus.PENDING,
@@ -43,20 +44,6 @@ class Invitations(object):
return invite
@classmethod
def create_for_owner(cls, workspace, user):
invite = Invitation(
workspace=workspace,
inviter=user,
user=user,
status=InvitationStatus.ACCEPTED,
expiration_time=Invitations.current_expiration_time(),
)
db.session.add(invite)
db.session.commit()
return invite
@classmethod
def accept(cls, token):
invite = Invitations._get(token)
@@ -72,6 +59,8 @@ class Invitations(object):
if invite.is_revoked or invite.is_rejected:
raise InvitationError(invite)
WorkspaceUsers.enable(invite.workspace_role)
return invite
@classmethod

View File

@@ -1,10 +1,9 @@
from sqlalchemy.orm.exc import NoResultFound
from atst.database import db
from atst.models.workspace_role import WorkspaceRole
from atst.models.workspace_role import WorkspaceRole, Status as WorkspaceRoleStatus
from atst.models.workspace_user import WorkspaceUser
from atst.models.user import User
from atst.models.invitation import Invitation, Status as InvitationStatus
from .roles import Roles
from .users import Users
@@ -38,9 +37,7 @@ class WorkspaceUsers(object):
db.session.query(WorkspaceRole)
.join(User)
.filter(User.id == user_id, WorkspaceRole.workspace_id == workspace_id)
.join(Invitation, WorkspaceRole.workspace_id == Invitation.workspace_id)
.filter(Invitation.user_id == WorkspaceRole.user_id)
.filter(Invitation.status == InvitationStatus.ACCEPTED)
.filter(WorkspaceRole.status == WorkspaceRoleStatus.ACTIVE)
.one()
)
except NoResultFound:
@@ -150,3 +147,10 @@ class WorkspaceUsers(object):
db.session.commit()
return workspace_users
@classmethod
def enable(cls, workspace_role):
workspace_role.status = WorkspaceRoleStatus.ACTIVE
db.session.add(workspace_role)
db.session.commit()

View File

@@ -4,8 +4,7 @@ from atst.database import db
from atst.domain.common import Query
from atst.domain.exceptions import NotFoundError
from atst.models.workspace import Workspace
from atst.models.workspace_role import WorkspaceRole
from atst.models.invitation import Invitation, Status as InvitationStatus
from atst.models.workspace_role import WorkspaceRole, Status as WorkspaceRoleStatus
class WorkspacesQuery(Query):
@@ -25,10 +24,8 @@ class WorkspacesQuery(Query):
return (
db.session.query(Workspace)
.join(WorkspaceRole)
.join(Invitation)
.filter(WorkspaceRole.user == user)
.filter(Invitation.user == user)
.filter(Invitation.status == InvitationStatus.ACCEPTED)
.filter(WorkspaceRole.status == WorkspaceRoleStatus.ACTIVE)
.all()
)

View File

@@ -3,7 +3,7 @@ from atst.domain.authz import Authorization
from atst.models.permissions import Permissions
from atst.domain.users import Users
from atst.domain.workspace_users import WorkspaceUsers
from atst.domain.invitations import Invitations
from atst.models.workspace_role import Status as WorkspaceRoleStatus
from .query import WorkspacesQuery
from .scopes import ScopedWorkspace
@@ -14,8 +14,9 @@ class Workspaces(object):
def create(cls, request, name=None):
name = name or request.displayname
workspace = WorkspacesQuery.create(request=request, name=name)
Workspaces._create_workspace_role(request.creator, workspace, "owner")
Invitations.create_for_owner(workspace, request.creator)
Workspaces._create_workspace_role(
request.creator, workspace, "owner", status=WorkspaceRoleStatus.ACTIVE
)
WorkspacesQuery.add_and_commit(workspace)
return workspace
@@ -109,9 +110,13 @@ class Workspaces(object):
return WorkspaceUsers.update_role(member, workspace.id, role_name)
@classmethod
def _create_workspace_role(cls, user, workspace, role_name):
def _create_workspace_role(
cls, user, workspace, role_name, status=WorkspaceRoleStatus.PENDING
):
role = Roles.get(role_name)
workspace_role = WorkspacesQuery.create_workspace_role(user, role, workspace)
workspace_role = WorkspacesQuery.create_workspace_role(
user, role, workspace, status=status
)
WorkspacesQuery.add_and_commit(workspace_role)
return workspace_role