diff --git a/src/api/googlesheets.py b/src/api/googlesheets.py index 6ce7ef57..9198ee1c 100644 --- a/src/api/googlesheets.py +++ b/src/api/googlesheets.py @@ -15,8 +15,6 @@ from settings.settings import RANGE_NAME config = parse_settings() -SPREADSHEET_ID = {} -SPREADSHEET_ID.setdefault('Домик', config.sheets.sheet_id) filename = 'credentials.json' path = os.getenv('CONFIG_PATH') @@ -53,10 +51,14 @@ def get_values( return result.get('values', []) -def get_data_from_spreadsheet(sheet, value_render_option='FORMATTED_VALUE'): +def get_data_from_spreadsheet( + spreadsheet_id, + sheet, + value_render_option='FORMATTED_VALUE' +): try: values = get_values( - SPREADSHEET_ID['Домик'], + spreadsheet_id, sheet, value_render_option ) @@ -71,36 +73,9 @@ def get_data_from_spreadsheet(sheet, value_render_option='FORMATTED_VALUE'): raise ConnectionError -def get_quality_of_seats(event_id: str, keys: List[str]): - try: - dict_column_name, len_column = get_column_info('База спектаклей_') - - values = get_values( - SPREADSHEET_ID['Домик'], - f'{RANGE_NAME['База спектаклей']}' - ) - - if not values: - googlesheets_logger.info('No data found') - raise ValueError - - return_data = [] - for row in values: - if event_id == row[dict_column_name['event_id']]: - for key in keys: - return_data.append(row[dict_column_name[key]]) - return return_data - raise KeyError - except HttpError as err: - googlesheets_logger.error(err) - except KeyError: - googlesheets_logger.error(f'Показа с event_id = {event_id} не найдено') - - -def get_column_info(name_sheet): +def get_column_info(spreadsheet_id, name_sheet): data_column_name = get_data_from_spreadsheet( - RANGE_NAME[name_sheet] + f'2:2' - ) + spreadsheet_id, RANGE_NAME[name_sheet] + f'2:2') dict_column_name: Dict[int | str, int] = {} for i, item in enumerate(data_column_name[0]): if item == '': @@ -117,15 +92,17 @@ def get_column_info(name_sheet): def write_data_reserve( + spreadsheet_id, event_id, numbers: List[int], option: int = 1 ) -> None: try: - dict_column_name, len_column = get_column_info('База спектаклей_') + dict_column_name, len_column = get_column_info( + spreadsheet_id, 'База спектаклей_') values = get_values( - SPREADSHEET_ID['Домик'], + spreadsheet_id, f'{RANGE_NAME['База спектаклей']}', value_render_option='UNFORMATTED_VALUE' ) @@ -204,7 +181,7 @@ def write_data_reserve( 'data': data } request = sheet.values().batchUpdate( - spreadsheetId=SPREADSHEET_ID['Домик'], + spreadsheetId=spreadsheet_id, body=value_range_body ) try: @@ -226,10 +203,11 @@ def write_data_reserve( async def write_client_reserve( + spreadsheet_id, context: ContextTypes.DEFAULT_TYPE, chat_id: int, base_ticket: BaseTicket, - ticket_status_value, + ticket_status_value ) -> int: # TODO Заменить на запись в другой лист reserve_user_data = context.user_data['reserve_user_data'] @@ -240,7 +218,7 @@ async def write_client_reserve( try: values_column = get_values( - SPREADSHEET_ID['Домик'], + spreadsheet_id, RANGE_NAME['База клиентов'] ) @@ -259,9 +237,11 @@ async def write_client_reserve( values[i].append(chat_id) values[i].append(client_data['name_adult']) values[i].append(client_data['phone']) - values[i].append(' | '.join([i[0] for i in client_data['data_children']])) + values[i].append( + ' | '.join([i[0] for i in client_data['data_children']])) values[i].append('') - values[i].append(' | '.join([i[1] for i in client_data['data_children']])) + values[i].append( + ' | '.join([i[1] for i in client_data['data_children']])) # Спектакль values[i].append(event_id) @@ -304,7 +284,8 @@ async def write_client_reserve( range_sheet = (RANGE_NAME['База клиентов_'] + f'R1C1:R1C{end_column_index}') - execute_append_googlesheet(sheet, + execute_append_googlesheet(spreadsheet_id, + sheet, range_sheet, value_input_option, response_value_render_option, @@ -319,15 +300,17 @@ async def write_client_reserve( def update_ticket_in_gspread( + spreadsheet_id, ticket_id: int, ticket_status: str, option: int = 1 ) -> None: try: - dict_column_name, len_column = get_column_info('База клиентов_') + dict_column_name, len_column = get_column_info( + spreadsheet_id, 'База клиентов_') values = get_values( - SPREADSHEET_ID['Домик'], + spreadsheet_id, f'{RANGE_NAME['База клиентов']}', value_render_option='UNFORMATTED_VALUE' ) @@ -374,7 +357,7 @@ def update_ticket_in_gspread( 'data': data } request = sheet.values().batchUpdate( - spreadsheetId=SPREADSHEET_ID['Домик'], + spreadsheetId=spreadsheet_id, body=value_range_body ) try: @@ -420,12 +403,14 @@ def get_flags_by_ticket_status(ticket_status_value): def write_client_cme( - custom_made_event: CustomMadeEvent, + spreadsheet_id, + custom_made_event: CustomMadeEvent ) -> None: - dict_column_name, len_column = get_column_info('База ДР_') + dict_column_name, len_column = get_column_info( + spreadsheet_id, 'База ДР_') values_column = get_values( - SPREADSHEET_ID['Домик'], + spreadsheet_id, RANGE_NAME['База ДР'] ) @@ -452,7 +437,7 @@ def write_client_cme( elif key == 'name_theater': values[0].append( '=VLOOKUP(' - 'INDEX($1:$66;ROW();MATCH("theater_event_id";$2:$2;0));' + 'INDEX($A:$Z;ROW();MATCH("theater_event_id";$2:$2;0));' '\'Репертуар\'!$A$3:$F;' 'MATCH("name";\'Репертуар\'!$2:$2;0)' ')' @@ -473,17 +458,21 @@ def write_client_cme( range_sheet = (RANGE_NAME['База ДР_'] + f'R1C1:R1C{end_column_index}') - execute_append_googlesheet(sheet, + execute_append_googlesheet(spreadsheet_id, + sheet, range_sheet, value_input_option, response_value_render_option, value_range_body) -def write_client_list_waiting(context: ContextTypes.DEFAULT_TYPE): +def write_client_list_waiting( + spreadsheet_id, + context: ContextTypes.DEFAULT_TYPE +): try: values_column = get_values( - SPREADSHEET_ID['Домик'], + spreadsheet_id, RANGE_NAME['Лист ожидания'] ) @@ -535,7 +524,8 @@ def write_client_list_waiting(context: ContextTypes.DEFAULT_TYPE): range_sheet = (RANGE_NAME['Лист ожидания_'] + f'R1C1:R1C{end_column_index}') - execute_append_googlesheet(sheet, + execute_append_googlesheet(spreadsheet_id, + sheet, range_sheet, value_input_option, response_value_render_option, @@ -545,10 +535,15 @@ def write_client_list_waiting(context: ContextTypes.DEFAULT_TYPE): googlesheets_logger.error(err) -def update_cme_in_gspread(cme_id, status) -> None: - dict_column_name, len_column = get_column_info('База ДР_') +def update_cme_in_gspread( + spreadsheet_id, + cme_id, + status +) -> None: + dict_column_name, len_column = get_column_info( + spreadsheet_id, 'База ДР_') values = get_values( - SPREADSHEET_ID['Домик'], + spreadsheet_id, f'{RANGE_NAME['База ДР']}', value_render_option='UNFORMATTED_VALUE' ) @@ -579,7 +574,8 @@ def update_cme_in_gspread(cme_id, status) -> None: range_sheet = (f'{RANGE_NAME['База ДР_']}' f'R{row_cme}C{col1}:R{row_cme}C{col2}') - execute_update_googlesheet(sheet, + execute_update_googlesheet(spreadsheet_id, + sheet, range_sheet, value_input_option, response_value_render_option, @@ -587,6 +583,7 @@ def update_cme_in_gspread(cme_id, status) -> None: def execute_update_googlesheet( + spreadsheet_id, sheet, range_sheet, value_input_option, @@ -594,7 +591,7 @@ def execute_update_googlesheet( value_range_body ): request = sheet.values().update( - spreadsheetId=SPREADSHEET_ID['Домик'], + spreadsheetId=spreadsheet_id, range=range_sheet, valueInputOption=value_input_option, responseValueRenderOption=response_value_render_option, @@ -618,6 +615,7 @@ def execute_update_googlesheet( def execute_append_googlesheet( + spreadsheet_id, sheet, range_sheet, value_input_option, @@ -625,7 +623,7 @@ def execute_append_googlesheet( value_range_body ): request = sheet.values().append( - spreadsheetId=SPREADSHEET_ID['Домик'], + spreadsheetId=spreadsheet_id, range=range_sheet, valueInputOption=value_input_option, insertDataOption='INSERT_ROWS', diff --git a/src/db/db_googlesheets.py b/src/db/db_googlesheets.py index 21549559..3e14da1a 100644 --- a/src/db/db_googlesheets.py +++ b/src/db/db_googlesheets.py @@ -7,11 +7,10 @@ from telegram.ext import ContextTypes from api.googlesheets import ( - get_data_from_spreadsheet, - get_column_info, - write_data_reserve, + get_data_from_spreadsheet, get_column_info, write_data_reserve, ) from db import db_postgres +from settings import parse_settings from settings.settings import RANGE_NAME from utilities.schemas.custom_made_format import CustomMadeFormatDTO from utilities.schemas.schedule_event import ScheduleEventDTO @@ -19,20 +18,26 @@ from utilities.schemas.ticket import BaseTicketDTO db_googlesheets_logger = logging.getLogger('bot.db.googlesheets') +config = parse_settings() +sheet_id_domik = config.sheets.sheet_id_domik +sheet_id_cme = config.sheets.sheet_id_cme def load_base_tickets(only_active=True) -> List[BaseTicketDTO]: tickets = [] - dict_column_name, len_column = get_column_info('Варианты стоимости_') + dict_column_name, len_column = get_column_info( + sheet_id_domik, 'Варианты стоимости_') qty_tickets = len(get_data_from_spreadsheet( - RANGE_NAME['Варианты стоимости_'] + f'A:A' - )) + sheet_id_domik, RANGE_NAME['Варианты стоимости_'] + f'A:A')) + + sheet = (RANGE_NAME['Варианты стоимости_'] + + f'R2C1:R{qty_tickets}C{len_column}') data = get_data_from_spreadsheet( - RANGE_NAME['Варианты стоимости_'] + - f'R2C1:R{qty_tickets}C{len_column}' + sheet_id_domik, + sheet ) db_googlesheets_logger.info('Данные стоимости броней загружены') @@ -65,15 +70,18 @@ def load_schedule_events( ) -> List[ScheduleEventDTO]: events = [] - dict_column_name, len_column = get_column_info('База спектаклей_') + dict_column_name, len_column = get_column_info( + sheet_id_domik, 'База спектаклей_') qty_events = len(get_data_from_spreadsheet( - RANGE_NAME['База спектаклей_'] + f'A:A' - )) + sheet_id_domik, RANGE_NAME['База спектаклей_'] + f'A:A')) + + sheet = (RANGE_NAME['База спектаклей_'] + + f'R2C1:R{qty_events}C{len_column}') data = get_data_from_spreadsheet( - RANGE_NAME['База спектаклей_'] + - f'R2C1:R{qty_events}C{len_column}', + sheet_id_domik, + sheet, value_render_option='UNFORMATTED_VALUE' ) db_googlesheets_logger.info('Данные мероприятий загружены') @@ -109,15 +117,18 @@ def load_schedule_events( def load_theater_events() -> List[TheaterEventDTO]: events = [] - dict_column_name, len_column = get_column_info('Список спектаклей_') + dict_column_name, len_column = get_column_info( + sheet_id_domik, 'Список спектаклей_') - qty_tickets = len(get_data_from_spreadsheet( - RANGE_NAME['Список спектаклей_'] + f'A:A' - )) + qty_theater_events = len(get_data_from_spreadsheet( + sheet_id_domik, RANGE_NAME['Список спектаклей_'] + f'A:A')) + + sheet = (RANGE_NAME['Список спектаклей_'] + + f'R2C1:R{qty_theater_events}C{len_column}') data = get_data_from_spreadsheet( - RANGE_NAME['Список спектаклей_'] + - f'R2C1:R{qty_tickets}C{len_column}', + sheet_id_domik, + sheet, value_render_option='UNFORMATTED_VALUE' ) db_googlesheets_logger.info('Данные репертуара загружены') @@ -146,15 +157,17 @@ def load_theater_events() -> List[TheaterEventDTO]: def load_custom_made_format() -> List[CustomMadeFormatDTO]: formats = [] - dict_column_name, len_column = get_column_info('База ФЗМ_') + dict_column_name, len_column = get_column_info( + sheet_id_cme, 'База ФЗМ_') - qty_tickets = len(get_data_from_spreadsheet( - RANGE_NAME['База ФЗМ_'] + f'A:A' - )) + qty_cme_formats = len(get_data_from_spreadsheet( + sheet_id_cme, RANGE_NAME['База ФЗМ_'] + f'A:A')) + + sheet = RANGE_NAME['База ФЗМ_'] + f'R2C1:R{qty_cme_formats}C{len_column}' data = get_data_from_spreadsheet( - RANGE_NAME['База ФЗМ_'] + - f'R2C1:R{qty_tickets}C{len_column}', + sheet_id_cme, + sheet, value_render_option='UNFORMATTED_VALUE' ) db_googlesheets_logger.info('Данные форматов заказных мероприятий загружены') @@ -183,13 +196,16 @@ def load_custom_made_format() -> List[CustomMadeFormatDTO]: def load_special_ticket_price() -> Dict: special_ticket_price = {} first_colum = get_data_from_spreadsheet( - RANGE_NAME['Индив стоимости'] - ) - dict_column_name, len_column = get_column_info('Индив стоимости_') + sheet_id_domik, RANGE_NAME['Индив стоимости']) + dict_column_name, len_column = get_column_info( + sheet_id_domik, 'Индив стоимости_') + + sheet = (RANGE_NAME['Индив стоимости_'] + + f'RC1:R{len(first_colum)}C{len_column}') data = get_data_from_spreadsheet( - RANGE_NAME['Индив стоимости_'] + - f'RC1:R{len(first_colum)}C{len_column}', + sheet_id_domik, + sheet, value_render_option='UNFORMATTED_VALUE' ) @@ -211,13 +227,16 @@ def load_clients_data( event_id: int ) -> Tuple[List[List[str]], Dict[int | str, int]]: data_clients_data = [] - first_colum = get_data_from_spreadsheet(RANGE_NAME['База клиентов']) + first_colum = get_data_from_spreadsheet( + sheet_id_domik, RANGE_NAME['База клиентов']) + + dict_column_name, len_column = get_column_info( + sheet_id_domik, 'База клиентов_') - dict_column_name, len_column = get_column_info('База клиентов_') sheet = (RANGE_NAME['База клиентов_'] + f'R1C1:R{len(first_colum)}C{len_column}') - data = get_data_from_spreadsheet(sheet) + data = get_data_from_spreadsheet(sheet_id_domik, sheet) for item in data[1:]: if item[dict_column_name['event_id']] == str(event_id): @@ -230,14 +249,16 @@ def load_clients_wait_data( event_ids: List[int] ) -> Tuple[List[List[str]], Dict[int | str, int]]: data_clients_data = [] - first_colum = get_data_from_spreadsheet(RANGE_NAME['Лист ожидания']) + first_colum = get_data_from_spreadsheet( + sheet_id_domik, RANGE_NAME['Лист ожидания']) - dict_column_name, len_column = get_column_info('Лист ожидания_') + dict_column_name, len_column = get_column_info( + sheet_id_domik, 'Лист ожидания_') sheet = (RANGE_NAME['Лист ожидания_'] + f'R1C1:R{len(first_colum)}C{len_column}') - data = get_data_from_spreadsheet(sheet) + data = get_data_from_spreadsheet(sheet_id_domik, sheet) for item in data[2:]: if int(item[dict_column_name['event_id']]) in event_ids: @@ -282,7 +303,7 @@ async def increase_free_and_decrease_nonconfirm_seat( ] try: - write_data_reserve(event_id, numbers) + write_data_reserve(sheet_id_domik, event_id, numbers) await db_postgres.update_schedule_event( context.session, int(event_id), @@ -337,7 +358,7 @@ async def decrease_free_and_increase_nonconfirm_seat( ] try: - write_data_reserve(event_id, numbers) + write_data_reserve(sheet_id_domik, event_id, numbers) await db_postgres.update_schedule_event( context.session, int(event_id), @@ -386,7 +407,7 @@ async def increase_free_seat( ] try: - write_data_reserve(event_id, numbers, 3) + write_data_reserve(sheet_id_domik, event_id, numbers, 3) await db_postgres.update_schedule_event( context.session, int(event_id), @@ -431,7 +452,7 @@ async def decrease_free_seat( ] try: - write_data_reserve(event_id, numbers, 3) + write_data_reserve(sheet_id_domik, event_id, numbers, 3) await db_postgres.update_schedule_event( context.session, int(event_id), @@ -476,7 +497,7 @@ async def decrease_nonconfirm_seat( ] try: - write_data_reserve(event_id, numbers, 2) + write_data_reserve(sheet_id_domik, event_id, numbers, 2) await db_postgres.update_schedule_event( context.session, int(event_id), @@ -534,7 +555,7 @@ async def update_free_seat( ] try: - write_data_reserve(event_id, numbers, 3) + write_data_reserve(sheet_id_domik, event_id, numbers, 3) await db_postgres.update_schedule_event( context.session, int(event_id), diff --git a/src/db/db_postgres.py b/src/db/db_postgres.py index 85ea849c..4bf73c5e 100644 --- a/src/db/db_postgres.py +++ b/src/db/db_postgres.py @@ -297,6 +297,7 @@ async def create_theater_event( flag_indiv_cost=False, price_type=PriceType.NONE, theater_event_id=None, + note=None, ): theater_event = TheaterEvent( id=theater_event_id, @@ -311,7 +312,8 @@ async def create_theater_event( max_num_child_bd=max_num_child_bd, max_num_adult_bd=max_num_adult_bd, flag_indiv_cost=flag_indiv_cost, - price_type=price_type + price_type=price_type, + note=note ) session.add(theater_event) await session.commit() diff --git a/src/db/migrations/versions/20250213-2205_06fcbbb514eb_rev8.py b/src/db/migrations/versions/20250213-2205_06fcbbb514eb_rev8.py new file mode 100644 index 00000000..742a7c03 --- /dev/null +++ b/src/db/migrations/versions/20250213-2205_06fcbbb514eb_rev8.py @@ -0,0 +1,31 @@ +"""rev8 + +Revision ID: 06fcbbb514eb +Revises: 83d1fd16082b +Create Date: 2025-02-13 22:05:15.186749 + +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = "06fcbbb514eb" +down_revision = "83d1fd16082b" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "theater_events", sa.Column("note", sa.String(), nullable=True) + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("theater_events", "note") + # ### end Alembic commands ### diff --git a/src/db/models.py b/src/db/models.py index ce27e78e..1d4f5646 100644 --- a/src/db/models.py +++ b/src/db/models.py @@ -231,6 +231,7 @@ class TheaterEvent(BaseModel): max_num_adult_bd: Mapped[int] = mapped_column(default=10) flag_indiv_cost: Mapped[bool] = mapped_column(default=False) price_type: Mapped[PriceType] = mapped_column(default=PriceType.NONE) + note: Mapped[Optional[str]] schedule_events: Mapped[List['ScheduleEvent']] = relationship( lazy='selectin') diff --git a/src/handlers/birthday_hl.py b/src/handlers/birthday_hl.py index aa1a110f..351ad711 100644 --- a/src/handlers/birthday_hl.py +++ b/src/handlers/birthday_hl.py @@ -261,11 +261,7 @@ async def get_time(update: Update, context: ContextTypes.DEFAULT_TYPE): f'{context.bot_data['texts']['text_legend']}' ) for i, theater_event in enumerate(theater_events): - full_name = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + full_name = get_full_name_event(theater_event) text += f'{DICT_OF_EMOJI_FOR_BUTTON[i + 1]} ' text += f'{full_name}\n' keyboard.append(InlineKeyboardButton( @@ -306,11 +302,7 @@ async def get_show(update: Update, context: ContextTypes.DEFAULT_TYPE): theater_event_id = int(callback_data) theater_event = await db_postgres.get_theater_event(context.session, theater_event_id) - full_name = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + full_name = get_full_name_event(theater_event) await query.edit_message_text( f'Вы выбрали мероприятие:\n{full_name}') @@ -351,7 +343,7 @@ async def get_age(update: Update, context: ContextTypes.DEFAULT_TYPE): _, callback_data = remove_intent_id(query.data) age = callback_data - await query.edit_message_text(f'Возраст именника: {age}') + await query.edit_message_text(f'Исполнится лет имениннику: {age}') custom_made_formats = await db_postgres.get_all_custom_made_format( context.session) @@ -654,11 +646,7 @@ async def get_note(update: Update, context: ContextTypes.DEFAULT_TYPE): case 'theater_event_id': theater_event = await db_postgres.get_theater_event( context.session, item) - item = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + item = get_full_name_event(theater_event) case 'custom_made_format_id': custom_made_format = await db_postgres.get_custom_made_format( context.session, item) @@ -753,7 +741,8 @@ async def get_confirm(update: Update, context: ContextTypes.DEFAULT_TYPE): context.user_data['birthday_user_data'][ 'custom_made_event_id'] = custom_made_event.id - write_client_cme(custom_made_event) + sheet_id_cme = context.config.sheets.sheet_id_cme + write_client_cme(sheet_id_cme, custom_made_event) state = ConversationHandler.END context.user_data['STATE'] = state diff --git a/src/handlers/list_wait_hl.py b/src/handlers/list_wait_hl.py index f617f303..7059bb08 100644 --- a/src/handlers/list_wait_hl.py +++ b/src/handlers/list_wait_hl.py @@ -31,11 +31,7 @@ async def send_clients_wait_data( await update.effective_chat.send_action(ChatAction.TYPING) - full_name = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + full_name = get_full_name_event(theater_event) date_event, time_event = await get_formatted_date_and_time_of_event( schedule_events[0]) diff --git a/src/handlers/main_hl.py b/src/handlers/main_hl.py index 1cd20177..3283a74c 100644 --- a/src/handlers/main_hl.py +++ b/src/handlers/main_hl.py @@ -303,7 +303,9 @@ async def update_ticket(update: Update, context: ContextTypes.DEFAULT_TYPE): ): pass - update_ticket_in_gspread(ticket_id, new_ticket_status.value) + sheet_id_domik = context.config.sheets.sheet_id_domik + update_ticket_in_gspread(sheet_id_domik, ticket_id, + new_ticket_status.value) data['status'] = new_ticket_status case 'Покупатель': people = ticket.people @@ -457,8 +459,9 @@ async def confirm_reserve(update: Update, context: ContextTypes.DEFAULT_TYPE): main_handlers_logger.info(text) ticket_status = TicketStatus.APPROVED + sheet_id_domik = context.config.sheets.sheet_id_domik for ticket_id in ticket_ids: - update_ticket_in_gspread(ticket_id, ticket_status.value) + update_ticket_in_gspread(sheet_id_domik, ticket_id, ticket_status.value) await db_postgres.update_ticket(context.session, ticket_id, status=ticket_status) @@ -566,8 +569,9 @@ async def reject_reserve(update: Update, context: ContextTypes.DEFAULT_TYPE): main_handlers_logger.info(text) ticket_status = TicketStatus.REJECTED + sheet_id_domik = context.config.sheets.sheet_id_domik for ticket_id in ticket_ids: - update_ticket_in_gspread(ticket_id, ticket_status.value) + update_ticket_in_gspread(sheet_id_domik, ticket_id, ticket_status.value) await db_postgres.update_ticket(context.session, ticket_id, status=ticket_status) @@ -646,7 +650,9 @@ async def confirm_birthday(update: Update, context: ContextTypes.DEFAULT_TYPE): await query.answer() except TimedOut as e: main_handlers_logger.error(e) - update_cme_in_gspread(cme_id, cme_status.value) + + sheet_id_cme = context.config.sheets.sheet_id_cme + update_cme_in_gspread(sheet_id_cme, cme_id, cme_status.value) await message.edit_text( message.text + f'\nОбновил статус в гугл-таблице {cme_status.value}') @@ -749,7 +755,9 @@ async def reject_birthday(update: Update, context: ContextTypes.DEFAULT_TYPE): await query.answer() except TimedOut as e: main_handlers_logger.error(e) - update_cme_in_gspread(cme_id, cme_status.value) + + sheet_id_cme = context.config.sheets.sheet_id_cme + update_cme_in_gspread(sheet_id_cme, cme_id, cme_status.value) await message.edit_text( message.text + f'\nОбновил статус в гугл-таблице {cme_status.value}') diff --git a/src/handlers/reserve_admin_hl.py b/src/handlers/reserve_admin_hl.py index 057cdba8..009c55d3 100644 --- a/src/handlers/reserve_admin_hl.py +++ b/src/handlers/reserve_admin_hl.py @@ -251,7 +251,9 @@ async def start_forma_info( text += '\nЗаписываю новый билет в клиентскую базу...' await query.edit_message_text(text) await update.effective_chat.send_action(ChatAction.TYPING) - await write_client_reserve(context, + sheet_id_domik = context.config.sheets.sheet_id_domik + await write_client_reserve(sheet_id_domik, + context, update.effective_chat.id, chose_base_ticket, TicketStatus.CREATED.value) diff --git a/src/handlers/reserve_hl.py b/src/handlers/reserve_hl.py index 88bb41ba..85b91ea4 100644 --- a/src/handlers/reserve_hl.py +++ b/src/handlers/reserve_hl.py @@ -257,11 +257,7 @@ async def choice_date(update: Update, context: ContextTypes.DEFAULT_TYPE): flag_christmas_tree = True if event.flag_santa: flag_santa = True - full_name = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + full_name = get_full_name_event(theater_event) text = (f'Вы выбрали мероприятие:\n' f'{full_name}\n' f'Выберите удобную дату\n\n') @@ -761,7 +757,9 @@ async def get_name_children( except TimedOut as e: reserve_hl_logger.error(e) reserve_hl_logger.info(text) - await write_client_reserve(context, + sheet_id_domik = context.config.sheets.sheet_id_domik + await write_client_reserve(sheet_id_domik, + context, update.effective_chat.id, chose_base_ticket, TicketStatus.CREATED.value) @@ -982,7 +980,8 @@ async def get_phone_for_waiting( text=text, message_thread_id=thread_id ) - write_client_list_waiting(context) + sheet_id_domik = context.config.sheets.sheet_id_domik + write_client_list_waiting(sheet_id_domik, context) await update.effective_chat.send_message( text='Вы добавлены в лист ожидания, ' 'если место освободится, то с вами свяжутся. ' diff --git a/src/handlers/sub_hl.py b/src/handlers/sub_hl.py index a99918e6..54d7db33 100644 --- a/src/handlers/sub_hl.py +++ b/src/handlers/sub_hl.py @@ -23,7 +23,7 @@ ) from settings.settings import ADMIN_GROUP, FILE_ID_RULES, OFFER from utilities.utl_func import ( - get_unique_months, get_full_name_event, + get_unique_months, filter_schedule_event_by_active, get_formatted_date_and_time_of_event, get_schedule_event_ids_studio, create_approve_and_reject_replay, set_back_context, @@ -265,11 +265,7 @@ async def create_and_send_payment( schedule_event) chose_base_ticket = await db_postgres.get_base_ticket( context.session, chose_base_ticket_id) - full_name = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + name = theater_event.name email = await db_postgres.get_email(context.session, update.effective_user.id) @@ -282,7 +278,9 @@ async def create_and_send_payment( update, context, TicketStatus.CREATED) await update.effective_chat.send_action(ChatAction.TYPING) - await write_client_reserve(context, + sheet_id_domik = context.config.sheets.sheet_id_domik + await write_client_reserve(sheet_id_domik, + context, update.effective_chat.id, chose_base_ticket, TicketStatus.CREATED.value) @@ -311,8 +309,8 @@ async def create_and_send_payment( ticket_name_for_desc ) len_for_name = max_len_decs - len_desc_without_name - full_name_for_desc = full_name[:len_for_name] - description = f'Билет на мероприятие {full_name_for_desc} {date_event} в {time_event}' + name_for_desc = name[:len_for_name] + description = f'Билет на мероприятие {name_for_desc} {date_event} в {time_event}' param = create_param_payment( price=chose_price, description=' '.join([description, ticket_name_for_desc]), diff --git a/src/handlers/support_hl.py b/src/handlers/support_hl.py index 0c87a7b0..e560f821 100644 --- a/src/handlers/support_hl.py +++ b/src/handlers/support_hl.py @@ -243,17 +243,20 @@ async def theater_event_preview( ): query = update.callback_query - text = (f'{kv_name_attr_theater_event['name']}=Название\n' - f'{kv_name_attr_theater_event['min_age_child']}=1\n' - f'{kv_name_attr_theater_event['max_age_child']}=0\n' - f'{kv_name_attr_theater_event['show_emoji']}=\n' - f'{kv_name_attr_theater_event['flag_premier']}=Нет\n' - f'{kv_name_attr_theater_event['flag_active_repertoire']}=Да\n' - f'{kv_name_attr_theater_event['flag_active_bd']}=Нет\n' - f'{kv_name_attr_theater_event['max_num_child_bd']}=8\n' - f'{kv_name_attr_theater_event['max_num_adult_bd']}=10\n' - f'{kv_name_attr_theater_event['flag_indiv_cost']}=Нет\n' - f'{kv_name_attr_theater_event['price_type']}=По умолчанию/Базовая стоимость/Опции/Индивидуальная\n') + text = ( + f'{kv_name_attr_theater_event['name']}=Название\n' + f'{kv_name_attr_theater_event['min_age_child']}=1\n' + f'{kv_name_attr_theater_event['max_age_child']}=0\n' + f'{kv_name_attr_theater_event['show_emoji']}=\n' + f'{kv_name_attr_theater_event['flag_premier']}=Нет\n' + f'{kv_name_attr_theater_event['flag_active_repertoire']}=Да\n' + f'{kv_name_attr_theater_event['flag_active_bd']}=Нет\n' + f'{kv_name_attr_theater_event['max_num_child_bd']}=8\n' + f'{kv_name_attr_theater_event['max_num_adult_bd']}=10\n' + f'{kv_name_attr_theater_event['flag_indiv_cost']}=Нет\n' + f'{kv_name_attr_theater_event['price_type']}=По умолчанию/Базовая стоимость/Опции/Индивидуальная\n' + f'{kv_name_attr_theater_event['note']}=\n' + ) await query.edit_message_text(text) await query.answer() diff --git a/src/handlers/webhook_hl.py b/src/handlers/webhook_hl.py index ac1fb855..a94d410a 100644 --- a/src/handlers/webhook_hl.py +++ b/src/handlers/webhook_hl.py @@ -46,7 +46,7 @@ async def webhook_update(update: WebhookNotification, pass -async def processing_ticket_paid(update, context): +async def processing_ticket_paid(update, context: ContextTypes.DEFAULT_TYPE): message_id = update.object.metadata['message_id'] chat_id = update.object.metadata['chat_id'] ticket_ids = update.object.metadata['ticket_ids'].split('|') @@ -66,8 +66,9 @@ async def processing_ticket_paid(update, context): webhook_hl_logger.error('Удаление кнопки для оплаты не произошло') text = f'Номер вашего билета ' ticket_status = TicketStatus.PAID + sheet_id_domik = context.config.sheets.sheet_id_domik for ticket_id in ticket_ids: - update_ticket_in_gspread(ticket_id, ticket_status.value) + update_ticket_in_gspread(sheet_id_domik, ticket_id, ticket_status.value) await db_postgres.update_ticket(context.session, ticket_id, status=ticket_status) diff --git a/src/settings/config_loader.py b/src/settings/config_loader.py index f73a9c02..d8cb1676 100644 --- a/src/settings/config_loader.py +++ b/src/settings/config_loader.py @@ -29,7 +29,8 @@ class PostgresSettings(BaseModel): class GoogleSheetsSettings(BaseModel): credentials_path: str - sheet_id: str + sheet_id_domik: str + sheet_id_cme: str class YookassaSettings(BaseModel): diff --git a/src/utilities/schemas/context.py b/src/utilities/schemas/context.py index 929788ca..8594ebe0 100644 --- a/src/utilities/schemas/context.py +++ b/src/utilities/schemas/context.py @@ -4,7 +4,7 @@ 'date': 'Дата', 'time': 'Время', 'theater_event_id': 'Спектакль', - 'age': 'Возраст именинника', + 'age': 'Исполнится лет имениннику', 'qty_child': 'Кол-во детей', 'qty_adult': 'Кол-во взрослых', 'custom_made_format_id': 'Формат праздника', diff --git a/src/utilities/schemas/theater_event.py b/src/utilities/schemas/theater_event.py index 337f2f03..503d3f38 100644 --- a/src/utilities/schemas/theater_event.py +++ b/src/utilities/schemas/theater_event.py @@ -29,6 +29,7 @@ class TheaterEventDTO(BaseModel): max_num_adult_bd: int flag_indiv_cost: bool price_type: PriceType + note: str def to_dto(self): return { @@ -44,7 +45,8 @@ def to_dto(self): 'max_num_child_bd': self.max_num_child_bd, 'max_num_adult_bd': self.max_num_adult_bd, 'flag_indiv_cost': self.flag_indiv_cost, - 'price_type': self.price_type + 'price_type': self.price_type, + 'note': self.note } @@ -60,6 +62,7 @@ def to_dto(self): 'max_num_adult_bd': 'Макс кол-во взрослых ДР', 'flag_indiv_cost': 'Индив стоимость', 'price_type': 'Расчет стоимости', + 'note': 'Примечание', } diff --git a/src/utilities/utl_func.py b/src/utilities/utl_func.py index c708fce5..17eaef2b 100644 --- a/src/utilities/utl_func.py +++ b/src/utilities/utl_func.py @@ -618,11 +618,7 @@ async def clean_replay_kb_and_send_typing_action(update): async def render_text_for_choice_time(theater_event, schedule_events): - full_name = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + full_name = get_full_name_event(theater_event) event = schedule_events[0] weekday = int(event.datetime_event.strftime('%w')) date_event = (event.datetime_event.strftime('%d.%m ') + @@ -670,13 +666,14 @@ def get_unique_months(events: Sequence[ScheduleEvent]): return unique_sorted_months -def get_full_name_event( - name, - flag_premiere, - min_age_child, - max_age_child, - duration -): +def get_full_name_event(event: TheaterEvent): + name = event.name + flag_premiere = event.flag_premier + min_age_child = event.min_age_child + max_age_child = event.max_age_child + duration = event.duration + note = event.note + full_name: str = name full_name += '\n' if flag_premiere: @@ -696,6 +693,8 @@ def get_full_name_event( full_name += str(duration // 60) + 'ч' if duration % 60 > 0: full_name += str(duration % 60) + 'мин' + if note: + full_name += f'\n{note}' return full_name @@ -745,11 +744,7 @@ async def filter_schedule_event_by_active( async def create_event_names_text(enum_theater_events, text): for i, event in enum_theater_events: - full_name = get_full_name_event(event.name, - event.flag_premier, - event.min_age_child, - event.max_age_child, - event.duration) + full_name = get_full_name_event(event) text += f'{DICT_OF_EMOJI_FOR_BUTTON[i]} {full_name}\n\n' return text @@ -894,11 +889,7 @@ async def create_str_info_by_schedule_event_id(context, choice_event_id): context.session, schedule_event.theater_event_id) date_event, time_event = await get_formatted_date_and_time_of_event( schedule_event) - full_name = get_full_name_event(theater_event.name, - theater_event.flag_premier, - theater_event.min_age_child, - theater_event.max_age_child, - theater_event.duration) + full_name = get_full_name_event(theater_event) text_emoji = await get_emoji(schedule_event) text_select_event = (f'Мероприятие:\n' f'{full_name}\n' diff --git a/src/utilities/utl_googlesheets.py b/src/utilities/utl_googlesheets.py index a764c32f..a4b3f3fe 100644 --- a/src/utilities/utl_googlesheets.py +++ b/src/utilities/utl_googlesheets.py @@ -49,5 +49,6 @@ async def write_to_return_seats_for_sale(context): async def update_ticket_db_and_gspread(context, ticket_id, **kwargs): - update_ticket_in_gspread(ticket_id, kwargs['status'].value) + sheet_id_domik = context.config.sheets.sheet_id_domik + update_ticket_in_gspread(sheet_id_domik, ticket_id, kwargs['status'].value) await db_postgres.update_ticket(context.session, ticket_id, **kwargs)