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)
Пример #6
0
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)
Пример #7
0
    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)
Пример #8
0
         ((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("Обработка списка закончена")
Пример #12
0
                        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)