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


from PyQt6.QtWidgets import *
from PyQt6.QtGui import QPixmap
from PyQt6.QtCore import Qt

from database import get_connection


class Window(QWidget):

    def __init__(self):
        super().__init__()

        self.setWindowTitle("Фотографии пользователей")
        self.resize(700, 600)

        # Главный вертикальный layout
        self.main_layout = QVBoxLayout(self)

        # Область прокрутки
        self.scroll = QScrollArea()
        self.scroll.setWidgetResizable(True)

        # Контейнер для карточек
        self.container = QWidget()
        self.users_layout = QVBoxLayout(self.container)

        self.scroll.setWidget(self.container)

        self.main_layout.addWidget(self.scroll)

        # Загружаем пользователей
        self.load_users()


    # Удаление старых карточек
    def clear_layout(self):

        while self.users_layout.count():

            item = self.users_layout.takeAt(0)

            if item.widget():
                item.widget().deleteLater()


    # Загрузка пользователей из базы
    def load_users(self):

        self.clear_layout()

        connection = None

        try:

            connection = get_connection()

            with connection.cursor() as cursor:

                cursor.execute("SELECT * FROM users")

                users = cursor.fetchall()


            # Создаём карточку для каждого пользователя
            for user in users:

                # Карточка
                frame = QFrame()
                frame.setFrameShape(QFrame.Shape.Box)

                card_layout = QHBoxLayout(frame)


                # Блок с текстом
                text_layout = QVBoxLayout()

                text_layout.addWidget(
                    QLabel(f"Имя: {user['first_name']}")
                )

                text_layout.addWidget(
                    QLabel(f"Фамилия: {user['last_name']}")
                )

                text_layout.addWidget(
                    QLabel(f"Логин: {user['login']}")
                )


                # Место для фотографии
                photo = QLabel()

                photo.setFixedSize(120, 120)

                photo.setAlignment(
                    Qt.AlignmentFlag.AlignCenter
                )


                # Проверяем, есть ли фотография
                if user["photo"]:

                    pixmap = QPixmap(user["photo"])

                    if not pixmap.isNull():

                        photo.setPixmap(
                            pixmap.scaled(
                                120,
                                120,
                                Qt.AspectRatioMode.KeepAspectRatio
                            )
                        )

                    else:
                        photo.setText("Фото не найдено")

                else:

                    photo.setText("Нет фотографии")


                # Кнопка выбора фотографии
                photo_button = QPushButton("Выбрать фото")


                # Передаём ID конкретного пользователя
                photo_button.clicked.connect(
                    lambda checked, user_id=user["id"]:
                    self.select_photo(user_id)
                )


                # Добавляем кнопку и фотографию в карточку
                text_layout.addWidget(photo_button)

                card_layout.addLayout(text_layout)

                card_layout.addWidget(photo)


                # Добавляем карточку в общий список
                self.users_layout.addWidget(frame)


            if not users:

                self.users_layout.addWidget(
                    QLabel("Пользователи не найдены")
                )


        except Exception as e:

            QMessageBox.critical(
                self,
                "Ошибка",
                f"Ошибка загрузки пользователей:\n{e}"
            )

        finally:

            if connection:
                connection.close()


    # Выбор и сохранение фотографии
    def select_photo(self, user_id):

        # Открываем окно выбора файла
        path, _ = QFileDialog.getOpenFileName(
            self,
            "Выберите фотографию",
            "",
            "Изображения (*.png *.jpg *.jpeg *.bmp)"
        )


        # Если пользователь нажал Отмена
        if not path:
            return


        connection = None

        try:

            connection = get_connection()

            with connection.cursor() as cursor:

                sql = """
                    UPDATE users
                    SET photo = %s
                    WHERE id = %s
                """

                cursor.execute(sql, (path, user_id))

                connection.commit()


            QMessageBox.information(
                self,
                "Успех",
                "Фотография успешно сохранена!"
            )


            # Обновляем карточки
            self.load_users()


        except Exception as e:

            QMessageBox.critical(
                self,
                "Ошибка",
                f"Не удалось сохранить фотографию:\n{e}"
            )

        finally:

            if connection:
                connection.close()


# Запуск программы
app = QApplication([])

window = Window()

window.show()

app.exec()