From b64ed05235a41c909a3eaea30d71946f33e6b5f7 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Mon, 29 May 2023 19:39:55 +0200 Subject: [PATCH] :sparkles: Merged database migrations into one --- ...01d7a503e360_added_storage_used_to_user.py | 33 ---- ..._added_thumbhash_and_server_storageitem.py | 33 ---- .../44255816ff7b_added_storageitem.py | 83 --------- .../versions/89c4b5d547aa_new_storage.py | 160 ++++++++++++++++++ ...dont_include_host_in_image_urls_anymore.py | 79 --------- 5 files changed, 160 insertions(+), 228 deletions(-) delete mode 100644 migrations/versions/01d7a503e360_added_storage_used_to_user.py delete mode 100644 migrations/versions/1310317108bd_added_thumbhash_and_server_storageitem.py delete mode 100644 migrations/versions/44255816ff7b_added_storageitem.py create mode 100644 migrations/versions/89c4b5d547aa_new_storage.py delete mode 100644 migrations/versions/b74382b2c6ad_dont_include_host_in_image_urls_anymore.py diff --git a/migrations/versions/01d7a503e360_added_storage_used_to_user.py b/migrations/versions/01d7a503e360_added_storage_used_to_user.py deleted file mode 100644 index 219de26..0000000 --- a/migrations/versions/01d7a503e360_added_storage_used_to_user.py +++ /dev/null @@ -1,33 +0,0 @@ -"""Added storage_used to User - -Revision ID: 01d7a503e360 -Revises: 1310317108bd -Create Date: 2023-05-29 19:05:04.142548 - -""" -from alembic import op -import sqlalchemy as sa -import ormar -from sqlalchemy.orm import Session - -# revision identifiers, used by Alembic. -revision = "01d7a503e360" -down_revision = "1310317108bd" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.add_column("users", sa.Column("storage_used", sa.BigInteger(), nullable=True)) - conn = op.get_bind() - session = Session(bind=conn) - session.execute("UPDATE users SET storage_used=0 WHERE storage_used is NULL") - op.alter_column("users", "storage_used", nullable=False) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column("users", "storage_used") - # ### end Alembic commands ### diff --git a/migrations/versions/1310317108bd_added_thumbhash_and_server_storageitem.py b/migrations/versions/1310317108bd_added_thumbhash_and_server_storageitem.py deleted file mode 100644 index afe0eed..0000000 --- a/migrations/versions/1310317108bd_added_thumbhash_and_server_storageitem.py +++ /dev/null @@ -1,33 +0,0 @@ -"""Added thumbhash and server StorageItem - -Revision ID: 1310317108bd -Revises: b74382b2c6ad -Create Date: 2023-05-29 15:53:00.388788 - -""" -from alembic import op -import sqlalchemy as sa -import ormar - - -# revision identifiers, used by Alembic. -revision = "1310317108bd" -down_revision = "b74382b2c6ad" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.add_column("storage_items", sa.Column("thumbhash", sa.Text(), nullable=True)) - op.add_column("storage_items", sa.Column("server", sa.Text(), nullable=True)) - op.add_column("storage_items", sa.Column("imported", sa.Boolean(), nullable=True)) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column("storage_items", "imported") - op.drop_column("storage_items", "server") - op.drop_column("storage_items", "thumbhash") - # ### end Alembic commands ### diff --git a/migrations/versions/44255816ff7b_added_storageitem.py b/migrations/versions/44255816ff7b_added_storageitem.py deleted file mode 100644 index cb5b4ec..0000000 --- a/migrations/versions/44255816ff7b_added_storageitem.py +++ /dev/null @@ -1,83 +0,0 @@ -"""Added StorageItem - -Revision ID: 44255816ff7b -Revises: 8ac2bed1718e -Create Date: 2023-05-25 12:29:44.913484 - -""" -from alembic import op -import sqlalchemy as sa -import ormar - - -# revision identifiers, used by Alembic. -revision = "44255816ff7b" -down_revision = "8ac2bed1718e" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - "storage_items", - sa.Column("id", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=False), - sa.Column("uploaded_at", sa.DateTime(), nullable=False), - sa.Column("mime_type", sa.Text(), nullable=False), - sa.Column("hash", sa.LargeBinary(length=16), nullable=True), - sa.Column("user", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), - sa.Column("size", sa.BigInteger(), nullable=False), - sa.Column("storage_path", sa.Text(), nullable=True), - sa.Column("deleted_at", sa.DateTime(), nullable=True), - sa.Column("alt_text", sa.Text(), nullable=True), - sa.Column("filename", sa.Text(), nullable=True), - sa.ForeignKeyConstraint(["user"], ["users.id"], name="fk_storage_items_users_id_user"), - sa.PrimaryKeyConstraint("id"), - ) - op.create_table( - "storageitems_quizs", - sa.Column("id", sa.Integer(), nullable=False), - sa.Column("quiz", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), - sa.Column("storageitem", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), - sa.ForeignKeyConstraint( - ["quiz"], ["quiz.id"], name="fk_storageitems_quizs_quiz_quiz_id", onupdate="CASCADE", ondelete="CASCADE" - ), - sa.ForeignKeyConstraint( - ["storageitem"], - ["storage_items.id"], - name="fk_storageitems_quizs_storage_items_storageitem_id", - onupdate="CASCADE", - ondelete="CASCADE", - ), - sa.PrimaryKeyConstraint("id"), - ) - op.create_table( - "storageitems_quiztivitys", - sa.Column("id", sa.Integer(), nullable=False), - sa.Column("quiztivity", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), - sa.Column("storageitem", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), - sa.ForeignKeyConstraint( - ["quiztivity"], - ["quiztivitys.id"], - name="fk_storageitems_quiztivitys_quiztivitys_quiztivity_id", - onupdate="CASCADE", - ondelete="CASCADE", - ), - sa.ForeignKeyConstraint( - ["storageitem"], - ["storage_items.id"], - name="fk_storageitems_quiztivitys_storage_items_storageitem_id", - onupdate="CASCADE", - ondelete="CASCADE", - ), - sa.PrimaryKeyConstraint("id"), - ) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table("storageitems_quiztivitys") - op.drop_table("storageitems_quizs") - op.drop_table("storage_items") - # ### end Alembic commands ### diff --git a/migrations/versions/89c4b5d547aa_new_storage.py b/migrations/versions/89c4b5d547aa_new_storage.py new file mode 100644 index 0000000..6bef72f --- /dev/null +++ b/migrations/versions/89c4b5d547aa_new_storage.py @@ -0,0 +1,160 @@ +"""New storage + +Revision ID: 89c4b5d547aa +Revises: 01d7a503e360 +Create Date: 2023-05-29 19:24:49.275211 + +""" +from alembic import op +import sqlalchemy as sa +import ormar +import re +import json + +from sqlalchemy.orm import Session + +# revision identifiers, used by Alembic. +revision = "89c4b5d547aa" +down_revision = "8ac2bed1718e" +branch_labels = None +depends_on = None + +magic_regex = r"/api/v1/storage/download/(.{36}--.{36})" + + +def upgrade() -> None: + ## ADDED STORAGE ITEM + op.create_table( + "storage_items", + sa.Column("id", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=False), + sa.Column("uploaded_at", sa.DateTime(), nullable=False), + sa.Column("mime_type", sa.Text(), nullable=False), + sa.Column("hash", sa.LargeBinary(length=16), nullable=True), + sa.Column("user", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), + sa.Column("size", sa.BigInteger(), nullable=False), + sa.Column("storage_path", sa.Text(), nullable=True), + sa.Column("deleted_at", sa.DateTime(), nullable=True), + sa.Column("alt_text", sa.Text(), nullable=True), + sa.Column("filename", sa.Text(), nullable=True), + sa.ForeignKeyConstraint(["user"], ["users.id"], name="fk_storage_items_users_id_user"), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "storageitems_quizs", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("quiz", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), + sa.Column("storageitem", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), + sa.ForeignKeyConstraint( + ["quiz"], ["quiz.id"], name="fk_storageitems_quizs_quiz_quiz_id", onupdate="CASCADE", ondelete="CASCADE" + ), + sa.ForeignKeyConstraint( + ["storageitem"], + ["storage_items.id"], + name="fk_storageitems_quizs_storage_items_storageitem_id", + onupdate="CASCADE", + ondelete="CASCADE", + ), + sa.PrimaryKeyConstraint("id"), + ) + op.create_table( + "storageitems_quiztivitys", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("quiztivity", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), + sa.Column("storageitem", ormar.fields.sqlalchemy_uuid.CHAR(32), nullable=True), + sa.ForeignKeyConstraint( + ["quiztivity"], + ["quiztivitys.id"], + name="fk_storageitems_quiztivitys_quiztivitys_quiztivity_id", + onupdate="CASCADE", + ondelete="CASCADE", + ), + sa.ForeignKeyConstraint( + ["storageitem"], + ["storage_items.id"], + name="fk_storageitems_quiztivitys_storage_items_storageitem_id", + onupdate="CASCADE", + ondelete="CASCADE", + ), + sa.PrimaryKeyConstraint("id"), + ) + + ## DON'T INCLUDE HOST IN IMAGE URLS + from classquiz.config import settings + + settings = settings() + conn = op.get_bind() + session = Session(bind=conn) + all_cover_images = session.execute("SELECT cover_image, id from quiz where cover_image is not null;") + for cover_image, id in all_cover_images: + try: + new_cover_image = re.search(magic_regex, cover_image).group(1) + session.execute(f"UPDATE quiz SET cover_image = '{new_cover_image}' WHERE id='{id}';") + except AttributeError: + continue + + all_background_images = session.execute("SELECT background_image, id from quiz where background_image is not null;") + for bg_image, id in all_background_images: + try: + new_bg_image = re.search(magic_regex, bg_image).group(1) + session.execute(f"UPDATE quiz SET cover_image = '{new_bg_image}' WHERE id='{id}';") + except AttributeError: + continue + + all_questions = session.execute("SELECT questions, id from quiz;") + question_image_regex = rf"{settings.root_address}/api/v1/storage/download/(?=.{{36}}--.{{36}})" + for question, id in all_questions: + question_as_json = json.dumps(question) + result = re.sub(question_image_regex, "", question_as_json) + session.execute(f"UPDATE quiz SET questions = '{result}' WHERE id='{id}';") + + ## ADDED THUMBHASH AND SERVER STORAGE ITEM + op.add_column("storage_items", sa.Column("thumbhash", sa.Text(), nullable=True)) + op.add_column("storage_items", sa.Column("server", sa.Text(), nullable=True)) + op.add_column("storage_items", sa.Column("imported", sa.Boolean(), nullable=True)) + + ## ADDED STORAGE USED TO USER + op.add_column("users", sa.Column("storage_used", sa.BigInteger(), nullable=True)) + conn = op.get_bind() + session = Session(bind=conn) + session.execute("UPDATE users SET storage_used=0 WHERE storage_used is NULL") + op.alter_column("users", "storage_used", nullable=False) + + +def downgrade() -> None: + ## ADDED STORAGE USED TO USER + op.drop_column("users", "storage_used") + + ## ADDED THUMBHASH AND SERVER STORAGE ITEM + op.drop_column("storage_items", "imported") + op.drop_column("storage_items", "server") + op.drop_column("storage_items", "thumbhash") + + ## DON'T INCLUDE HOST IN IMAGE URLS + from classquiz.config import settings + + settings = settings() + conn = op.get_bind() + session = Session(bind=conn) + all_cover_images = session.execute("SELECT cover_image, id from quiz where cover_image is not null;") + for cover_image, id in all_cover_images: + new_cover_image = f"{settings.root_address}/api/v1/storage/download/{cover_image}" + # print(new_cover_image, id) + session.execute(f"UPDATE quiz SET cover_image = '{new_cover_image}' WHERE id='{id}';") + + all_background_images = session.execute("SELECT background_image, id from quiz where background_image is not null;") + for bg_image, id in all_background_images: + new_bg_image = f"{settings.root_address}/api/v1/storage/download/{bg_image}" + # print(new_cover_image, id) + session.execute(f"UPDATE quiz SET cover_image = '{new_bg_image}' WHERE id='{id}';") + + all_questions = session.execute("SELECT questions, id from quiz;") + question_image_regex = r"(?=.{36}--.{36})" + for question, id in all_questions: + question_as_json = json.dumps(question) + result = re.sub(question_image_regex, f"{settings.root_address}/api/v1/storage/download/", question_as_json) + session.execute(f"UPDATE quiz SET questions = '{result}' WHERE id='{id}';") + + ## ADDED STORAGE ITEM + op.drop_table("storageitems_quiztivitys") + op.drop_table("storageitems_quizs") + op.drop_table("storage_items") diff --git a/migrations/versions/b74382b2c6ad_dont_include_host_in_image_urls_anymore.py b/migrations/versions/b74382b2c6ad_dont_include_host_in_image_urls_anymore.py deleted file mode 100644 index a906947..0000000 --- a/migrations/versions/b74382b2c6ad_dont_include_host_in_image_urls_anymore.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Dont include host in image urls anymore - -Revision ID: b74382b2c6ad -Revises: 44255816ff7b -Create Date: 2023-05-25 16:25:11.646113 - -""" -import json -import re - -from alembic import op -import sqlalchemy as sa -import ormar -from sqlalchemy.orm import Session - - -# revision identifiers, used by Alembic. -revision = "b74382b2c6ad" -down_revision = "44255816ff7b" -branch_labels = None -depends_on = None - -magic_regex = r"/api/v1/storage/download/(.{36}--.{36})" - - -def upgrade() -> None: - from classquiz.config import settings - - settings = settings() - conn = op.get_bind() - session = Session(bind=conn) - all_cover_images = session.execute("SELECT cover_image, id from quiz where cover_image is not null;") - for cover_image, id in all_cover_images: - try: - new_cover_image = re.search(magic_regex, cover_image).group(1) - session.execute(f"UPDATE quiz SET cover_image = '{new_cover_image}' WHERE id='{id}';") - except AttributeError: - continue - - all_background_images = session.execute("SELECT background_image, id from quiz where background_image is not null;") - for bg_image, id in all_background_images: - try: - new_bg_image = re.search(magic_regex, bg_image).group(1) - session.execute(f"UPDATE quiz SET cover_image = '{new_bg_image}' WHERE id='{id}';") - except AttributeError: - continue - - all_questions = session.execute("SELECT questions, id from quiz;") - question_image_regex = rf"{settings.root_address}/api/v1/storage/download/(?=.{{36}}--.{{36}})" - for question, id in all_questions: - question_as_json = json.dumps(question) - result = re.sub(question_image_regex, "", question_as_json) - session.execute(f"UPDATE quiz SET questions = '{result}' WHERE id='{id}';") - - -def downgrade() -> None: - from classquiz.config import settings - - settings = settings() - conn = op.get_bind() - session = Session(bind=conn) - all_cover_images = session.execute("SELECT cover_image, id from quiz where cover_image is not null;") - for cover_image, id in all_cover_images: - new_cover_image = f"{settings.root_address}/api/v1/storage/download/{cover_image}" - # print(new_cover_image, id) - session.execute(f"UPDATE quiz SET cover_image = '{new_cover_image}' WHERE id='{id}';") - - all_background_images = session.execute("SELECT background_image, id from quiz where background_image is not null;") - for bg_image, id in all_background_images: - new_bg_image = f"{settings.root_address}/api/v1/storage/download/{bg_image}" - # print(new_cover_image, id) - session.execute(f"UPDATE quiz SET cover_image = '{new_bg_image}' WHERE id='{id}';") - - all_questions = session.execute("SELECT questions, id from quiz;") - question_image_regex = r"(?=.{36}--.{36})" - for question, id in all_questions: - question_as_json = json.dumps(question) - result = re.sub(question_image_regex, f"{settings.root_address}/api/v1/storage/download/", question_as_json) - session.execute(f"UPDATE quiz SET questions = '{result}' WHERE id='{id}';")