def participant_notification(payment, subject, logger): logger.info(">>>> sf_participant_create.participant_notification begin") logger.info("Уведомление участника") mail_text2 = get_participant_notification_text(payment) logger.info(f"Message Subject: {subject}") logger.info(f"Message text:\n{mail_text2}") send_mail([payment["Электронная почта"]], subject, mail_text2, logger) logger.info(">>>> sf_participant_create.participant_notification end") return mail_text2
def get_full_list_participants(db_connect, logger_, level_): """ Получение полного списка участников и отправка его менеджерам :param level_: :param logger_: :param db_connect: Соединение с БД :return: """ logger_.info( "Получение полного списка участников и отправка его менеджерам") # Полный список участников sql_text = f"""SELECT id, type, last_name as "Фамилия", first_name as "Имя", email, telegram, payment_date "Дата оплаты", number_of_days as "Дней", deadline "Оплачено до", until_date as "Отсрочка до", comment FROM public.participants WHERE type in ('P', 'N') and sf_level={str(level_)} order by last_name""" values_tuple = (None, ) records = db_connect.execute_select(sql_text, values_tuple) # (1126, 'P', 'АБРАМОВА', 'ЕЛЕНА', '*****@*****.**', '@el414342', datetime.date(2019, 8, 7), 45, datetime.date(2019, 9, 21), datetime.date(2019, 10, 15), None) # noqa: E501 count_participants = len(records) # print(f"ВСЕГО {count_participants} УЧАСТНИКОВ") logger_.info(f"ВСЕГО {count_participants} УЧАСТНИКОВ") # now_for_file = datetime.now().strftime("%d%m%Y_%H%M") now_for_file = datetime.now().strftime("%Y_%m_%d") xlsx_file_path = os.path.join( os.path.dirname(logger_.handlers[0].baseFilename), f'PARTICIPANTS{str(level_)}_{now_for_file}.xlsx') table_text = get_excel_table(records, xlsx_file_path) now_for_text = datetime.now().strftime("%d.%m.%Y") mail_text = f"""Здравствуйте! Во вложении содержится полный список участников {PASSWORDS.settings['short_project_name']} {str(level_)} уровня на {now_for_text} в формате xlsx. ВСЕГО {count_participants} УЧАСТНИКОВ Таблица в виде текста: {table_text} С уважением, ваш робот.""" # print(mail_text) logger_.info(mail_text) logger_.debug( f"Список получателей:\n{PASSWORDS.settings['full_list_participants_to_emails'][level_]}" ) send_mail( PASSWORDS.settings['full_list_participants_to_emails'][level_], f"[ШКОЛА ГИВИНА] Полный список участников {PASSWORDS.settings['short_project_name']} уровня {str(level_)} на {now_for_text}. Всего {count_participants}.", mail_text, logger_, xlsx_file_path)
def get_list_debtors(db_connect, logger_): # TODO: Сейчас эта функция не используется, её нужно переделать под два уровня. """ Получение списка должников и отправка его менеджерам :param logger_: :param db_connect: Соединение с БД :return: """ logger_.info("Получение списка должников и отправка его менеджерам") # Список должников sql_text = """SELECT id, type, last_name as "Фамилия", first_name as "Имя", email, telegram, payment_date "Дата оплаты", number_of_days as "Дней", deadline "Оплачено до", until_date as "Отсрочка до", comment FROM public.participants WHERE type in ('P', 'N') and ((deadline - CURRENT_TIMESTAMP < INTERVAL '0 days' and until_date is NULL) or (until_date - CURRENT_TIMESTAMP < INTERVAL '0 days' and until_date is not NULL)) order by last_name""" values_tuple = (None, ) records = db_connect.execute_select(sql_text, values_tuple) # (1126, 'P', 'АБРАМОВА', 'ЕЛЕНА', '*****@*****.**', '@el414342', datetime.date(2019, 8, 7), 45, datetime.date(2019, 9, 21), datetime.date(2019, 10, 15), None) # noqa: E501 now_for_text = datetime.now().strftime("%d.%m.%Y") if len(records) != 0: # now_for_file = datetime.now().strftime("%d%m%Y_%H%M") now_for_file = datetime.now().strftime("%Y_%m_%d") xlsx_file_path = os.path.join( os.path.dirname(logger_.handlers[0].baseFilename), f'DEBTORS_{now_for_file}.xlsx') table_text = get_excel_table(records, xlsx_file_path) mail_text = f"""Здравствуйте! Во вложении содержится список должников на сегодня {now_for_text} в формате xlsx. Таблица в виде текста: {table_text} С уважением, ваш робот.""" # print(mail_text) logger_.info(mail_text) send_mail(PASSWORDS.settings['manager_emails'], f"[ШКОЛА ГИВИНА]. Список должников {now_for_text}", mail_text, logger_, xlsx_file_path) else: mail_text = "Сегодня должников нет." logger_.info(mail_text) send_mail( PASSWORDS.settings['manager_emails'], f"[ШКОЛА ГИВИНА]. Список должников {now_for_text}. СЕГОДНЯ " f"ДОЛЖНИКОВ НЕТ.", mail_text, logger_)
def block_participants(db_connect, logger_): """ Блокировка участников у которых оплата просрочена на 5 дней :param db_connect: Соединение с БД :param logger_: :return: """ logger_.info("Блокировка участников у которых оплата просрочена на 5 дней") # Список участников подлежащих блокировке sql_text = """SELECT --current_date, until_date - current_date as "INTERVAL2", deadline - current_date as "INTERVAL", --last_name, --first_name, fio, email, telegram, payment_date, number_of_days, deadline, until_date, --,comment id, sf_level FROM public.participants WHERE type in ('P', 'N') and ( ((deadline - current_date < -5 and until_date is NULL) or (until_date - current_date < -5 and until_date is not NULL)) ) order by last_name""" values_tuple = (None, ) records = db_connect.execute_select(sql_text, values_tuple) # (None, 7, 'АЛААА', '*****@*****.**', datetime.date(2019, 12, 31), None) # (None, 7, 'БАР', 'ИРА', '*****@*****.**', '@xxx', datetime.date(2019, 12, 8), 30, datetime.date(2020, 1, 7), None) # (None, 7, 'БАР ИРА', '*****@*****.**', '@xxx', datetime.date(2019, 12, 8), 30, datetime.date(2020, 1, 7), None) logger_.info("debug fac_url error") logger_.info(PASSWORDS.settings['fac_url1']) logger_.info(PASSWORDS.settings['fac_url2']) for p in records: # print(p) logger_.info(f"Блокирую {p}") # Определяем что используется Срок оплаты или отсрочка # if p[7] is None: # until_date = p[8] # else: # until_date = p[7] try: block_one_participant(p[9], db_connect, logger_) if p[10] == 1: fac_url = PASSWORDS.settings['fac_url1'] discount_text = "" else: fac_url = PASSWORDS.settings['fac_url2'] discount_text = ", при этом вы получите скидку 7% и 13% соответственно" logger_.info(f"{p[10]}|{fac_url}") mail_text = f"""Это письмо сформировано автоматически, не отвечайте на него. Если у вас есть вопросы, свяжитесь с менеджером проекта. Здравствуйте, {p[2].title()}! Наша автоматическая система заблокировала вашу учётную запись в проекте "{PASSWORDS.settings['project_name']}" уровень {p[10]}, потому что вы {p[5].strftime("%d.%m.%Y")} оплатили период {p[6]} дней участия в {PASSWORDS.settings['short_project_name']} и ваша оплата просрочена на 5 дней. Система предупреждала вас за 3 и 7 дней до срока, письмом на email - {p[3]}. Для разблокировки достаточно просто оплатить {PASSWORDS.settings['short_project_name']}. Если же вы больше не хотите участвовать в {PASSWORDS.settings['short_project_name']} - система больше не будет вас беспокоить. Вы можете оплатить {PASSWORDS.settings['short_project_name']} через страницу оплаты (доступен PayPal). Возможна оплата сразу за 3 или 6 месяцев{discount_text}: (+PayPal) {fac_url} Внимание с 31 июля 2020 года PayPal прекратил обработку внутрироссийских платежей, оплата доступна только для граждан нерезидентов России. Пожалуйста, при оплате, указывайте свои Фамилию, Имя, такие же как и при регистрации. Ваш email: {p[3]} Ваш telegram: {p[4]} С благодарностью и сердечным теплом, команда Школы Гивина. """ logger_.info(mail_text) send_mail( [p[3]] + PASSWORDS.settings['manager_emails'][p[10]], f'[ШКОЛА ГИВИНА] Оповещение о блокировке в "{PASSWORDS.settings["project_name"]}" уровень {p[10]}', mail_text, logger_) except: # noqa: E722 send_error_to_admin( f"DAILY WORKS ERROR: Ошибка при попытке заблокировать участника:\n{p}", logger_, prog_name="sf_daily_works.py") logger_.info('\n' + '=' * 120)
def participants_notification(db_connect, logger_): """ Уведомление участников о необходимости оплаты :param logger_: :param db_connect: Соединение с БД :return: """ logger_.info("Уведомление участников о необходимости оплаты") # Список участников подлежащих уведомлению sql_text = """SELECT --current_date, until_date - current_date as "INTERVAL2", deadline - current_date as "INTERVAL", --last_name, --first_name, fio, email, telegram, payment_date, number_of_days, deadline, until_date, sf_level --,comment FROM public.participants WHERE type in ('P', 'N') and ( ((deadline - current_date = 7 and until_date is NULL) or (until_date - current_date = 7 and until_date is not NULL)) or ((deadline - current_date = 3 and until_date is NULL) or (until_date - current_date = 3 and until_date is not NULL)) ) order by last_name""" values_tuple = (None, ) records = db_connect.execute_select(sql_text, values_tuple) # (None,7,'АЛААА','*****@*****.**',datetime.date(2019, 12, 31),None) # (None,7,'БАРААААА','ИРАААА','*****@*****.**','@xxx',datetime.date(2019, 12, 8),30,datetime.date(2020, 1, 7),None) # (None,7,'БАРААААА ИРАААА','*****@*****.**','@xxx',datetime.date(2019, 12, 8),30,datetime.date(2020, 1, 7),None) """ 0 1 2 3 4 5 6 7 8 9 INTERVAL2 INTERVAL fio email telegram payment_date number_of_days deadline until_date sf_level 3 -24 ФИО [email protected] NULL 03.01.2021 30 03.02.2021 02.03.2021 2 """ intervals = {3: "3 дня", 7: "7 дней"} logger_.info("debug fac_url error") logger_.info(PASSWORDS.settings['fac_url1']) logger_.info(PASSWORDS.settings['fac_url2']) for p in records: logger_.info(f"Информирую {p}") # Интервал высчитывается по двум полям until_date и deadline. Здесь определяется какой из них используется. if p[0] is None: interval = intervals[p[1]] else: interval = intervals[p[0]] # Для уровень 1 не оповещаем за 3 дня только за 7 if p[9] == 1 and interval == 3: logger_.info(f"Пропускаю это оповещение уровень 1 за 3 дня!!!") continue # Определяем что используется Срок оплаты или отсрочка if p[7] is None: until_date = p[8] else: until_date = p[7] # if p[9] == 1: fac_url = PASSWORDS.settings['fac_url1'] discount_text = "" else: fac_url = PASSWORDS.settings['fac_url2'] discount_text = ", при этом вы получите скидку 7% и 13% соответственно" logger_.info(f"{p[9]}|{fac_url}") mail_text = f"""Это письмо сформировано автоматически, не отвечайте на него. Если у вас есть вопросы, свяжитесь с менеджером проекта. Здравствуйте, {p[2].title()}! Напоминаем вам о том, что вы {p[5].strftime("%d.%m.%Y")} оплатили период {p[6]} дней участия в проекте {PASSWORDS.settings['project_name']} ({PASSWORDS.settings['short_project_name']}) уровень {p[9]}. {until_date} через {interval} у вас истекает оплаченный период {PASSWORDS.settings['short_project_name']}. Вы можете оплатить {PASSWORDS.settings['short_project_name']} через страницу оплаты (доступен PayPal). Возможна оплата сразу за 3 или 6 месяцев{discount_text}: (+PayPal) {fac_url} Внимание с 31 июля 2020 года PayPal прекратил обработку внутрироссийских платежей, оплата доступна только для граждан нерезидентов России. Пожалуйста, при оплате, указывайте свои Фамилию, Имя, такие же как и при регистрации. Ваш email: {p[3]} Ваш telegram: {p[4]} С благодарностью и сердечным теплом, команда Школы Гивина. """ # print(mail_text) logger_.info(mail_text) try: send_mail([ p[3] ], f'[ШКОЛА ГИВИНА] Напоминание об оплате "{PASSWORDS.settings["project_name"]}" уровень {p[9]}', mail_text, logger_) except: # noqa: E722 logger_.error( f"ERROR: При попытке оповещения участника\n{p}\nОтправляю почтовое оповещение админу." ) send_error_to_admin( f"DAILY WORKS ERROR: Ошибка при попытке выслать оповещение должнику:\n{p}", logger_, prog_name="sf_daily_works.py") logger_.info('\n' + '=' * 120)
def block_one_participant(p, postgres, logger): # noqa: C901 print(f"Попытка блокировки участника |{p}|") logger.info(f"Попытка блокировки участника |{p}|") # Проверяем что p это ID sql_instr = "" participant = None if isinstance(p, int): sql_instr = "id" print(f"Ищем участника по ID - {p}") logger.info(f"Ищем участника по ID - {p}") participant = postgres.find_participant_by('id', p) else: p = p.strip() if p[0] == '@': # Ищем участника по Telegram sql_instr = "telegram" p = p.lower() print(f"Ищем участника по Telegram - {p}") logger.info(f"Ищем участника по Telegram - {p}") participant = postgres.find_participant_by('telegram', p) elif '@' in p: # Ищем участника по email sql_instr = "email" p = p.lower() print(f"Ищем участника по email - {p}") logger.info(f"Ищем участника по email - {p}") participant = postgres.find_participant_by('email', p) elif is_rus(p): # Ищем участника по fio sql_instr = "fio" p = p.upper() print(f"Ищем участника по fio - {p}") logger.info(f"Ищем участника по fio - {p}") participant = postgres.find_participant_by('fio', p) elif is_eng(p): # Ищем участника по fio_eng sql_instr = "fio_eng" p = p.upper() print(f"Ищем участника по fio_eng - {p}") logger.info(f"Ищем участника по fio_eng - {p}") participant = postgres.find_participant_by('fio_eng', p) if participant is None: print(f"******* ВНИМАНИЕ: По значению {p} ничего не нашлось") logger.warning(f"******* ВНИМАНИЕ: По значению {p} ничего не нашлось") print("-" * 45) else: if participant['type'] == 'N' or participant['type'] == 'P': # Блокируем пользователя # sql_text = f"UPDATE participants SET type='B', password=password||'55' where {sql_instr}=%s RETURNING id;" sql_text = f"UPDATE participants SET type='B' where {sql_instr}=%s RETURNING id;" values_tuple = (p, ) id_ = postgres.execute_dml_id(sql_text, values_tuple) if id_ is None: print(f"******* ВНИМАНИЕ: UPDATE для {p} не отработал") logger.error(f"******* ВНИМАНИЕ: UPDATE для {p} не отработал") else: print(f"Блокировка участника ID={id_}") logger.info(f"Блокировка участника ID={id_}") # Состояние участник sql_text = 'SELECT id, fio, login, password, type, login1, sf_level, password1 FROM participants where id=%s;' # [(1420, 'ВОЛЬНЫХ НАТАЛЬЯ', '*****@*****.**', 'password', 'B')] values_tuple = (id_, ) participant = postgres.execute_select(sql_text, values_tuple)[0] print(participant) logger.debug(f"participant={participant}") # Измение статуса в zoom (блокировка участника) print("Блокировка участника в Zoom") logger.info("Блокировка участника в Zoom") zoom_user = ZoomUS(logger) if participant[6] == 1: # level login_ = participant[5] # login1 else: login_ = participant[2] # login zoom_result = zoom_user.zoom_users_userstatus( login_, "deactivate") print(zoom_result) logger.debug(f"zoom_result={zoom_result}") if zoom_result is not None: logger.error("+" * 60) mail_text = f"\nПроцедура не смогла автоматически заблокировать участника. Ошибка:\n" \ f"{zoom_result}\n" \ f"ID: {participant[0]}\nFIO: {participant[1]}\n" \ f"Level: {participant[6]}\n" \ f"Login: {login_}\nPassword: {participant[3]}" send_mail(PASSWORDS.settings['admin_emails'], "BLOCK PARTICIPANT ERROR", mail_text, logger) print(mail_text) logger.error(mail_text) logger.error("+" * 60) else: print("Учётка Zoom успешно заблокирована") logger.info("Учётка Zoom успешно заблокирована") elif participant['type'] == 'B': print("ЭТОТ УЧАСТНИК УЖЕ ЗАБЛОКИРОВАН") logger.info("ЭТОТ УЧАСТНИК УЖЕ ЗАБЛОКИРОВАН") else: print(f"Неизвестный тип участника type={participant['type']}") logger.warning( f"Неизвестный тип участника type={participant['type']}") print("-" * 45) logger.info("-" * 45)
log = custom_logger.get_logger(program_file=program_file) # noinspection PyBroadException try: log.info("Try connect to DB") db = DBPostgres(dbname=PASSWORDS.settings['postgres_dbname'], user=PASSWORDS.settings['postgres_user'], password=PASSWORDS.settings['postgres_password'], host=PASSWORDS.settings['postgres_host'], port=PASSWORDS.settings['postgres_port'], logger=log) except Exception: main_error_text = \ f"MAIN ERROR (Postgres):\n{traceback.format_exc()}" print(main_error_text) log.error(main_error_text) log.error(f"Send email to: {PASSWORDS.settings['admin_emails']}") send_mail(PASSWORDS.settings['admin_emails'], "MAIN ERROR (Postgres)", main_error_text, log) log.error("Exit with error") exit(1) file = PASSWORDS.settings['list_path'] with open(file, newline='', encoding='utf-8') as f: reader = csv.reader(f, delimiter=';') # headers = next(reader, None) for row in reader: print(row[0]) print(type(row[0])) block_one_participant(row[0], db, log)
((b'\\HasNoChildren', b'\\Unmarked', b'\\NoInferiors'), b'|', 'INBOX'), ((b'\\HasNoChildren', b'\\Marked'), b'|', 'Notification'), ((b'\\HasNoChildren', b'\\Unmarked'), b'|', 'Outbox'), ((b'\\HasNoChildren', b'\\Unmarked', b'\\Sent'), b'|', 'Sent'), ((b'\\HasNoChildren', b'\\Unmarked', b'\\Junk'), b'|', 'Spam'), ((b'\\HasNoChildren', b'\\Marked', b'\\Trash'), b'|', 'Trash')] """ client.select_folder('INBOX') logger.info('Connect Yandex server successful') except Exception: client.logout() error_text = "MAIN ERROR (Yandex mail):\n" + traceback.format_exc() print(error_text) logger.error(error_text) logger.error(f"Send email to: {PASSWORDS.settings['admin_emails']}") send_mail(PASSWORDS.settings['admin_emails'], "MAIN ERROR (Yandex mail)", error_text, logger, attached_file=logger.handlers[0].baseFilename) logger.error("Exit with error") sys.exit(1) # First sort_mail() execution then go to idle mode email = Email(client, postgres, session_id, logger) email.sort_mail() client.logout() postgres.session_end(session_id) logger.info('#' * 45) logger.info('Session end') logger.info('END gtp_school_friends')
def mark_payment_into_db(payment, database, logger, participant_type='P'): """ Отмечаем оплату в БД. Поля until_date (отсрочка до) и comment - обнуляются. :return: """ logger.info(">>>> mark_payment_into_db begin") mm = MailMessage("", "") # Состояние участника до отметки # logger.info(select_participant(payment["participant_id"], database)) # Коментарий и поле отсрочки обнуляются # Для заблокированного пользователя меняется его тип (type) и из пароля удаляются два последних символа if payment["participant_type"] == "B": # Нужно дополнить сведения участника которых не хватает (т.к. это не новый участник а заблокированный) logger.debug(f"payment до и после дополнения сведениями в mark_payment_into_db") logger.debug(payment) result = database.get_participant_by_id(payment["participant_id"])[0] if not payment["Фамилия"]: payment["Фамилия"] = result[0] if not payment["Имя"]: payment["Имя"] = result[1] if not payment["Фамилия Имя"]: payment["Фамилия Имя"] = result[2] if not payment["Электронная почта"]: payment["Электронная почта"] = result[3] if not payment["telegram"]: payment["telegram"] = result[4] if not payment["login"]: payment["login"] = result[5] if not payment["password"]: payment["password"] = result[6] if not payment["login1"]: payment["login1"] = result[7] # payment["level"] = result[8] if not payment["password1"]: payment["password1"] = result[9] logger.debug(payment) # [('ИВАНОВ', 'ИВАН', 'ИВАНОВ ИВАН', '*****@*****.**', '@xxxx', '*****@*****.**', '43RFji1r48')] logger.info("Изменение статуса участника в БД") sql_text = """UPDATE participants SET payment_date=%s, number_of_days=%s, deadline=%s, until_date=NULL, comment=NULL, type=%s WHERE id=%s;""" values_tuple = (payment["Время проведения"], payment["number_of_days"], payment["deadline"], participant_type, payment["participant_id"]) database.execute_dml(sql_text, values_tuple) logger.info("Статус участника в БД изменён") # Изменение статуса в zoom logger.info("Активация участника в Zoom") zoom_user = ZoomUS(logger) if payment["level"] == 2: login_ = payment["login"] else: login_ = payment["login1"] logger.info(f'Активируем участника login_={login_}; level={payment["level"]}') zoom_result = zoom_user.zoom_users_userstatus(login_, "activate") if zoom_result is not None: if zoom_result["message"].startswith("User does not exist"): # Если вдруг оказалось что такого пользователя нет в zoom - пробуем его создать mm = create_sf_participant_zoom(logger, payment, mm) logger.info("Участник заново создан в Zoom") else: logger.error("+" * 60) mail_text = f"Процедура не смогла автоматически разблокировать участника.\n" \ f"Ошибка:\n" \ f"{zoom_result}\n" \ f"ID : {payment['participant_id']}\n" \ f"ФИО : {payment['Фамилия Имя']}\n" \ f"Login : {login_}\n" \ f"Password: {payment['password']}" send_mail(PASSWORDS.settings['admin_emails'], "UNBLOCK PARTICIPANT ERROR", mail_text, logger, attached_file=logger.handlers[0].baseFilename) logger.error(mail_text) logger.error("+" * 60) else: logger.info("Участник активирован в Zoom") # Уведомление участника logger.info("Уведомление участника") notification_text = participant_notification(payment, f'[ШКОЛА ГИВИНА] Ваша учётная запись в {PASSWORDS.settings["project_name"]} разблокирована уровень {payment["level"]}.', logger) mm.subject = f"[{PASSWORDS.settings['short_project_name']}] РАЗБЛОКИРОВКА УЧАСТНИКА" mm.text += "Текст уведомления:\n\n\n" + notification_text else: logger.info("Отмечаем оплату в БД") logger.debug(f"Время проведения|{type(payment['Время проведения'])}|{payment['Время проведения']}") logger.debug(f"number_of_days|{type(payment['number_of_days'])}|{payment['number_of_days']}") logger.debug(f"deadline|{type(payment['deadline'])}|{payment['deadline']}") logger.debug(f"until_date|{type(payment['until_date'])}|{payment['until_date']}") sql_text = """UPDATE participants SET payment_date=%s, number_of_days=%s, deadline=%s, until_date=NULL, comment=NULL, type=%s WHERE id=%s;""" values_tuple = (payment["Время проведения"], payment["number_of_days"], payment["deadline"], participant_type, payment["participant_id"]) # logger.info(sql_text % values_tuple) database.execute_dml(sql_text, values_tuple) logger.info("Оплата в БД отмечена") # Уведомление участника logger.info("Уведомление участника") notification_text = participant_notification(payment, f'[ШКОЛА ГИВИНА] Ваша оплата принята и продлено участие в онлайн-формате {PASSWORDS.settings["project_name"]} уровень {payment["level"]}.', logger) mm.subject = f"[{PASSWORDS.settings['short_project_name']}] ПРИНЯТА ОПЛАТА" mm.text += "Текст уведомления:\n\n\n" + notification_text # Окончательное состояние участника logger.info(f"Окончательное состояние участника\n{select_participant(payment['participant_id'], database)}") # Оповещение админов logger.info("Уведомление админов и менеджеров") list_ = PASSWORDS.settings['admin_emails'] list_.extend(item for item in PASSWORDS.settings['manager_emails'][payment["level"]] if item not in PASSWORDS.settings['admin_emails']) logger.info(f"list_={list_}") send_mail(list_, mm.subject, mm.text, logger) logger.info(">>>> mark_payment_into_db end")
def create_sf_participant(payment, database, logger, special_case=False): logger.info(">>>>sf_participant_create.create_sf_participant begin") # This is new participant # Participant must have Name, Surname, Email # mail_text = "" # subject = "НОВЫЙ УЧАСТНИК" mm = MailMessage(f"[{PASSWORDS.settings['short_project_name']}] НОВЫЙ УЧАСТНИК", "") logger.info(f"Создание участника:{payment}") if not payment["Фамилия"]: logger.error("The participant must have a Surname") raise Exception("The participant must have a Surname") if not payment["Имя"]: logger.error("The participant must have a Name") raise Exception("The participant must have a Name") if not payment["Электронная почта"]: logger.warning("+" * 60) logger.warning("ВНИМАНИЕ: У участника нет Email!!!") logger.warning("+" * 60) # raise Exception("The participant must have a Email") mm.text += "\nВНИМАНИЕ: У участника нет Email!!!" if not payment["telegram"]: logger.warning("+" * 60) logger.warning("ВНИМАНИЕ: У участника нет Telegram!!!") logger.warning("+" * 60) # raise Exception("The participant must have a Email") mm.text += "\nВНИМАНИЕ: У участника нет Telegram!!!" # Создать участнику КПД учётку (email) Yandex mm = create_sf_participant_yandex(logger, payment, mm) # Генерация пароля для Zoom (для всех почт пароль одинаковый) if payment["level"] == 2: if payment["password"] is None: payment["password"] = password_for_sf() mm.text += f'\nPassword: {payment["password"]}' logger.info(f'Password: {payment["password"]}') else: if payment["password1"] is None: payment["password1"] = password_for_sf() mm.text += f'\nPassword: {payment["password1"]}' logger.info(f'Password: {payment["password1"]}') # Создать участнику КПД учётку Zoom mm = create_sf_participant_zoom(logger, payment, mm) # Создать участника КПД в БД и отметить ему оплату mm = create_sf_participant_db(database, logger, payment, mm, special_case) # Почтовые оповещения # TODO Отправить Telegram участнику # https://github.com/DevGivinSchool/GivinToolsPython/issues/13#issue-650152143 logger.warning("+" * 60) logger.warning("TODO: Отправить уведомление участнику в Telegram.") logger.warning("+" * 60) mm.text += f"\nВНИМАНИЕ: Необходимо отправить оповещение участнику {payment['telegram']} в Telegram вручную." if payment["Электронная почта"]: # Оповещение участника notification_text = participant_notification(payment, f'[ШКОЛА ГИВИНА] Поздравляем, Вы приняты в {PASSWORDS.settings["project_name"]} уровень {payment["level"]}.', logger) else: mm.text += "\nВНИМАНИЕ: Отправить почтовое уведомление (email) участнику" logger.warning("+" * 60) logger.warning("ВНИМАНИЕ: Отправить почтовое уведомление (email) участнику") logger.warning("+" * 60) notification_text = "НЕТ ТЕКСТА ОПОВЕЩЕНИЯ УЧАСТНИКА. Т.к. у участника не email" mm.text += "Текст уведомления:\n\n\n" + notification_text # send_mail(PASSWORDS.logins['admin_emails'], subject, mail_text, logger) # Вычитаю из списка почт менеджеров список почт админов, чтобы не было повторных писем logger.info("Уведомление админов и менеджеров") list_ = PASSWORDS.settings['admin_emails'] list_.extend(item for item in PASSWORDS.settings['manager_emails'][payment["level"]] if item not in PASSWORDS.settings['admin_emails']) logger.info(f"list_={list_}") send_mail(list_, mm.subject, mm.text, logger) logger.info(">>>>sf_participant_create.create_sf_participant end")
def create_sf_participants(list_, database, logger): # noqa: C901 """ Создание нескольких участников КПД по списку. Список в формате: Фамилия; Имя; email; telegram :param logger: :param database: :param list_: :return: """ logger.info("Начинаю обработку списка") line_number = 1 for line in list_: print(line) payment = payment_creator.get_clear_payment() try: payment["Фамилия"] = line[0] except IndexError: print("Нет фамилии. Скорее всего файл list_.py пустой.") exit(1) try: payment["Имя"] = line[1] except: # noqa: E722 print(f"Строка №{line_number}. Нет имени, участник не создан") exit(1) try: if line[2]: payment["Электронная почта"] = line[2] except IndexError: print(f"Строка №{line_number}. Нет email, участник не создан") exit(1) try: if line[3]: payment["telegram"] = line[3] except IndexError: pass try: if line[4]: payment["level"] = int(line[4]) except IndexError: pass except ValueError: print("ERROR: Не могу преобразовать level в целое число") raise payment["Время проведения"] = datetime.now() payment["auto"] = False payment_creator.payment_normalization(payment) if payment["level"] == 1: payment_creator.payment_computation1(payment, logger) else: payment_creator.payment_computation2(payment, logger) # noinspection PyBroadException try: create_sf_participant(payment, database, logger) except: # noqa: E722 mail_text = 'Ошибка создания участника\n' + traceback.format_exc() logger.error(mail_text) send_mail(PASSWORDS.settings['admin_emails'], "ERROR CREATE PARTICIPANT", mail_text, logger) line_number += 1 logger.info("\n"*7) logger.info("Обработка списка закончена")
logger.info(f"Ничего не отправляю, это старый участник telegram_id={person['telegram_id']}") mark_telegram_update_id(telegram_update_id, logger) # Процедура обработки списка проверки telegram_bot_added logger.info('Процедура обработки списка проверки telegram_bot_added') rows = dbconnect.execute_select(r"select telegram_id, telegram_username from telegram_bot_added where new=FALSE", None) if not rows: logger.info("Списко проверки пустой") else: send_email_alert = True for row in rows: logger.info(f"Поиск по username={row[1]}") person = dbconnect.find_participant_by_telegram_username(row[1]) logger.info(person) if person: message = get_participant_notification_text(person['last_name'], person['first_name'], person['login'], person['password']) send_message_to_telegram(tb, person['telegram_id'], message, logger) # Сбросить все строки (new) в telegram_bot_added в FALSE sql_text = r"UPDATE telegram_bot_added set new=FALSE where new=TRUE" rowcount = dbconnect.execute_dml(sql_text, None) logger.info(f"rowcount={rowcount}") # Удаление строк из telegram_bot_added старше 31 дней. sql_text = r"delete from telegram_bot_added where insert_date < NOW() - INTERVAL '31 days'" rowcount = dbconnect.execute_dml(sql_text, None) logger.info(f"rowcount={rowcount}") if send_email_alert: send_mail(PASSWORDS.settings['admin_emails'], "[sf_telegram_bot.py]:УДАЧНОЕ ВЫПОЛНЕНИЕ", "см.лог во вложении", logger, attached_file=logger.handlers[0].baseFilename)