Пример #1
0
def add_to_pdf(startdate, enddate):
    """
    :param startdate: string
    :param enddate: string
    :return: string, pdf path / string, filename
    """
    images_directory = get_config('images_path')
    pdf_directory = get_config('pdf_path')

    # pdf file structure
    pdf.add_page()
    pdf.set_font('Arial', 'B', 16)
    pdf.cell(40, 10, 'Weekly ECG report {} - {}'.format(startdate, enddate))
    pdf.set_font('Arial', '', 12)

    filelist = os.listdir(images_directory)

    for filename in sorted(filelist):
        filename = str(filename)
        length = len(filename)
        pdf.ln(10)
        pdf.cell(40, 10, filename[1:length - 4])
        pdf.ln(10)
        pdf.image(images_directory + '/' + filename, None, None, 200, 100)

    filename = 'Weekly_ECG_Report_{}_{}.pdf'.format(startdate, enddate)
    full_path = pdf_directory + '/' + filename
    pdf.output(full_path, 'F')

    return full_path, filename

    add_to_log('PDF file was created')
Пример #2
0
def visualise_part(filename, df, begin, end):
    """
    :param filename: str, filename to save the plot
    :param df: dataframe, input dataframe from pandas sql read
    :param begin: int, filter begin
    :param end: int, filter end
    :return: None
    """

    full_path = path + '/' + filename
    ax = plt.gca()

    # filter dataframe
    df = df[(df['rn'] >= begin) & (df['rn'] <= end)]

    # set elements
    df.plot(kind='line', x='rn', y='signal', ax=ax)
    figure = plt.gcf()

    # set to 1500 x 800 and save it
    figure.set_size_inches(15, 8)
    plt.savefig(full_path)

    # clears figure to separate plots
    plt.clf()

    add_to_log('Partial plot saved at {}'.format(full_path))
Пример #3
0
def clear_images_directory():
    images_directory = get_config('images_path')

    for filename in os.listdir(images_directory):
        os.remove(images_directory + '/' + filename)

    add_to_log('Images directory been cleared')
Пример #4
0
def process():

    try:
        today = date.today()

        # Get Ecg data for last 7 days
        for day in range(number_of_days):
            act_day = today - timedelta(days=day)
            sql = """
                select rn, measurement, signal from (
                    select
                        row_number() over(partition by get_body_heartget_id order by heartgetsignal_id asc) as rn,
                        dense_rank() over(partition by get_body_heartget_id order by 1) as filtr,
                        get_body_heartget_id as measurement,
                        signal
                    from withings.heartgetsignal
                    where date(created_at) = '{}'
                    order by heartgetsignal_id
                ) sub where filtr = 1;
                """.format(act_day)
            df = execute_sql(sql.strip())

            # get signals from dataframe
            signals = df.loc[:, "signal"]

            # change dataframe data to numpy_array for biosppy lib
            numpy_array = signals.to_numpy()

            str_act_day = str(act_day)
            str_day = str(day)

            # Visualize Ecg data
            if df.empty:
                pass
            else:
                visualise_part(str_day + 'heart_signal_first_half_' + str_act_day, df, 0, 4500)
                visualise_part(str_day + 'heart_signal_second_half_' + str_act_day, df, 4500, 10000)
                visualise_all(str_day + 'heart_signal_summary_' + str_act_day + ".png", numpy_array)

        # Add to pdf and get back the path
        pdf_path, filename = add_to_pdf(str(today - timedelta(number_of_days)), str(today))

        # Finally send report
        send_mail(
            from_address,
            to_address,
            subject,
            filename,
            pdf_path,
            password
        )

    except Exception as e:
        pass
        add_to_log('Error occurred: ' + str(e))
    finally:
        clear_images_directory()
Пример #5
0
def visualise_all(filename, nparray):
    """
    :param filename: str, filename to save the plot
    :param nparray: nparray, input numpy array what biosppy lib use
    :return: None
    """

    # load raw ECG signal
    signal = nparray

    # process it and save the plot (changed function in source lib)
    full_path = path + '/' + filename
    ecg.ecg(signal=signal, sampling_rate=300., show=False, path=full_path)

    add_to_log('Complex plot saved at {}'.format(full_path))
Пример #6
0
def main():
    add_to_log('Process started')
    print('started')
    process()
    print('finished')
    add_to_log('Process ended')
    add_to_log('====================================================================')
Пример #7
0
def send_mail(fromaddr, toaddr, subject, filename, file_path, password):
    """
    :param fromaddr: string
    :param toaddr: string
    :param subject: string
    :param filename: string
    :param file_path: string
    :param password: string
    :return: None
    """

    # instance of MIMEMultipart
    msg = MIMEMultipart()

    # storing the senders email address
    msg['From'] = fromaddr

    # storing the receivers email address
    msg['To'] = toaddr

    # storing the subject
    msg['Subject'] = subject

    # string to store the body of the mail
    body = "Szia! Küldöm az aktuális heti kimutatást."

    # attach the body with the msg instance
    msg.attach(MIMEText(body, 'plain'))

    # open the file to be sent
    filename = filename
    attachment = open(file_path, "rb")

    # instance of MIMEBase and named as p
    p = MIMEBase('application', 'octet-stream')

    # To change the payload into encoded form
    p.set_payload((attachment).read())

    # encode into base64
    encoders.encode_base64(p)

    p.add_header('Content-Disposition', "attachment; filename= %s" % filename)

    # attach the instance 'p' to instance 'msg'
    msg.attach(p)

    # creates SMTP session
    s = smtplib.SMTP('smtp.gmail.com', 587)

    # start TLS for security
    s.starttls()

    # Authentication
    s.login(fromaddr, password)

    # Converts the Multipart msg into a string
    text = msg.as_string()

    # sending the mail
    s.sendmail(fromaddr, toaddr, text)

    # terminating the session
    s.quit()

    add_to_log('Email sent successfully')