Skip to content

Commit

Permalink
FIX: Translations
Browse files Browse the repository at this point in the history
  • Loading branch information
amilcarlucas committed Jan 24, 2025
1 parent 8331dd3 commit 00755c7
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 27 deletions.
18 changes: 15 additions & 3 deletions ardupilot_methodic_configurator/backend_internet.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
import os
import subprocess
import tempfile
from datetime import datetime, timezone
from logging import error as logging_error
from logging import info as logging_info
from pathlib import Path
from typing import Any, Callable, Optional
from urllib.parse import urljoin

from requests import HTTPError as requests_HTTPError
from requests import RequestException as requests_RequestException
from requests import Timeout as requests_Timeout
from requests import get as requests_get
Expand Down Expand Up @@ -71,10 +73,11 @@ def download_file_from_url( # noqa: PLR0911 pylint: disable=too-many-return-sta
downloaded += len(chunk)
if progress_callback and total_size:
progress = (downloaded / total_size) * 100
progress_callback(progress, f"Downloading... {progress:.1f}%")
msg = _("Downloading ... {:.1f}%")
progress_callback(progress, msg.format(progress))

if progress_callback:
progress_callback(100.0, "Download complete")
progress_callback(100.0, _("Download complete"))
return True

except requests_Timeout:
Expand Down Expand Up @@ -127,6 +130,15 @@ def get_release_info(name: str, should_be_pre_release: bool, timeout: int = 30)

return release_info # type: ignore[no-any-return]

except requests_HTTPError as e:
if e.response.status_code == 403:
logging_error(_("Failed to fetch release info: {}").format(e))
# Get the rate limit reset time
reset_time = int(e.response.headers.get("X-RateLimit-Reset", 0))
# Create a timezone-aware UTC datetime
reset_datetime = datetime.fromtimestamp(reset_time, timezone.utc).strftime("%Y-%m-%d %H:%M:%S %Z")
logging_error(_("Rate limit exceeded. Please try again after: %s (UTC)"), reset_datetime)
raise
except RequestException as e:
logging_error(_("Failed to fetch release info: {}").format(e))
raise
Expand Down Expand Up @@ -160,7 +172,7 @@ def download_and_install_on_windows(
return False

if progress_callback:
progress_callback(100.0, "Starting installation...")
progress_callback(100.0, _("Starting installation..."))

# Run installer
result = subprocess.run( # noqa: S603
Expand Down
25 changes: 13 additions & 12 deletions ardupilot_methodic_configurator/frontend_tkinter_software_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,25 @@
from tkinter import ttk
from typing import Callable, Optional

from ardupilot_methodic_configurator import _, __version__


class UpdateDialog: # pylint: disable=too-many-instance-attributes
"""Dialog for displaying software update information and handling user interaction."""

def __init__(
self, version_info: str, download_callback: Optional[Callable[[], bool]] = None
) -> None:
def __init__(self, version_info: str, download_callback: Optional[Callable[[], bool]] = None) -> None:
self.root = tk.Tk()
self.root.title("Software Update")
self.root.title(_("Amilcar Lucas's - ArduPilot methodic configurator ") + __version__ + _(" - Update Software"))
self.download_callback = download_callback
self.root.protocol("WM_DELETE_WINDOW", self.on_cancel)

self.frame = ttk.Frame(self.root, padding="20")
self.frame.grid(sticky="nsew")

self.msg = ttk.Label(self.frame, text=version_info, wraplength=450, justify="left")
self.msg = ttk.Label(self.frame, text=version_info, wraplength=650, justify="left")
self.msg.grid(row=0, column=0, columnspan=2, pady=20)

self.progress = ttk.Progressbar(self.frame, orient="horizontal", length=300, mode="determinate")
self.progress = ttk.Progressbar(self.frame, orient="horizontal", length=400, mode="determinate")
self.progress.grid(row=1, column=0, columnspan=2, pady=10, padx=10)
self.progress.grid_remove()

Expand All @@ -41,8 +41,8 @@ def __init__(
self._setup_buttons()

def _setup_buttons(self) -> None:
self.yes_btn = ttk.Button(self.frame, text="Update Now", command=self.on_yes)
self.no_btn = ttk.Button(self.frame, text="Not Now", command=self.on_no)
self.yes_btn = ttk.Button(self.frame, text=_("Update Now"), command=self.on_yes)
self.no_btn = ttk.Button(self.frame, text=_("Not Now"), command=self.on_no)
self.yes_btn.grid(row=3, column=0, padx=5)
self.no_btn.grid(row=3, column=1, padx=5)

Expand All @@ -54,7 +54,6 @@ def update_progress(self, value: float, status: str = "") -> None:
self.root.update()

def on_yes(self) -> None:
self.result = True
self.progress.grid()
self.status_label.grid()
self.yes_btn.config(state="disabled")
Expand All @@ -63,12 +62,14 @@ def on_yes(self) -> None:
if self.download_callback:
success = self.download_callback()
if success:
self.status_label["text"] = "Update complete! Please restart the application."
self.root.after(2000, self.root.destroy)
self.status_label["text"] = _("Update complete! Please restart the application.")
self.result = True
else:
self.status_label["text"] = "Update failed!"
self.status_label["text"] = _("Update failed!")
self.yes_btn.config(state="normal")
self.no_btn.config(state="normal")
self.result = False
self.root.after(2000, self.root.destroy)

def on_no(self) -> None:
self.result = False
Expand Down
36 changes: 24 additions & 12 deletions ardupilot_methodic_configurator/middleware_software_updates.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,16 @@
from ardupilot_methodic_configurator.frontend_tkinter_software_update import UpdateDialog


def format_version_info(current_version_str: str, latest_release: dict[str, Any]) -> str:
def format_version_info(_current_version: str, _latest_release: str, _changes: str) -> str:
return (
f"New version available!\n\n"
f"Current version: {current_version_str}\n"
f"Latest version: {latest_release['tag_name']}\n\n"
f"Changes:\n{latest_release.get('body', 'No changes listed')}"
)
_("New version available!")
+ "\n\n"
+ _("Current version: {_current_version}")
+ "\n"
+ _("Latest version: {_latest_release}")
+ "\n\n"
+ _("Changes:\n{_changes}")
).format(**locals())


class UpdateManager: # pylint: disable=too-few-public-methods
Expand All @@ -53,7 +56,7 @@ def _perform_download(self, latest_release: dict[str, Any]) -> bool:
return download_and_install_on_windows(
download_url=download_url,
file_name=file_name,
progress_callback=self.dialog.update_progress if self.dialog else None
progress_callback=self.dialog.update_progress if self.dialog else None,
)
return download_and_install_pip_release() == 0

Expand All @@ -64,15 +67,24 @@ def check_and_update(self, latest_release: dict[str, Any], current_version_str:
logging_info(_("Already running latest version."))
return True

version_info = format_version_info(current_version_str, latest_release)
version_info = format_version_info(
current_version_str, latest_version, latest_release.get("body", _("No changes listed"))
)
self.dialog = UpdateDialog(version_info, download_callback=lambda: self._perform_download(latest_release))
return self.dialog.show()

except Exception as e:
logging_error(_("Update process failed: %s"), e)
except KeyError as ke:
logging_error(_("Key error during update process: %s"), ke)
return False
except requests_RequestException as req_ex:
logging_error(_("Network error during update process: %s"), req_ex)
return False
except ValueError as val_ex:
logging_error(_("Value error during update process: %s"), val_ex)
return False


def main() -> None:
def check_for_software_updates() -> None:
"""Main update orchestration function."""
git_hash = LocalFilesystem.get_git_commit_hash()

Expand All @@ -96,4 +108,4 @@ def main() -> None:
" called from another script"
)
)
main()
check_for_software_updates()

0 comments on commit 00755c7

Please sign in to comment.