From 2009c2c96ab2c9bf857d9731ef0d330ac230276c Mon Sep 17 00:00:00 2001 From: parfenovma Date: Sun, 16 Feb 2025 17:41:54 +0000 Subject: [PATCH 1/3] init --- .../20250216_1725_8a7cb1960f13_ods_rating.py | 212 +++++++++++++++++ .../20250216_1740_41490fd26134_dwh_rating.py | 220 ++++++++++++++++++ profcomff_definitions/DWH/rating.py | 55 +++++ profcomff_definitions/ODS/rating.py | 49 ++++ 4 files changed, 536 insertions(+) create mode 100644 migrations/versions/20250216_1725_8a7cb1960f13_ods_rating.py create mode 100644 migrations/versions/20250216_1740_41490fd26134_dwh_rating.py create mode 100644 profcomff_definitions/DWH/rating.py create mode 100644 profcomff_definitions/ODS/rating.py diff --git a/migrations/versions/20250216_1725_8a7cb1960f13_ods_rating.py b/migrations/versions/20250216_1725_8a7cb1960f13_ods_rating.py new file mode 100644 index 0000000..2d76309 --- /dev/null +++ b/migrations/versions/20250216_1725_8a7cb1960f13_ods_rating.py @@ -0,0 +1,212 @@ +"""ods_rating + +Revision ID: 8a7cb1960f13 +Revises: adb819726799 +Create Date: 2025-02-16 17:25:54.519503 + +""" + +from alembic import op +import sqlalchemy as sa +import os + + +# revision identifiers, used by Alembic. +revision = '8a7cb1960f13' +down_revision = 'adb819726799' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table_schema("ODS_RATING") + op.create_table( + 'comment', + sa.Column('uuid', sa.Uuid(), nullable=False, comment='Техническое поле в dwh'), + sa.Column('api_uuid', sa.Uuid(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('create_ts', sa.DateTime(), nullable=False, comment='Timestamp создания комментария, мск'), + sa.Column('update_ts', sa.DateTime(), nullable=False, comment='Timestamp обновления комментария, мск'), + sa.Column('subject', sa.String(), nullable=True, comment='Предмет, к которому относится комментарий'), + sa.Column('text', sa.String(), nullable=True, comment='Текст комментария'), + sa.Column('mark_kindness', sa.Integer(), nullable=False, comment='Доброта преподавателя'), + sa.Column('mark_freebie', sa.Integer(), nullable=False, comment='Халявность преподавателя'), + sa.Column('mark_clarity', sa.Integer(), nullable=False, comment='Понятность преподавателя'), + sa.Column('lecturer_id', sa.Integer(), nullable=False, comment='Идертификатор преподавателя'), + sa.Column( + 'review_status', + sa.String(), + nullable=False, + comment='Статус комментария, может быть approved, pending, dismissed', + ), + sa.PrimaryKeyConstraint('uuid'), + schema='ODS_RATING', + comment='\n Комментарии в rating-api\n ', + info={'sensitive': False}, + ) + op.create_table( + 'lecturer', + sa.Column('uuid', sa.Uuid(), nullable=False, comment='Техническое поле в dwh'), + sa.Column('api_id', sa.Integer(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('first_name', sa.String(), nullable=False, comment='Имя преподавателя'), + sa.Column('last_name', sa.String(), nullable=False, comment='Фамилия преподавателя'), + sa.Column('middle_name', sa.String(), nullable=False, comment='отчество преподавателя'), + sa.Column('subject', sa.String(), nullable=True, comment='Список предметов преподавателя'), + sa.Column('avatar_link', sa.String(), nullable=True, comment='Ссылка на аватар преподавателя'), + sa.Column('timetable_id', sa.Integer(), nullable=False, comment='Идертификатор в timetable-api'), + sa.PrimaryKeyConstraint('uuid'), + schema='ODS_RATING', + comment='\n Преподаватели в rating-api\n ', + info={'sensitive': False}, + ) + op.create_table( + 'lecturer_user_comment', + sa.Column('uuid', sa.Uuid(), nullable=False, comment='Техническое поле в dwh'), + sa.Column('api_id', sa.Integer(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('lecturer_id', sa.Integer(), nullable=False, comment='Идентифиактор преподавателя'), + sa.Column('user_id', sa.Integer(), nullable=False, comment='Идентификатор пользователя в auth-api'), + sa.Column('create_ts', sa.DateTime(), nullable=False, comment='Timestamp создания комментария, мск'), + sa.Column('update_ts', sa.DateTime(), nullable=False, comment='Timestamp обновления комментария, мск'), + sa.PrimaryKeyConstraint('uuid'), + schema='ODS_RATING', + comment='\n Связь лекторов и комметариев в rating-api\n ', + info={'sensitive': False}, + ) + op.create_group( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read" + ) + op.create_group( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write" + ) + op.create_group( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all" + ) + op.grant_on_schema( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + "ODS_RATING", + ) + op.grant_on_schema( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + "ODS_RATING", + ) + op.grant_on_schema( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + "ODS_RATING", + ) + op.grant_on_table( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + ['SELECT'], + '"ODS_RATING".lecturer_user_comment', + ) + op.grant_on_table( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_RATING".lecturer_user_comment', + ) + op.grant_on_table( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + ['ALL'], + '"ODS_RATING".lecturer_user_comment', + ) + op.grant_on_table( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + ['SELECT'], + '"ODS_RATING".lecturer', + ) + op.grant_on_table( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_RATING".lecturer', + ) + op.grant_on_table( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + ['ALL'], + '"ODS_RATING".lecturer', + ) + op.grant_on_table( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + ['SELECT'], + '"ODS_RATING".comment', + ) + op.grant_on_table( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_RATING".comment', + ) + op.grant_on_table( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + ['ALL'], + '"ODS_RATING".comment', + ) + + +def downgrade(): + op.revoke_on_table( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + ['ALL'], + '"ODS_RATING".comment', + ) + op.revoke_on_table( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_RATING".comment', + ) + op.revoke_on_table( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + ['SELECT'], + '"ODS_RATING".comment', + ) + op.revoke_on_table( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + ['ALL'], + '"ODS_RATING".lecturer', + ) + op.revoke_on_table( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_RATING".lecturer', + ) + op.revoke_on_table( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + ['SELECT'], + '"ODS_RATING".lecturer', + ) + op.revoke_on_table( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + ['ALL'], + '"ODS_RATING".lecturer_user_comment', + ) + op.revoke_on_table( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"ODS_RATING".lecturer_user_comment', + ) + op.revoke_on_table( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + ['SELECT'], + '"ODS_RATING".lecturer_user_comment', + ) + op.revoke_on_schema( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all", + "ODS_RATING", + ) + op.revoke_on_schema( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write", + "ODS_RATING", + ) + op.revoke_on_schema( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read", + "ODS_RATING", + ) + op.drop_table('lecturer_user_comment', schema='ODS_RATING') + op.drop_table('lecturer', schema='ODS_RATING') + op.drop_table('comment', schema='ODS_RATING') + op.delete_group( + "test_dwh_ods_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_all" + ) + op.delete_group( + "test_dwh_ods_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_write" + ) + op.delete_group( + "test_dwh_ods_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_ods_rating_read" + ) + op.drop_table_schema("ODS_RATING") diff --git a/migrations/versions/20250216_1740_41490fd26134_dwh_rating.py b/migrations/versions/20250216_1740_41490fd26134_dwh_rating.py new file mode 100644 index 0000000..9a12c42 --- /dev/null +++ b/migrations/versions/20250216_1740_41490fd26134_dwh_rating.py @@ -0,0 +1,220 @@ +"""dwh_rating + +Revision ID: 41490fd26134 +Revises: 8a7cb1960f13 +Create Date: 2025-02-16 17:40:38.011446 + +""" + +from alembic import op +import sqlalchemy as sa +import os + + +# revision identifiers, used by Alembic. +revision = '41490fd26134' +down_revision = '8a7cb1960f13' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table_schema("DWH_RATING") + op.create_table( + 'comment', + sa.Column('uuid', sa.Uuid(), nullable=False, comment='Техническое поле в dwh'), + sa.Column('api_uuid', sa.Uuid(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('create_ts', sa.DateTime(), nullable=False, comment='Timestamp создания комментария, мск'), + sa.Column('update_ts', sa.DateTime(), nullable=False, comment='Timestamp обновления комментария, мск'), + sa.Column('subject', sa.String(), nullable=True, comment='Предмет, к которому относится комментарий'), + sa.Column('text', sa.String(), nullable=True, comment='Текст комментария'), + sa.Column('mark_kindness', sa.Integer(), nullable=False, comment='Доброта преподавателя'), + sa.Column('mark_freebie', sa.Integer(), nullable=False, comment='Халявность преподавателя'), + sa.Column('mark_clarity', sa.Integer(), nullable=False, comment='Понятность преподавателя'), + sa.Column('lecturer_id', sa.Integer(), nullable=False, comment='Идертификатор преподавателя'), + sa.Column( + 'review_status', + sa.String(), + nullable=False, + comment='Статус комментария, может быть approved, pending, dismissed', + ), + sa.Column('valid_from_dt', sa.Date(), nullable=True, comment='Дата начала действия записи'), + sa.Column('valid_to_dt', sa.Date(), nullable=True, comment='Дата конца действия записи'), + sa.PrimaryKeyConstraint('uuid'), + schema='DWH_RATING', + comment='\n Комментарии в rating-api\n ', + info={'sensitive': False}, + ) + op.create_table( + 'lecturer', + sa.Column('uuid', sa.Uuid(), nullable=False, comment='Техническое поле в dwh'), + sa.Column('api_id', sa.Integer(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('first_name', sa.String(), nullable=False, comment='Имя преподавателя'), + sa.Column('last_name', sa.String(), nullable=False, comment='Фамилия преподавателя'), + sa.Column('middle_name', sa.String(), nullable=False, comment='отчество преподавателя'), + sa.Column('subject', sa.String(), nullable=True, comment='Список предметов преподавателя'), + sa.Column('avatar_link', sa.String(), nullable=True, comment='Ссылка на аватар преподавателя'), + sa.Column('timetable_id', sa.Integer(), nullable=False, comment='Идертификатор в timetable-api'), + sa.Column('valid_from_dt', sa.Date(), nullable=True, comment='Дата начала действия записи'), + sa.Column('valid_to_dt', sa.Date(), nullable=True, comment='Дата конца действия записи'), + sa.PrimaryKeyConstraint('uuid'), + schema='DWH_RATING', + comment='\n Преподаватели в rating-api\n ', + info={'sensitive': False}, + ) + op.create_table( + 'lecturer_user_comment', + sa.Column('uuid', sa.Uuid(), nullable=False, comment='Техническое поле в dwh'), + sa.Column('api_id', sa.Integer(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('lecturer_id', sa.Integer(), nullable=False, comment='Идентифиактор преподавателя'), + sa.Column('user_id', sa.Integer(), nullable=False, comment='Идентификатор пользователя в auth-api'), + sa.Column('create_ts', sa.DateTime(), nullable=False, comment='Timestamp создания комментария, мск'), + sa.Column('update_ts', sa.DateTime(), nullable=False, comment='Timestamp обновления комментария, мск'), + sa.Column('valid_from_dt', sa.Date(), nullable=True, comment='Дата начала действия записи'), + sa.Column('valid_to_dt', sa.Date(), nullable=True, comment='Дата конца действия записи'), + sa.PrimaryKeyConstraint('uuid'), + schema='DWH_RATING', + comment='\n Связь лекторов и комметариев в rating-api\n ', + info={'sensitive': False}, + ) + op.create_group( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read" + ) + op.create_group( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write" + ) + op.create_group( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all" + ) + op.grant_on_schema( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + "DWH_RATING", + ) + op.grant_on_schema( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + "DWH_RATING", + ) + op.grant_on_schema( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + "DWH_RATING", + ) + op.grant_on_table( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + ['SELECT'], + '"DWH_RATING".comment', + ) + op.grant_on_table( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_RATING".comment', + ) + op.grant_on_table( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + ['ALL'], + '"DWH_RATING".comment', + ) + op.grant_on_table( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + ['SELECT'], + '"DWH_RATING".lecturer_user_comment', + ) + op.grant_on_table( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_RATING".lecturer_user_comment', + ) + op.grant_on_table( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + ['ALL'], + '"DWH_RATING".lecturer_user_comment', + ) + op.grant_on_table( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + ['SELECT'], + '"DWH_RATING".lecturer', + ) + op.grant_on_table( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_RATING".lecturer', + ) + op.grant_on_table( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + ['ALL'], + '"DWH_RATING".lecturer', + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.revoke_on_table( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + ['ALL'], + '"DWH_RATING".lecturer', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_RATING".lecturer', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + ['SELECT'], + '"DWH_RATING".lecturer', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + ['ALL'], + '"DWH_RATING".lecturer_user_comment', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_RATING".lecturer_user_comment', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + ['SELECT'], + '"DWH_RATING".lecturer_user_comment', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + ['ALL'], + '"DWH_RATING".comment', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DWH_RATING".comment', + ) + op.revoke_on_table( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + ['SELECT'], + '"DWH_RATING".comment', + ) + op.revoke_on_schema( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all", + "DWH_RATING", + ) + op.revoke_on_schema( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write", + "DWH_RATING", + ) + op.revoke_on_schema( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read", + "DWH_RATING", + ) + op.drop_table('lecturer_user_comment', schema='DWH_RATING') + op.drop_table('lecturer', schema='DWH_RATING') + op.drop_table('comment', schema='DWH_RATING') + op.delete_group( + "test_dwh_dwh_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_all" + ) + op.delete_group( + "test_dwh_dwh_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_write" + ) + op.delete_group( + "test_dwh_dwh_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dwh_rating_read" + ) + op.drop_table_schema("DWH_RATING") diff --git a/profcomff_definitions/DWH/rating.py b/profcomff_definitions/DWH/rating.py new file mode 100644 index 0000000..67f06b0 --- /dev/null +++ b/profcomff_definitions/DWH/rating.py @@ -0,0 +1,55 @@ +from datetime import datetime, date +from uuid import UUID + +from sqlalchemy.orm import Mapped, mapped_column + +from profcomff_definitions.base import Base + + +class Lecturer(Base): + """ + Преподаватели в rating-api + """ + uuid: Mapped[UUID] = mapped_column(primary_key=True, comment="Техническое поле в dwh") + api_id: Mapped[int] = mapped_column(comment="Идентифиактор в rating-api") + first_name: Mapped[str] = mapped_column(comment="Имя преподавателя") + last_name: Mapped[str] = mapped_column(comment="Фамилия преподавателя") + middle_name: Mapped[str] = mapped_column(comment="отчество преподавателя") + subject: Mapped[str | None] = mapped_column(comment="Список предметов преподавателя") + avatar_link: Mapped[str | None] = mapped_column(comment="Ссылка на аватар преподавателя") + timetable_id: Mapped[int] = mapped_column(comment="Идертификатор в timetable-api") + valid_from_dt: Mapped[date | None] = mapped_column(comment="Дата начала действия записи") + valid_to_dt: Mapped[date | None] = mapped_column(comment="Дата конца действия записи") + + +class Comment(Base): + """ + Комментарии в rating-api + """ + uuid: Mapped[UUID] = mapped_column(primary_key=True, comment="Техническое поле в dwh") + api_uuid: Mapped[UUID] = mapped_column(comment="Идентифиактор в rating-api") + create_ts: Mapped[datetime] = mapped_column(comment="Timestamp создания комментария, мск") + update_ts: Mapped[datetime] = mapped_column(comment="Timestamp обновления комментария, мск") + subject: Mapped[str | None] = mapped_column(comment="Предмет, к которому относится комментарий") + text: Mapped[str | None] = mapped_column(comment="Текст комментария") + mark_kindness: Mapped[int] = mapped_column(comment="Доброта преподавателя") + mark_freebie: Mapped[int] = mapped_column(comment="Халявность преподавателя") + mark_clarity: Mapped[int] = mapped_column(comment="Понятность преподавателя") + lecturer_id: Mapped[int] = mapped_column(comment="Идертификатор преподавателя") + review_status: Mapped[str] = mapped_column(comment="Статус комментария, может быть approved, pending, dismissed") + valid_from_dt: Mapped[date | None] = mapped_column(comment="Дата начала действия записи") + valid_to_dt: Mapped[date | None] = mapped_column(comment="Дата конца действия записи") + + +class LecturerUserComment(Base): + """ + Связь лекторов и комметариев в rating-api + """ + uuid: Mapped[UUID] = mapped_column(primary_key=True, comment="Техническое поле в dwh") + api_id: Mapped[int] = mapped_column(comment="Идентифиактор в rating-api") + lecturer_id: Mapped[int] = mapped_column(comment="Идентифиактор преподавателя") + user_id: Mapped[int] = mapped_column(comment="Идентификатор пользователя в auth-api") + create_ts: Mapped[datetime] = mapped_column(comment="Timestamp создания комментария, мск") + update_ts: Mapped[datetime] = mapped_column(comment="Timestamp обновления комментария, мск") + valid_from_dt: Mapped[date | None] = mapped_column(comment="Дата начала действия записи") + valid_to_dt: Mapped[date | None] = mapped_column(comment="Дата конца действия записи") diff --git a/profcomff_definitions/ODS/rating.py b/profcomff_definitions/ODS/rating.py new file mode 100644 index 0000000..255577c --- /dev/null +++ b/profcomff_definitions/ODS/rating.py @@ -0,0 +1,49 @@ +from datetime import datetime +from uuid import UUID + +from sqlalchemy.orm import Mapped, mapped_column + +from profcomff_definitions.base import Base + + +class Lecturer(Base): + """ + Преподаватели в rating-api + """ + uuid: Mapped[UUID] = mapped_column(primary_key=True, comment="Техническое поле в dwh") + api_id: Mapped[int] = mapped_column(comment="Идентифиактор в rating-api") + first_name: Mapped[str] = mapped_column(comment="Имя преподавателя") + last_name: Mapped[str] = mapped_column(comment="Фамилия преподавателя") + middle_name: Mapped[str] = mapped_column(comment="отчество преподавателя") + subject: Mapped[str | None] = mapped_column(comment="Список предметов преподавателя") + avatar_link: Mapped[str | None] = mapped_column(comment="Ссылка на аватар преподавателя") + timetable_id: Mapped[int] = mapped_column(comment="Идертификатор в timetable-api") + + +class Comment(Base): + """ + Комментарии в rating-api + """ + uuid: Mapped[UUID] = mapped_column(primary_key=True, comment="Техническое поле в dwh") + api_uuid: Mapped[UUID] = mapped_column(comment="Идентифиактор в rating-api") + create_ts: Mapped[datetime] = mapped_column(comment="Timestamp создания комментария, мск") + update_ts: Mapped[datetime] = mapped_column(comment="Timestamp обновления комментария, мск") + subject: Mapped[str | None] = mapped_column(comment="Предмет, к которому относится комментарий") + text: Mapped[str | None] = mapped_column(comment="Текст комментария") + mark_kindness: Mapped[int] = mapped_column(comment="Доброта преподавателя") + mark_freebie: Mapped[int] = mapped_column(comment="Халявность преподавателя") + mark_clarity: Mapped[int] = mapped_column(comment="Понятность преподавателя") + lecturer_id: Mapped[int] = mapped_column(comment="Идертификатор преподавателя") + review_status: Mapped[str] = mapped_column(comment="Статус комментария, может быть approved, pending, dismissed") + + +class LecturerUserComment(Base): + """ + Связь лекторов и комметариев в rating-api + """ + uuid: Mapped[UUID] = mapped_column(primary_key=True, comment="Техническое поле в dwh") + api_id: Mapped[int] = mapped_column(comment="Идентифиактор в rating-api") + lecturer_id: Mapped[int] = mapped_column(comment="Идентифиактор преподавателя") + user_id: Mapped[int] = mapped_column(comment="Идентификатор пользователя в auth-api") + create_ts: Mapped[datetime] = mapped_column(comment="Timestamp создания комментария, мск") + update_ts: Mapped[datetime] = mapped_column(comment="Timestamp обновления комментария, мск") From e3ce899531e65a6fb9a970496eebdc66dea6417d Mon Sep 17 00:00:00 2001 From: parfenovma Date: Sat, 22 Feb 2025 09:32:47 +0000 Subject: [PATCH 2/3] add_dm --- .../20250222_0923_458e9065c0d1_dm_comment.py | 92 +++++++++++++++++++ profcomff_definitions/DM/rating.py | 38 ++++++++ 2 files changed, 130 insertions(+) create mode 100644 migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py create mode 100644 profcomff_definitions/DM/rating.py diff --git a/migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py b/migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py new file mode 100644 index 0000000..542b014 --- /dev/null +++ b/migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py @@ -0,0 +1,92 @@ +"""dm_comment + +Revision ID: 458e9065c0d1 +Revises: 41490fd26134 +Create Date: 2025-02-22 09:23:35.334508 + +""" + +from alembic import op +import sqlalchemy as sa +import os + + +# revision identifiers, used by Alembic. +revision = '458e9065c0d1' +down_revision = '41490fd26134' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'dm_lecturer_comment_act', + sa.Column('comment_api_uuid', sa.Uuid(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('lecturer_api_id', sa.Integer(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('lecturer_full_name', sa.String(), nullable=True, comment='ФИО преподавателя'), + sa.Column('lecturer_first_name', sa.String(), nullable=True, comment='Имя преподавателя'), + sa.Column('lecturer_last_name', sa.String(), nullable=True, comment='Фамилия преподавателя'), + sa.Column('lecturer_middle_name', sa.String(), nullable=True, comment='ОТчество преподавателя'), + sa.Column('timetable_id', sa.Integer(), nullable=True, comment='Идертификатор в timetable-api'), + sa.Column('has_timetable_id', sa.Boolean(), nullable=False, comment='Флаг: есть ли преподаватель в расписании'), + sa.Column('lecturer_subject', sa.String(), nullable=True, comment='Предмет, относящийся к преподавателю'), + sa.Column('comment_subject', sa.String(), nullable=True, comment='Оцениваемый предмет'), + sa.Column( + 'comment_shortened_text', sa.String(), nullable=True, comment='Первые 80 символов текста комментария' + ), + sa.Column('comment_full_text', sa.String(), nullable=True, comment='Полный текст комментария'), + sa.Column('comment_create_ts', sa.DateTime(), nullable=True, comment='Timestamp создания комментария, мск'), + sa.Column('comment_update_ts', sa.DateTime(), nullable=True, comment='Timestamp обновления комментария, мск'), + sa.Column('comment_mark_kindness', sa.Integer(), nullable=False, comment='Оценка доброты'), + sa.Column('comment_mark_freebie', sa.Integer(), nullable=False, comment='Оценка халявности'), + sa.Column('comment_mark_clarity', sa.Integer(), nullable=False, comment='Оценка понятности'), + sa.Column('comment_review_status', sa.String(), nullable=False, comment='Статус комментария'), + sa.Column('user_id', sa.Integer(), nullable=True, comment='Идентификатор пользователя из auth-api'), + sa.Column('user_full_name', sa.String(), nullable=True, comment='Имя пользователя'), + sa.Column('user_email', sa.String(), nullable=True, comment='Список электронных почт пользователя'), + ) + op.execute( + """ + CREATE INDEX "ix__dm_lecturer_comment_act__comment_shortened_text" + ON "dm_lecturer_comment_act" + USING gin(to_tsvector('russian', "comment_shortened_text")); + """ + ) + op.execute( + """ + CREATE INDEX "ix__dm_lecturer_comment_act__lecturer_full_name" + ON "dm_lecturer_comment_act" + USING gin(to_tsvector('russian', "lecturer_full_name")); + """ + ) + op.execute( + """ + CREATE INDEX "ix__dm_lecturer_comment_act__user_full_name" + ON "dm_lecturer_comment_act" + USING gin(to_tsvector('russian', "user_full_name")); + """ + ) + op.create_index( + op.f('ix_dm_lecturer_comment_act_comment_create_ts'), + 'dm_lecturer_comment_act', + ['comment_create_ts'], + unique=False, + ) + op.create_index(op.f('ix_dm_lecturer_comment_act_user_id'), 'dm_lecturer_comment_act', ['user_id'], unique=False) + + +def downgrade(): + op.drop_index(op.f('ix_dm_lecturer_comment_act_user_id'), table_name='dm_lecturer_comment_act') + op.drop_index(op.f('ix_dm_lecturer_comment_act_comment_create_ts'), table_name='dm_lecturer_comment_act') + op.drop_index( + 'ix__dm_lecturer_comment_act__user_full_name', table_name='dm_lecturer_comment_act', postgresql_using='gin' + ) + op.drop_index( + 'ix__dm_lecturer_comment_act__lecturer_full_name', table_name='dm_lecturer_comment_act', postgresql_using='gin' + ) + op.drop_index( + 'ix__dm_lecturer_comment_act__comment_shortened_text', + table_name='dm_lecturer_comment_act', + postgresql_using='gin', + ) + op.drop_table('dm_lecturer_comment_act') diff --git a/profcomff_definitions/DM/rating.py b/profcomff_definitions/DM/rating.py new file mode 100644 index 0000000..fe04da9 --- /dev/null +++ b/profcomff_definitions/DM/rating.py @@ -0,0 +1,38 @@ +from datetime import date, datetime +from uuid import UUID +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy import schema +from profcomff_definitions.base import Base + + +class DmLecturerCommentAct(Base): + """ + Snapshot table that shows sizes for all tables in DWH + """ + comment_api_uuid: Mapped[UUID] = mapped_column(comment="Идентифиактор в rating-api") + lecturer_api_id: Mapped[int] = mapped_column(comment="Идентифиактор в rating-api") + lecturer_full_name: Mapped[str | None] = mapped_column(comment="ФИО преподавателя") + lecturer_first_name: Mapped[str | None] = mapped_column(comment="Имя преподавателя") + lecturer_last_name: Mapped[str | None] = mapped_column(comment="Фамилия преподавателя") + lecturer_middle_name: Mapped[str | None] = mapped_column(comment="ОТчество преподавателя") + timetable_id: Mapped[int | None] = mapped_column(comment="Идертификатор в timetable-api") + has_timetable_id: Mapped[bool] = mapped_column(comment="Флаг: есть ли преподаватель в расписании") + lecturer_subject: Mapped[str | None] = mapped_column(comment="Предмет, относящийся к преподавателю") + comment_subject: Mapped[str | None] = mapped_column(comment="Оцениваемый предмет") + comment_shortened_text: Mapped[str | None] = mapped_column(comment="Первые 80 символов текста комментария") + comment_full_text: Mapped[str | None] = mapped_column(comment="Полный текст комментария") + comment_create_ts: Mapped[datetime | None] = mapped_column(comment="Timestamp создания комментария, мск", index=True) + comment_update_ts: Mapped[datetime | None] = mapped_column(comment="Timestamp обновления комментария, мск") + comment_mark_kindness: Mapped[int] = mapped_column(comment="Оценка доброты") + comment_mark_freebie: Mapped[int] = mapped_column(comment="Оценка халявности") + comment_mark_clarity: Mapped[int] = mapped_column(comment="Оценка понятности") + comment_review_status: Mapped[str] = mapped_column(comment="Статус комментария") + user_id: Mapped[int | None] = mapped_column(comment="Идентификатор пользователя из auth-api", index=True) + user_full_name: Mapped[str | None] = mapped_column(comment="Имя пользователя") + user_email: Mapped[str | None] = mapped_column(comment="Список электронных почт пользователя") + __mapper_args__ = {"primary_key": ["comment_api_uuid", "lecturer_api_id"]} + __table_args__ = ( + schema.Index("ix__dm_lecturer_comment_act__user_full_name", "user_full_name", postgresql_using="gin"), + schema.Index("ix__dm_lecturer_comment_act__lecturer_full_name", "lecturer_full_name", postgresql_using="gin"), + schema.Index("ix__dm_lecturer_comment_act__comment_shortened_text", "comment_shortened_text", postgresql_using="gin"), + ) From c9c39d2d925db86e6e52370469767c4ea3e5f0d1 Mon Sep 17 00:00:00 2001 From: parfenovma Date: Sat, 22 Feb 2025 09:56:17 +0000 Subject: [PATCH 3/3] add_dm --- .../20250222_0923_458e9065c0d1_dm_comment.py | 92 ----------- ...20250222_0952_2d7609e6f490_dm_comment_2.py | 144 ++++++++++++++++++ 2 files changed, 144 insertions(+), 92 deletions(-) delete mode 100644 migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py create mode 100644 migrations/versions/20250222_0952_2d7609e6f490_dm_comment_2.py diff --git a/migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py b/migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py deleted file mode 100644 index 542b014..0000000 --- a/migrations/versions/20250222_0923_458e9065c0d1_dm_comment.py +++ /dev/null @@ -1,92 +0,0 @@ -"""dm_comment - -Revision ID: 458e9065c0d1 -Revises: 41490fd26134 -Create Date: 2025-02-22 09:23:35.334508 - -""" - -from alembic import op -import sqlalchemy as sa -import os - - -# revision identifiers, used by Alembic. -revision = '458e9065c0d1' -down_revision = '41490fd26134' -branch_labels = None -depends_on = None - - -def upgrade(): - op.create_table( - 'dm_lecturer_comment_act', - sa.Column('comment_api_uuid', sa.Uuid(), nullable=False, comment='Идентифиактор в rating-api'), - sa.Column('lecturer_api_id', sa.Integer(), nullable=False, comment='Идентифиактор в rating-api'), - sa.Column('lecturer_full_name', sa.String(), nullable=True, comment='ФИО преподавателя'), - sa.Column('lecturer_first_name', sa.String(), nullable=True, comment='Имя преподавателя'), - sa.Column('lecturer_last_name', sa.String(), nullable=True, comment='Фамилия преподавателя'), - sa.Column('lecturer_middle_name', sa.String(), nullable=True, comment='ОТчество преподавателя'), - sa.Column('timetable_id', sa.Integer(), nullable=True, comment='Идертификатор в timetable-api'), - sa.Column('has_timetable_id', sa.Boolean(), nullable=False, comment='Флаг: есть ли преподаватель в расписании'), - sa.Column('lecturer_subject', sa.String(), nullable=True, comment='Предмет, относящийся к преподавателю'), - sa.Column('comment_subject', sa.String(), nullable=True, comment='Оцениваемый предмет'), - sa.Column( - 'comment_shortened_text', sa.String(), nullable=True, comment='Первые 80 символов текста комментария' - ), - sa.Column('comment_full_text', sa.String(), nullable=True, comment='Полный текст комментария'), - sa.Column('comment_create_ts', sa.DateTime(), nullable=True, comment='Timestamp создания комментария, мск'), - sa.Column('comment_update_ts', sa.DateTime(), nullable=True, comment='Timestamp обновления комментария, мск'), - sa.Column('comment_mark_kindness', sa.Integer(), nullable=False, comment='Оценка доброты'), - sa.Column('comment_mark_freebie', sa.Integer(), nullable=False, comment='Оценка халявности'), - sa.Column('comment_mark_clarity', sa.Integer(), nullable=False, comment='Оценка понятности'), - sa.Column('comment_review_status', sa.String(), nullable=False, comment='Статус комментария'), - sa.Column('user_id', sa.Integer(), nullable=True, comment='Идентификатор пользователя из auth-api'), - sa.Column('user_full_name', sa.String(), nullable=True, comment='Имя пользователя'), - sa.Column('user_email', sa.String(), nullable=True, comment='Список электронных почт пользователя'), - ) - op.execute( - """ - CREATE INDEX "ix__dm_lecturer_comment_act__comment_shortened_text" - ON "dm_lecturer_comment_act" - USING gin(to_tsvector('russian', "comment_shortened_text")); - """ - ) - op.execute( - """ - CREATE INDEX "ix__dm_lecturer_comment_act__lecturer_full_name" - ON "dm_lecturer_comment_act" - USING gin(to_tsvector('russian', "lecturer_full_name")); - """ - ) - op.execute( - """ - CREATE INDEX "ix__dm_lecturer_comment_act__user_full_name" - ON "dm_lecturer_comment_act" - USING gin(to_tsvector('russian', "user_full_name")); - """ - ) - op.create_index( - op.f('ix_dm_lecturer_comment_act_comment_create_ts'), - 'dm_lecturer_comment_act', - ['comment_create_ts'], - unique=False, - ) - op.create_index(op.f('ix_dm_lecturer_comment_act_user_id'), 'dm_lecturer_comment_act', ['user_id'], unique=False) - - -def downgrade(): - op.drop_index(op.f('ix_dm_lecturer_comment_act_user_id'), table_name='dm_lecturer_comment_act') - op.drop_index(op.f('ix_dm_lecturer_comment_act_comment_create_ts'), table_name='dm_lecturer_comment_act') - op.drop_index( - 'ix__dm_lecturer_comment_act__user_full_name', table_name='dm_lecturer_comment_act', postgresql_using='gin' - ) - op.drop_index( - 'ix__dm_lecturer_comment_act__lecturer_full_name', table_name='dm_lecturer_comment_act', postgresql_using='gin' - ) - op.drop_index( - 'ix__dm_lecturer_comment_act__comment_shortened_text', - table_name='dm_lecturer_comment_act', - postgresql_using='gin', - ) - op.drop_table('dm_lecturer_comment_act') diff --git a/migrations/versions/20250222_0952_2d7609e6f490_dm_comment_2.py b/migrations/versions/20250222_0952_2d7609e6f490_dm_comment_2.py new file mode 100644 index 0000000..77ea30b --- /dev/null +++ b/migrations/versions/20250222_0952_2d7609e6f490_dm_comment_2.py @@ -0,0 +1,144 @@ +"""dm_comment_2 + +Revision ID: 2d7609e6f490 +Revises: 41490fd26134 +Create Date: 2025-02-22 09:52:54.267898 + +""" + +from alembic import op +import sqlalchemy as sa +import os + + +# revision identifiers, used by Alembic. +revision = '2d7609e6f490' +down_revision = '41490fd26134' +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table_schema("DM_RATING") + op.create_table( + 'dm_lecturer_comment_act', + sa.Column('comment_api_uuid', sa.Uuid(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('lecturer_api_id', sa.Integer(), nullable=False, comment='Идентифиактор в rating-api'), + sa.Column('lecturer_full_name', sa.String(), nullable=True, comment='ФИО преподавателя'), + sa.Column('lecturer_first_name', sa.String(), nullable=True, comment='Имя преподавателя'), + sa.Column('lecturer_last_name', sa.String(), nullable=True, comment='Фамилия преподавателя'), + sa.Column('lecturer_middle_name', sa.String(), nullable=True, comment='ОТчество преподавателя'), + sa.Column('timetable_id', sa.Integer(), nullable=True, comment='Идертификатор в timetable-api'), + sa.Column('has_timetable_id', sa.Boolean(), nullable=False, comment='Флаг: есть ли преподаватель в расписании'), + sa.Column('lecturer_subject', sa.String(), nullable=True, comment='Предмет, относящийся к преподавателю'), + sa.Column('comment_subject', sa.String(), nullable=True, comment='Оцениваемый предмет'), + sa.Column( + 'comment_shortened_text', sa.String(), nullable=True, comment='Первые 80 символов текста комментария' + ), + sa.Column('comment_full_text', sa.String(), nullable=True, comment='Полный текст комментария'), + sa.Column('comment_create_ts', sa.DateTime(), nullable=True, comment='Timestamp создания комментария, мск'), + sa.Column('comment_update_ts', sa.DateTime(), nullable=True, comment='Timestamp обновления комментария, мск'), + sa.Column('comment_mark_kindness', sa.Integer(), nullable=False, comment='Оценка доброты'), + sa.Column('comment_mark_freebie', sa.Integer(), nullable=False, comment='Оценка халявности'), + sa.Column('comment_mark_clarity', sa.Integer(), nullable=False, comment='Оценка понятности'), + sa.Column('comment_review_status', sa.String(), nullable=False, comment='Статус комментария'), + sa.Column('user_id', sa.Integer(), nullable=True, comment='Идентификатор пользователя из auth-api'), + sa.Column('user_full_name', sa.String(), nullable=True, comment='Имя пользователя'), + sa.Column('user_email', sa.String(), nullable=True, comment='Список электронных почт пользователя'), + schema='DM_RATING', + comment='\n Snapshot table that shows sizes for all tables in DWH\n ', + info={'sensitive': False}, + ) + op.create_group( + "test_dwh_dm_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_read" + ) + op.create_group( + "test_dwh_dm_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_write" + ) + op.create_group("test_dwh_dm_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_all") + op.grant_on_schema( + "test_dwh_dm_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_read", + "DM_RATING", + ) + op.grant_on_schema( + "test_dwh_dm_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_write", + "DM_RATING", + ) + op.grant_on_schema( + "test_dwh_dm_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_all", "DM_RATING" + ) + op.grant_on_table( + "test_dwh_dm_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_read", + ['SELECT'], + '"DM_RATING".dm_lecturer_comment_act', + ) + op.grant_on_table( + "test_dwh_dm_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_RATING".dm_lecturer_comment_act', + ) + op.grant_on_table( + "test_dwh_dm_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_all", + ['ALL'], + '"DM_RATING".dm_lecturer_comment_act', + ) + op.create_index( + op.f('ix_DM_RATING_dm_lecturer_comment_act_comment_create_ts'), + 'dm_lecturer_comment_act', + ['comment_create_ts'], + unique=False, + schema='DM_RATING', + ) + op.create_index( + op.f('ix_DM_RATING_dm_lecturer_comment_act_user_id'), + 'dm_lecturer_comment_act', + ['user_id'], + unique=False, + schema='DM_RATING', + ) + + +def downgrade(): + op.drop_index( + op.f('ix_DM_RATING_dm_lecturer_comment_act_user_id'), table_name='dm_lecturer_comment_act', schema='DM_RATING' + ) + op.drop_index( + op.f('ix_DM_RATING_dm_lecturer_comment_act_comment_create_ts'), + table_name='dm_lecturer_comment_act', + schema='DM_RATING', + ) + op.revoke_on_table( + "test_dwh_dm_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_all", + ['ALL'], + '"DM_RATING".dm_lecturer_comment_act', + ) + op.revoke_on_table( + "test_dwh_dm_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_write", + ['SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'INSERT'], + '"DM_RATING".dm_lecturer_comment_act', + ) + op.revoke_on_table( + "test_dwh_dm_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_read", + ['SELECT'], + '"DM_RATING".dm_lecturer_comment_act', + ) + op.revoke_on_schema( + "test_dwh_dm_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_all", "DM_RATING" + ) + op.revoke_on_schema( + "test_dwh_dm_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_write", + "DM_RATING", + ) + op.revoke_on_schema( + "test_dwh_dm_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_read", + "DM_RATING", + ) + op.drop_table('dm_lecturer_comment_act', schema='DM_RATING') + op.delete_group("test_dwh_dm_rating_all" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_all") + op.delete_group( + "test_dwh_dm_rating_write" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_write" + ) + op.delete_group( + "test_dwh_dm_rating_read" if os.getenv("ENVIRONMENT") != "production" else "prod_dwh_dm_rating_read" + ) + op.drop_table_schema("DM_RATING")