Загрузка данных
import sys
import os
import shutil
import mysql.connector
from PyQt6 import QtWidgets, QtCore, QtGui
from item import Ui_Form as ItemUI
from redakt_products import Ui_MainWindow as EditUI
from products_main import Ui_mainWindow as MainUI
from order_item import Ui_Form as ItemOrderUI
from redakt_orders import Ui_MainWindow as EditOrdersUI
db_config = {'host':'localhost','user':'root','password':'root', 'database':'trade_db'}
class ProductItem(QtWidgets.QWidget, ItemUI):
def __init__(self, data, role):
super().__init__()
self.setupUi(self)
self.data = data
self.name_product.setText(f'Имя товара: {data["name_product"]} / Категория: {data["name_category"]}')
self.desc_product.setText(f'Описание: {data["description_product"]}')
self.manufacturer_product.setText(f'Производитель: {data["name_manufacturer"]}')
self.delievery_product.setText(f'Поставщик: {data["name_provider"]}')
self.old_price_product.setText(f'<s style = "color: red"> {data["price_product"]} руб </s>')
new_price = float(data["price_product"]) * (1 - data["sale_product"] / 100)
self.new_price_product.setText(f'{new_price} руб')
self.unit_product.setText(f'Единица измерения: {data["name_unit"]}')
self.col_sklad_product.setText(f'Количество на складе: {str(data["count_in_stock_product"])}')
sale = data.get('sale_product')
if sale and int(sale) > 0:
self.sale_product.setText(f'Скидка - {sale}%')
if int(sale) > 15:
self.setStyleSheet('background-color: green')
else:
self.sale_product.setText('')
photo = data.get("photo_product")
pix = QtGui.QPixmap(f'resources/icons/{photo}')
pix2 = QtGui.QPixmap(f'resources/icons/picture.jpg')
if photo and not pix.isNull():
self.photo_product.setPixmap(pix.scaled(150,150, QtCore.Qt.AspectRatioMode.KeepAspectRatio))
else:
self.photo_product.setPixmap(pix2.scaled(150, 150, QtCore.Qt.AspectRatioMode.KeepAspectRatio))
if role == "admin":
self.btn_to_redakt_item.clicked.connect(self.edit_info)
self.btn_to_delete_product.clicked.connect(self.delete_info)
else:
self.btn_to_redakt_item.hide()
self.btn_to_delete_product.hide()
self.btn_to_insert_product.hide()
def edit_info(self):
main_window = self.window()
self.main_win_edit = EditMain(self.data, main_window)
self.main_win_edit.show()
def delete_info(self):
reply = QtWidgets.QMessageBox.question(self, 'Удаление','Вы действительно хотите удалить товар?', QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No)
if reply == QtWidgets.QMessageBox.StandardButton.No:
return
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
try:
join = "DELETE FROM product WHERE id_product = %s"
cursor.execute(join,(self.data["id_product"],))
conn.commit()
except Exception as e:
QtWidgets.QMessageBox.warning(self,'Неверное удаление!', f'Нельзя удалить данный товар, так как он уже есть в заказах - {e}')
main_window = self.window()
if hasattr(main_window,'load_products'):
main_window.load_products()
except Exception as e:
print(f'Критическая ошибка - {e}')
class EditMain(QtWidgets.QMainWindow, EditUI):
def __init__(self, data, main_window):
super().__init__()
self.setupUi(self)
self.data = data
self.main_window = main_window
self.input_name.setText(str(data["name_product"]))
self.input_category.setText(str(data["name_category"]))
self.input_desc.setText(str(data["description_product"]))
self.input_unit.setText(str(data["name_unit"]))
self.input_sale.setText(str(data["sale_product"]))
self.input_delivery.setText(str(data["name_provider"]))
self.input_mafucaturer.setText(str(data["name_manufacturer"]))
self.input_col_in_sklad.setText(str(data["count_in_stock_product"]))
self.input_price.setText(str(data["price_product"]))
photo = data.get("photo_product")
self.current_photo = photo
pix = QtGui.QPixmap(f'resources/icons/{photo}')
pix2 = QtGui.QPixmap(f'resources/icons/picture.jpg')
if photo and not pix.isNull():
self.choosen_redakt_photo.setPixmap(pix.scaled(120, 120, QtCore.Qt.AspectRatioMode.KeepAspectRatio))
else:
self.choosen_redakt_photo.setPixmap(pix2.scaled(120, 120, QtCore.Qt.AspectRatioMode.KeepAspectRatio))
self.save_edit_item.clicked.connect(self.save_changed)
self.btn_choose_photo_redakt.clicked.connect(self.load_photo)
self.go_to_main_btn.clicked.connect(self.back_to_main)
def back_to_main(self):
self.close()
def save_changed(self):
name = self.input_name.text()
category = self.input_category.text()
desc = self.input_desc.text()
manufacturer = self.input_mafucaturer.text()
provider = self.input_delivery.text()
price = self.input_price.text()
unit = self.input_unit.text()
count = self.input_col_in_sklad.text()
sale = self.input_sale.text()
photo = self.current_photo
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
try:
join = """UPDATE product SET
name_product = %s,
id_category = (SELECT id_category FROM category WHERE name_category = %s LIMIT 1),
description_product = %s,
id_manufacturer = (SELECT id_manufacturer FROM manufacturer WHERE name_manufacturer = %s LIMIT 1),
id_provider = (SELECT id_provider FROM provider WHERE name_provider = %s LIMIT 1),
price_product = %s,
id_unit = (SELECT id_unit FROM unit WHERE name_unit = %s LIMIT 1),
count_in_stock_product = %s,
sale_product = %s,
photo_product = %s
WHERE id_product = %s"""
cursor.execute(join,(name,category,desc,manufacturer,provider,price,unit,count,sale,photo,self.data["id_product"]))
conn.commit()
self.main_window.load_products()
self.close()
except Exception as e:
QtWidgets.QMessageBox.warning(self,'Неверное редактирование', f'Нельзя редактировать некоторые поля заказа, которых нет в БД (например единицы измерения) - {e}')
except Exception as e:
print(f'Не удалось сохранить новые данные - {e}')
def load_photo(self):
filepath, _ = QtWidgets.QFileDialog.getOpenFileName(self,'Выбор фото','','Images: *.png *.jpg *.jpeg')
if filepath:
filename = os.path.basename(filepath)
shutil.copy(filepath, f'resources/icons/{filename}')
self.current_photo = filename
pix = QtGui.QPixmap(f'resources/icons/{filename}')
self.choosen_redakt_photo.setPixmap(pix.scaled(120,120,QtCore.Qt.AspectRatioMode.KeepAspectRatio))
class ProductMain(QtWidgets.QMainWindow, MainUI):
def __init__(self, role = "admin", guest = "Администратор"):
super().__init__()
self.setupUi(self)
self.user_role = role
self.user_name_lbl.setText(f'Пользователь - {guest}')
self.scrollArea.setWidgetResizable(True)
self.vbox = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
self.vbox.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
self.scrollArea_2.setWidgetResizable(True)
self.vbox_2 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2)
self.vbox_2.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
self.search_input.textEdited.connect(self.load_products)
self.sort_combo.currentIndexChanged.connect(self.load_products)
self.back_to_auth_btn.clicked.connect(self.go_to_auth)
if role == "client" or role == "guest":
self.sort_combo.hide()
self.search_input.hide()
self.tabWidget.removeTab(1)
self.load_products()
self.load_orders()
def go_to_auth(self):
from logic_auth import AuthApp
self.open_auth = AuthApp()
self.open_auth.show()
self.close()
def clear_vbox(self):
while self.vbox.count():
item = self.vbox.takeAt(0)
widget = item.widget()
if widget:
widget.deleteLater()
def clear_vbox_2(self):
while self.vbox_2.count():
item = self.vbox_2.takeAt(0)
widget = item.widget()
if widget:
widget.deleteLater()
def load_products(self):
self.clear_vbox()
search_text = self.search_input.text()
sort_combo = self.sort_combo.currentIndex()
join = """SELECT p.*,c.name_category, m.name_manufacturer, u.name_unit, pr.name_provider FROM product p
JOIN category c ON c.id_category = p.id_category
JOIN manufacturer m ON m.id_manufacturer = p.id_manufacturer
JOIN unit u ON u.id_unit = p.id_unit
JOIN provider pr ON pr.id_provider = p.id_provider
WHERE p.name_product LIKE %s OR p.description_product LIKE %s"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
pattern = f'%{search_text}%'
if sort_combo == 1:
join += " ORDER BY price_product ASC"
elif sort_combo == 2:
join += " ORDER BY price_product DESC"
cursor.execute(join,(pattern,pattern))
products = cursor.fetchall()
for p_data in products:
card = ProductItem(p_data, self.user_role)
self.vbox.addWidget(card)
except Exception as e:
print(f'Критическая ошибка - {e}')
def load_orders(self):
self.clear_vbox_2()
join = """SELECT o.*,os.name_order_status, pp.street_pickup_point FROM `order` o
JOIN order_status os ON os.id_order_status = o.id_order_status
JOIN pickup_point pp ON pp.id_pickup_point = o.id_pickup_point
"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
cursor.execute(join)
products = cursor.fetchall()
for p_data in products:
card = OrderItem(p_data, self.user_role)
self.vbox_2.addWidget(card)
except Exception as e:
print(f'Критическая ошибка - {e}')
class OrderItem(QtWidgets.QWidget, ItemOrderUI):
def __init__(self, data, role):
super().__init__()
self.setupUi(self)
self.data = data
self.article_order.setText(f'Артикл заказа - {str(data["receive_code_order"])}')
self.status_order.setText(f'Статус заказа - {data["name_order_status"]}')
self.adress_stock.setText(f'Адрес пункта выдачи - {data["street_pickup_point"]}')
self.date_order.setText(f'Дата заказа - {str(data["date_order"])}')
self.date_delivery.setText(f'Дата доставки - {str(data["delivery_date_order"])}')
self.btn_to_redakt_order.clicked.connect(self.edit_order)
self.btn_to_delete_order.clicked.connect(self.delete_order)
if role == "client" or role == "guest":
self.btn_to_delete_order.hide()
self.btn_to_redakt_order.hide()
self.btn_to_insert_order.hide()
def edit_order(self):
main_window = self.window()
self.main_win_edit = EditOrder(self.data, main_window)
self.main_win_edit.show()
def delete_order(self):
reply = QtWidgets.QMessageBox.question(self, 'Удаление','Вы действительно хотите удалить товар?', QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No)
if reply == QtWidgets.QMessageBox.StandardButton.No:
return
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
try:
join = "DELETE FROM `order` WHERE id_order = %s"
cursor.execute(join,(self.data["id_order"],))
conn.commit()
except Exception as e:
QtWidgets.QMessageBox.warning(self,'Неверное удаление!', f'Нельзя удалить данный товар, так как он уже есть в заказах - {e}')
main_window = self.window()
if hasattr(main_window,'load_orders'):
main_window.load_orders()
except Exception as e:
print(f'Критическая ошибка - {e}')
class EditOrder(QtWidgets.QMainWindow, EditOrdersUI):
def __init__(self, data, main_window):
super().__init__()
self.setupUi(self)
self.data = data
self.main_window = main_window
self.input_article_order.setText(str(data["receive_code_order"]))
self.input_status_order.setText(str(data["name_order_status"]))
self.input_adress_stock_order.setText(str(data["street_pickup_point"]))
self.input_date_order.setText(str(data["date_order"]))
self.input_delivery.setText(str(data["delivery_date_order"]))
self.save_edit_item.clicked.connect(self.save_changed)
self.go_to_main_btn.clicked.connect(self.back_to_main)
def back_to_main(self):
self.close()
def save_changed(self):
article = self.input_article_order.text()
status = self.input_status_order.text()
adress = self.input_adress_stock_order.text()
date_order = self.input_date_order.text()
delivery = self.input_delivery.text()
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
try:
join = """UPDATE `order` SET
receive_code_order = %s,
id_order_status = (SELECT id_order_status FROM order_status WHERE name_order_status = %s LIMIT 1),
id_pickup_point = (SELECT id_pickup_point FROM pickup_point WHERE street_pickup_point = %s LIMIT 1),
date_order = %s,
delivery_date_order = %s
WHERE id_order = %s"""
cursor.execute(join,(article, status, adress, date_order, delivery ,self.data["id_order"]))
conn.commit()
self.main_window.load_orders()
self.close()
except Exception as e:
QtWidgets.QMessageBox.warning(self,'Неверное редактирование', f'Нельзя редактировать некоторые поля заказа, которых нет в БД (например адрес пункта выдачи) - {e}')
except Exception as e:
print(f'Критическая ошибка - {e}')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = ProductMain()
window.show()
sys.exit(app.exec())