From abe15a5197970c5e13f7a3643bd4a80f1510d4fe Mon Sep 17 00:00:00 2001 From: Syrine Neifar <syrine@greenhost.nl> Date: Wed, 18 Jan 2023 15:56:20 +0100 Subject: [PATCH] Combine migrations into one --- backend/migrations/versions/27761560bbcb_.py | 46 ----------- .../3fa0c38ea1ac_add_velero_as_app.py | 25 ------ ...462d2d9d25_convert_role_column_to_table.py | 48 ------------ .../versions/7d27395c892a_new_migration.py | 69 +++++++++++++++++ .../versions/b514cca2d47b_add_user_role.py | 76 ------------------- backend/migrations/versions/e08df0bef76f_.py | 33 -------- .../fc0892d07771_add_oauthclient_app_table.py | 39 ---------- 7 files changed, 69 insertions(+), 267 deletions(-) delete mode 100644 backend/migrations/versions/27761560bbcb_.py delete mode 100644 backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py delete mode 100644 backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py create mode 100644 backend/migrations/versions/7d27395c892a_new_migration.py delete mode 100644 backend/migrations/versions/b514cca2d47b_add_user_role.py delete mode 100644 backend/migrations/versions/e08df0bef76f_.py delete mode 100644 backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py diff --git a/backend/migrations/versions/27761560bbcb_.py b/backend/migrations/versions/27761560bbcb_.py deleted file mode 100644 index baa80e49..00000000 --- a/backend/migrations/versions/27761560bbcb_.py +++ /dev/null @@ -1,46 +0,0 @@ -"""empty message - -Revision ID: 27761560bbcb -Revises: -Create Date: 2021-12-21 06:07:14.857940 - -""" -import sqlalchemy as sa -from alembic import op - -# revision identifiers, used by Alembic. -revision = "27761560bbcb" -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - "app", - sa.Column("id", sa.Integer(), nullable=False), - sa.Column("name", sa.String(length=64), nullable=True), - sa.Column("slug", sa.String(length=64), nullable=True), - sa.PrimaryKeyConstraint("id"), - sa.UniqueConstraint("slug"), - ) - op.create_table( - "app_role", - sa.Column("user_id", sa.String(length=64), nullable=False), - sa.Column("app_id", sa.Integer(), nullable=False), - sa.Column("role", sa.String(length=64), nullable=True), - sa.ForeignKeyConstraint( - ["app_id"], - ["app.id"], - ), - sa.PrimaryKeyConstraint("user_id", "app_id"), - ) - # ### end Alembic commands ### - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table("app_role") - op.drop_table("app") - # ### end Alembic commands ### diff --git a/backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py b/backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py deleted file mode 100644 index 5caae97d..00000000 --- a/backend/migrations/versions/3fa0c38ea1ac_add_velero_as_app.py +++ /dev/null @@ -1,25 +0,0 @@ -"""add-velero-as-app - -Revision ID: 3fa0c38ea1ac -Revises: e08df0bef76f -Create Date: 2022-10-13 09:40:44.290319 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '3fa0c38ea1ac' -down_revision = 'e08df0bef76f' -branch_labels = None -depends_on = None - - -def upgrade(): - # Add monitoring app - op.execute(f'INSERT IGNORE INTO app (`name`, `slug`) VALUES ("Velero","velero")') - - -def downgrade(): - pass diff --git a/backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py b/backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py deleted file mode 100644 index 53a8a1d5..00000000 --- a/backend/migrations/versions/5f462d2d9d25_convert_role_column_to_table.py +++ /dev/null @@ -1,48 +0,0 @@ -"""convert role column to table - -Revision ID: 5f462d2d9d25 -Revises: 27761560bbcb -Create Date: 2022-04-13 15:00:27.182898 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql - -# revision identifiers, used by Alembic. -revision = "5f462d2d9d25" -down_revision = "27761560bbcb" -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - role_table = op.create_table( - "role", - sa.Column("id", sa.Integer(), nullable=False), - sa.Column("name", sa.String(length=64), nullable=True), - sa.PrimaryKeyConstraint("id"), - ) - op.add_column("app_role", sa.Column("role_id", sa.Integer(), nullable=True)) - op.create_foreign_key(None, "app_role", "role", ["role_id"], ["id"]) - # ### end Alembic commands ### - - # Insert default role "admin" as ID 1 - op.execute(sa.insert(role_table).values(id=1,name="admin")) - # Set role_id 1 to all current "admin" users - op.execute("UPDATE app_role SET role_id = 1 WHERE role = 'admin'") - - # Drop old column - op.drop_column("app_role", "role") - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column( - "app_role", sa.Column("role", mysql.VARCHAR(length=64), nullable=True) - ) - op.drop_constraint(None, "app_role", type_="foreignkey") - op.drop_column("app_role", "role_id") - op.drop_table("role") - # ### end Alembic commands ### diff --git a/backend/migrations/versions/7d27395c892a_new_migration.py b/backend/migrations/versions/7d27395c892a_new_migration.py new file mode 100644 index 00000000..35590b09 --- /dev/null +++ b/backend/migrations/versions/7d27395c892a_new_migration.py @@ -0,0 +1,69 @@ +"""empty message + +Revision ID: 7d27395c892a +Revises: +Create Date: 2023-01-18 14:48:23.996261 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '7d27395c892a' +down_revision = None +branch_labels = None +depends_on = None + +def upgrade(): + + op.create_table( + "app", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("name", sa.String(length=64), nullable=True), + sa.Column("slug", sa.String(length=64), nullable=True), + sa.Column('external', sa.Boolean(), server_default='0', nullable=False), + sa.Column('url', sa.String(length=128), nullable=True), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint("slug"), + ) + + op.create_table( + "app_role", + sa.Column("user_id", sa.String(length=64), nullable=False), + sa.Column("app_id", sa.Integer(), nullable=False), + sa.Column("role_id", sa.Integer(), nullable=True), + sa.ForeignKeyConstraint( + ["app_id"], + ["app.id"], + ), + sa.PrimaryKeyConstraint("user_id", "app_id"), + ) + + role_table = op.create_table( + "role", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("name", sa.String(length=64), nullable=True), + sa.PrimaryKeyConstraint("id"), + ) + + op.create_foreign_key(None, "app_role", "role", ["role_id"], ["id"]) + + op.execute("INSERT INTO `role` (id, `name`) VALUES (1, 'admin')") + op.execute("INSERT INTO `role` (id, `name`) VALUES (2, 'user')") + op.execute("INSERT INTO `role` (id, `name`) VALUES (3, 'no access')") + + oauthclient_app_table = op.create_table('oauthclient_app', + sa.Column('oauthclient_id', mysql.VARCHAR(length=64), nullable=False), + sa.Column('app_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=False), + sa.ForeignKeyConstraint(['app_id'], ['app.id'], name='oauthclient_app_fk_app_id'), + sa.PrimaryKeyConstraint('oauthclient_id'), + mysql_default_charset='utf8mb3', + mysql_engine='InnoDB' + ) + +def downgrade(): + op.drop_table("role") + op.drop_table("app_role") + op.drop_table("app") + op.drop_table('oauthclient_app') diff --git a/backend/migrations/versions/b514cca2d47b_add_user_role.py b/backend/migrations/versions/b514cca2d47b_add_user_role.py deleted file mode 100644 index 05869420..00000000 --- a/backend/migrations/versions/b514cca2d47b_add_user_role.py +++ /dev/null @@ -1,76 +0,0 @@ -"""update apps and add 'user' and 'no access' role - -Revision ID: b514cca2d47b -Revises: 5f462d2d9d25 -Create Date: 2022-06-08 17:24:51.305129 - -""" -from alembic import op -import sqlalchemy as sa - -# revision identifiers, used by Alembic. -revision = 'b514cca2d47b' -down_revision = '5f462d2d9d25' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### end Alembic commands ### - - # Check and update app table in DB - apps = { - "dashboard": "Dashboard", - "wekan": "Wekan", - "wordpress": "WordPress", - "nextcloud": "Nextcloud", - "zulip": "Zulip" - } - # app table - app_table = sa.table('app', sa.column('id', sa.Integer), sa.column( - 'name', sa.String), sa.column('slug', sa.String)) - - existing_apps = op.get_bind().execute(app_table.select()).fetchall() - existing_app_slugs = [app['slug'] for app in existing_apps] - for app_slug in apps.keys(): - if app_slug in existing_app_slugs: - op.execute(f'UPDATE app SET `name` = "{apps.get(app_slug)}" WHERE slug = "{app_slug}"') - else: - op.execute(f'INSERT INTO app (`name`, slug) VALUES ("{apps.get(app_slug)}","{app_slug}")') - - # Fetch all apps including newly created - existing_apps = op.get_bind().execute(app_table.select()).fetchall() - # Insert role "user" as ID 2 - op.execute("INSERT INTO `role` (id, `name`) VALUES (2, 'user')") - # Insert role "no access" as ID 3 - op.execute("INSERT INTO `role` (id, `name`) VALUES (3, 'no access')") - # Set role_id 2 to all current "user" users which by have NULL role ID - op.execute("UPDATE app_role SET role_id = 2 WHERE role_id IS NULL") - - # Add 'no access' role for all users that don't have any roles for specific apps - app_roles_table = sa.table('app_role', sa.column('user_id', sa.String), sa.column( - 'app_id', sa.Integer), sa.column('role_id', sa.Integer)) - - app_ids = [app['id'] for app in existing_apps] - app_roles = op.get_bind().execute(app_roles_table.select()).fetchall() - user_ids = set([app_role['user_id'] for app_role in app_roles]) - - for user_id in user_ids: - existing_user_app_ids = [x['app_id'] for x in list(filter(lambda role: role['user_id'] == user_id, app_roles))] - missing_user_app_ids = [x for x in app_ids if x not in existing_user_app_ids] - - if len(missing_user_app_ids) > 0: - values = [{'user_id': user_id, 'app_id': app_id, 'role_id': 3} for app_id in missing_user_app_ids] - op.bulk_insert(app_roles_table, values) - - -def downgrade(): - # Revert all users role_id to NULL where role is 'user' - op.execute("UPDATE app_role SET role_id = NULL WHERE role_id = 2") - # Delete role 'user' from roles - op.execute("DELETE FROM `role` WHERE id = 2") - - # Delete all user app roles where role is 'no access' with role_id 3 - op.execute("DELETE FROM app_role WHERE role_id = 3") - # Delete role 'no access' from roles - op.execute("DELETE FROM `role` WHERE id = 3") diff --git a/backend/migrations/versions/e08df0bef76f_.py b/backend/migrations/versions/e08df0bef76f_.py deleted file mode 100644 index 005833fb..00000000 --- a/backend/migrations/versions/e08df0bef76f_.py +++ /dev/null @@ -1,33 +0,0 @@ -"""Add fields for external apps - -Revision ID: e08df0bef76f -Revises: b514cca2d47b -Create Date: 2022-09-23 16:38:06.557307 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = 'e08df0bef76f' -down_revision = 'b514cca2d47b' -branch_labels = None -depends_on = None - - -def upgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('app', sa.Column('external', sa.Boolean(), server_default='0', nullable=False)) - op.add_column('app', sa.Column('url', sa.String(length=128), nullable=True)) - # ### end Alembic commands ### - - # Add monitoring app - op.execute(f'INSERT IGNORE INTO app (`name`, `slug`) VALUES ("Monitoring","monitoring")') - - -def downgrade(): - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('app', 'url') - op.drop_column('app', 'external') - # ### end Alembic commands ### diff --git a/backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py b/backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py deleted file mode 100644 index be0ddf02..00000000 --- a/backend/migrations/versions/fc0892d07771_add_oauthclient_app_table.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Add oauthclient_app table - -Revision ID: fc0892d07771 -Revises: 3fa0c38ea1ac -Create Date: 2022-11-02 09:52:09.510764 - -""" -from alembic import op -import sqlalchemy as sa -from sqlalchemy.dialects import mysql - -# revision identifiers, used by Alembic. -revision = 'fc0892d07771' -down_revision = '3fa0c38ea1ac' -branch_labels = None -depends_on = None - - -def upgrade(): - oauthclient_app_table = op.create_table('oauthclient_app', - sa.Column('oauthclient_id', mysql.VARCHAR(length=64), nullable=False), - sa.Column('app_id', mysql.INTEGER(display_width=11), autoincrement=False, nullable=False), - sa.ForeignKeyConstraint(['app_id'], ['app.id'], name='oauthclient_app_fk_app_id'), - sa.PrimaryKeyConstraint('oauthclient_id'), - mysql_default_charset='utf8mb3', - mysql_engine='InnoDB' - ) - values = [ - {"oauthclient_id": "dashboard" , "app_id": 1}, - {"oauthclient_id": "wekan" , "app_id": 2}, - {"oauthclient_id": "wordpress" , "app_id": 3}, - {"oauthclient_id": "nextcloud" , "app_id": 4}, - {"oauthclient_id": "zulip" , "app_id": 5}, - {"oauthclient_id": "kube-prometheus-stack", "app_id": 6}, - ] - op.bulk_insert(oauthclient_app_table, values) - -def downgrade(): - op.drop_table('oauthclient_app') -- GitLab