diff --git a/.gitignore b/.gitignore index 68bc17f..f0f77dd 100644 --- a/.gitignore +++ b/.gitignore @@ -123,6 +123,7 @@ celerybeat.pid .env .venv env/ +venv venv/ ENV/ env.bak/ diff --git a/migrations/versions/20250315_1949_5edf7206774e_fix_redirector.py b/migrations/versions/20250315_1949_5edf7206774e_fix_redirector.py index b24c0c3..1ebc518 100644 --- a/migrations/versions/20250315_1949_5edf7206774e_fix_redirector.py +++ b/migrations/versions/20250315_1949_5edf7206774e_fix_redirector.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250412_1504_066fd36bb01c_added_column_to_fetch_with_back_data.py b/migrations/versions/20250412_1504_066fd36bb01c_added_column_to_fetch_with_back_data.py index 045fec5..098798f 100644 --- a/migrations/versions/20250412_1504_066fd36bb01c_added_column_to_fetch_with_back_data.py +++ b/migrations/versions/20250412_1504_066fd36bb01c_added_column_to_fetch_with_back_data.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250415_2142_5c9e53fd0e21_rental_errors.py b/migrations/versions/20250415_2142_5c9e53fd0e21_rental_errors.py index 6b56cc8..a7ede5c 100644 --- a/migrations/versions/20250415_2142_5c9e53fd0e21_rental_errors.py +++ b/migrations/versions/20250415_2142_5c9e53fd0e21_rental_errors.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250415_2154_40d72f2dd950_fix_viribus_ods.py b/migrations/versions/20250415_2154_40d72f2dd950_fix_viribus_ods.py index a68fbce..561e8fd 100644 --- a/migrations/versions/20250415_2154_40d72f2dd950_fix_viribus_ods.py +++ b/migrations/versions/20250415_2154_40d72f2dd950_fix_viribus_ods.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql diff --git a/migrations/versions/20250416_0827_d43d62fb3748_fix_chat.py b/migrations/versions/20250416_0827_d43d62fb3748_fix_chat.py index 4921505..a07e953 100644 --- a/migrations/versions/20250416_0827_d43d62fb3748_fix_chat.py +++ b/migrations/versions/20250416_0827_d43d62fb3748_fix_chat.py @@ -8,7 +8,6 @@ import os -import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250417_1932_b9c1ac6c4360_.py b/migrations/versions/20250417_1932_b9c1ac6c4360_.py index 92950e5..2823953 100644 --- a/migrations/versions/20250417_1932_b9c1ac6c4360_.py +++ b/migrations/versions/20250417_1932_b9c1ac6c4360_.py @@ -6,12 +6,6 @@ """ -import os - -import sqlalchemy as sa -from alembic import op - - # revision identifiers, used by Alembic. revision = 'b9c1ac6c4360' down_revision = ('5c9e53fd0e21', '40d72f2dd950') diff --git a/migrations/versions/20250417_1934_018159bb0cfc_add_col_in_dm_marketing.py b/migrations/versions/20250417_1934_018159bb0cfc_add_col_in_dm_marketing.py index 9a36876..b544e7d 100644 --- a/migrations/versions/20250417_1934_018159bb0cfc_add_col_in_dm_marketing.py +++ b/migrations/versions/20250417_1934_018159bb0cfc_add_col_in_dm_marketing.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250421_1620_32883c034be8_.py b/migrations/versions/20250421_1620_32883c034be8_.py index 8fdec4b..b8efc7b 100644 --- a/migrations/versions/20250421_1620_32883c034be8_.py +++ b/migrations/versions/20250421_1620_32883c034be8_.py @@ -6,12 +6,6 @@ """ -import os - -import sqlalchemy as sa -from alembic import op - - # revision identifiers, used by Alembic. revision = '32883c034be8' down_revision = ('d43d62fb3748', '018159bb0cfc') diff --git a/migrations/versions/20250424_2354_7baa38ad06f1_dwh_pipelines_177_added_keys_table_and_.py b/migrations/versions/20250424_2354_7baa38ad06f1_dwh_pipelines_177_added_keys_table_and_.py index 0110b8b..b551fef 100644 --- a/migrations/versions/20250424_2354_7baa38ad06f1_dwh_pipelines_177_added_keys_table_and_.py +++ b/migrations/versions/20250424_2354_7baa38ad06f1_dwh_pipelines_177_added_keys_table_and_.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250426_1710_00dc9eb31a18_added_dwh_user_info_info_encrypted_.py b/migrations/versions/20250426_1710_00dc9eb31a18_added_dwh_user_info_info_encrypted_.py index 526eb2c..768bf5a 100644 --- a/migrations/versions/20250426_1710_00dc9eb31a18_added_dwh_user_info_info_encrypted_.py +++ b/migrations/versions/20250426_1710_00dc9eb31a18_added_dwh_user_info_info_encrypted_.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250429_2314_83a86d9e5c9b_rental_fix.py b/migrations/versions/20250429_2314_83a86d9e5c9b_rental_fix.py index ffe0c5d..6f286cf 100644 --- a/migrations/versions/20250429_2314_83a86d9e5c9b_rental_fix.py +++ b/migrations/versions/20250429_2314_83a86d9e5c9b_rental_fix.py @@ -6,11 +6,8 @@ """ -import os - import sqlalchemy as sa from alembic import op -from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. diff --git a/migrations/versions/20250509_1311_1d108dc04935_drop_table_dwh_rental.py b/migrations/versions/20250509_1311_1d108dc04935_drop_table_dwh_rental.py index 1842257..5f14261 100644 --- a/migrations/versions/20250509_1311_1d108dc04935_drop_table_dwh_rental.py +++ b/migrations/versions/20250509_1311_1d108dc04935_drop_table_dwh_rental.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql diff --git a/migrations/versions/20250522_1336_3c2c26d09969_ods_gitstat.py b/migrations/versions/20250522_1336_3c2c26d09969_ods_gitstat.py index 9ffe634..c0ac193 100644 --- a/migrations/versions/20250522_1336_3c2c26d09969_ods_gitstat.py +++ b/migrations/versions/20250522_1336_3c2c26d09969_ods_gitstat.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250524_2352_31293ac08820_rental_struct_fix.py b/migrations/versions/20250524_2352_31293ac08820_rental_struct_fix.py index 70e5420..69b64ce 100644 --- a/migrations/versions/20250524_2352_31293ac08820_rental_struct_fix.py +++ b/migrations/versions/20250524_2352_31293ac08820_rental_struct_fix.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql diff --git a/migrations/versions/20250528_1331_b259a3b8c31d_ods_social_id_data_type_fix.py b/migrations/versions/20250528_1331_b259a3b8c31d_ods_social_id_data_type_fix.py index e1a68f1..6ca2b5d 100644 --- a/migrations/versions/20250528_1331_b259a3b8c31d_ods_social_id_data_type_fix.py +++ b/migrations/versions/20250528_1331_b259a3b8c31d_ods_social_id_data_type_fix.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250528_1802_d1a22199f353_dm_rental_fix_table.py b/migrations/versions/20250528_1802_d1a22199f353_dm_rental_fix_table.py index d672c5c..d4e3336 100644 --- a/migrations/versions/20250528_1802_d1a22199f353_dm_rental_fix_table.py +++ b/migrations/versions/20250528_1802_d1a22199f353_dm_rental_fix_table.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250705_1543_80e114fe1399_bot_actions_fix.py b/migrations/versions/20250705_1543_80e114fe1399_bot_actions_fix.py index 126e1f2..2c4c2be 100644 --- a/migrations/versions/20250705_1543_80e114fe1399_bot_actions_fix.py +++ b/migrations/versions/20250705_1543_80e114fe1399_bot_actions_fix.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250804_1833_5345485db41c_student_id_info.py b/migrations/versions/20250804_1833_5345485db41c_student_id_info.py index 94ffea5..b0dc632 100644 --- a/migrations/versions/20250804_1833_5345485db41c_student_id_info.py +++ b/migrations/versions/20250804_1833_5345485db41c_student_id_info.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op diff --git a/migrations/versions/20250807_1713_dd8e7cd6c56e_ods_userdata.py b/migrations/versions/20250807_1713_dd8e7cd6c56e_ods_userdata.py index 1ae0023..d540d1e 100644 --- a/migrations/versions/20250807_1713_dd8e7cd6c56e_ods_userdata.py +++ b/migrations/versions/20250807_1713_dd8e7cd6c56e_ods_userdata.py @@ -10,7 +10,6 @@ import sqlalchemy as sa from alembic import op -from sqlalchemy.dialects import postgresql revision = 'dd8e7cd6c56e' diff --git a/migrations/versions/20250817_0032_059a2a1571f1_rating_refactor.py b/migrations/versions/20250817_0032_059a2a1571f1_rating_refactor.py index 5a367d1..ab942e6 100644 --- a/migrations/versions/20250817_0032_059a2a1571f1_rating_refactor.py +++ b/migrations/versions/20250817_0032_059a2a1571f1_rating_refactor.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql diff --git a/migrations/versions/20250909_1508_2a352723139d_comments_stg_union_member.py b/migrations/versions/20250909_1508_2a352723139d_comments_stg_union_member.py index 44ceac3..65c0a50 100644 --- a/migrations/versions/20250909_1508_2a352723139d_comments_stg_union_member.py +++ b/migrations/versions/20250909_1508_2a352723139d_comments_stg_union_member.py @@ -6,11 +6,8 @@ """ -import os - import sqlalchemy as sa from alembic import op -from sqlalchemy.dialects import postgresql revision = '2a352723139d' diff --git a/migrations/versions/20250909_1648_6c633eace8bc_add_new_tables_ods_userdata.py b/migrations/versions/20250909_1648_6c633eace8bc_add_new_tables_ods_userdata.py index a96640a..a6e4502 100644 --- a/migrations/versions/20250909_1648_6c633eace8bc_add_new_tables_ods_userdata.py +++ b/migrations/versions/20250909_1648_6c633eace8bc_add_new_tables_ods_userdata.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql diff --git a/migrations/versions/20250918_2124_1a383420f47f_ods_userdata_card_table.py b/migrations/versions/20250918_2124_1a383420f47f_ods_userdata_card_table.py index 2eeaae3..7e32c01 100644 --- a/migrations/versions/20250918_2124_1a383420f47f_ods_userdata_card_table.py +++ b/migrations/versions/20250918_2124_1a383420f47f_ods_userdata_card_table.py @@ -6,11 +6,8 @@ """ -import os - import sqlalchemy as sa from alembic import op -from sqlalchemy.dialects import postgresql revision = '1a383420f47f' diff --git a/migrations/versions/20250919_2126_3ac342622c64_dm_rental_refactor_and_strike_datamart.py b/migrations/versions/20250919_2126_3ac342622c64_dm_rental_refactor_and_strike_datamart.py index 068d6b9..74430f2 100644 --- a/migrations/versions/20250919_2126_3ac342622c64_dm_rental_refactor_and_strike_datamart.py +++ b/migrations/versions/20250919_2126_3ac342622c64_dm_rental_refactor_and_strike_datamart.py @@ -6,8 +6,6 @@ """ -import os - import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql diff --git a/migrations/versions/20251007_1446_ab55e423b1e4_multicommit_fix_state.py b/migrations/versions/20251007_1446_ab55e423b1e4_multicommit_fix_state.py new file mode 100644 index 0000000..364936c --- /dev/null +++ b/migrations/versions/20251007_1446_ab55e423b1e4_multicommit_fix_state.py @@ -0,0 +1,356 @@ +"""multicommit: fix state + +Revision ID: ab55e423b1e4 +Revises: 3ac342622c64 +Create Date: 2025-10-07 14:46:07.684999 + +""" + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql + + +# revision identifiers, used by Alembic. +revision = 'ab55e423b1e4' +down_revision = '3ac342622c64' +branch_labels = None +depends_on = None + + +def upgrade(): + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_weighted', + existing_type=sa.DOUBLE_PRECISION(precision=53), + type_=sa.Integer(), + existing_comment='Взвешенная оценка преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_kindness_weighted', + existing_type=sa.DOUBLE_PRECISION(precision=53), + type_=sa.Integer(), + existing_comment='Взвешенная доброта преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_clarity_weighted', + existing_type=sa.DOUBLE_PRECISION(precision=53), + type_=sa.Integer(), + existing_comment='Взвешенная понятность преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_freebie_weighted', + existing_type=sa.DOUBLE_PRECISION(precision=53), + type_=sa.Integer(), + existing_comment='Взвешенная халявность преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) + op.drop_table_comment('dm_strike', existing_comment='\n Витрина страйки\n ', schema='DM_RENTAL') + op.drop_index(op.f('lecturer_ts_idx'), table_name='lecturer', schema='DWH_RATING') + + # МИГРАЦИЯ: Надо поменять на op.execute("... USING issue_id::Integer"); + op.alter_column( + 'git_hub', + 'issue_id', + existing_type=sa.VARCHAR(), + type_=sa.Integer(), + comment='Идентификатор issue', + existing_nullable=True, + schema='ODS_SOCIAL', + postgresql_using='git_hub.issue_id::integer', + ) + op.alter_column( + 'git_hub', + 'user_id', + existing_type=sa.VARCHAR(), + type_=sa.Integer(), + comment='Идентификатор пользователя открывшего issue', + existing_nullable=True, + schema='ODS_SOCIAL', + postgresql_using='git_hub.issue_id::integer', + ) + op.alter_column( + 'git_hub', + 'repository_id', + existing_type=sa.VARCHAR(), + type_=sa.Integer(), + comment='Идентификатор репозитория', + existing_nullable=True, + schema='ODS_SOCIAL', + postgresql_using='git_hub.issue_id::integer', + ) + op.alter_column( + 'git_hub', + 'assignee_id', + existing_type=sa.VARCHAR(), + type_=sa.Integer(), + comment='Идентификатор назначенного исполнителем issue', + existing_nullable=True, + schema='ODS_SOCIAL', + postgresql_using='git_hub.issue_id::integer', + ) + op.alter_column( + 'git_hub', + 'assignee_login', + existing_type=sa.VARCHAR(), + type_=sa.Integer(), + comment='Логин назначенного исполнителем issue', + existing_nullable=True, + schema='ODS_SOCIAL', + postgresql_using='git_hub.issue_id::integer', + ) + op.alter_column( + 'git_hub', + 'organization_id', + existing_type=sa.VARCHAR(), + type_=sa.Integer(), + nullable=False, + comment='Идентификатор организации', + schema='ODS_SOCIAL', + postgresql_using='git_hub.issue_id::integer', + ) + op.alter_column( + 'git_hub_username', + 'username', + existing_type=sa.VARCHAR(), + comment='Имя пользователя GitHub', + existing_nullable=False, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'user_id', + existing_type=sa.INTEGER(), + comment='Идентификатор пользователя', + existing_nullable=False, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'source', + existing_type=sa.VARCHAR(), + comment='Источник данных', + existing_nullable=False, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'created', + existing_type=postgresql.TIMESTAMP(), + comment='Дата создания записи', + existing_nullable=True, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'modified', + existing_type=postgresql.TIMESTAMP(), + comment='Дата последнего изменения записи', + existing_nullable=True, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'is_deleted', + existing_type=sa.BOOLEAN(), + comment='Флаг удаления записи', + existing_nullable=True, + schema='ODS_USERDATA', + ) + op.alter_column( + 'union_member', + 'middle_name', + existing_type=sa.VARCHAR(), + comment='Отчество пользователя', + existing_nullable=True, + schema='STG_UNION_MEMBER', + ) + op.drop_column('union_member', 'card', schema='STG_UNION_MEMBER') + + +def downgrade(): + op.add_column( + 'union_member', sa.Column('card', sa.VARCHAR(), autoincrement=False, nullable=True), schema='STG_UNION_MEMBER' + ) + op.alter_column( + 'union_member', + 'middle_name', + existing_type=sa.VARCHAR(), + comment=None, + existing_comment='Отчество пользователя', + existing_nullable=True, + schema='STG_UNION_MEMBER', + ) + op.alter_column( + 'git_hub_username', + 'is_deleted', + existing_type=sa.BOOLEAN(), + comment=None, + existing_comment='Флаг удаления записи', + existing_nullable=True, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'modified', + existing_type=postgresql.TIMESTAMP(), + comment=None, + existing_comment='Дата последнего изменения записи', + existing_nullable=True, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'created', + existing_type=postgresql.TIMESTAMP(), + comment=None, + existing_comment='Дата создания записи', + existing_nullable=True, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'source', + existing_type=sa.VARCHAR(), + comment=None, + existing_comment='Источник данных', + existing_nullable=False, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'user_id', + existing_type=sa.INTEGER(), + comment=None, + existing_comment='Идентификатор пользователя', + existing_nullable=False, + schema='ODS_USERDATA', + ) + op.alter_column( + 'git_hub_username', + 'username', + existing_type=sa.VARCHAR(), + comment=None, + existing_comment='Имя пользователя GitHub', + existing_nullable=False, + schema='ODS_USERDATA', + ) + # При касте integer -> varchar, ручные изменения не нужны + op.alter_column( + 'git_hub', + 'organization_id', + existing_type=sa.Integer(), + type_=sa.VARCHAR(), + nullable=True, + comment=None, + existing_comment='Идентификатор организации', + schema='ODS_SOCIAL', + ) + op.alter_column( + 'git_hub', + 'assignee_login', + existing_type=sa.Integer(), + type_=sa.VARCHAR(), + comment=None, + existing_comment='Логин назначенного исполнителем issue', + existing_nullable=True, + schema='ODS_SOCIAL', + ) + op.alter_column( + 'git_hub', + 'assignee_id', + existing_type=sa.Integer(), + type_=sa.VARCHAR(), + comment=None, + existing_comment='Идентификатор назначенного исполнителем issue', + existing_nullable=True, + schema='ODS_SOCIAL', + ) + op.alter_column( + 'git_hub', + 'repository_id', + existing_type=sa.Integer(), + type_=sa.VARCHAR(), + comment=None, + existing_comment='Идентификатор репозитория', + existing_nullable=True, + schema='ODS_SOCIAL', + ) + op.alter_column( + 'git_hub', + 'user_id', + existing_type=sa.Integer(), + type_=sa.VARCHAR(), + comment=None, + existing_comment='Идентификатор пользователя открывшего issue', + existing_nullable=True, + schema='ODS_SOCIAL', + ) + op.alter_column( + 'git_hub', + 'issue_id', + existing_type=sa.Integer(), + type_=sa.VARCHAR(), + comment=None, + existing_comment='Идентификатор issue', + existing_nullable=True, + schema='ODS_SOCIAL', + ) + op.create_index( + op.f('lecturer_ts_idx'), 'lecturer', ['valid_from_dt', 'valid_to_dt'], unique=False, schema='DWH_RATING' + ) + op.create_table_comment('dm_strike', '\n Витрина страйки\n ', existing_comment=None, schema='DM_RENTAL') + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_freebie_weighted', + existing_type=sa.Integer(), + type_=sa.DOUBLE_PRECISION(precision=53), + existing_comment='Взвешенная халявность преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_clarity_weighted', + existing_type=sa.Integer(), + type_=sa.DOUBLE_PRECISION(precision=53), + existing_comment='Взвешенная понятность преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_kindness_weighted', + existing_type=sa.Integer(), + type_=sa.DOUBLE_PRECISION(precision=53), + existing_comment='Взвешенная доброта преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) + op.alter_column( + 'dm_lecturer_comment_act', + 'mark_weighted', + existing_type=sa.Integer(), + type_=sa.DOUBLE_PRECISION(precision=53), + existing_comment='Взвешенная оценка преподавателя', + existing_nullable=False, + existing_server_default=sa.text("'0'::double precision"), + schema='DM_RATING', + ) diff --git a/migrations/versions/20251115_0012_af84d0ad7c58_apply_new_definitions_lib_changes.py b/migrations/versions/20251115_0012_af84d0ad7c58_apply_new_definitions_lib_changes.py new file mode 100644 index 0000000..e001f5f --- /dev/null +++ b/migrations/versions/20251115_0012_af84d0ad7c58_apply_new_definitions_lib_changes.py @@ -0,0 +1,436 @@ +"""Apply new definitions-lib changes + +Revision ID: af84d0ad7c58 +Revises: ab55e423b1e4 +Create Date: 2025-11-15 00:12:36.907971 + +""" + +import os + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql + + +# revision identifiers, used by Alembic. +revision = 'af84d0ad7c58' +down_revision = 'ab55e423b1e4' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_group( + "test_sensitive_dwh_stg_userdata_all" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_all" + ) + op.create_group( + "test_sensitive_dwh_stg_userdata_write" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_write" + ) + op.create_group( + "test_sensitive_dwh_stg_userdata_read" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_read" + ) + op.grant_on_schema( + ( + "test_sensitive_dwh_stg_userdata_all" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_all" + ), + "STG_USERDATA", + ) + op.grant_on_schema( + ( + "test_sensitive_dwh_stg_userdata_write" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_write" + ), + "STG_USERDATA", + ) + op.grant_on_schema( + ( + "test_sensitive_dwh_stg_userdata_read" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_read" + ), + "STG_USERDATA", + ) + op.grant_on_table( + "test_dwh_dm_rental_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rental_read", + ['SELECT'], + '"DM_RENTAL".dm_strike', + ) + op.grant_on_table( + "test_dwh_dm_rental_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rental_all", + ['ALL'], + '"DM_RENTAL".dm_strike', + ) + op.grant_on_table( + "test_dwh_dm_rental_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rental_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_RENTAL".dm_strike', + ) + op.grant_on_table( + "test_dwh_dm_timetable_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_timetable_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_TIMETABLE".dm_timetable_act', + ) + op.grant_on_table( + "test_dwh_dm_timetable_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_timetable_read", + ['SELECT'], + '"DM_TIMETABLE".dm_timetable_act', + ) + op.grant_on_table( + "test_dwh_dm_timetable_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_timetable_all", + ['ALL'], + '"DM_TIMETABLE".dm_timetable_act', + ) + op.grant_on_table( + "test_dwh_dm_user_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_user_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_USER".union_member_card', + ) + op.grant_on_table( + "test_dwh_dm_user_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_user_all", + ['ALL'], + '"DM_USER".union_member_card', + ) + op.grant_on_table( + "test_dwh_dm_user_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_user_read", + ['SELECT'], + '"DM_USER".union_member_card', + ) + op.grant_on_table( + "test_dwh_dwh_user_info_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_user_info_all", + ['ALL'], + '"DWH_USER_INFO".encrypted_info', + ) + op.grant_on_table( + "test_dwh_dwh_user_info_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_user_info_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_USER_INFO".encrypted_info', + ) + op.grant_on_table( + "test_dwh_dwh_user_info_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_user_info_read", + ['SELECT'], + '"DWH_USER_INFO".encrypted_info', + ) + op.grant_on_table( + "test_dwh_ods_social_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_social_read", + ['SELECT'], + '"ODS_SOCIAL".git_hub', + ) + op.grant_on_table( + "test_dwh_ods_social_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_social_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_SOCIAL".git_hub', + ) + op.grant_on_table( + "test_dwh_ods_social_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_social_all", + ['ALL'], + '"ODS_SOCIAL".git_hub', + ) + op.grant_on_table( + "test_dwh_ods_userdata_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_read", + ['SELECT'], + '"ODS_USERDATA".card', + ) + op.grant_on_table( + "test_dwh_ods_userdata_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_all", + ['ALL'], + '"ODS_USERDATA".card', + ) + op.grant_on_table( + "test_dwh_ods_userdata_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_USERDATA".card', + ) + op.grant_on_table( + "test_dwh_ods_userdata_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_read", + ['SELECT'], + '"ODS_USERDATA".rzd', + ) + op.grant_on_table( + "test_dwh_ods_userdata_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_all", + ['ALL'], + '"ODS_USERDATA".rzd', + ) + op.grant_on_table( + "test_dwh_ods_userdata_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_USERDATA".rzd', + ) + op.grant_on_table( + "test_dwh_ods_userdata_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_read", + ['SELECT'], + '"ODS_USERDATA".status', + ) + op.grant_on_table( + "test_dwh_ods_userdata_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_all", + ['ALL'], + '"ODS_USERDATA".status', + ) + op.grant_on_table( + "test_dwh_ods_userdata_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_USERDATA".status', + ) + op.add_column( + 'info_keys', + sa.Column('created', sa.DateTime(), nullable=False, comment='Дата создания/обновления ключа'), + schema='STG_USERDATA', + ) + op.grant_on_table( + ( + "test_sensitive_dwh_stg_userdata_all" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_all" + ), + ['ALL'], + '"STG_USERDATA".info_keys', + ) + op.grant_on_table( + ( + "test_sensitive_dwh_stg_userdata_read" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_read" + ), + ['SELECT'], + '"STG_USERDATA".info_keys', + ) + op.grant_on_table( + ( + "test_sensitive_dwh_stg_userdata_write" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_write" + ), + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"STG_USERDATA".info_keys', + ) + op.drop_table('encrypted_info', schema='STG_USERDATA') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + 'encrypted_info', + sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False, comment='Идентификатор зашифрованной записи'), + sa.Column('param_id', sa.INTEGER(), autoincrement=False, nullable=True, comment='Идентификатор параметра'), + sa.Column( + 'source_id', sa.INTEGER(), autoincrement=False, nullable=True, comment='Идентификатор источника данных' + ), + sa.Column( + 'owner_id', sa.INTEGER(), autoincrement=False, nullable=True, comment='Идентификатор владельца данных' + ), + sa.Column( + 'value', postgresql.BYTEA(), autoincrement=False, nullable=True, comment='Зашифрованное значение параметра' + ), + sa.Column( + 'create_ts', postgresql.TIMESTAMP(), autoincrement=False, nullable=True, comment='Время создания записи' + ), + sa.Column( + 'modify_ts', + postgresql.TIMESTAMP(), + autoincrement=False, + nullable=True, + comment='Время последнего изменения записи', + ), + sa.Column('is_deleted', sa.BOOLEAN(), autoincrement=False, nullable=True, comment='Флаг удаления записи'), + sa.PrimaryKeyConstraint('id', name=op.f('encrypted_info_pkey')), + schema='STG_USERDATA', + ) + op.revoke_on_table( + ( + "test_sensitive_dwh_stg_userdata_write" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_write" + ), + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"STG_USERDATA".info_keys', + ) + op.revoke_on_table( + ( + "test_sensitive_dwh_stg_userdata_read" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_read" + ), + ['SELECT'], + '"STG_USERDATA".info_keys', + ) + op.revoke_on_table( + ( + "test_sensitive_dwh_stg_userdata_all" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_all" + ), + ['ALL'], + '"STG_USERDATA".info_keys', + ) + op.drop_column('info_keys', 'created', schema='STG_USERDATA') + op.revoke_on_table( + "test_dwh_ods_userdata_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_USERDATA".status', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_all", + ['ALL'], + '"ODS_USERDATA".status', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_read", + ['SELECT'], + '"ODS_USERDATA".status', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_USERDATA".rzd', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_all", + ['ALL'], + '"ODS_USERDATA".rzd', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_read", + ['SELECT'], + '"ODS_USERDATA".rzd', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_USERDATA".card', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_all", + ['ALL'], + '"ODS_USERDATA".card', + ) + op.revoke_on_table( + "test_dwh_ods_userdata_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_userdata_read", + ['SELECT'], + '"ODS_USERDATA".card', + ) + op.revoke_on_table( + "test_dwh_ods_social_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_social_all", + ['ALL'], + '"ODS_SOCIAL".git_hub', + ) + op.revoke_on_table( + "test_dwh_ods_social_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_social_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_SOCIAL".git_hub', + ) + op.revoke_on_table( + "test_dwh_ods_social_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_social_read", + ['SELECT'], + '"ODS_SOCIAL".git_hub', + ) + op.revoke_on_table( + "test_dwh_dwh_user_info_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_user_info_read", + ['SELECT'], + '"DWH_USER_INFO".encrypted_info', + ) + op.revoke_on_table( + "test_dwh_dwh_user_info_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_user_info_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_USER_INFO".encrypted_info', + ) + op.revoke_on_table( + "test_dwh_dwh_user_info_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_user_info_all", + ['ALL'], + '"DWH_USER_INFO".encrypted_info', + ) + op.revoke_on_table( + "test_dwh_dm_user_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_user_read", + ['SELECT'], + '"DM_USER".union_member_card', + ) + op.revoke_on_table( + "test_dwh_dm_user_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_user_all", + ['ALL'], + '"DM_USER".union_member_card', + ) + op.revoke_on_table( + "test_dwh_dm_user_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_user_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_USER".union_member_card', + ) + op.revoke_on_table( + "test_dwh_dm_timetable_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_timetable_all", + ['ALL'], + '"DM_TIMETABLE".dm_timetable_act', + ) + op.revoke_on_table( + "test_dwh_dm_timetable_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_timetable_read", + ['SELECT'], + '"DM_TIMETABLE".dm_timetable_act', + ) + op.revoke_on_table( + "test_dwh_dm_timetable_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_timetable_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_TIMETABLE".dm_timetable_act', + ) + op.revoke_on_table( + "test_dwh_dm_rental_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rental_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_RENTAL".dm_strike', + ) + op.revoke_on_table( + "test_dwh_dm_rental_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rental_all", + ['ALL'], + '"DM_RENTAL".dm_strike', + ) + op.revoke_on_table( + "test_dwh_dm_rental_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rental_read", + ['SELECT'], + '"DM_RENTAL".dm_strike', + ) + op.revoke_on_schema( + ( + "test_sensitive_dwh_stg_userdata_read" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_read" + ), + "STG_USERDATA", + ) + op.revoke_on_schema( + ( + "test_sensitive_dwh_stg_userdata_write" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_write" + ), + "STG_USERDATA", + ) + op.revoke_on_schema( + ( + "test_sensitive_dwh_stg_userdata_all" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_all" + ), + "STG_USERDATA", + ) + op.delete_group( + "test_sensitive_dwh_stg_userdata_read" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_read" + ) + op.delete_group( + "test_sensitive_dwh_stg_userdata_write" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_write" + ) + op.delete_group( + "test_sensitive_dwh_stg_userdata_all" + if os.getenv("ENVIRONMENT") != "production" + else "prod_sensitive_dwh_stg_userdata_all" + ) + # ### end Alembic commands ### diff --git a/profcomff_definitions/DM/rental.py b/profcomff_definitions/DM/rental.py index a4cbd7b..cd7f8df 100644 --- a/profcomff_definitions/DM/rental.py +++ b/profcomff_definitions/DM/rental.py @@ -1,4 +1,4 @@ -from datetime import date, datetime, timedelta +from datetime import datetime from uuid import UUID from sqlalchemy.orm import Mapped, mapped_column diff --git a/profcomff_definitions/DWH/rental.py b/profcomff_definitions/DWH/rental.py index 3c401c7..b675f0a 100644 --- a/profcomff_definitions/DWH/rental.py +++ b/profcomff_definitions/DWH/rental.py @@ -1,7 +1,7 @@ from datetime import date, datetime from uuid import UUID -from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import Mapped, mapped_column from profcomff_definitions.base import Base diff --git a/profcomff_definitions/ODS/userdata.py b/profcomff_definitions/ODS/userdata.py index b1391aa..9cb82a7 100644 --- a/profcomff_definitions/ODS/userdata.py +++ b/profcomff_definitions/ODS/userdata.py @@ -1,4 +1,4 @@ -from datetime import date, datetime +from datetime import datetime from sqlalchemy.orm import Mapped, mapped_column diff --git a/profcomff_definitions/STG/userdata.py b/profcomff_definitions/STG/userdata.py index 6080871..c2cb4b5 100644 --- a/profcomff_definitions/STG/userdata.py +++ b/profcomff_definitions/STG/userdata.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Mapped, mapped_column -from profcomff_definitions.base import Base, SensitiveBase +from profcomff_definitions.base import Base, sensitive class Category(Base): @@ -39,6 +39,8 @@ class Source(Base): is_deleted: Mapped[bool | None] = mapped_column(comment="Флаг удаления записи") +# uncomment when corresponding functionality is implemented in definitions-lib +# @encrypted(columns=['value']) class Info(Base): id: Mapped[int] = mapped_column(primary_key=True, comment="Идентификатор информационной записи") param_id: Mapped[int | None] = mapped_column(comment="Идентификатор параметра") @@ -50,17 +52,8 @@ class Info(Base): is_deleted: Mapped[bool | None] = mapped_column(comment="Флаг удаления записи") -class InfoKeys(SensitiveBase): +@sensitive +class InfoKeys(Base): id: Mapped[int] = mapped_column(primary_key=True, comment="Идентификатор ключа шифрования") key: Mapped[str] = mapped_column(comment="Симметричный ключ шифрования") - - -class EncryptedInfo(Base): - id: Mapped[int] = mapped_column(primary_key=True, comment="Идентификатор зашифрованной записи") - param_id: Mapped[int | None] = mapped_column(comment="Идентификатор параметра") - source_id: Mapped[int | None] = mapped_column(comment="Идентификатор источника данных") - owner_id: Mapped[int | None] = mapped_column(comment="Идентификатор владельца данных") - value: Mapped[bytes | None] = mapped_column(comment="Зашифрованное значение параметра") - create_ts: Mapped[datetime | None] = mapped_column(comment="Время создания записи") - modify_ts: Mapped[datetime | None] = mapped_column(comment="Время последнего изменения записи") - is_deleted: Mapped[bool | None] = mapped_column(comment="Флаг удаления записи") + created: Mapped[datetime] = mapped_column(comment="Дата создания/обновления ключа") diff --git a/profcomff_definitions/base.py b/profcomff_definitions/base.py index ad3ffd1..e3b6047 100644 --- a/profcomff_definitions/base.py +++ b/profcomff_definitions/base.py @@ -6,6 +6,87 @@ from sqlalchemy.orm import as_declarative +def _recursive_merge(a: dict, b: dict) -> None: + """Helper function for recursive_merge""" + for key, val in b.items(): + if key in a and isinstance(a[key], dict) and isinstance(val, dict): + _recursive_merge(a[key], val) + continue + a[key] = val + + +def recursive_merge(a: dict, b: dict) -> dict: + """Returns a copy of 'a', recursively-updated with 'b' + (acts like recursive dict .update operator) + """ + ret = a.copy() + _recursive_merge(ret, b) + return ret + + +def sensitive(cls): + """Mark table as sensitive + + Sets 'info.sensitive' attribute to True. This attribute can be accessed in + definitions-lib in table comparator with + metadata_table_code.info.get("sensitive", False) + """ + cls.__table_args__ = recursive_merge(cls.__table_args__, {"info": {"sensitive": True}, "extend_existing": True}) + # Private function from sqlalchemy/sql/schema.py:Table + # Can be replaced with cls.__table__ = Table(...), but will be less optimal + cls.__table__._init_existing(**cls.__table_args__) + + return cls + + +def encrypted(id_column: str = "id", **kwargs): + """Mark table as encrypted + + Arguments: + - id_column (optional, default: "id"): encryption keys are going to be + generated for all rows and will be unique for each `id_column` value. + Should be a name of primary key in a table. + + Keyword arguments: + - key_table (default: _ekeys): table name to store keys in. If + unspecified, generated automatically (check generated migration scripts + for the actual name) + + - columns (default: all columns except id_column): array of column names to + be encrypted + + Action: + Sets 'info.encrypted' attribute to True, and adds information about + encryption in 'info.encryption' attribute. + + Example: + # key_table defaults to "user_info_ekeys" + @encrypted('user_id', columns=['email', 'name']) + class UserInfo(Base): + ... + + Attributes can be accessesed in definitions-lib in table comparator with + metadata_table_.info.get("attribute-name", default_value); + """ + + def encrypted_decorator(cls): + _key_table = kwargs.get('key_table', cls.__tablename__ + "_ekeys") + _columns = kwargs.get('columns', [i.name for i in cls.__table__.columns if i.name != id_column]) + + cls.__table_args__ = recursive_merge( + cls.__table_args__, + { + "info": {"encrypted": True, "encryption": {"id": id_column, "keys": _key_table, "columns": _columns}}, + "extend_existing": True, + }, + ) + # See comment in function "sensitive" + cls.__table__._init_existing(**cls.__table_args__) + return cls + + return encrypted_decorator + + @as_declarative() class Base: """Base class for all database entities""" @@ -22,27 +103,19 @@ def __tablename__(cls) -> str: @declared_attr def __table_args__(cls) -> dict[str, Any]: schema = f'{cls.__module__.split(".")[-2].upper()}_{cls.__module__.split(".")[-1].upper()}' + # this line is very important for definitions-lib! Without it, the library wouldn't know which schemas are present in the database add_table_schema_to_model(schema, Base.metadata) - - return {'schema': schema, 'comment': cls.__doc__, 'info': {'sensitive': False}} + return { + 'schema': schema, + 'comment': cls.__doc__, + 'info': { + 'sensitive': False, + 'encrypted': False, + }, + } def __repr__(self) -> str: attrs = [] for c in self.__table__.columns: attrs.append(f"{c.name}={getattr(self, c.name)}") return "{}({})".format(self.__class__.__name__, ", ".join(attrs)) - - -class SensitiveBase(Base): - """Base class for all sensitive entities""" - - @classmethod - @declared_attr - def __table_args__(cls) -> dict[str, Any]: - schema = f'{cls.__module__.split(".")[-2].upper()}_{cls.__module__.split(".")[-1].upper()}' - add_table_schema_to_model(schema, Base.metadata) - - return {'schema': schema, 'comment': cls.__doc__, 'info': {'sensitive': True}} - - __abstract__ = True - __mapper_args__ = {'concrete': True}