migrations/versions/98af61feea92_add_encrypted_options_to_data_sources.py (47 lines of code) (raw):

"""add_encrypted_options_to_data_sources Revision ID: 98af61feea92 Revises: 73beceabb948 Create Date: 2019-01-31 09:21:31.517265 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql from sqlalchemy.sql import table from sqlalchemy_utils.types.encrypted.encrypted_type import FernetEngine from redash import settings from redash.utils.configuration import ConfigurationContainer from redash.models.types import ( EncryptedConfiguration, Configuration, MutableDict, MutableList, PseudoJSON, ) # revision identifiers, used by Alembic. revision = "98af61feea92" down_revision = "73beceabb948" branch_labels = None depends_on = None def upgrade(): op.add_column( "data_sources", sa.Column("encrypted_options", postgresql.BYTEA(), nullable=True), ) # copy values data_sources = table( "data_sources", sa.Column("id", sa.Integer, primary_key=True), sa.Column( "encrypted_options", ConfigurationContainer.as_mutable( EncryptedConfiguration( sa.Text, settings.DATASOURCE_SECRET_KEY, FernetEngine ) ), ), sa.Column("options", ConfigurationContainer.as_mutable(Configuration)), ) conn = op.get_bind() for ds in conn.execute(data_sources.select()): conn.execute( data_sources.update() .where(data_sources.c.id == ds.id) .values(encrypted_options=ds.options) ) op.drop_column("data_sources", "options") op.alter_column("data_sources", "encrypted_options", nullable=False) def downgrade(): pass