template creation

This commit is contained in:
helldh 2026-02-15 15:52:10 +03:00
parent 3c2137da2b
commit c0727d7b59
6 changed files with 464 additions and 293 deletions

173
src/db.py
View file

@ -1,19 +1,27 @@
import psycopg2 as pg
from .objects import User, Rights
DB_AUTH_HARDCODED = {
DB_CONFIG = {
"host": "127.0.0.1",
"port": 5432,
"dbname": "examdb",
"user": "postgres",
"password": "213k2010###"
"dbname": "example", # TODO: Заменить на название из задания
"user": "example_user",
"password": "example_password123" # TODO: Заменить на реальный пароль
}
def get_connection():
return pg.connect(**DB_AUTH_HARDCODED)
"""Получить подключение к базе данных"""
return pg.connect(**DB_CONFIG)
def do_request(autocommit=False):
"""
Декоратор для выполнения SQL запросов с автоматическим управлением соединением
Args:
autocommit: Если True, автоматически фиксирует транзакцию
"""
def upper_wrapper(func):
def wrapper(*args, **kwargs):
conn = get_connection()
@ -21,7 +29,6 @@ def do_request(autocommit=False):
try:
kwargs['cursor'] = cursor
result = func(*args, **kwargs)
if autocommit:
@ -30,43 +37,57 @@ def do_request(autocommit=False):
return result
except Exception as e:
print(f"Error: Can't request query to DB: {e}")
print(f"Error: Database request failed: {e}")
conn.rollback()
return None
finally:
cursor.close()
conn.close()
return wrapper
return wrapper
return upper_wrapper
@do_request()
def auth(login: str, password: str, *, cursor) -> User | None:
"""
Аутентификация пользователя
Args:
login: Имя пользователя
password: Пароль
Returns:
User объект или None если аутентификация не удалась
"""
cursor.execute("""
SELECT id, name, rights
FROM users
WHERE name = %s
AND password = %s;
WHERE name = %s AND password = %s;
""", (login, password))
user = cursor.fetchone()
if not user:
print("Warning: Login Forbidden: Can't find such user!")
print("Warning: Authentication failed - user not found")
return None
rights = None
# Маппинг строки роли на Enum
rights_mapping = {
"admin": Rights.ADMIN,
"manager": Rights.MANAGER,
"client": Rights.CLIENT,
"customer": Rights.CLIENT, # Альтернативное название
"guest": Rights.GUEST,
}
match user[2]:
case "admin":
rights = Rights.ADMIN
case "customer":
rights = Rights.CLIENT
case "manager":
rights = Rights.MANAGER
case _:
return None
rights = rights_mapping.get(user[2])
if not rights:
print(f"Warning: Unknown user role: {user[2]}")
return None
return User(
id=user[0],
@ -74,80 +95,54 @@ def auth(login: str, password: str, *, cursor) -> User | None:
rights=rights
)
# TODO: Ниже функции для работы с предметной областью
# Заменить на ваши функции (например: get_products, add_product, etc.)
@do_request()
def get_free_numbers(*, cursor):
def get_items(*, cursor):
"""
Получить список доступных элементов
Например: get_products(), get_available_rooms(), etc.
"""
# Пример запроса - заменить на реальный
cursor.execute("""
SELECT *
FROM rooms
WHERE status = 'free';
FROM items
WHERE status = 'available';
""")
free = cursor.fetchall()
items = cursor.fetchall()
return items if items else None
if not free:
return None
return free
@do_request(autocommit=True)
def update_number_status(number: str, checkin: str,
checkout: str, user: User,
*, cursor):
def create_request(item_id: int, user: User, **kwargs):
"""
Создать заявку/заказ
TODO: Адаптировать под конкретную предметную область
Args:
item_id: ID элемента (товар, номер, услуга)
user: Пользователь создающий заявку
**kwargs: Дополнительные параметры (даты, количество, etc.)
"""
# TODO: Реализовать вашу логику создания заявки
pass
@do_request()
def get_user_requests(user_id: int, *, cursor):
"""
Получить заявки/заказы пользователя
TODO: Заменить на вашу логику
"""
cursor.execute("""
SELECT password
FROM users
WHERE id = %s
""", (user.id,))
SELECT *
FROM requests
WHERE user_id = %s;
""", (user_id,))
password = cursor.fetchone()
if not password:
return False
cursor.execute("""
SELECT id
FROM guests
WHERE name = %s
AND PHONE = %s
""", (user.name, password[0]))
guest = cursor.fetchone()
if not guest:
return False
cursor.execute("""
SELECT id
FROM rooms
WHERE number = %s;
""", (number,))
number_id = cursor.fetchone()
if not number_id:
return False
cursor.execute("""
SELECT guest, room
FROM bookings
WHERE guest = %s
AND room = %s;
""", (guest[0], number_id[0]))
request_exists = cursor.fetchone()
if request_exists:
return False
cursor.execute("""
INSERT INTO bookings(guest, room, checkin, checkout, status)
VALUES (%s, %s, %s, %s, 'active');
""", (guest[0], number_id[0], checkin, checkout))
cursor.execute("""
UPDATE rooms
SET status = 'booked'
WHERE number = %s;
""", (number,))
return True
return cursor.fetchall()