From af88cbce8ff77fba8859cafe0f79ba87dfd990e9 Mon Sep 17 00:00:00 2001 From: Hosein Date: Tue, 30 Dec 2025 20:47:37 +0330 Subject: [PATCH] added creating teacher functionality --- bot/callbacks/teachers.py | 94 ++++++++++++++++++++++++++++++++++++++- bot/handlers/teachers.py | 6 ++- bot/utils/formatters.py | 2 +- database/models.py | 26 ++++++++++- 4 files changed, 123 insertions(+), 5 deletions(-) diff --git a/bot/callbacks/teachers.py b/bot/callbacks/teachers.py index b849ed5..7243281 100644 --- a/bot/callbacks/teachers.py +++ b/bot/callbacks/teachers.py @@ -1,9 +1,14 @@ -from telebot import types +from telebot import types, TeleBot from database.models import Teachers from bot.utils.formatters import format_teacher_info -def register(bot): +def register(bot: TeleBot): + cancelMarkup = types.InlineKeyboardMarkup() + cancelMarkup.add(types.InlineKeyboardButton( + "Cancel", callback_data="cancel")) + + # Showing details of a Teacher @bot.callback_query_handler(func=lambda call: call.data.startswith('teacher_')) def show_teacher_details(call): teacher_id = call.data.split('_')[1] @@ -18,3 +23,88 @@ def register(bot): bot.send_message(call.message.chat.id, "Teacher not found.") bot.answer_callback_query(call.id) + + # Creating a Teacher Flow + @bot.callback_query_handler(func=lambda call: call.data == 'create_teacher') + def start_teacher_creation(call): + msg = bot.send_message(call.message.chat.id, + "Please enter the teacher's name:", reply_markup=cancelMarkup) + bot.register_next_step_handler( + msg, process_name_step) + bot.answer_callback_query(call.id) + + def process_name_step(message): + name = message.text + msg = bot.send_message( + message.chat.id, f"Name: {name}\n\nNow enter email:", reply_markup=cancelMarkup) + bot.register_next_step_handler(msg, process_email_step, name) + + def process_email_step(message, name): + email = message.text + msg = bot.send_message( + message.chat.id, f"Email: {email}\n\nNow enter phone: ()", reply_markup=cancelMarkup) + bot.register_next_step_handler(msg, process_phone_step, name, email) + + def process_phone_step(message, name, email): + phone = message.text + msg = bot.send_message( + message.chat.id, f"Phone: {phone}\n\nNow enter password: ", reply_markup=cancelMarkup) + bot.register_next_step_handler( + msg, process_password_step, name, email, phone) + + def process_password_step(message, name, email, phone): + password = message.text + msg = bot.send_message( + message.chat.id, f"password: {password}\n\nNow enter username:", reply_markup=cancelMarkup) + bot.register_next_step_handler( + msg, process_username_step, name, email, phone, password) + + def process_username_step(message, name, email, phone, password): + username = message.text + msg = bot.send_message( + message.chat.id, f"username: {username}\n\nNow enter birthday: (YY/MM/DD)", reply_markup=cancelMarkup) + bot.register_next_step_handler( + msg, process_birthday_step, name, email, phone, password, username) + + def process_birthday_step(message, name, email, phone, password, username): + birthday = message.text + msg = bot.send_message( + message.chat.id, f"birthday: {birthday}\n\nNow enter about me: ", reply_markup=cancelMarkup) + bot.register_next_step_handler( + msg, process_aboutme_step, name, email, phone, password, username, birthday) + + def process_aboutme_step(message, name, email, phone, password, username, birthday): + about_me = message.text + msg = bot.send_message( + message.chat.id, f"about me: {about_me}\n\nNow enter job title: ", reply_markup=cancelMarkup) + bot.register_next_step_handler( + msg, process_jobtitle_step, name, email, phone, password, username, birthday, about_me) + + def process_jobtitle_step(message, name, email, phone, password, username, birthday, about_me): + job_title = message.text + msg = bot.send_message(message.chat.id, "is this correct? (enter any key) (Use Cancel to Stop creating)\n" + f"Name: {name}\n" + f"Email: {email}\n" + f"Phone: {phone}\n" + f"Password: {password}\n" + f"Birthday: {birthday}\n" + f"About Me: {about_me}\n" + f"Job Title: {job_title}", + reply_markup=cancelMarkup) + + bot.register_next_step_handler( + msg, confirm_teacher_creation, name, email, phone, password, username, birthday, about_me, job_title) + + def confirm_teacher_creation(message, name, email, phone, password, username, birthday, about_me, job_title): + if (Teachers.createTeacher(name=name, email=email, phone_number=phone, + password=password, username=username, birthday=birthday, + about_me=about_me, job_title=job_title)): + bot.send_message(message.chat.id, "✅ Teacher created!") + else: + bot.send_message(message.chat.id, "❌ Failed to create teacher.") + + @bot.callback_query_handler(func=lambda call: call.data == 'cancel') + def cancel_action(call): + bot.clear_step_handler(call.message) + bot.send_message(call.message.chat.id, "Action cancelled.") + bot.answer_callback_query(call.id) diff --git a/bot/handlers/teachers.py b/bot/handlers/teachers.py index 109751f..2240869 100644 --- a/bot/handlers/teachers.py +++ b/bot/handlers/teachers.py @@ -12,11 +12,15 @@ def register(bot): data = Teachers.getAllTeachers() if data: - markup = types.InlineKeyboardMarkup(row_width=2) + markup = types.InlineKeyboardMarkup(row_width=1) for row in data: btn = types.InlineKeyboardButton( f"@{row[1]} | id#{row[0]}", callback_data=f"teacher_{row[0]}") markup.add(btn) + # add button for creating a new teacher + markup.add(types.InlineKeyboardButton( + "➕ Create New Teacher", callback_data="create_teacher")) + bot.send_message( message.chat.id, "Here is the data:", reply_markup=markup) else: diff --git a/bot/utils/formatters.py b/bot/utils/formatters.py index b9ac134..747b01d 100644 --- a/bot/utils/formatters.py +++ b/bot/utils/formatters.py @@ -89,7 +89,7 @@ def format_teacher_info(teacher): age = calculate_age(birthday) details = f""" - 👤 Student Profile + 👤 Teacher Profile Name: {name} Username: {username} diff --git a/database/models.py b/database/models.py index 88d7fa9..dc078ff 100644 --- a/database/models.py +++ b/database/models.py @@ -77,7 +77,7 @@ class Teachers: cursor = conn.cursor() cursor.execute( - "SELECT id,username, name, created_at, email, phone_number, last_seen, is_verfied, birthday, about_me, job_title FROM teachers WHERE id = %s", (teacher_id)) + "SELECT id, username, name, created_at, email, phone_number, last_seen, is_verfied, birthday, about_me, job_title FROM teachers WHERE id = %s", (teacher_id, )) result = cursor.fetchall() cursor.close() @@ -88,3 +88,27 @@ class Teachers: finally: if conn: connection.release_db_connection(conn) + + def createTeacher(name, email, phone_number, password, username, birthday, about_me, job_title): + conn = None + try: + conn = connection.get_db_connection() + if not conn: + return False + + cursor = conn.cursor() + cursor.execute( + "INSERT INTO teachers (name, email, phone_number, hashed_password, username, birthday, about_me, job_title) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)", + (name, email, phone_number, password, + username, birthday, about_me, job_title) + ) + conn.commit() + cursor.close() + + return True + except Exception as e: + logger.error(f"Database query error in createTeacher: {e}") + return False + finally: + if conn: + connection.release_db_connection(conn)