diff --git a/alembic/versions/17da2a475429_add_application_role_cloud_id.py b/alembic/versions/17da2a475429_add_application_role_cloud_id.py new file mode 100644 index 00000000..fffaaad8 --- /dev/null +++ b/alembic/versions/17da2a475429_add_application_role_cloud_id.py @@ -0,0 +1,29 @@ +"""add application_role.cloud_id + +Revision ID: 17da2a475429 +Revises: 50979d8ef680 +Create Date: 2020-02-01 10:43:03.073539 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '17da2a475429' # pragma: allowlist secret +down_revision = '50979d8ef680' # pragma: allowlist secret +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('application_roles', sa.Column('cloud_id', sa.String(), nullable=True)) + op.add_column('application_roles', sa.Column('claimed_until', sa.TIMESTAMP(timezone=True), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('application_roles', 'cloud_id') + op.drop_column('application_roles', 'claimed_until') + # ### end Alembic commands ### diff --git a/atst/models/application.py b/atst/models/application.py index 1af9e39f..c8e8caf0 100644 --- a/atst/models/application.py +++ b/atst/models/application.py @@ -1,4 +1,4 @@ -from sqlalchemy import and_, Column, ForeignKey, String, UniqueConstraint, TIMESTAMP +from sqlalchemy import and_, Column, ForeignKey, String, UniqueConstraint from sqlalchemy.orm import relationship, synonym from atst.models.base import Base @@ -9,7 +9,11 @@ from atst.models.types import Id class Application( - Base, mixins.TimestampsMixin, mixins.AuditableMixin, mixins.DeletableMixin + Base, + mixins.TimestampsMixin, + mixins.AuditableMixin, + mixins.DeletableMixin, + mixins.ClaimableMixin, ): __tablename__ = "applications" @@ -41,7 +45,6 @@ class Application( ) cloud_id = Column(String) - claimed_until = Column(TIMESTAMP(timezone=True)) @property def users(self): diff --git a/atst/models/application_role.py b/atst/models/application_role.py index d65ceac7..68ed8512 100644 --- a/atst/models/application_role.py +++ b/atst/models/application_role.py @@ -1,5 +1,5 @@ from enum import Enum -from sqlalchemy import Index, ForeignKey, Column, Enum as SQLAEnum, Table +from sqlalchemy import Index, ForeignKey, Column, Enum as SQLAEnum, Table, String from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from sqlalchemy.event import listen @@ -33,6 +33,7 @@ class ApplicationRole( mixins.AuditableMixin, mixins.PermissionsMixin, mixins.DeletableMixin, + mixins.ClaimableMixin, ): __tablename__ = "application_roles" @@ -59,6 +60,8 @@ class ApplicationRole( primaryjoin="and_(EnvironmentRole.application_role_id == ApplicationRole.id, EnvironmentRole.deleted == False)", ) + cloud_id = Column(String) + @property def latest_invitation(self): if self.invitations: diff --git a/atst/models/environment.py b/atst/models/environment.py index a0713c63..b9d16fe0 100644 --- a/atst/models/environment.py +++ b/atst/models/environment.py @@ -1,4 +1,4 @@ -from sqlalchemy import Column, ForeignKey, String, TIMESTAMP, UniqueConstraint +from sqlalchemy import Column, ForeignKey, String, UniqueConstraint from sqlalchemy.orm import relationship from sqlalchemy.dialects.postgresql import JSONB from enum import Enum @@ -9,7 +9,11 @@ import atst.models.types as types class Environment( - Base, mixins.TimestampsMixin, mixins.AuditableMixin, mixins.DeletableMixin + Base, + mixins.TimestampsMixin, + mixins.AuditableMixin, + mixins.DeletableMixin, + mixins.ClaimableMixin, ): __tablename__ = "environments" @@ -28,8 +32,6 @@ class Environment( cloud_id = Column(String) root_user_info = Column(JSONB(none_as_null=True)) - claimed_until = Column(TIMESTAMP(timezone=True)) - roles = relationship( "EnvironmentRole", back_populates="environment", diff --git a/atst/models/environment_role.py b/atst/models/environment_role.py index 24aaeb7e..56fe78d4 100644 --- a/atst/models/environment_role.py +++ b/atst/models/environment_role.py @@ -1,5 +1,5 @@ from enum import Enum -from sqlalchemy import Index, ForeignKey, Column, String, TIMESTAMP, Enum as SQLAEnum +from sqlalchemy import Index, ForeignKey, Column, String, Enum as SQLAEnum from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship @@ -15,7 +15,11 @@ class CSPRole(Enum): class EnvironmentRole( - Base, mixins.TimestampsMixin, mixins.AuditableMixin, mixins.DeletableMixin + Base, + mixins.TimestampsMixin, + mixins.AuditableMixin, + mixins.DeletableMixin, + mixins.ClaimableMixin, ): __tablename__ = "environment_roles" @@ -33,7 +37,6 @@ class EnvironmentRole( application_role = relationship("ApplicationRole") csp_user_id = Column(String()) - claimed_until = Column(TIMESTAMP(timezone=True)) class Status(Enum): PENDING = "pending" diff --git a/atst/models/mixins/__init__.py b/atst/models/mixins/__init__.py index e95b2516..36a5c43a 100644 --- a/atst/models/mixins/__init__.py +++ b/atst/models/mixins/__init__.py @@ -4,3 +4,4 @@ from .permissions import PermissionsMixin from .deletable import DeletableMixin from .invites import InvitesMixin from .state_machines import FSMMixin +from .claimable import ClaimableMixin diff --git a/atst/models/mixins/claimable.py b/atst/models/mixins/claimable.py new file mode 100644 index 00000000..afa33a59 --- /dev/null +++ b/atst/models/mixins/claimable.py @@ -0,0 +1,5 @@ +from sqlalchemy import Column, TIMESTAMP + + +class ClaimableMixin(object): + claimed_until = Column(TIMESTAMP(timezone=True))