update full manage
This commit is contained in:
parent
7ae16570d5
commit
df598ef183
@ -1,9 +1,11 @@
|
|||||||
import requests
|
import requests
|
||||||
from packaging import version
|
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.alert_manager import AlertManager
|
||||||
from app.core.settings_manager import SettingsManager
|
from app.core.settings_manager import SettingsManager
|
||||||
from app.core.language_manager import LanguageManager
|
from app.core.language_manager import LanguageManager
|
||||||
|
from app.ui.widgets.loading_bar import LoadingBar
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -17,7 +19,6 @@ class UpdateManager:
|
|||||||
self.app_name = self.settings_manager.get_config("app_name").replace(" ","_")
|
self.app_name = self.settings_manager.get_config("app_name").replace(" ","_")
|
||||||
self.app_os = self.settings_manager.get_config("app_os")
|
self.app_os = self.settings_manager.get_config("app_os")
|
||||||
self.arch = self.settings_manager.get_config("architecture")
|
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:
|
def get_latest_release_with_asset(self) -> dict:
|
||||||
# Récupère la release la plus récente qui contient le bon fichier
|
# 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)
|
resp = requests.get(api_url)
|
||||||
releases = resp.json()
|
releases = resp.json()
|
||||||
# Cherche le bon asset dans chaque release
|
# 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 release in releases:
|
||||||
for asset in release.get("assets", []):
|
for asset in release.get("assets", []):
|
||||||
if asset.get("name", "") == expected_filename:
|
if expected_filename in asset.get("name", ""):
|
||||||
return {
|
return {
|
||||||
"tag_name": release.get("tag_name"),
|
"tag_name": release.get("tag_name"),
|
||||||
"download_url": asset.get("browser_download_url")
|
"download_url": asset.get("browser_download_url")
|
||||||
@ -56,18 +57,36 @@ class UpdateManager:
|
|||||||
if choice:
|
if choice:
|
||||||
folder = QFileDialog.getExistingDirectory(parent, self.language_manager.get_text("choose_update_folder"))
|
folder = QFileDialog.getExistingDirectory(parent, self.language_manager.get_text("choose_update_folder"))
|
||||||
if folder:
|
if folder:
|
||||||
self.download(release["download_url"], folder, parent)
|
self.download(release["download_url"], release["tag_name"], folder, parent)
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def download(self, download_url, folder, parent=None):
|
def download(self, download_url, version, folder, parent=None):
|
||||||
try:
|
try:
|
||||||
filename = os.path.basename(download_url)
|
filename = os.path.basename(download_url).replace(".", "-" +version + ".")
|
||||||
local_path = os.path.join(folder, filename)
|
local_path = os.path.join(folder, filename)
|
||||||
resp = requests.get(download_url, stream=True)
|
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:
|
with open(local_path, "wb") as f:
|
||||||
for chunk in resp.iter_content(chunk_size=8192):
|
for chunk in resp.iter_content(chunk_size=8192):
|
||||||
|
if chunk:
|
||||||
f.write(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)
|
msg = self.language_manager.get_text("update_downloaded").replace("{local_path}", local_path)
|
||||||
self.alert_manager.show_success(msg, parent=parent)
|
self.alert_manager.show_success(msg, parent=parent)
|
||||||
# Ouvre le fichier téléchargé
|
# Ouvre le fichier téléchargé
|
||||||
|
20
app/ui/widgets/loading_bar.py
Normal file
20
app/ui/widgets/loading_bar.py
Normal file
@ -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)
|
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"app_name": "Application",
|
"app_name": "HoDA",
|
||||||
"python_version": "3.11.7",
|
"python_version": "3.11.7",
|
||||||
"app_os": "Windows",
|
"app_os": "Windows",
|
||||||
"app_version": "1.0.0",
|
"app_version": "1.0.0",
|
||||||
"architecture": "x64",
|
"architecture": "x64",
|
||||||
"icon_path": "data/assets/icon.ico",
|
"icon_path": "data/assets/icon.ico",
|
||||||
"main_script": "main.py",
|
"main_script": "main.py",
|
||||||
"git_repo": "https://gitea.louismazin.ovh/LouisMazin/PythonApplicationTemplate"
|
"git_repo": "https://gitea.louismazin.ovh/LouisMazin/HoDA"
|
||||||
}
|
}
|
@ -21,5 +21,7 @@
|
|||||||
"update_found": "New version available: {latest_tag} \nDo you want to install the update?",
|
"update_found": "New version available: {latest_tag} \nDo you want to install the update?",
|
||||||
"choose_update_folder": "Choose destination folder",
|
"choose_update_folder": "Choose destination folder",
|
||||||
"update_downloaded": "Update downloaded to {local_path}",
|
"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"
|
||||||
}
|
}
|
@ -21,5 +21,7 @@
|
|||||||
"update_found": "Nouvelle version disponible : {latest_tag} \nVoulez-vous installer la mise à jour ?",
|
"update_found": "Nouvelle version disponible : {latest_tag} \nVoulez-vous installer la mise à jour ?",
|
||||||
"choose_update_folder": "Choisissez le dossier de destination",
|
"choose_update_folder": "Choisissez le dossier de destination",
|
||||||
"update_downloaded": "Mise à jour téléchargée dans {local_path}",
|
"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"
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user