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
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()
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)
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))
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}
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='')
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}
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}
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)
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='')
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], "")
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"