From 6125041a93edf17403fa80660012fceb318f3c7a Mon Sep 17 00:00:00 2001 From: dandds Date: Fri, 26 Oct 2018 12:54:28 -0400 Subject: [PATCH] record inviter on invitation --- ..._add_inviter_relationship_to_invitation.py | 32 +++++++++++++++++++ atst/domain/invitations.py | 4 +-- atst/models/invitation.py | 5 ++- atst/routes/workspaces.py | 2 +- tests/domain/test_invitations.py | 5 +-- 5 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 alembic/versions/2bec1868a22a_add_inviter_relationship_to_invitation.py diff --git a/alembic/versions/2bec1868a22a_add_inviter_relationship_to_invitation.py b/alembic/versions/2bec1868a22a_add_inviter_relationship_to_invitation.py new file mode 100644 index 00000000..23c75457 --- /dev/null +++ b/alembic/versions/2bec1868a22a_add_inviter_relationship_to_invitation.py @@ -0,0 +1,32 @@ +"""add inviter relationship to invitation + +Revision ID: 2bec1868a22a +Revises: c7feaa7b6b0c +Create Date: 2018-10-26 12:45:13.192062 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = '2bec1868a22a' +down_revision = 'c7feaa7b6b0c' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('invitations', sa.Column('inviter_id', postgresql.UUID(as_uuid=True), nullable=True)) + op.create_index(op.f('ix_invitations_inviter_id'), 'invitations', ['inviter_id'], unique=False) + op.create_foreign_key(None, 'invitations', 'users', ['inviter_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'invitations', type_='foreignkey') + op.drop_index(op.f('ix_invitations_inviter_id'), table_name='invitations') + op.drop_column('invitations', 'inviter_id') + # ### end Alembic commands ### diff --git a/atst/domain/invitations.py b/atst/domain/invitations.py index fb4e30dc..0f36cecb 100644 --- a/atst/domain/invitations.py +++ b/atst/domain/invitations.py @@ -30,8 +30,8 @@ class Invitations(object): return invite @classmethod - def create(cls, workspace, user): - invite = Invitation(workspace=workspace, user=user, valid=True) + def create(cls, workspace, inviter, user): + invite = Invitation(workspace=workspace, inviter=inviter, user=user, valid=True) db.session.add(invite) db.session.commit() diff --git a/atst/models/invitation.py b/atst/models/invitation.py index 97158370..95d170ac 100644 --- a/atst/models/invitation.py +++ b/atst/models/invitation.py @@ -12,11 +12,14 @@ class Invitation(Base, TimestampsMixin): id = types.Id() user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), index=True) - user = relationship("User", backref="invitations") + user = relationship("User", backref="invitations", foreign_keys=[user_id]) workspace_id = Column(UUID(as_uuid=True), ForeignKey("workspaces.id"), index=True) workspace = relationship("Workspace", backref="invitations") + inviter_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), index=True) + inviter = relationship("User", backref="sent_invites", foreign_keys=[inviter_id]) + valid = Column(Boolean, default=True) def __repr__(self): diff --git a/atst/routes/workspaces.py b/atst/routes/workspaces.py index fbd14ceb..6dd60b6c 100644 --- a/atst/routes/workspaces.py +++ b/atst/routes/workspaces.py @@ -239,7 +239,7 @@ def create_member(workspace_id): if form.validate(): try: new_member = Workspaces.create_member(g.current_user, workspace, form.data) - invite = Invitations.create(workspace, new_member.user) + invite = Invitations.create(workspace, g.current_user, new_member.user) send_invite_email( g.current_user.full_name, invite.id, new_member.user.email ) diff --git a/tests/domain/test_invitations.py b/tests/domain/test_invitations.py index 5a51ec2b..c0fc8901 100644 --- a/tests/domain/test_invitations.py +++ b/tests/domain/test_invitations.py @@ -9,16 +9,17 @@ from tests.factories import WorkspaceFactory, UserFactory, InvitationFactory def test_create_invitation(): workspace = WorkspaceFactory.create() user = UserFactory.create() - invite = Invitations.create(workspace, user) + invite = Invitations.create(workspace, workspace.owner, user) assert invite.user == user assert invite.workspace == workspace + assert invite.inviter == workspace.owner assert invite.valid def test_accept_invitation(): workspace = WorkspaceFactory.create() user = UserFactory.create() - invite = Invitations.create(workspace, user) + invite = Invitations.create(workspace, workspace.owner, user) assert invite.valid accepted_invite = Invitations.accept(invite.id) assert not accepted_invite.valid