add application_invitation table

This commit is contained in:
dandds 2019-04-23 09:28:56 -04:00
parent dd0b184bc2
commit 054f6b80b9
5 changed files with 121 additions and 1 deletions

View File

@ -0,0 +1,69 @@
"""add application_invitation
Revision ID: 432c5287256d
Revises: 1880551a32e4
Create Date: 2019-04-23 09:23:05.738680
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = '432c5287256d'
down_revision = '1880551a32e4'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.rename_table('invitations', 'portfolio_invitations')
op.create_table('application_invitations',
sa.Column('time_created', sa.TIMESTAMP(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('time_updated', sa.TIMESTAMP(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('id', postgresql.UUID(as_uuid=True), server_default=sa.text('uuid_generate_v4()'), nullable=False),
sa.Column('status', sa.Enum('ACCEPTED', 'REVOKED', 'PENDING', 'REJECTED_WRONG_USER', 'REJECTED_EXPIRED', name='status', native_enum=False), nullable=True),
sa.Column('expiration_time', sa.TIMESTAMP(timezone=True), nullable=True),
sa.Column('token', sa.String(), nullable=True),
sa.Column('email', sa.String(), nullable=False),
sa.Column('application_role_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('user_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.Column('inviter_id', postgresql.UUID(as_uuid=True), nullable=True),
sa.ForeignKeyConstraint(['application_role_id'], ['application_roles.id'], ),
sa.ForeignKeyConstraint(['inviter_id'], ['users.id'], ),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_application_invitations_application_role_id'), 'application_invitations', ['application_role_id'], unique=False)
op.create_index(op.f('ix_application_invitations_inviter_id'), 'application_invitations', ['inviter_id'], unique=False)
op.create_index(op.f('ix_application_invitations_token'), 'application_invitations', ['token'], unique=False)
op.create_index(op.f('ix_application_invitations_user_id'), 'application_invitations', ['user_id'], unique=False)
op.drop_index('ix_invitations_inviter_id', table_name='invitations')
op.drop_index('ix_invitations_portfolio_role_id', table_name='invitations')
op.drop_index('ix_invitations_token', table_name='invitations')
op.drop_index('ix_invitations_user_id', table_name='invitations')
op.create_index(op.f('ix_portfolio_invitations_inviter_id'), 'portfolio_invitations', ['inviter_id'], unique=False)
op.create_index(op.f('ix_portfolio_invitations_portfolio_role_id'), 'portfolio_invitations', ['portfolio_role_id'], unique=False)
op.create_index(op.f('ix_portfolio_invitations_token'), 'portfolio_invitations', ['token'], unique=False)
op.create_index(op.f('ix_portfolio_invitations_user_id'), 'portfolio_invitations', ['user_id'], unique=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.rename_table('portfolio_invitations', 'invitations')
op.drop_index(op.f('ix_application_invitations_user_id'), table_name='application_invitations')
op.drop_index(op.f('ix_application_invitations_token'), table_name='application_invitations')
op.drop_index(op.f('ix_application_invitations_inviter_id'), table_name='application_invitations')
op.drop_index(op.f('ix_application_invitations_application_role_id'), table_name='application_invitations')
op.drop_table('application_invitations')
op.drop_index(op.f('ix_portfolio_invitations_user_id'), table_name='portfolio_invitations')
op.drop_index(op.f('ix_portfolio_invitations_token'), table_name='portfolio_invitations')
op.drop_index(op.f('ix_portfolio_invitations_portfolio_role_id'), table_name='portfolio_invitations')
op.drop_index(op.f('ix_portfolio_invitations_inviter_id'), table_name='portfolio_invitations')
op.create_index('ix_invitations_user_id', 'invitations', ['user_id'], unique=False)
op.create_index('ix_invitations_token', 'invitations', ['token'], unique=False)
op.create_index('ix_invitations_portfolio_role_id', 'invitations', ['portfolio_role_id'], unique=False)
op.create_index('ix_invitations_inviter_id', 'invitations', ['inviter_id'], unique=False)
# ### end Alembic commands ###

View File

@ -14,6 +14,7 @@ from .environment import Environment
from .attachment import Attachment from .attachment import Attachment
from .audit_event import AuditEvent from .audit_event import AuditEvent
from .portfolio_invitation import PortfolioInvitation from .portfolio_invitation import PortfolioInvitation
from .application_invitation import ApplicationInvitation
from .task_order import TaskOrder from .task_order import TaskOrder
from .dd_254 import DD254 from .dd_254 import DD254

View File

@ -0,0 +1,41 @@
from sqlalchemy import Column, ForeignKey
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship, backref
from atst.models import Base
from atst.models.mixins import TimestampsMixin, AuditableMixin, InvitesMixin
class ApplicationInvitation(Base, TimestampsMixin, AuditableMixin, InvitesMixin):
__tablename__ = "application_invitations"
application_role_id = Column(
UUID(as_uuid=True), ForeignKey("application_roles.id"), index=True
)
role = relationship(
"ApplicationRole",
backref=backref("invitations", order_by="ApplicationInvitation.time_created"),
)
@property
def application(self):
if self.role: # pragma: no branch
return self.role.application
@property
def application_id(self):
return self.role.application_id
@property
def event_details(self):
return {"email": self.email, "dod_id": self.user_dod_id}
@property
def history(self):
changes = self.get_changes()
change_set = {}
if "status" in changes:
change_set["status"] = [s.name for s in changes["status"]]
return change_set

View File

@ -7,7 +7,7 @@ from atst.models.mixins import TimestampsMixin, AuditableMixin, InvitesMixin
class PortfolioInvitation(Base, TimestampsMixin, AuditableMixin, InvitesMixin): class PortfolioInvitation(Base, TimestampsMixin, AuditableMixin, InvitesMixin):
__tablename__ = "invitations" __tablename__ = "portfolio_invitations"
portfolio_role_id = Column( portfolio_role_id = Column(
UUID(as_uuid=True), ForeignKey("portfolio_roles.id"), index=True UUID(as_uuid=True), ForeignKey("portfolio_roles.id"), index=True

View File

@ -246,6 +246,15 @@ class PortfolioInvitationFactory(Base):
expiration_time = PortfolioInvitations.current_expiration_time() expiration_time = PortfolioInvitations.current_expiration_time()
class ApplicationInvitationFactory(Base):
class Meta:
model = ApplicationInvitation
email = factory.Faker("email")
status = InvitationStatus.PENDING
expiration_time = PortfolioInvitations.current_expiration_time()
class AttachmentFactory(Base): class AttachmentFactory(Base):
class Meta: class Meta:
model = Attachment model = Attachment