예제 #1
0
def define_recomendation(category_id, total_grade):

    mycursor = mydb.cursor()
    mycursor.execute(
        f"select categories_n_grades.id, categories_n_grades.recomendation_text, grades_scope.grade, "
        "categories_n_grades.gif from categories_n_grades  INNER JOIN grades_scope ON "
        f"categories_n_grades.grades_id=grades_scope.id where categories_n_grades.categories_grades_id={category_id};"
    )
    myresult = mycursor.fetchall()
    grade_limit = 0
    flag = True
    obj = None

    for item in myresult:
        if grade_limit < int(item[2]):
            grade_limit = int(item[2])

        if flag and total_grade <= item[2]:
            flag = False
            obj = {
                "recom_id": item[0],
                "recommendation": item[1],
                "gif": item[3]
            }
    obj["grade_limit"] = grade_limit
    return obj
예제 #2
0
def create_table():
    sql = '''create table wxrobot(
        msg_id varchar(50),
        msg_type char(20),
        msg_time Datetime,
        msg_content varchar(255),
        msg_sender  varchar(255),
        msg_receiver  varchar(255),
        msg_sender_name  varchar(255),
        msg_receiver_name  varchar(255),
        is_at  BOOLEAN,
        is_group  BOOLEAN,
        msg_group varchar(255),
        msg_group_name varchar(255)
    )'''
    try:
        cursor = mydb.cursor()
        cursor.execute(sql)
        mydb.commit()
        print('创建成功')
        return True
    except Exception as e:
        print('创建失败', e)
        return False
    finally:
        cursor.close()
예제 #3
0
def get_data_for_complex_chart(id_telegram):
    mycursor = mydb.cursor()
    mycursor.execute(
        "select categories.category, grades_scope.grade_title, COUNT(grades_scope.grade_title) as count, categories.rgb from users "
        "INNER JOIN categories_n_grades ON users.user_cat_grades_id = categories_n_grades.id "
        "INNER JOIN categories ON categories_n_grades.categories_grades_id = categories.id "
        "INNER JOIN grades_scope ON categories_n_grades.grades_id = grades_scope.id "
        f"where users.idTelegram = {id_telegram} "
        "GROUP BY categories.category, grades_scope.grade_title, categories.rgb  ORDER BY categories.category;"
    )

    myresult = mycursor.fetchall()
    total_times = 0
    category_titles_array = []
    category_titles_counts = []
    category_titles_obj = []
    sub_category_numbers = []
    grade_titles = []
    grades = []
    colors = []

    for row in myresult:  # разделяет данные
        category_titles_obj.append(row[0])
        grade_titles.append(row[1])
        grades.append(row[2])
        total_times += int(row[2])
        colors.append(row[3])

    category_titles_obj = dict.fromkeys(category_titles_obj)
    colors = list(dict.fromkeys(colors))

    for property in category_titles_obj:
        count = 0
        for row in myresult:
            if property == row[0]:
                count += 1
        sub_category_numbers.append(count)

    for property in category_titles_obj:  # считает количество прохождений для каждой категории
        for row in myresult:
            if property == row[0]:
                if category_titles_obj[property] is None:
                    category_titles_obj[property] = 0 + row[2]
                else:
                    category_titles_obj[property] += row[2]

    for property in category_titles_obj:  # разделили на массив категорий и массив количества каждой из них
        category_titles_array.append(property)
        category_titles_counts.append(category_titles_obj[property])

    colors = recalculate_colors(
        colors
    )  # пересчитывает цифры rgb по пропорции и получает массив кортежей-tuple
    draw_complex_pie_chart(id_telegram, category_titles_array,
                           category_titles_counts, grade_titles, grades,
                           colors, sub_category_numbers, total_times)
예제 #4
0
def save_user_results(id_telegram, recom_id, result, recom_id2):

    try:
        mycursor = mydb.cursor()
        mycursor.callproc('save_user_procedure',
                          [id_telegram, recom_id, result, recom_id2])
        mydb.commit()

    except mydb.connector.Error as error:
        print("Failed to execute stored procedure: {}".format(error))
예제 #5
0
def get_answers_grades(category_id):
    answers = []
    grades = []

    mycursor = mydb.cursor()
    mycursor.execute(
        f"SELECT answer,emoji, grade FROM chatbot_test.answers WHERE answer_category_id={category_id};"
    )
    myresult = mycursor.fetchall()

    for item in myresult:
        answers.append(f"{item[0]}{item[1]}")
        grades.append(item[2])

    return {"answers": answers, "grades": grades}
예제 #6
0
async def process_callback_test(call: types.CallbackQuery):
    """"Ловим какой тест был выбран и
    выводим описание"""
    await call.answer(cache_time=500)
    callback_data = call.data
    logging.info(f"call = {callback_data}")
    mycursor = mydb.cursor()
    id = callback_data.replace("action:btn", "")
    mycursor.execute(
        f"SELECT description FROM chatbot_test.categories WHERE id={id};")
    myresult = ''.join(mycursor.fetchone())
    set_button_pick_options()
    set_id(id)
    await call.message.answer(myresult, reply_markup=button_pick_options)
    await call.message.edit_reply_markup(reply_markup='')
예제 #7
0
def get_subcategories(
    category_id
):  # для простой круговой диаграммы нужны подкатегории и их оценки
    mycursor = mydb.cursor()
    mycursor.execute(
        f"select grades_scope.grade_title, grades_scope.grade from categories_n_grades "
        "INNER JOIN grades_scope ON categories_n_grades.grades_id = grades_scope.id "
        f"where categories_n_grades.categories_grades_id ={category_id};")
    myresult = mycursor.fetchall()
    titles = []
    grades = []

    for item in myresult:
        titles.append(item[0])
        grades.append(item[1])

    return {"titles": titles, "grades": grades}
예제 #8
0
def get_all_result_by_category(id_telegram, g_id):
    dates = []
    results = []

    mycursor = mydb.cursor()
    mycursor.execute(
        f"select users.result, users.date from users "
        f"INNER JOIN categories_n_grades ON users.user_cat_grades_id = categories_n_grades.id "
        f"where categories_n_grades.categories_grades_id = {g_id} and users.idTelegram = {id_telegram} ORDER  BY  users.date"
    )
    myresult = mycursor.fetchall()

    for x in myresult:
        results.append(x[0])
        dates.append(x[1].strftime("%d-%m-%Y"))

    return {"results": results, "dates": dates}
예제 #9
0
def get_questions(category_id: int):
    global questions, gifs
    mycursor = mydb.cursor()
    mycursor.execute(
        f"SELECT qustion, gif_address FROM chatbot_test.questions WHERE category_id={category_id};"
    )
    myresult = mycursor.fetchall()

    for x in myresult:
        x = ''.join(x)
        gif_start = x.find(
            "http"
        )  # в одной строке и вопрос и адрес, поэтому ищу начало адреса картинки
        gif_address = x[gif_start:]  # срез адреса
        x = x[:gif_start]  # срез от начала вопроса до адреса картинки

        questions.append(x)
        gifs.append(gif_address)
예제 #10
0
async def process_callback_start(call: types.CallbackQuery):
    await call.answer(cache_time=500)
    callback_data = call.data
    logging.info(f"call = {callback_data}")

    mycursor = mydb.cursor()
    mycursor.execute("SELECT id, category FROM chatbot_test.categories;")
    myresult = mycursor.fetchall()
    ids = []
    categories_str = "Выберите один из следующих тестов:"
    i = 1
    for x in myresult:
        ids.append(x[0])
        x = ''.join(x[1])
        categories_str += f"\n{i}. {x}"
        i += 1
    setButtonsCount(len(ids))
    set_categories_buttons_count(ids)
    await call.message.answer(categories_str, reply_markup=categories_buttons)
    await call.message.edit_reply_markup(reply_markup='')
예제 #11
0
async def process_callback_start_test(call: types.CallbackQuery):
    global global_reply_keyboard

    await call.answer(cache_time=500)
    await call.message.edit_reply_markup(reply_markup='')
    callback_data = call.data
    logging.info(f"call = {callback_data}")
    mycursor = mydb.cursor()
    mycursor.execute(
        f"SELECT answer, emoji FROM chatbot_test.answers WHERE answer_category_id={g_id};"
    )
    myresult = mycursor.fetchall()
    answers_arr = []
    for x in myresult:
        x = ''.join(x)
        answers_arr.append(x)

    global_reply_keyboard = set_reply_keyboard(answers_arr)
    init_user_answers(answers_arr)
    get_questions(g_id)

    await call.message.answer(show_question(),
                              reply_markup=global_reply_keyboard)
    await call.message.answer_sticker(gifs[current_question], "")
예제 #12
0
def get_category_title(id):
    mycursor = mydb.cursor()
    mycursor.execute(
        f"SELECT category FROM chatbot_test.categories where id={g_id}")
    category_title = mycursor.fetchone()
    return ''.join(category_title)
def create_pdf(id_telegram, total_grade, grade_limit, recomendation):
    cur_date = datetime.now()

    string = f"Помните, что чем ниже количество набранных баллов" \
             f",тем меньше уровень того или инного растройства.\nВы набрали {total_grade} из {grade_limit} баллов. \n" \
             f"Таким образом, y Вас {recomendation}"

    pdf = FPDF()
    pdf.add_page()
    pdf.add_font('DejaVuSerif', '', 'font/DejaVuSerif.ttf', uni=True)
    pdf.add_font('DejaVuSerif-Bold', '', 'font/DejaVuSerif-Bold.ttf', uni=True)

    pdf.set_font('DejaVuSerif-Bold', '', 16)
    pdf.cell(40, 10, f"{cur_date.strftime('%m/%d/%Y, %H:%M')}",ln=1)

    pdf.set_font("DejaVuSerif", "", 14)
    pdf.multi_cell(180, 8, txt=string)

    pdf.set_font("DejaVuSerif", "", 14)
    pdf.multi_cell(150, 9, f"\nНиже приведены графики, которые помогут "
                           "Вам лучше понять и увидеть результаты текущего и предыдуших тестов")

    pdf.image(f"{SIMPLE_PIE_CHART}_{id_telegram}.png", x=5, y=110, w=180, h=80)

    pdf.set_font("DejaVuSerif", "", 14)
    pdf.set_y(230)
    pdf.multi_cell(170, 9, "Выше изображенный круговой график демонстрирует зависимость полученного балла "
                           "от предельной величины баллов."
                           "Иначе говоря, посмотрев на него Вы поймете: насколько всё хорошо или плохо")

    pdf.add_page()
    pdf.set_font("DejaVuSerif", "", 14)
    pdf.multi_cell(180, 8, txt="Нижеприведенный комплексный график показывает разнообразие тестов, "
                               "которые пользователь проходил за всё время использования программы MeChecker, "
                               "и результатов, которые были получены по каждому из них. "
                               "Он позволит Вам оценить эмоциональное состояние, "
                               "в котором Вы преимущественно находились и находитесь прямо сейчас")

    pdf.image(f"{COMPLEX_PIE_CHART}_{id_telegram}.png", x=5, y=65, w=200, h=100)

    mycursor = mydb.cursor()
    mycursor.execute(f"select categories.id, categories.category from users "
                     "INNER JOIN categories_n_grades ON users.user_cat_grades_id = categories_n_grades.id "
                     "INNER JOIN categories ON categories_n_grades.categories_grades_id = categories.id "
                     f"where users.idTelegram = {id_telegram} "
                     "group by categories.id, categories.category;")
    myresult = mycursor.fetchall()

    categories_object = {}
    for item in myresult:
        categories_object[item[1]] = item[0]

    print(categories_object)

    for property in categories_object:

        obj = get_all_result_by_category(id_telegram, categories_object[property])
        draw_line_graph(id_telegram, obj["results"], obj["dates"], property)

        res_string = "Нижеприведенный график показывает зависимость всех результатов, полученных в ходе прохождения " \
                     f"теста - '{property}', " \
                     "от времени прохождения теста.\nБлагодаря ему легко визуализируется динамика психологического " \
                     "состояния человека. Приглядитесь к нему внимательно, вспомните недавние события, и Вы поймете, " \
                     "что улучшило Ваше психологическое состояние, а что - нет. Придерживайтесь этой тактики, " \
                     "потому что именно она поможет Вам в долгосрочной перспективе!"

        if len(obj["results"]) < 2:
            res_string += "(в данный момент тест пройден один раз, поэтому на графике показана только начальная точка)"

        pdf.add_page()
        pdf.set_font("DejaVuSerif", "", 14)

        pdf.multi_cell(180, 8, txt=res_string)

        pdf.image(f"{property}_{id_telegram}.png", x=5, y=100, w=200, h=150)

    pdf.output(f"results{cur_date.date()}_{id_telegram}.pdf", "F")
    return f"results{cur_date.date()}_{id_telegram}.pdf"