# -*- coding: utf-8 -*-
# -----------------------------------------------------------------------------
# Copyright (c) 2016-2017 Anaconda, Inc.
#
# May be copied and distributed freely only as part of an Anaconda or
# Miniconda installation.
# -----------------------------------------------------------------------------
"""Update application dialog."""
from qtpy.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout # pylint: disable=no-name-in-module
from anaconda_navigator.config import CONF, WIN
from anaconda_navigator.utils.analytics import GATracker
from anaconda_navigator.widgets import ButtonNormal, ButtonPrimary, SpacerHorizontal, SpacerVertical
from anaconda_navigator.widgets.dialogs import DialogBase
class DialogUpdateApplication(DialogBase):
"""Update application dialog."""
WIDTH = 580 # pylint: disable=invalid-name
def __init__( # pylint: disable=too-many-arguments
self,
version,
config=CONF,
startup=False,
qa_testing=False,
is_root_writable=False,
):
"""
Update application dialog.
Parameter
---------
version: str
New version of update available.
"""
super().__init__()
self.tracker = GATracker()
extra_text = ''
if not is_root_writable and WIN:
extra_text = '
(You will be prompted to elevate privileges)
'
self.label = QLabel(
'There\'s a new version of Anaconda Navigator available. '
'We strongly recommend you to update.
'
'If you click yes, Anaconda Navigator will close and then the '
'Anaconda Navigator Updater will start.
'
f'Do you wish to update to Anaconda Navigator {version} now?
{extra_text}
'
)
self.button_yes = ButtonPrimary('Yes')
self.button_no = ButtonNormal('No, remind me later')
self.button_no_show = ButtonNormal("No, don't show again")
self.config = config
if not startup:
self.button_no_show.setVisible(False)
self.button_no.setText('No')
# Widgets setup
self.label.setWordWrap(True)
self.setMinimumWidth(self.WIDTH)
self.setMaximumWidth(self.WIDTH)
self.setWindowTitle('Update Application')
# On QA testing addicon continuumcrew channel allows to test that
# the update checking mechanism is working with a dummy package
# version 1000.0.0, this disallows any installation when using that
# check
if qa_testing:
self.button_yes.setDisabled(True)
self.button_no.setDisabled(True)
self.button_no_show.setDisabled(True)
# Layouts
layout_buttons = QHBoxLayout()
layout_buttons.addStretch()
layout_buttons.addWidget(self.button_no_show)
layout_buttons.addWidget(SpacerHorizontal())
layout_buttons.addWidget(self.button_no)
layout_buttons.addWidget(SpacerHorizontal())
layout_buttons.addWidget(self.button_yes)
layout = QVBoxLayout()
layout.addWidget(self.label)
layout_buttons.addWidget(SpacerVertical())
layout_buttons.addWidget(SpacerVertical())
layout.addLayout(layout_buttons)
self.setLayout(layout)
# Signals
self.button_yes.clicked.connect(self.accept)
self.button_no.clicked.connect(self.reject)
self.button_no_show.clicked.connect(self.no_show)
self.button_yes.setFocus()
def no_show(self):
"""Handle not showing updates on startup."""
self.config.set('main', 'hide_update_dialog', True)
self.reject()
# --- Local testing
# -----------------------------------------------------------------------------
def local_test(): # pragma: no cover
"""Run local tests."""
from anaconda_navigator.utils.qthelpers import qapplication # pylint: disable=import-outside-toplevel
app = qapplication(test_time=3)
widget = DialogUpdateApplication(version='1.5.0', startup=True)
widget.update_style_sheet()
widget.show()
app.exec_()
if __name__ == '__main__': # pragma: no cover
local_test()