Integrate claude, improve selenium and support qemu #1

Open
mathben wants to merge 224 commits from develop into master
2 changed files with 33 additions and 14 deletions
Showing only changes of commit 25cc780005 - Show all commits

View file

@ -453,33 +453,36 @@ def run_deploy_form(ctx, run_app: bool = True):
t("Disk"), t("Disk"),
t("Status"), t("Status"),
) )
self._reload_catalog(select_defaults=True) self._reload_catalog(first_load=True)
# -- catalogue et recalcul ------------------------------------- # # -- catalogue et recalcul ------------------------------------- #
def _entries(self): def _entries(self):
return catalog.get(self.arch, []) return catalog.get(self.arch, [])
def _reload_catalog(self, select_defaults=False): def _reload_catalog(self, first_load=False):
"""Recharge la liste à cocher après un changement d'architecture. """(Re)charge la liste à cocher.
Les cases cochées sont conservées quand la même entrée existe
encore (l'identité est (distro, version, arch), pas le rang).""" RIEN n'est coché d'avance : déployer coûte cher, et une case
pré-cochée ferait créer une VM que personne n'a demandée. Le « * »
marque toujours la version principale, et F7 les coche toutes.
Après un changement d'architecture, les cases déjà cochées sont
conservées quand l'entrée existe encore — l'identité est
(distro, version, archi), pas le rang dans la liste."""
widget = self.query_one("#f_catalog", SelectionList) widget = self.query_one("#f_catalog", SelectionList)
keep = set() keep = (
if not select_defaults: set()
keep = { if first_load
else {
entry_key(self._entries_before[i]) entry_key(self._entries_before[i])
for i in widget.selected for i in widget.selected
if i < len(self._entries_before) if i < len(self._entries_before)
} }
)
widget.clear_options() widget.clear_options()
entries = self._entries() entries = self._entries()
for i, e in enumerate(entries): for i, e in enumerate(entries):
on = ( widget.add_option((entry_label(e), i, entry_key(e) in keep))
e.get("default", False)
if select_defaults
else (entry_key(e) in keep)
)
widget.add_option((entry_label(e), i, on))
self._entries_before = entries self._entries_before = entries
self._recompute() self._recompute()
@ -525,6 +528,14 @@ def run_deploy_form(ctx, run_app: bool = True):
f"{r['disk_gb']}G", f"{r['disk_gb']}G",
f"{icon}{r['note']}", f"{icon}{r['note']}",
) )
if not self.rows:
# Rien de coché : un total à zéro n'apprend rien, on dit
# plutôt comment remplir la liste.
self.query_one("#totals", Static).update(
f" {t('Tick what to deploy')} — "
f"{t('F7 main versions · F6 all')}"
)
return
n, cpus, ram, disk = plan_totals(self.rows) n, cpus, ram, disk = plan_totals(self.rows)
warn = "" warn = ""
if free_ram and ram > free_ram: if free_ram and ram > free_ram:

View file

@ -1475,6 +1475,14 @@ TRANSLATIONS = {
"fr": "toutes", "fr": "toutes",
"en": "all", "en": "all",
}, },
"Tick what to deploy": {
"fr": "Cocher ce qu'on veut déployer",
"en": "Tick what to deploy",
},
"F7 main versions · F6 all": {
"fr": "F7 versions principales · F6 tout",
"en": "F7 main versions · F6 all",
},
"exists - skipped": { "exists - skipped": {
"fr": "existe — ignorée", "fr": "existe — ignorée",
"en": "exists - skipped", "en": "exists - skipped",