DogAcademyGame/database/db_events.py
Xatiko 815f432536 Исправлена админ-панель: работа с бд теперь доступна (нужно добавить кнопки), добавлены кнопки 'Открыть сессию пользователя' - для того чтобы администратор мог открыть игру, не выходя из админ-панели, создав при этом дополнительное окно, и 'Выйти'(бургер-меню) - закрыть приложение. Исправлен процесс регистрации: при регистрации пользователя данные из таблицы Auth автоматически переносятся в таблицу Users и GameSession для дальнейшего просмотра, редактирования, удаления данных в админ-панели, добавлен параметр username для корректрой работы базы данных и процесса регистрации, исправлен интерфейс: добавлены наименования полей, для удобства пользователя. Изменения в коде: работа с бд перенесена в файл с интерфейсом админ-панели, потому что Python по-другому не воспринимает мои страдания((( Изменения в логировании: при запуске игры создаётся/обновляется файл game.log (импортировать в админ-панель, также как и logfile.log).
2024-11-28 17:17:19 +03:00

319 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from sqlalchemy import func
from sqlalchemy.orm import joinedload
from database.db_session import get_session
from database.models import Auth, Notifications, Users, GameSession, Dogs, Questions
from sqlalchemy.exc import SQLAlchemyError
def get_user_by_id(user_id):
"""Получение данных пользователя по ID."""
session = get_session()
try:
user = session.query(Users).filter_by(user_id=user_id).first()
return user
except SQLAlchemyError as e:
print(f"Ошибка при получении пользователя: {e}")
return None
finally:
session.close()
def create_user(login, password, username):
"""Создание нового пользователя в базе данных."""
session = get_session()
# Проверяем, есть ли уже пользователь с таким логином
if session.query(Auth).filter_by(login=login).first():
return False, "Логин уже используется."
# Создаем новую запись в таблице Auth
new_auth = Auth(login=login, password=password)
session.add(new_auth)
try:
session.commit() # Сохраняем изменения в таблице Auth
# Создаем новую запись в таблице Users, связывая с только что добавленным Auth
new_user = Users(user_id=new_auth.user_id, username=username)
session.add(new_user)
session.commit() # Сохраняем изменения в таблице Users
except SQLAlchemyError as e:
session.rollback() # Откат изменений при ошибке
print(f"Ошибка при создании пользователя: {e}")
return False, "Произошла ошибка при регистрации."
finally:
session.close()
return True, "Регистрация успешна."
def check_user(login, password=None):
"""Проверка существования пользователя по логину и паролю (если передан)."""
session = get_session()
try:
print(f"Проверяем пользователя с логином: {login}")
# Фильтрация только по логину
query = session.query(Auth).filter_by(login=login)
# Если передан пароль, фильтруем и по паролю
if password:
query = query.filter_by(password=password)
user = query.first()
if user:
print(f"Пользователь найден: {user.user_id}")
return user.user_id # Возвращаем user_id пользователя
else:
print("Пользователь не найден.")
return None
except SQLAlchemyError as e:
print(f"Ошибка при проверке пользователя: {e}")
return None
finally:
session.close()
def save_progress(user_id, level, score, duration, health, hunger, sleepiness):
"""Сохранение игрового прогресса в базу данных."""
session = get_session()
try:
session_data = GameSession(
user_id=user_id,
level=level,
score=score,
duration=duration,
health=health,
hunger=hunger,
sleepiness=sleepiness,
end_time=func.now()
)
session.add(session_data)
session.commit()
except SQLAlchemyError as e:
print(f"Ошибка при сохранении прогресса: {e}")
session.rollback()
finally:
session.close()
def get_user_progress(user_id):
"""Получение прогресса пользователя по его ID."""
session = get_session()
try:
progress = session.query(GameSession).filter_by(user_id=user_id).all()
return progress
except SQLAlchemyError as e:
print(f"Ошибка при получении прогресса: {e}")
return []
finally:
session.close()
def create_notification(user_id, message):
"""Создание уведомления для пользователя."""
session = get_session()
try:
notification = Notifications(user_id=user_id, message=message)
session.add(notification)
session.commit()
except SQLAlchemyError as e:
print(f"Ошибка при создании уведомления: {e}")
session.rollback()
finally:
session.close()
def get_notifications(user_id):
"""Получение уведомлений для пользователя."""
session = get_session()
try:
notifications = session.query(Notifications).filter_by(user_id=user_id).all()
return notifications
except SQLAlchemyError as e:
print(f"Ошибка при получении уведомлений: {e}")
return []
finally:
session.close()
def get_knowledge_base():
"""Получение базы знаний (статей о собаках)."""
session = get_session()
try:
dogs = session.query(Dogs).all()
return dogs # Список объектов Dogs
except SQLAlchemyError as e:
print(f"Ошибка при получении базы знаний: {e}")
return []
finally:
session.close()
def get_dogs():
"""Получение списка пород собак."""
session = get_session()
try:
dogs = session.query(Dogs).all()
return dogs # Список объектов Dogs
except SQLAlchemyError as e:
print(f"Ошибка при получении списка собак: {e}")
return []
finally:
session.close()
def update_user_dog(user_id, dog_id):
"""Обновление выбранной пользователем породы собаки."""
session = get_session()
try:
user = session.query(Users).filter_by(user_id=user_id).first()
if user:
user.dog_id = dog_id
session.commit()
print(f"Порода пользователя обновлена на {dog_id}")
else:
print("Пользователь не найден.")
except SQLAlchemyError as e:
print(f"Ошибка при обновлении породы собаки: {e}")
session.rollback()
finally:
session.close()
def debug_list_users():
"""Отладочный вывод всех пользователей."""
session = get_session()
try:
users = session.query(Auth).all()
for user in users:
print(f"User ID: {user.user_id}, Login: {user.login}, Password: {user.password}")
except SQLAlchemyError as e:
print(f"Ошибка при получении списка пользователей: {e}")
finally:
session.close()
def get_all_users():
"""Получить всех пользователей с предварительной загрузкой данных."""
session = get_session()
try:
users = session.query(Users).options(joinedload(Users.auth)).all()
return users
except SQLAlchemyError as e:
print(f"Ошибка при получении пользователей: {e}")
return [] # Возвращаем пустой список, если ошибка
finally:
session.close()
def get_all_questions():
"""Получить все вопросы."""
session = get_session()
try:
questions = session.query(Questions).all()
return questions
except SQLAlchemyError as e:
print(f"Ошибка при получении вопросов: {e}")
return []
finally:
session.close()
def get_all_dogs():
"""Получить все записи о собаках."""
session = get_session()
try:
dogs = session.query(Dogs).all()
return dogs
except SQLAlchemyError as e:
print(f"Ошибка при получении собак: {e}")
return []
finally:
session.close()
def get_user_by_username(username):
"""Получить пользователя по логину."""
session = get_session()
try:
user = session.query(Users).join(Auth).filter(Auth.login == username).first()
return user
except SQLAlchemyError as e:
print(f"Ошибка при получении пользователя: {e}")
return None
finally:
session.close()
def update_user(user_id, new_login, new_password):
"""Обновить данные пользователя."""
session = get_session()
try:
user = session.query(Users).filter_by(user_id=user_id).first()
if user:
auth = user.auth
auth.login = new_login
auth.password = new_password
session.commit()
except SQLAlchemyError as e:
print(f"Ошибка при обновлении пользователя: {e}")
session.rollback()
finally:
session.close()
def update_user_info(user_id, new_login, new_username):
"""Обновление данных пользователя."""
session = get_session()
try:
user = session.query(Users).filter_by(user_id=user_id).first()
if user:
user.auth.login = new_login
user.username = new_username
session.commit()
return True, "Данные пользователя обновлены."
return False, "Пользователь не найден."
except SQLAlchemyError as e:
session.rollback()
return False, f"Ошибка при обновлении: {e}"
finally:
session.close()
def delete_user(user_id):
"""Удаление пользователя."""
session = get_session()
try:
user = session.query(Users).filter_by(user_id=user_id).first()
if user:
session.delete(user.auth)
session.commit()
return True, "Пользователь удалён."
return False, "Пользователь не найден."
except SQLAlchemyError as e:
session.rollback()
return False, f"Ошибка при удалении: {e}"
finally:
session.close()
def update_dog_info(dog_id, breed, characteristics):
"""Обновление информации о собаке."""
session = get_session()
try:
dog = session.query(Dogs).filter_by(dog_id=dog_id).first()
if dog:
dog.breed = breed
dog.characteristics = characteristics
session.commit()
return True, "Информация о собаке обновлена."
return False, "Собака не найдена."
except SQLAlchemyError as e:
session.rollback()
return False, f"Ошибка при обновлении: {e}"
finally:
session.close()
def update_question(question_id, text, helpful_info):
"""Обновление вопроса."""
session = get_session()
try:
question = session.query(Questions).filter_by(question_id=question_id).first()
if question:
question.question_text = text
question.helpful_info = helpful_info
session.commit()
return True, "Вопрос обновлён."
return False, "Вопрос не найден."
except SQLAlchemyError as e:
session.rollback()
return False, f"Ошибка при обновлении: {e}"
finally:
session.close()