new workspace members are provisional until they log in for the first time
This commit is contained in:
parent
8f146b2fee
commit
49f5edfe29
@ -0,0 +1,28 @@
|
|||||||
|
"""add provisional column to users
|
||||||
|
|
||||||
|
Revision ID: 5284ac1ac77c
|
||||||
|
Revises: 25bcba9b99a9
|
||||||
|
Create Date: 2018-10-25 11:04:49.879393
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '5284ac1ac77c'
|
||||||
|
down_revision = '25bcba9b99a9'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.add_column('users', sa.Column('provisional', sa.Boolean(), nullable=True))
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_column('users', 'provisional')
|
||||||
|
# ### end Alembic commands ###
|
@ -89,3 +89,12 @@ class Users(object):
|
|||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def finalize(cls, user):
|
||||||
|
user.provisional = False
|
||||||
|
|
||||||
|
db.session.add(user)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
return user
|
||||||
|
@ -86,6 +86,7 @@ class Workspaces(object):
|
|||||||
last_name=data["last_name"],
|
last_name=data["last_name"],
|
||||||
email=data["email"],
|
email=data["email"],
|
||||||
atat_role_name="default",
|
atat_role_name="default",
|
||||||
|
provisional=True,
|
||||||
)
|
)
|
||||||
return Workspaces.add_member(workspace, new_user, data["workspace_role"])
|
return Workspaces.add_member(workspace, new_user, data["workspace_role"])
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from sqlalchemy import String, ForeignKey, Column, Date
|
from sqlalchemy import String, ForeignKey, Column, Date, Boolean
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
|
|
||||||
@ -26,6 +26,8 @@ class User(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
|
|||||||
designation = Column(String)
|
designation = Column(String)
|
||||||
date_latest_training = Column(Date)
|
date_latest_training = Column(Date)
|
||||||
|
|
||||||
|
provisional = Column(Boolean)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def atat_permissions(self):
|
def atat_permissions(self):
|
||||||
return self.atat_role.permissions
|
return self.atat_role.permissions
|
||||||
|
@ -101,6 +101,10 @@ def login_redirect():
|
|||||||
auth_context = _make_authentication_context()
|
auth_context = _make_authentication_context()
|
||||||
auth_context.authenticate()
|
auth_context.authenticate()
|
||||||
user = auth_context.get_user()
|
user = auth_context.get_user()
|
||||||
|
|
||||||
|
if user.provisional:
|
||||||
|
Users.finalize(user)
|
||||||
|
|
||||||
session["user_id"] = user.id
|
session["user_id"] = user.id
|
||||||
|
|
||||||
return redirect(redirect_after_login_url())
|
return redirect(redirect_after_login_url())
|
||||||
|
@ -86,6 +86,23 @@ def test_can_create_workspace_user(workspace, workspace_owner):
|
|||||||
|
|
||||||
new_member = Workspaces.create_member(workspace_owner, workspace, user_data)
|
new_member = Workspaces.create_member(workspace_owner, workspace, user_data)
|
||||||
assert new_member.workspace == workspace
|
assert new_member.workspace == workspace
|
||||||
|
assert new_member.user.provisional
|
||||||
|
|
||||||
|
|
||||||
|
def test_can_add_existing_user_to_workspace(workspace, workspace_owner):
|
||||||
|
user = UserFactory.create()
|
||||||
|
user_data = {
|
||||||
|
"first_name": "New",
|
||||||
|
"last_name": "User",
|
||||||
|
"email": "new.user@mail.com",
|
||||||
|
"workspace_role": "developer",
|
||||||
|
"dod_id": user.dod_id,
|
||||||
|
}
|
||||||
|
|
||||||
|
new_member = Workspaces.create_member(workspace_owner, workspace, user_data)
|
||||||
|
assert new_member.workspace == workspace
|
||||||
|
assert new_member.user.email == user.email
|
||||||
|
assert not new_member.user.provisional
|
||||||
|
|
||||||
|
|
||||||
def test_need_permission_to_create_workspace_user(workspace, workspace_owner):
|
def test_need_permission_to_create_workspace_user(workspace, workspace_owner):
|
||||||
|
@ -211,3 +211,17 @@ def test_redirected_on_login(client, monkeypatch):
|
|||||||
target_route = url_for("requests.requests_form_new", screen=1)
|
target_route = url_for("requests.requests_form_new", screen=1)
|
||||||
response = _login(client, next=target_route)
|
response = _login(client, next=target_route)
|
||||||
assert target_route in response.headers.get("Location")
|
assert target_route in response.headers.get("Location")
|
||||||
|
|
||||||
|
|
||||||
|
def test_invited_user_finalized_on_login(monkeypatch, client):
|
||||||
|
user = UserFactory.create(provisional=True)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"atst.domain.authnid.AuthenticationContext.authenticate", lambda *args: True
|
||||||
|
)
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"atst.domain.authnid.AuthenticationContext.get_user", lambda *args: user
|
||||||
|
)
|
||||||
|
|
||||||
|
resp = _login(client)
|
||||||
|
|
||||||
|
assert not user.provisional
|
||||||
|
Loading…
x
Reference in New Issue
Block a user