Files
PVHBackend/db/DBDataUtils.py
T

235 lines
9.0 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.
import re
import sqlite3
from loguru import logger as log
def add_category(conn, name, description=None, parent_id=None, image_path=None):
cursor = conn.cursor()
try:
cursor.execute('''
INSERT OR IGNORE INTO categories (name, description, parent_id, image_path)
VALUES (?, ?, ?, ?)
''', (name, description, parent_id, image_path))
cursor.execute('SELECT id FROM categories WHERE name = ?', (name,))
result = cursor.fetchone()
category_id = result[0] if result else None
return category_id
except sqlite3.Error as e:
log.error(f"Ошибка при добавлении категории: {e}")
return None
def add_filter(conn, name, filter_key, filter_type='single'):
cursor = conn.cursor()
try:
cursor.execute('''
INSERT OR IGNORE INTO filters (name, filter_key, filter_type)
VALUES (?, ?, ?)
''', (name, filter_key, filter_type))
except sqlite3.Error as e:
log.error(f"Ошибка при добавлении фильтра: {e}")
def parse_product_data(product_text):
"""Парсинг данных продукта из текста"""
# Определяем тип применения
application_match = re.search(r'(ВНУТРЕННЕЙ|НАРУЖНОЙ)', product_text)
application_type = "внутренняя" if application_match and application_match.group(1) == "ВНУТРЕННЕЙ" else "наружная"
# Определяем цвет
color_match = re.search(r'цвет\s+([^)]+)', product_text)
color = color_match.group(1).strip() if color_match else None
# Определяем класс жесткости
stiffness_match = re.search(r'SN(\d+)', product_text)
stiffness_class = f"SN{stiffness_match.group(1)}" if stiffness_match else None
# Определяем размеры
size_match = re.search(r'(\d+)х(\d+[,.]?\d*)х(\d+)', product_text.replace(',', '.'))
if size_match:
diameter = int(size_match.group(1))
wall_thickness = float(size_match.group(2))
length = int(size_match.group(3))
else:
diameter = wall_thickness = length = None
# Для фитингов может не быть длины
if not length and diameter:
# Проверяем на отводы
angle_match = re.search(r'(\d+)°', product_text)
if angle_match:
length = None
else:
length = 0
short_name = f"Труба ПВХ {diameter}мм {application_type} {length}мм" if diameter else product_text[:50]
return {
'short_name': short_name,
'full_name': product_text,
'diameter': diameter,
'wall_thickness': wall_thickness,
'length': length,
'color': color,
'application_type': application_type,
'stiffness_class': stiffness_class
}
def add_product(conn, product_text, category_id, image_path=None,
diameter=None, wall_thickness=None, length=None,
color=None, application_type=None, stiffness_class=None,
fitting_type=None, angle=None):
"""
Добавление товара с возможностью явного указания параметров
Если параметры не указаны, они парсятся из product_text
"""
cursor = conn.cursor()
# Если параметры не указаны явно, парсим из текста
if any(p is None for p in [diameter, wall_thickness, length, color, application_type, stiffness_class]):
product_data = parse_product_data(product_text)
diameter = diameter or product_data['diameter']
wall_thickness = wall_thickness or product_data['wall_thickness']
length = length or product_data['length']
color = color or product_data['color']
application_type = application_type or product_data['application_type']
stiffness_class = stiffness_class or product_data['stiffness_class']
# Формируем короткое имя
if diameter and length:
name = f"Труба ПВХ {diameter}мм {application_type} {length}мм"
elif fitting_type and diameter:
name = f"{fitting_type.capitalize()} ПВХ {diameter}мм"
else:
name = product_text[:100]
# Формируем описание
description_parts = []
if fitting_type:
description_parts.append(f"{fitting_type.capitalize()} для канализационных систем")
else:
description_parts.append(f"Труба ПВХ для {application_type} канализации")
if diameter:
description_parts.append(f"Диаметр: {diameter}мм")
if wall_thickness:
description_parts.append(f"Толщина стенки: {wall_thickness}мм")
if length and length > 0:
description_parts.append(f"Длина: {length}мм")
if stiffness_class:
description_parts.append(f"Класс жесткости: {stiffness_class}")
if angle:
description_parts.append(f"Угол: {angle}")
description = ", ".join(description_parts)
try:
cursor.execute('''
INSERT INTO products (
name, full_name, description, category_id,
diameter, wall_thickness, length, color,
application_type, stiffness_class, image_path
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (
name,
product_text,
description,
category_id,
diameter,
wall_thickness,
length if length and length > 0 else None,
color,
application_type,
stiffness_class,
image_path
))
product_id = cursor.lastrowid
# Добавляем фильтры для товара
filters_to_add = []
if diameter:
filters_to_add.append(('diameter', str(diameter)))
if length and length > 0:
filters_to_add.append(('length', str(length)))
if application_type:
filters_to_add.append(('application_type', application_type))
if color:
filters_to_add.append(('color', color))
if wall_thickness:
filters_to_add.append(('wall_thickness', str(wall_thickness)))
if stiffness_class:
filters_to_add.append(('stiffness_class', stiffness_class))
if fitting_type:
filters_to_add.append(('fitting_type', fitting_type))
if angle:
filters_to_add.append(('angle', angle))
for filter_key, value in filters_to_add:
if value:
cursor.execute('''
INSERT OR IGNORE INTO product_filters (product_id, filter_key, value)
VALUES (?, ?, ?)
''', (product_id, filter_key, value))
return product_id
except sqlite3.Error as e:
log.error(f"Ошибка при добавлении товара: {e}")
return None
def get_categories_by_page(conn, page_number=1, items_per_page=9):
"""Получить категории для определенной страницы"""
cursor = conn.cursor()
offset = (page_number - 1) * items_per_page
cursor.execute('''
SELECT * FROM categories
ORDER BY id
LIMIT ? OFFSET ?
''', (items_per_page, offset))
return cursor.fetchall()
def get_products_by_page(conn, page_number=1, items_per_page=9, category_id=None):
"""Получить товары для определенной страницы"""
cursor = conn.cursor()
offset = (page_number - 1) * items_per_page
if category_id:
cursor.execute('''
SELECT * FROM products
WHERE category_id = ?
ORDER BY id
LIMIT ? OFFSET ?
''', (category_id, items_per_page, offset))
else:
cursor.execute('''
SELECT * FROM products
ORDER BY id
LIMIT ? OFFSET ?
''', (items_per_page, offset))
return cursor.fetchall()
def get_total_categories_pages(conn, items_per_page=9):
"""Получить общее количество страниц категорий"""
cursor = conn.cursor()
cursor.execute('SELECT COUNT(*) FROM categories')
total_categories = cursor.fetchone()[0]
return (total_categories + items_per_page - 1) // items_per_page
def get_total_products_pages(conn, items_per_page=9, category_id=None):
"""Получить общее количество страниц товаров"""
cursor = conn.cursor()
if category_id:
cursor.execute('SELECT COUNT(*) FROM products WHERE category_id = ?', (category_id,))
else:
cursor.execute('SELECT COUNT(*) FROM products')
total_products = cursor.fetchone()[0]
return (total_products + items_per_page - 1) // items_per_page