new workspace members are provisional until they log in for the first time

This commit is contained in:
dandds 2018-10-25 11:25:58 -04:00
parent 8f146b2fee
commit 49f5edfe29
7 changed files with 76 additions and 1 deletions

View File

@ -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 ###

View File

@ -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

View File

@ -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"])

View File

@ -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

View File

@ -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())

View File

@ -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):

View File

@ -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