From 177719e21c8284baedae0bb2800baaab2c7f5f58 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Wed, 12 Jul 2023 11:16:32 +0200 Subject: [PATCH] :sparkles: Added proper delete constrains in database --- classquiz/routers/eximport.py | 10 +- ...ed6823c69b2_added_proper_delete_actions.py | 100 ++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 migrations/versions/2ed6823c69b2_added_proper_delete_actions.py diff --git a/classquiz/routers/eximport.py b/classquiz/routers/eximport.py index 3b7cc03..3c54899 100644 --- a/classquiz/routers/eximport.py +++ b/classquiz/routers/eximport.py @@ -26,6 +26,14 @@ image_delimiter = b"\xc6\xc6\xc6\x00" image_index_delimiter = b"\xc5\xc5\x00" +class UUIDEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, uuid.UUID): + # if the obj is uuid, we simply return the value of uuid + return obj.hex + return json.JSONEncoder.default(self, obj) + + @router.get("/{quiz_id}") async def export_quiz(quiz_id: uuid.UUID, user: User = Depends(get_current_user)): try: @@ -46,7 +54,7 @@ async def export_quiz(quiz_id: uuid.UUID, user: User = Depends(get_current_user) del quiz_dict["user_id"], quiz_dict["id"] quiz_dict["created_at"] = quiz_dict["created_at"].isoformat() quiz_dict["updated_at"] = quiz_dict["updated_at"].isoformat() - quiz_json = json.dumps(quiz_dict) + quiz_json = json.dumps(quiz_dict, cls=UUIDEncoder) bin_data = gzip.compress(quiz_json.encode("utf-8"), compresslevel=9) bin_data = bin_data + quiz_delimiter for image_key in image_urls: diff --git a/migrations/versions/2ed6823c69b2_added_proper_delete_actions.py b/migrations/versions/2ed6823c69b2_added_proper_delete_actions.py new file mode 100644 index 0000000..2c75b51 --- /dev/null +++ b/migrations/versions/2ed6823c69b2_added_proper_delete_actions.py @@ -0,0 +1,100 @@ +# SPDX-FileCopyrightText: 2023 Marlon W (Mawoka) +# +# SPDX-License-Identifier: MPL-2.0 + +"""Added proper delete actions + +Revision ID: 2ed6823c69b2 +Revises: 230ac26db527 +Create Date: 2023-07-12 11:00:37.785183 + +""" +from alembic import op +import sqlalchemy as sa +import ormar + + +# revision identifiers, used by Alembic. +revision = "2ed6823c69b2" +down_revision = "230ac26db527" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # op.drop_constraint('fk_api_keys_users_id_user', 'api_keys', type_='foreignkey') + op.execute("ALTER TABLE api_keys DROP CONSTRAINT IF EXISTS fk_api_keys_users_id_user") + op.create_foreign_key("fk_api_keys_users_id_user", "api_keys", "users", ["user"], ["id"], ondelete="CASCADE") + # op.drop_constraint('fk_fido_credentials_users_id_user', 'fido_credentials', type_='foreignkey') + op.execute("ALTER TABLE fido_credentials DROP CONSTRAINT IF EXISTS fk_fido_credentials_users_id_user") + op.create_foreign_key( + "fk_fido_credentials_users_id_user", "fido_credentials", "users", ["user"], ["id"], ondelete="CASCADE" + ) + # op.drop_constraint('fk_game_results_users_id_user', 'game_results', type_='foreignkey') + op.execute("ALTER TABLE game_results DROP CONSTRAINT IF EXISTS fk_game_results_users_id_user") + # op.drop_constraint('fk_game_results_quiz_id_quiz', 'game_results', type_='foreignkey') + op.execute("ALTER TABLE game_results DROP CONSTRAINT IF EXISTS fk_game_results_quiz_id_quiz") + op.create_foreign_key("fk_game_results_quiz_id_quiz", "game_results", "quiz", ["quiz"], ["id"], ondelete="CASCADE") + op.create_foreign_key( + "fk_game_results_users_id_user", "game_results", "users", ["user"], ["id"], ondelete="CASCADE" + ) + # op.drop_constraint('fk_quiz_users_id_user_id', 'quiz', type_='foreignkey') + op.execute("ALTER TABLE quiz DROP CONSTRAINT IF EXISTS fk_quiz_users_id_user_id") + op.create_foreign_key("fk_quiz_users_id_user_id", "quiz", "users", ["user_id"], ["id"], ondelete="CASCADE") + # op.drop_constraint('fk_quiztivitys_users_id_user', 'quiztivitys', type_='foreignkey') + op.execute("ALTER TABLE quiztivitys DROP CONSTRAINT IF EXISTS fk_quiztivitys_users_id_user") + op.create_foreign_key("fk_quiztivitys_users_id_user", "quiztivitys", "users", ["user"], ["id"], ondelete="CASCADE") + # op.drop_constraint('fk_quiztivityshares_quiztivitys_id_quiztivity', 'quiztivityshares', type_='foreignkey') + op.execute("ALTER TABLE quiztivityshares DROP CONSTRAINT IF EXISTS fk_quiztivityshares_quiztivitys_id_quiztivity") + # op.drop_constraint('fk_quiztivityshares_users_id_user', 'quiztivityshares', type_='foreignkey') + op.execute("ALTER TABLE quiztivitys DROP CONSTRAINT IF EXISTS fk_quiztivitys_users_id_user") + op.create_foreign_key( + "fk_quiztivityshares_users_id_user", "quiztivityshares", "users", ["user"], ["id"], ondelete="CASCADE" + ) + op.create_foreign_key( + "fk_quiztivityshares_quiztivitys_id_quiztivity", + "quiztivityshares", + "quiztivitys", + ["quiztivity"], + ["id"], + ondelete="CASCADE", + ) + # op.drop_constraint('fk_storage_items_users_id_user', 'storage_items', type_='foreignkey') + op.execute("ALTER TABLE storage_items DROP CONSTRAINT IF EXISTS fk_storage_items_users_id_user") + op.create_foreign_key( + "fk_storage_items_users_id_user", "storage_items", "users", ["user"], ["id"], ondelete="SET NULL" + ) + # op.drop_constraint('fk_user_sessions_users_id_user', 'user_sessions', type_='foreignkey') + op.execute("ALTER TABLE user_sessions DROP CONSTRAINT IF EXISTS fk_user_sessions_users_id_user") + op.create_foreign_key( + "fk_user_sessions_users_id_user", "user_sessions", "users", ["user"], ["id"], ondelete="CASCADE" + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint("fk_user_sessions_users_id_user", "user_sessions", type_="foreignkey") + op.create_foreign_key("fk_user_sessions_users_id_user", "user_sessions", "users", ["user"], ["id"]) + op.drop_constraint("fk_storage_items_users_id_user", "storage_items", type_="foreignkey") + op.create_foreign_key("fk_storage_items_users_id_user", "storage_items", "users", ["user"], ["id"]) + op.drop_constraint("fk_quiztivityshares_quiztivitys_id_quiztivity", "quiztivityshares", type_="foreignkey") + op.drop_constraint("fk_quiztivityshares_users_id_user", "quiztivityshares", type_="foreignkey") + op.create_foreign_key("fk_quiztivityshares_users_id_user", "quiztivityshares", "users", ["user"], ["id"]) + op.create_foreign_key( + "fk_quiztivityshares_quiztivitys_id_quiztivity", "quiztivityshares", "quiztivitys", ["quiztivity"], ["id"] + ) + op.drop_constraint("fk_quiztivitys_users_id_user", "quiztivitys", type_="foreignkey") + op.create_foreign_key("fk_quiztivitys_users_id_user", "quiztivitys", "users", ["user"], ["id"]) + op.drop_constraint("fk_quiz_users_id_user_id", "quiz", type_="foreignkey") + op.create_foreign_key("fk_quiz_users_id_user_id", "quiz", "users", ["user_id"], ["id"]) + op.drop_constraint("fk_game_results_users_id_user", "game_results", type_="foreignkey") + op.drop_constraint("fk_game_results_quiz_id_quiz", "game_results", type_="foreignkey") + op.create_foreign_key("fk_game_results_quiz_id_quiz", "game_results", "quiz", ["quiz"], ["id"]) + op.create_foreign_key("fk_game_results_users_id_user", "game_results", "users", ["user"], ["id"]) + op.drop_constraint("fk_fido_credentials_users_id_user", "fido_credentials", type_="foreignkey") + op.create_foreign_key("fk_fido_credentials_users_id_user", "fido_credentials", "users", ["user"], ["id"]) + op.drop_constraint("fk_api_keys_users_id_user", "api_keys", type_="foreignkey") + op.create_foreign_key("fk_api_keys_users_id_user", "api_keys", "users", ["user"], ["id"]) + # ### end Alembic commands ###