Загрузка данных


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())