Skip to content

Commit

Permalink
Add filters btn (host/service), improve global problems
Browse files Browse the repository at this point in the history
Ref #272
  • Loading branch information
algorys committed Mar 15, 2018
1 parent 70ac1b8 commit 788fc27
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 80 deletions.
124 changes: 86 additions & 38 deletions alignak_app/qobjects/alignak/problems.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,13 @@

from logging import getLogger

from PyQt5.Qt import QWidget, QIcon, QVBoxLayout, QPushButton, Qt, QLabel, QHBoxLayout, QLineEdit
from PyQt5.Qt import QWidget, QIcon, QVBoxLayout, QPushButton, Qt, QLabel, QLineEdit, QHBoxLayout

from alignak_app.backend.datamanager import data_manager
from alignak_app.utils.config import settings

from alignak_app.qobjects.common.actions import ActionsQWidget
from alignak_app.qobjects.common.buttons import ToggleQWidgetButton
from alignak_app.qobjects.alignak.problems_table import ProblemsQTableView

logger = getLogger(__name__)
Expand All @@ -52,6 +53,8 @@ def __init__(self, parent=None):
self.problems_title = QLabel()
self.actions_widget = ActionsQWidget()
self.spy_widget = None
self.filter_hosts_btn = ToggleQWidgetButton()
self.filter_services_btn = ToggleQWidgetButton()
self.spy_btn = QPushButton()
self.host_btn = QPushButton()

Expand All @@ -68,26 +71,41 @@ def initialize(self, spy_widget):

self.spy_widget = spy_widget

problem_layout.addWidget(self.get_problems_widget_title())
self.problems_title.setObjectName('itemtitle')
problem_layout.addWidget(self.problems_title)

problem_layout.addWidget(self.get_search_widget())

problem_layout.addWidget(self.get_btn_widget())

problem_layout.addWidget(self.problems_table)

self.update_problems_data()

def update_action_buttons(self):
def get_curent_user_role_item(self):
"""
Update status of action buttons and set current item for ActionsQWidget
Return current selected item by ``Qt.UserRole``
:return: current selected item or None
:rtype: alignak_app.items.item.Item
"""

# Get item by UserRole
item = self.problems_table.model().data(
self.problems_table.selectionModel().currentIndex(),
Qt.UserRole
)

return item

def update_action_buttons(self):
"""
Update status of action buttons and set current item for ActionsQWidget
"""

# Get item by UserRole
item = self.get_curent_user_role_item()

if item:
# If the elements had been ack or downtimed, they would not be present
self.actions_widget.acknowledge_btn.setEnabled(True)
Expand All @@ -102,6 +120,11 @@ def update_action_buttons(self):
bool(host_id not in self.spy_widget.spy_list_widget.spied_hosts)
)
self.host_btn.setEnabled(True)
else:
self.actions_widget.acknowledge_btn.setEnabled(False)
self.actions_widget.downtime_btn.setEnabled(False)
self.host_btn.setEnabled(False)
self.spy_btn.setEnabled(False)

def get_search_widget(self):
"""
Expand All @@ -127,37 +150,14 @@ def get_search_widget(self):
self.line_search.setFixedHeight(search_lbl.height())
layout.addWidget(self.line_search)

return widget

def get_problems_widget_title(self):
"""
Return QWidget title with number of problems and refresh QPushButton
:return: QWidget with number of problems
:rtype: QWidget
"""

widget_title = QWidget()
layout_title = QHBoxLayout()
widget_title.setLayout(layout_title)

self.problems_title.setObjectName('itemtitle')
layout_title.addWidget(self.problems_title)

layout_title.addWidget(self.get_btn_widget())

self.actions_widget.initialize(None)
self.actions_widget.acknowledge_btn.setEnabled(False)
self.actions_widget.downtime_btn.setEnabled(False)
layout_title.addWidget(self.actions_widget)

# refresh button
refresh_btn = QPushButton(_('Refresh'))
refresh_btn.setObjectName('ok')
refresh_btn.setFixedSize(120, 30)
refresh_btn.setFixedSize(120, search_lbl.height())
refresh_btn.clicked.connect(self.update_problems_data)
layout_title.addWidget(refresh_btn)
layout.addWidget(refresh_btn)

return widget_title
return widget

def get_btn_widget(self):
"""
Expand All @@ -169,8 +169,29 @@ def get_btn_widget(self):

widget_btn = QWidget()
layout_btn = QHBoxLayout()
layout_btn.setContentsMargins(0, 0, 0, 5)
widget_btn.setLayout(layout_btn)

host_filter = QLabel(_('Filter hosts'))
host_filter.setObjectName('subtitle')
layout_btn.addWidget(host_filter)
self.filter_hosts_btn.initialize()
self.filter_hosts_btn.update_btn_state(False)
self.filter_hosts_btn.toggle_btn.clicked.connect(lambda: self.update_problems_data('host'))
layout_btn.addWidget(self.filter_hosts_btn)

service_filter = QLabel(_('Filter services'))
service_filter.setObjectName('subtitle')
layout_btn.addWidget(service_filter)
self.filter_services_btn.initialize()
self.filter_services_btn.update_btn_state(False)
self.filter_services_btn.toggle_btn.clicked.connect(
lambda: self.update_problems_data('service')
)
layout_btn.addWidget(self.filter_services_btn)

layout_btn.addStretch()

self.host_btn.setIcon(QIcon(settings.get_image('host')))
self.host_btn.setFixedSize(80, 20)
self.host_btn.setEnabled(False)
Expand All @@ -182,9 +203,13 @@ def get_btn_widget(self):
self.spy_btn.setEnabled(False)
self.spy_btn.setToolTip(_('Spy current host'))
self.spy_btn.clicked.connect(self.add_spied_host)

layout_btn.addWidget(self.spy_btn)

self.actions_widget.initialize(None)
self.actions_widget.acknowledge_btn.setEnabled(False)
self.actions_widget.downtime_btn.setEnabled(False)
layout_btn.addWidget(self.actions_widget)

layout_btn.setAlignment(Qt.AlignCenter)

return widget_btn
Expand All @@ -196,10 +221,7 @@ def add_spied_host(self):
"""

# Get item by UserRole
item = self.problems_table.model().data(
self.problems_table.selectionModel().currentIndex(),
Qt.UserRole
)
item = self.get_curent_user_role_item()

if item:
if 'service' in item.item_type:
Expand All @@ -212,13 +234,16 @@ def add_spied_host(self):

self.update_action_buttons()

def update_problems_data(self):
def update_problems_data(self, item_type=''):
"""
Update data of Problems QTableWidget and problems title
:param item_type: TODO
:type item_type: str
"""

problems_data = data_manager.get_problems()
old_research = self.line_search.text()

if self.parent():
self.parent().parent().setTabText(
Expand All @@ -233,7 +258,30 @@ def update_problems_data(self):
)
)

if self.filter_hosts_btn.is_checked() and not self.filter_services_btn.is_checked():
item_type = 'host'
if self.filter_services_btn.is_checked() and not self.filter_hosts_btn.is_checked():
item_type = 'service'
if not self.filter_services_btn.is_checked() and not self.filter_hosts_btn.is_checked():
item_type = ''

if isinstance(item_type, str):
if 'host' in item_type and self.filter_hosts_btn.is_checked():
if self.filter_services_btn.is_checked():
self.filter_services_btn.update_btn_state(False)
if 'service' in item_type and self.filter_services_btn.is_checked():
if self.filter_hosts_btn.is_checked():
self.filter_hosts_btn.update_btn_state(False)
problems_data['problems'] = [
item for item in problems_data['problems'] if item_type in item.item_type
]

proxy_filter = self.problems_table.update_view(problems_data)
self.line_search.textChanged.connect(proxy_filter.setFilterRegExp)

self.problems_table.selectionModel().selectionChanged.connect(self.update_action_buttons)
self.update_action_buttons()

if old_research:
self.line_search.setText(old_research)
self.line_search.textChanged.emit(old_research)
6 changes: 5 additions & 1 deletion alignak_app/qobjects/alignak/problems_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ def __init__(self, parent=None):
self.horizontalHeader().setStretchLastSection(True)
self.horizontalHeader().setMinimumHeight(40)
self.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)
self.setSelectionMode(QAbstractItemView.SingleSelection)
# Fields
self.headers_list = [
_('Items in problem'), _('Output')
Expand Down Expand Up @@ -115,8 +116,11 @@ def get_item_text(item):
:rtype: str
"""

hostname = ''
if 'host' in item.data:
hostname = data_manager.get_item('host', '_id', item.data['host']).get_display_name()
host = data_manager.get_item('host', '_id', item.data['host'])
if host:
hostname = host.get_display_name()
service_name = item.get_display_name()
else:
hostname = item.get_display_name()
Expand Down
7 changes: 4 additions & 3 deletions alignak_app/qobjects/common/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ def initialize(self, item):
self.item = item

layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
self.setLayout(layout)

self.acknowledge_btn.setIcon(QIcon(settings.get_image('acknowledge')))
Expand Down Expand Up @@ -94,8 +95,8 @@ def add_acknowledge(self): # pragma: no cover
ack_dialog.initialize(self.item.item_type, self.item.get_display_name(), comment)

if ack_dialog.exec_() == AckQDialog.Accepted:
sticky = ack_dialog.sticky_toggle_btn.get_btn_state()
notify = ack_dialog.notify_toggle_btn.get_btn_state()
sticky = ack_dialog.sticky_toggle_btn.is_checked()
notify = ack_dialog.notify_toggle_btn.is_checked()
comment = str(ack_dialog.ack_comment_edit.toPlainText())

data = {
Expand Down Expand Up @@ -146,7 +147,7 @@ def add_downtime(self): # pragma: no cover
downtime_dialog.initialize(self.item.item_type, self.item.get_display_name(), comment)

if downtime_dialog.exec_() == DownQDialog.Accepted:
fixed = downtime_dialog.fixed_toggle_btn.get_btn_state()
fixed = downtime_dialog.fixed_toggle_btn.is_checked()
duration = downtime_dialog.duration_to_seconds()
start_stamp = downtime_dialog.start_time.dateTime().toTime_t()
end_stamp = downtime_dialog.end_time.dateTime().toTime_t()
Expand Down
5 changes: 3 additions & 2 deletions alignak_app/qobjects/common/buttons.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,14 @@ def initialize(self):
"""

layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
self.setLayout(layout)

self.toggle_btn.setText(_('ON'))
self.toggle_btn.setFixedSize(80, 20)
self.toggle_btn.setCheckable(True)
self.toggle_btn.setChecked(True)
self.toggle_btn.setObjectName("True")
self.toggle_btn.setObjectName('True')
self.toggle_btn.clicked.connect(self.update_btn_state)
layout.addWidget(self.toggle_btn)

Expand All @@ -74,7 +75,7 @@ def update_btn_state(self, state):
self.toggle_btn.setObjectName(str(state))
self.toggle_btn.setStyleSheet(settings.css_style)

def get_btn_state(self):
def is_checked(self):
"""
Return "toggle_btn" state
Expand Down
4 changes: 2 additions & 2 deletions alignak_app/qobjects/host/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ def get_actions_widget(self):
layout.addWidget(activecheck_lbl)
self.activecheck_btn.initialize()
self.activecheck_btn.toggle_btn.clicked.connect(lambda: self.patch_host_checks(
'active_checks_enabled', self.activecheck_btn.get_btn_state()
'active_checks_enabled', self.activecheck_btn.is_checked()
))
layout.addWidget(self.activecheck_btn)

Expand All @@ -179,7 +179,7 @@ def get_actions_widget(self):
layout.addWidget(passivecheck_lbl)
self.passivecheck_btn.initialize()
self.passivecheck_btn.toggle_btn.clicked.connect(lambda: self.patch_host_checks(
'passive_checks_enabled', self.passivecheck_btn.get_btn_state()
'passive_checks_enabled', self.passivecheck_btn.is_checked()
))
layout.addWidget(self.passivecheck_btn)

Expand Down
24 changes: 12 additions & 12 deletions alignak_app/qobjects/panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,20 +290,20 @@ def define_hostname(self):
:rtype: str
"""

hostname = ''

if isinstance(self.sender(), QPushButton):
# From Problems QWidget
item = self.problems_widget.problems_model.item(
self.problems_widget.problems_table.selectionModel().currentIndex().row(),
self.problems_widget.problems_table.selectionModel().currentIndex().column()
).item
if 'service' in item.item_type:
hostname = data_manager.get_item('host', item.data['host']).name
else:
hostname = item.name

if hostname in self.hostnames_list:
self.line_search.setText(hostname)
self.tab_widget.setCurrentIndex(0)
item = self.problems_widget.get_curent_user_role_item()
if item:
if 'service' in item.item_type:
hostname = data_manager.get_item('host', item.data['host']).name
else:
hostname = item.name

if hostname in self.hostnames_list:
self.line_search.setText(hostname)
self.tab_widget.setCurrentIndex(0)
elif isinstance(self.sender(), QLineEdit):
# From QLineEdit
hostname = self.line_search.text()
Expand Down
4 changes: 2 additions & 2 deletions alignak_app/qobjects/user/profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ def get_hosts_notif_widget(self):
data_manager.database['user'].data['host_notifications_enabled']
)
self.hostnotif_toggle_btn.toggle_btn.clicked.connect(lambda: self.enable_notifications(
'host_notifications_enabled', self.hostnotif_toggle_btn.get_btn_state()
'host_notifications_enabled', self.hostnotif_toggle_btn.is_checked()
))
self.hostnotif_toggle_btn.setObjectName('host_notifications_enabled')
host_notif_layout.addWidget(self.hostnotif_toggle_btn, 2, 1, 1, 1)
Expand Down Expand Up @@ -381,7 +381,7 @@ def get_services_notif_widget(self):
data_manager.database['user'].data['service_notifications_enabled']
)
self.servicenotif_toggle_btn.toggle_btn.clicked.connect(lambda: self.enable_notifications(
'service_notifications_enabled', self.servicenotif_toggle_btn.get_btn_state()
'service_notifications_enabled', self.servicenotif_toggle_btn.is_checked()
))
service_notif_layout.addWidget(self.servicenotif_toggle_btn, 2, 1, 1, 1)

Expand Down
6 changes: 3 additions & 3 deletions test/test_common_buttons.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,12 @@ def test_get_btn_state(self):
under_test = ToggleQWidgetButton()
under_test.initialize()

self.assertTrue(under_test.get_btn_state())
self.assertTrue(under_test.is_checked())

under_test.update_btn_state(True)

self.assertTrue(under_test.get_btn_state())
self.assertTrue(under_test.is_checked())

under_test.update_btn_state(False)

self.assertFalse(under_test.get_btn_state())
self.assertFalse(under_test.is_checked())

0 comments on commit 788fc27

Please sign in to comment.