diff --git a/README.md b/README.md index 9e4023038..690625b41 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ export NOTIFICATION_QUEUE_PREFIX='[unique-to-environment]-notification_developme export SECRET_KEY='dev-notify-secret-key' export SQLALCHEMY_DATABASE_URI = 'postgresql://localhost/notification_api' export VERIFY_CODE_FROM_EMAIL_ADDRESS='no-reply@notify.works' +export NOTIFY_EMAIL_DOMAIN='dev.notify.com' "> environment.sh ``` diff --git a/app/models.py b/app/models.py index 84726164a..e0065e3e3 100644 --- a/app/models.py +++ b/app/models.py @@ -224,3 +224,38 @@ class Notification(db.Model): onupdate=datetime.datetime.now) status = db.Column( db.Enum(*NOTIFICATION_STATUS_TYPES, name='notification_status_types'), nullable=False, default='sent') + + +INVITED_USER_STATUS_TYPES = ['pending', 'accepted', 'cancelled'] + + +class InvitedUser(db.Model): + + __tablename__ = 'invited_users' + + id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + email_address = db.Column(db.String(255), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('users.id'), index=True, nullable=False) + from_user = db.relationship('User') + service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, unique=False) + service = db.relationship('Service') + _token = db.Column(db.String, nullable=False) + created_at = db.Column( + db.DateTime, + index=False, + unique=False, + nullable=False, + default=datetime.datetime.now) + status = db.Column( + db.Enum(*INVITED_USER_STATUS_TYPES, name='invited_users_status_types'), nullable=False, default='invited') + + @property + def token(self): + raise AttributeError("Token not readable") + + @token.setter + def token(self, token): + self._token = hashpw(token) + + def check_token(self, token): + return check_hash(token, self._token) diff --git a/migrations/versions/0022_add_invite_users.py b/migrations/versions/0022_add_invite_users.py new file mode 100644 index 000000000..b77be1d73 --- /dev/null +++ b/migrations/versions/0022_add_invite_users.py @@ -0,0 +1,42 @@ +"""empty message + +Revision ID: 0022_add_invite_users +Revises: 0021_add_job_metadata +Create Date: 2016-02-23 16:41:40.481468 + +""" + +# revision identifiers, used by Alembic. +revision = '0022_add_invite_users' +down_revision = '0021_add_job_metadata' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.create_table('invited_users', + sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False), + sa.Column('email_address', sa.String(length=255), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('service_id', postgresql.UUID(as_uuid=True), nullable=True), + sa.Column('_token', sa.String(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=False), + sa.Column('status', sa.Enum('pending', 'accepted', 'cancelled', name='invited_users_status_types'), nullable=False), + sa.ForeignKeyConstraint(['service_id'], ['services.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_invited_users_service_id'), 'invited_users', ['service_id'], unique=False) + op.create_index(op.f('ix_invited_users_user_id'), 'invited_users', ['user_id'], unique=False) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_invited_users_user_id'), table_name='invited_users') + op.drop_index(op.f('ix_invited_users_service_id'), table_name='invited_users') + op.drop_table('invited_users') + op.execute('DROP TYPE invited_users_status_types') + ### end Alembic commands ###