template creation
This commit is contained in:
parent
3c2137da2b
commit
c0727d7b59
6 changed files with 464 additions and 293 deletions
173
src/db.py
173
src/db.py
|
|
@ -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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue