From 5034067fd92f37fc08a90b0f72748120bb61598c Mon Sep 17 00:00:00 2001 From: Hirad Date: Fri, 24 Jan 2025 13:36:02 +0330 Subject: [PATCH] add table and image status --- natalie.py | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/natalie.py b/natalie.py index 407d8f3..3db394f 100644 --- a/natalie.py +++ b/natalie.py @@ -1,12 +1,14 @@ import sys -from PyQt6.QtWidgets import (QApplication, QListWidgetItem) +from PyQt6.QtWidgets import (QApplication, QListWidgetItem, QTableWidgetItem) from PyQt6.QtCore import Qt from portainer_api import PortainerService -from gui.portainer_ui import PortainerUi from config.settings import PortainerConfig +from gui.portainer_ui import PortainerUi +from gui.dialog_box_ui import DialogBox from gui.workers.load_stacks_worker import LoadStacksWorker from gui.workers.load_endpoints_worker import LoadEndpointsWorker +from gui.workers.load_container_image_status_worker import LoadContainerImageStatusWorker from utils.date_converter import datetime_from_timestamp from utils.endpoint_converter import endpoint_id_to_name_converter @@ -15,6 +17,8 @@ from utils.endpoint_converter import endpoint_id_to_name_converter class Natalie(PortainerUi): def __init__(self, portainer_url, portainer_token): super().__init__() + self.image_status_worker = None + self.stack_webhook = None self.endpoints_list = None self.main_window.resize(800, 600) self.portainer = PortainerService(portainer_url, portainer_token) @@ -27,10 +31,10 @@ class Natalie(PortainerUi): self.stacks_worker.error_occurred.connect(self.error_occurred) self.stacks_worker.start() self.stacks_list.itemClicked.connect(self.load_stack) + self.update.clicked.connect(self.update_stack) def load_endpoints(self, endpoints): self.endpoints_list = endpoints - print(self.endpoints_list) self.combo_box.clear() self.combo_box.addItem("All") for endpoint in endpoints: @@ -45,14 +49,40 @@ class Natalie(PortainerUi): self.stacks_list.addItem(item) def load_stack(self, item): + self.containers_table.setRowCount(0) + self.containers_table.clearContents() + self.progress_bar.setRange(0, 0) + self.progress_bar.show() data = item.data(Qt.ItemDataRole.UserRole) - print(data) self.stack_name_label.setText(data['name']) - self.endpoint_label.setText(endpoint_id_to_name_converter(self.endpoints_list, data['endpoint_id'])) + endpoint_id = data['endpoint_id'] + self.endpoint_label.setText(endpoint_id_to_name_converter(self.endpoints_list, endpoint_id)) self.created_by_label.setText(data['created_by']) self.creation_date_label.setText(datetime_from_timestamp(data['creation_date'])) self.updated_by_label.setText(data['updated_by']) self.update_date_label.setText(datetime_from_timestamp(data['update_date'])) + self.stack_webhook = data['webhook'] + containers = self.portainer.containers.list_containers_of_stack(endpoint_id, data['name']) + self.containers_table.setRowCount(len(containers)) + for i, container in enumerate(containers): + self.image_status_worker = LoadContainerImageStatusWorker(self.portainer, endpoint_id, container['id']) + self.containers_table.setItem(i, 0, QTableWidgetItem(container['name'])) + self.containers_table.setItem(i, 1, QTableWidgetItem(container['image'])) + self.containers_table.setItem(i, 2, QTableWidgetItem(container['status'])) + self.containers_table.setItem(i, 3, QTableWidgetItem('Loading...')) + image_status_worker = LoadContainerImageStatusWorker(self.portainer, endpoint_id, container['id']) + image_status_worker.image_status_retrieved.connect(lambda status, row=i: self.update_image_status(row, status)) + image_status_worker.start() + self.image_status_worker = image_status_worker + self.progress_bar.hide() + + def update_image_status(self, row, status): + self.containers_table.setItem(row, 3, QTableWidgetItem(status)) + + def update_stack(self): + self.portainer.stacks.update_stack(self.stack_webhook) + dialog_box = DialogBox("Update Stack", "Stack updated successfully.") + dialog_box.exec() def error_occurred(self, error_message): print(f"Error occurred: {error_message}")