<commit_before>#!/usr/bin/env python
# -*- coding: utf-8 -*-
import emails
import docs.conf as cfg
import argparse
# import ipdb as pdb
import os.path
from emails.template import JinjaTemplate as T
import time
import logging as log
import sys
from database import Database
from sqlalchemy.exc import SQLAlchemyError
from ParametrosEnvio import ParametrosEnvio
from Participantes import Participantes
from RegistroEnvio import RegistroEnvio
from datetime import datetime

reload(sys)
sys.setdefaultencoding('utf8')


def parse_args():
    """
    Parse script input arguments.

    Returns the parsed args, having validated that the input
    file can be read, and that there is a valid Username.
    """
    parser = get_parser()
    args = parser.parse_args()

    # pdb.set_trace()
    if os.path.isfile(args.html_filename):
        args.html = args.html_filename
    return args


def get_parser():
    """ Return the parser used to interpret the script arguments."""
    usage = (
        "Script to send an HTML file as an HTML email."
        "\nExamples:"
        "\n1. Send the contents of test_file.html to fred"
        "\n$ send_html_email.py test_file.html"
        "\n"
       )
    epilog = "NB This script requires a Gmail account."

    formatter_class = argparse.RawDescriptionHelpFormatter
    parser = argparse.ArgumentParser(description=usage,
                                     epilog=epilog,
                                     formatter_class=formatter_class
                                     )
    parser.add_argument('html_filename',
                        help='The HTML file as Jinja template')
    return parser


def print_args(args):
    """Print out the input arguments."""
    print ('Sending test email by file: %s' % args.html)


def get_recipients(session):
    """TODO: Docstring for get_recipients.

    """
    for participante in session.query(Participantes).all():
        yield participante


def get_current_timestamp():
    """Retorna a data e hora atual
    :returns: Data e hora atual

    """
    return datetime.now()


def obtem_dias_entre_data(data_inicio, data_fim):
    """

    :data_inicio: TODO
    :data_fim: TODO
    :returns: TODO

    """
    total_dias = (data_fim - data_inicio)
    return total_dias


def avalia_envio_participante(parametros_envio,
                              participante,
                              registro_envio,
                              session
                              ):
    """Avalia se o email pode ser enviado para um participante
       dado o registro de envios anteriores e o parâmetros de envio
       definidos

    :parametros_envio: Um objeto do tipo ParametrosEnvio
    :participante:  Um objeto do tipo Participantes
    :registro_envio: Um objeto do tipo RegistroEnvio
    :returns: True se o envio pode ser realizado
              False se o envio NÃO pode ser realizado

    """
    is_envio_permitido = False
    total_envio = registro_envio.get_total_envios()
    max_envio_permitido = parametros_envio._max_num_envios
    if total_envio == 0:
        is_envio_permitido = True
    elif total_envio == max_envio_permitido:
        is_envio_permitido = False
    elif total_envio == 1:
        ultima_data_envio = registro_envio.get_ultima_data_envio(participante,
                                                                 session)
        data_hora_atual = get_current_timestamp()
        dif_em_dias = obtem_dias_entre_data(ultima_data_envio,
                                            data_hora_atual)
        if dif_em_dias >= 2:
                is_envio_permitido = True
        else:
            is_envio_permitido = False

    elif total_envio == 2:
        ultima_data_envio = registro_envio.get_ultima_data_envio(participante,
                                                                 session)
        data_hora_atual = get_current_timestamp()

        dif_em_dias = obtem_dias_entre_data(ultima_data_envio,
                                            data_hora_atual)
        if dif_em_dias >= 3:
            is_envio_permitido = True
        else:
            is_envio_permitido = False
    else:
        is_envio_permitido = False
    return is_envio_permitido


def main():
    """
        TODO: Docstring for main.
        :returns: None

    """
    SECONDS_NEW_SEND = 60
    log_path = './log/'
    file_name = 'email_sender'
    log_format = "[%(asctime)s] [%(levelname)s] : %(message)s"
    logFormatter = log.Formatter(log_format,
                                 datefmt='%d-%m-%Y %H:%m:%S'
                                 )
    rootLogger = log.getLogger()
    rootLogger.setLevel(log.INFO)

    fileHandler = log.FileHandler("{0}/{1}.log".format(log_path, file_name))
    fileHandler.setFormatter(logFormatter)
    rootLogger.addHandler(fileHandler)

    consoleHandler = log.StreamHandler()
    consoleHandler.setFormatter(logFormatter)
    rootLogger.addHandler(consoleHandler)
    args = parse_args()
    total_email_enviados = 0

    try:
        db = Database(user=cfg.db_dissertacao["user"],
                      password=cfg.db_dissertacao["password"],
                      db=cfg.db_dissertacao["database"],
                      host=cfg.db_dissertacao["host"],
                      port=cfg.db_dissertacao["port"])
        session = db._get_session()
        # Obtendo os parâmetros de envios dos e-mails
        parametros = session.query(ParametrosEnvio).first()
        # Verificando se o envio está bloqueado
        if not parametros.is_envio_bloqueado():
            log.warning(("O processo de envio de e-mail "
                         "está bloqueado! Uma nova tentativa "
                         "de envio será feita em breve!"))
            sys.exit(0)
        # Inciando o envio
        log.info("Iniciando o processo de envio de e-mail's")
        retry = True
        recipients_list = get_recipients(session)

        with open(args.html, 'rb') as html_file:
            html_content = T(html_file.read())
            email_subejct = 'Survey about Issue Tracking System'
            email_sender = ('<NAME>',
                            '<EMAIL>')
            for r in recipients_list:
                real_name = r._nome_participante
                user_mail = r._email_participante
                project_name = r._projeto_participante
                email_ccb = ("<NAME>",
                             '<EMAIL>')
                retry = True
                while retry:
                    message = emails.html(html=html_content,
                                          subject=email_subejct,
                                          mail_from=email_sender,
                                          bcc=email_ccb
                                          )
                    smtp = {'host': cfg.smtp_dcc['host'],
                            'port': cfg.smtp_dcc['port'],
                            'tls': cfg.smtp_dcc['tls'],
                            'user': cfg.smtp_dcc['user'],
                            'password': cfg.smtp_dcc['password']
                            }

                    response = message.send(to=user_mail,
                                            render={'real_name': real_name},
                                            smtp=smtp
                                            )
                    if response.status_code not in [250, ]:
                        retry = True
                    else:
                        retry = False
                        try:
                            data_hora_envio = get_current_timestamp()
                            registroEnvio = RegistroEnvio(user_mail,
                                                          data_hora_envio)
                            session.add(registroEnvio)
                            session.commit()
                            total_email_enviados = total_email_enviados + 1
                        except SQLAlchemyError as e:
                            log.error(e)
                            session.rollback()
                        log.info(("Enviado para o participante"
                                  " {0} do Projeto {1}"
                                  " através do e-mail {2}"
                                  ).format(real_name,
                                           project_name,
                                           user_mail))
                    u_message = ("Aguardando {0} segundos para um "
                                 "novo envio").format(SECONDS_NEW_SEND)
                    log.info(u_message)
                    time.sleep(SECONDS_NEW_SEND)

    except emails.backend.smtp.exceptions.SMTPConnectNetworkError as esmtp:
        log.error(esmtp)
        return
    except IOError as ioe:
        log.error(ioe)
        return
    except UnicodeError as ue:
        log.error(ue)
        return
    except SQLAlchemyError as sqle:<commit_msg>Realizados mudanças para  registro do envio<commit_after>#!/usr/bin/env python
# -*- coding: utf-8 -*-
import emails
import docs.conf as cfg
import argparse
# import ipdb as pdb
import os.path
from emails.template import JinjaTemplate as T
import time
import logging as log
import sys
from Database import Database
from sqlalchemy.exc import SQLAlchemyError
from ParametrosEnvio import ParametrosEnvio
from Participantes import Participantes
from RegistroEnvio import RegistroEnvio
from datetime import datetime

reload(sys)
sys.setdefaultencoding('utf8')


def parse_args():
    """
    Parse script input arguments.

    Returns the parsed args, having validated that the input
    file can be read, and that there is a valid Username.
    """
    parser = get_parser()
    args = parser.parse_args()

    # pdb.set_trace()
    if os.path.isfile(args.html_filename):
        args.html = args.html_filename
    return args


def get_parser():
    """ Return the parser used to interpret the script arguments."""
    usage = (
        "Script to send an HTML file as an HTML email."
        "\nExamples:"
        "\n1. Send the contents of test_file.html to fred"
        "\n$ send_html_email.py test_file.html"
        "\n"
       )
    epilog = "NB This script requires a Gmail account."

    formatter_class = argparse.RawDescriptionHelpFormatter
    parser = argparse.ArgumentParser(description=usage,
                                     epilog=epilog,
                                     formatter_class=formatter_class
                                     )
    parser.add_argument('html_filename',
                        help='The HTML file as Jinja template')
    return parser


def print_args(args):
    """Print out the input arguments."""
    print ('Sending test email by file: %s' % args.html)


def get_recipients(session):
    """TODO: Docstring for get_recipients.

    """
    for participante in session.query(Participantes).all():
        yield participante


def get_current_timestamp():
    """Retorna a data e hora atual
    :returns: Data e hora atual

    """
    return datetime.now()


def obtem_dias_entre_data(data_inicio, data_fim):
    """

    :data_inicio: TODO
    :data_fim: TODO
    :returns: TODO

    """
    total_dias = (data_fim - data_inicio).days
    return total_dias


def avalia_envio_participante(parametros_envio,
                              participante,
                              registro_envio,
                              session
                              ):
    """Avalia se o email pode ser enviado para um participante
       dado o registro de envios anteriores e o parâmetros de envio
       definidos

    :parametros_envio: Um objeto do tipo ParametrosEnvio
    :participante:  Um objeto do tipo Participantes
    :registro_envio: Um objeto do tipo RegistroEnvio
    :returns: True se o envio pode ser realizado
              False se o envio NÃO pode ser realizado

    """
    is_envio_permitido = False
    total_envio = registro_envio.get_total_envios()
    max_envio_permitido = parametros_envio._max_num_envios
    if total_envio == 0:
        is_envio_permitido = True
    elif total_envio == max_envio_permitido:
        is_envio_permitido = False
    elif total_envio == 1:
        ultima_data_envio = registro_envio.get_ultima_data_envio(participante,
                                                                 session)
        data_hora_atual = get_current_timestamp()
        dif_em_dias = obtem_dias_entre_data(ultima_data_envio,
                                            data_hora_atual)
        if dif_em_dias >= 2:
                is_envio_permitido = True
        else:
            is_envio_permitido = False

    elif total_envio == 2:
        ultima_data_envio = registro_envio.get_ultima_data_envio(participante,
                                                                 session)
        data_hora_atual = get_current_timestamp()

        dif_em_dias = obtem_dias_entre_data(ultima_data_envio,
                                            data_hora_atual)
        if dif_em_dias >= 3:
            is_envio_permitido = True
        else:
            is_envio_permitido = False
    else:
        is_envio_permitido = False
    return is_envio_permitido


def main():
    """
        TODO: Docstring for main.
        :returns: None

    """
    SECONDS_NEW_SEND = 60
    log_path = './log/'
    file_name = 'email_sender'
    log_format = "[%(asctime)s] [%(levelname)s] : %(message)s"
    logFormatter = log.Formatter(log_format,
                                 datefmt='%d-%m-%Y %H:%M:%S'
                                 )
    rootLogger = log.getLogger()
    rootLogger.setLevel(log.INFO)

    fileHandler = log.FileHandler("{0}/{1}.log".format(log_path, file_name))
    fileHandler.setFormatter(logFormatter)
    rootLogger.addHandler(fileHandler)

    consoleHandler = log.StreamHandler()
    consoleHandler.setFormatter(logFormatter)
    rootLogger.addHandler(consoleHandler)
    args = parse_args()
    total_email_enviados = 0

    try:
        # pdb.set_trace()
        db = Database(user=cfg.db_dissertacao["user"],
                      password=cfg.db_dissertacao["password"],
                      db=cfg.db_dissertacao["database"],
                      host=cfg.db_dissertacao["host"],
                      port=cfg.db_dissertacao["port"])
        session = db.get_session()
        # Obtendo os parâmetros de envios dos e-mails
        parametros = session.query(ParametrosEnvio).first()
        # Verificando se o envio está bloqueado
        if not parametros.is_envio_bloqueado():
            log.warning(("O processo de envio de e-mail "
                         "está bloqueado! Uma nova tentativa "
                         "de envio será feita em breve!"))
            sys.exit(0)
        # Inciando o envio
        log.info("Iniciando o processo de envio de e-mail's")
        retry = True
        recipients_list = get_recipients(session)

        with open(args.html, 'rb') as html_file:
            html_content = T(html_file.read())
            email_subejct = 'Survey about Issue Tracking System'
            email_sender = ('<NAME>',
                            '<EMAIL>')
            email_ccb = ("<NAME>",
                         '<EMAIL>')
            for r in recipients_list:
                real_name = r._nome_participante
                user_mail = r._email_participante
                project_name = r._projeto_participante
                retry = True
                data_hora_envio = get_current_timestamp()

                registro_envio = RegistroEnvio(user_mail,
                                               data_hora_envio)

                if avalia_envio_participante(parametros,
                                             r,
                                             registro_envio):
                    real_name = r._nome_participante
                    user_mail = r._email_participante
                    project_name = r._projeto_participante
                    retry = True
                    while retry:
                        message = emails.html(html=html_content,
                                              subject=email_subejct,
                                              mail_from=email_sender,
                                              bcc=email_ccb
                                              )
                        smtp = {'host': cfg.smtp_dcc['host'],
                                'port': cfg.smtp_dcc['port'],
                                'tls': cfg.smtp_dcc['tls'],
                                'user': cfg.smtp_dcc['user'],
                                'password': cfg.smtp_dcc['password']
                                }

                        response = message.send(to=user_mail,
                                                render={'real_name':
                                                        real_name},
                                                smtp=smtp
                                                )
                        if response.status_code not in [250, ]:
                            retry = True
                        else:
                            retry = False
                            try:
                                session.add(registro_envio)
                                session.commit()
                                total_email_enviados = total_email_enviados + 1
                            except SQLAlchemyError as e:
                                log.error(e)
                                session.rollback()
                            log.info(("Enviado para o participante"
                                      " {0} do Projeto {1}"
                                      " através do e-mail {2}"
                                      ).format(real_name,
                                               project_name,
                                               user_mail))
                        u_message = ("Aguardando {0} segundos para um "
                                     "novo envio").format(SECONDS_NEW_SEND)
                        log.info(u_message)
                        time.sleep(SECONDS_NEW_SEND)

    except emails.backend.smtp.exceptions.SMTPConnectNetworkError as esmtp:
        log.error(esmtp)
        return
    except IOError as ioe:
        log.error(ioe)
        return
    except UnicodeError as ue:
        log.error(ue)
        return
    except SQLAlchemyError as sqle:
{'fraction_non_alphanumeric': 0.07324754303089537, 'fraction_numerical': 0.0023890970299180105, 'mean_word_length': 1.4443264764432648, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 77, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1495343', 'n_tokens_mistral': 5087, 'n_tokens_neox': 4893, 'n_words': 1125}