first steps towards multi-account sessions

This commit is contained in:
codl 2018-06-08 00:41:41 +02:00
parent 78ca3dc0ea
commit f7a942858e
No known key found for this signature in database
GPG Key ID: 6CD7C8891ED1233A
3 changed files with 95 additions and 8 deletions

View File

@ -0,0 +1,67 @@
"""convert account/session relation to many-many
Revision ID: 7c4fa4bd92bf
Revises: 2bd33abe291c
Create Date: 2018-06-07 22:53:25.476476
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '7c4fa4bd92bf'
down_revision = '2bd33abe291c'
branch_labels = None
depends_on = None
sessions = sa.table(
"sessions",
sa.Column('id', sa.String),
sa.Column('account_id', sa.String)
)
def upgrade():
session_accounts = op.create_table(
"session_accounts",
sa.Column('session_id', sa.String),
sa.Column('account_id', sa.String),
sa.PrimaryKeyConstraint('session_id', 'account_id', name=op.f('pk_session_accounts')),
sa.ForeignKeyConstraint(
['session_id'], ['sessions.id'],
name=op.f('fk_session_accounts_session_id_sessions'),
onupdate='CASCADE', ondelete='CASCADE'
),
sa.ForeignKeyConstraint(
['account_id'], ['accounts.id'],
name=op.f('fk_session_accounts_account_id_accounts'),
onupdate='CASCADE', ondelete='CASCADE'
)
)
op.execute(
session_accounts
.insert()
.from_select(
['session_id', 'account_id'],
sa.select([sessions])
)
)
op.drop_constraint('fk_sessions_account_id_accounts', 'sessions')
op.drop_index('ix_sessions_account_id')
op.alter_column('sessions', 'account_id', new_column_name='current_account_id', nullable=True)
op.create_foreign_key(
'fk_sessions_current_account_id_accounts', 'sessions', 'accounts',
['current_account_id'], ['id'],
onupdate='SET NULL', ondelete='SET NULL')
def downgrade():
op.drop_table("session_accounts")
op.drop_constraint('fk_sessions_current_account_id_accounts')
op.alter_column('sessions', 'current_account_id', new_column_name='account_id', nullable=False)
op.create_foreign_key(
'fk_sessions_account_id_accounts', 'sessions', 'accounts',
['account_id'], ['id'],
onupdate='CASCADE', ondelete='CASCADE')
op.create_index('ix_sessions_account_id', 'sessions', ['account_id'])

View File

@ -226,18 +226,33 @@ class OAuthToken(db.Model, TimestampMixin):
# token is for until we call /account/verify_credentials with it
session_accounts = db.Table(
'session_accounts',
db.Column(
'session_id',
db.String, db.ForeignKey('sessions.id'), primary_key=True),
db.Column(
'account_id',
db.String, db.ForeignKey('accounts.id'), primary_key=True)
)
class Session(db.Model, TimestampMixin):
__tablename__ = 'sessions'
id = db.Column(db.String, primary_key=True,
default=secrets.token_urlsafe)
account_id = db.Column(
current_account_id = db.Column(
db.String,
db.ForeignKey('accounts.id',
ondelete='CASCADE', onupdate='CASCADE'),
nullable=False, index=True)
account = db.relationship(Account, lazy='joined', backref='sessions')
db.ForeignKey(
'accounts.id', ondelete='SET NULL', onupdate='SET NULL'),
nullable=True)
account = db.relationship(Account)
accounts = db.relationship(
Account,
secondary=session_accounts,
lazy='joined', backref=db.backref('sessions', lazy=True))
csrf_token = db.Column(db.String,
default=secrets.token_urlsafe,

View File

@ -65,11 +65,16 @@ def twitter_login_step1():
def login(account_id):
session = Session(account_id=account_id)
db.session.add(session)
session = get_viewer_session()
if not session:
session = Session()
db.session.add(session)
session.current_account_id = account_id
db.session.commit()
session.account.dormant = False
session.current_account.dormant = False
if(session.account not in session.accounts):
session.accounts.append(session.account)
db.session.commit()
tasks.fetch_acc.s(account_id).apply_async(routing_key='high')