gui/mozregui/global_prefs.py (99 lines of code) (raw):
import os
from configobj import ConfigObj
from glean import Glean
from PySide6.QtWidgets import QDialog
from mozregression.config import ARCHIVE_BASE_URL, DEFAULT_CONF_FNAME, get_config
from mozregression.network import set_http_session
from mozregui.ui.global_prefs import Ui_GlobalPrefs
def get_prefs():
"""
Return the global prefs as a dict.
"""
settings = get_config(DEFAULT_CONF_FNAME)
options = dict()
options["persist"] = settings["persist"]
options["http_timeout"] = float(settings["http-timeout"])
options["persist_size_limit"] = float(settings["persist-size-limit"])
options["background_downloads"] = (
False if settings.get("background_downloads") == "no" else True
)
options["approx_policy"] = settings["approx-policy"] == "auto"
options["archive_base_url"] = settings["archive-base-url"]
options["cmdargs"] = settings["cmdargs"]
options["enable_telemetry"] = not settings.get("enable-telemetry") in ["no", "0", "false"]
return options
def save_prefs(options):
conf_dir = os.path.dirname(DEFAULT_CONF_FNAME)
if not os.path.isdir(conf_dir):
os.makedirs(conf_dir)
settings = ConfigObj(DEFAULT_CONF_FNAME)
settings.update(
{
"persist": options["persist"] or "",
"http-timeout": options["http_timeout"],
"persist-size-limit": options["persist_size_limit"],
"background_downloads": "yes" if options["background_downloads"] else "no",
"approx-policy": "auto" if options["approx_policy"] else "none",
"enable-telemetry": "yes" if options["enable_telemetry"] else "no",
}
)
# only save base url in the file if it differs from the default.
if options["archive_base_url"] and options["archive_base_url"] != ARCHIVE_BASE_URL:
settings["archive-base-url"] = options["archive_base_url"]
elif "archive-base-url" in settings:
del settings["archive-base-url"]
# likewise only save args if it has a value
if "cmdargs" in settings and not settings["cmdargs"]:
del settings["cmdargs"]
settings.write()
def set_default_prefs():
"""Set the default prefs for a first launch of the application."""
if not os.path.isfile(DEFAULT_CONF_FNAME):
options = get_prefs()
options["persist"] = os.path.join(os.path.dirname(DEFAULT_CONF_FNAME), "persist")
options["persist_size_limit"] = 2.0
save_prefs(options)
def apply_prefs(options):
set_http_session(get_defaults={"timeout": options["http_timeout"]})
# persist options have to be passed in the bisection, not handled here.
class ChangePrefsDialog(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
self.ui = Ui_GlobalPrefs()
self.ui.setupUi(self)
# set default values
options = get_prefs()
self.ui.persist.line_edit.setText(options["persist"] or "")
self.ui.http_timeout.setValue(options["http_timeout"])
self.ui.persist_size_limit.setValue(options["persist_size_limit"])
self.ui.bg_downloads.setChecked(options["background_downloads"])
self.ui.approx.setChecked(options["approx_policy"])
self.ui.archive_base_url.setText(options["archive_base_url"])
self.ui.advanced_options.setText("Show Advanced Options")
self.ui.enable_telemetry.setChecked(options["enable_telemetry"])
self.toggle_visibility(False)
self.ui.advanced_options.clicked.connect(self.toggle_adv_options)
def toggle_adv_options(self):
if self.ui.advanced_options.text() == "Show Advanced Options":
self.ui.advanced_options.setText("Hide Advanced Options")
self.toggle_visibility(True)
else:
self.ui.advanced_options.setText("Show Advanced Options")
self.toggle_visibility(False)
def toggle_visibility(self, visible):
self.ui.http_timeout.setVisible(visible)
self.ui.label_3.setVisible(visible)
self.ui.bg_downloads.setVisible(visible)
self.ui.label_2.setVisible(visible)
self.ui.archive_base_url.setVisible(visible)
self.ui.label_5.setVisible(visible)
self.ui.enable_telemetry.setVisible(visible)
self.ui.telemetryLabel.setVisible(visible)
def save_prefs(self):
options = get_prefs()
ui = self.ui
options["persist"] = str(ui.persist.line_edit.text()) or None
options["http_timeout"] = ui.http_timeout.value()
options["persist_size_limit"] = ui.persist_size_limit.value()
options["background_downloads"] = ui.bg_downloads.isChecked()
options["approx_policy"] = ui.approx.isChecked()
options["archive_base_url"] = str(ui.archive_base_url.text())
options["enable_telemetry"] = ui.enable_telemetry.isChecked()
# if telemetry went from enabled to disabled, we will send a deletion
# ping
Glean.set_upload_enabled(options["enable_telemetry"])
save_prefs(options)
def change_prefs_dialog(parent=None):
"""
A dialog to change global prefs. This does not apply the prefs.
"""
dlg = ChangePrefsDialog(parent)
if dlg.exec() == QDialog.Accepted:
dlg.save_prefs()