From df598ef183768869a899255b956fad2c844128dd Mon Sep 17 00:00:00 2001 From: Louis Mazin Date: Tue, 19 Aug 2025 20:12:30 +0200 Subject: [PATCH] update full manage --- app/core/update_manager.py | 35 +++++++++++++++++++++++++++-------- app/ui/widgets/loading_bar.py | 20 ++++++++++++++++++++ config.json | 4 ++-- data/lang/en.json | 4 +++- data/lang/fr.json | 4 +++- 5 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 app/ui/widgets/loading_bar.py diff --git a/app/core/update_manager.py b/app/core/update_manager.py index 118e06e..f76d6a2 100644 --- a/app/core/update_manager.py +++ b/app/core/update_manager.py @@ -1,9 +1,11 @@ import requests from packaging import version -from PyQt6.QtWidgets import QFileDialog +from PyQt6.QtWidgets import QApplication +from PyQt6.QtWidgets import QFileDialog, QDialog, QVBoxLayout from app.core.alert_manager import AlertManager from app.core.settings_manager import SettingsManager from app.core.language_manager import LanguageManager +from app.ui.widgets.loading_bar import LoadingBar import os import sys import subprocess @@ -17,7 +19,6 @@ class UpdateManager: self.app_name = self.settings_manager.get_config("app_name").replace(" ","_") self.app_os = self.settings_manager.get_config("app_os") self.arch = self.settings_manager.get_config("architecture") - self.extension = "exe" if self.app_os.lower() == "windows" else "AppImage" # adapte selon OS def get_latest_release_with_asset(self) -> dict: # Récupère la release la plus récente qui contient le bon fichier @@ -33,10 +34,10 @@ class UpdateManager: resp = requests.get(api_url) releases = resp.json() # Cherche le bon asset dans chaque release - expected_filename = f"{self.app_name}-{self.app_os}-{self.arch}.{self.extension}" + expected_filename = f"{self.app_name}-{self.app_os}-{self.arch}" for release in releases: for asset in release.get("assets", []): - if asset.get("name", "") == expected_filename: + if expected_filename in asset.get("name", ""): return { "tag_name": release.get("tag_name"), "download_url": asset.get("browser_download_url") @@ -56,18 +57,36 @@ class UpdateManager: if choice: folder = QFileDialog.getExistingDirectory(parent, self.language_manager.get_text("choose_update_folder")) if folder: - self.download(release["download_url"], folder, parent) + self.download(release["download_url"], release["tag_name"], folder, parent) return True return False - def download(self, download_url, folder, parent=None): + def download(self, download_url, version, folder, parent=None): try: - filename = os.path.basename(download_url) + filename = os.path.basename(download_url).replace(".", "-" +version + ".") local_path = os.path.join(folder, filename) resp = requests.get(download_url, stream=True) + total = int(resp.headers.get('content-length', 0)) + + # Crée une boîte de dialogue avec la barre de chargement + dialog = QDialog(parent) + dialog.setWindowTitle(self.language_manager.get_text("update")) + layout = QVBoxLayout(dialog) + loading_bar = LoadingBar(self.language_manager.get_text("downloading_update"), dialog) + layout.addWidget(loading_bar) + dialog.setModal(True) + dialog.show() + + downloaded = 0 with open(local_path, "wb") as f: for chunk in resp.iter_content(chunk_size=8192): - f.write(chunk) + if chunk: + f.write(chunk) + downloaded += len(chunk) + percent = int(downloaded * 100 / total) if total else 0 + loading_bar.set_progress(percent) + QApplication.processEvents() + dialog.close() msg = self.language_manager.get_text("update_downloaded").replace("{local_path}", local_path) self.alert_manager.show_success(msg, parent=parent) # Ouvre le fichier téléchargé diff --git a/app/ui/widgets/loading_bar.py b/app/ui/widgets/loading_bar.py new file mode 100644 index 0000000..bfc61b3 --- /dev/null +++ b/app/ui/widgets/loading_bar.py @@ -0,0 +1,20 @@ +from PyQt6.QtWidgets import QProgressBar, QWidget, QVBoxLayout, QLabel +from PyQt6.QtCore import Qt + +class LoadingBar(QWidget): + def __init__(self, label_text: str = "", parent=None) -> None: + super().__init__(parent) + layout = QVBoxLayout(self) + layout.setAlignment(Qt.AlignmentFlag.AlignCenter) + self.label = QLabel(label_text, self) + self.progress = QProgressBar(self) + self.progress.setMinimum(0) + self.progress.setMaximum(100) + layout.addWidget(self.label) + layout.addWidget(self.progress) + + def set_label(self, text: str) -> None: + self.label.setText(text) + + def set_progress(self, value: int) -> None: + self.progress.setValue(value) diff --git a/config.json b/config.json index 92ba29b..7ee62ea 100644 --- a/config.json +++ b/config.json @@ -1,10 +1,10 @@ { - "app_name": "Application", + "app_name": "HoDA", "python_version": "3.11.7", "app_os": "Windows", "app_version": "1.0.0", "architecture": "x64", "icon_path": "data/assets/icon.ico", "main_script": "main.py", - "git_repo": "https://gitea.louismazin.ovh/LouisMazin/PythonApplicationTemplate" + "git_repo": "https://gitea.louismazin.ovh/LouisMazin/HoDA" } \ No newline at end of file diff --git a/data/lang/en.json b/data/lang/en.json index 338b7d5..2dad60b 100644 --- a/data/lang/en.json +++ b/data/lang/en.json @@ -21,5 +21,7 @@ "update_found": "New version available: {latest_tag} \nDo you want to install the update?", "choose_update_folder": "Choose destination folder", "update_downloaded": "Update downloaded to {local_path}", - "update_download_error": "Error downloading update" + "update_download_error": "Error downloading update", + "downloading_update": "Downloading update...", + "update": "Update" } \ No newline at end of file diff --git a/data/lang/fr.json b/data/lang/fr.json index 606f2c5..f8dcd5c 100644 --- a/data/lang/fr.json +++ b/data/lang/fr.json @@ -21,5 +21,7 @@ "update_found": "Nouvelle version disponible : {latest_tag} \nVoulez-vous installer la mise à jour ?", "choose_update_folder": "Choisissez le dossier de destination", "update_downloaded": "Mise à jour téléchargée dans {local_path}", - "update_download_error": "Erreur lors du téléchargement de la mise à jour" + "update_download_error": "Erreur lors du téléchargement de la mise à jour", + "downloading_update": "Téléchargement de la mise à jour...", + "update": "Mise à jour" } \ No newline at end of file