Skip to content

Commit

Permalink
Request services once, improve all service QWidgets
Browse files Browse the repository at this point in the history
Ref #284
  • Loading branch information
algorys committed Mar 23, 2018
1 parent f02377e commit d697d9a
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 128 deletions.
9 changes: 6 additions & 3 deletions alignak_app/qobjects/panel.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,11 @@ def display_host(self):

# Get Host Item and its services
host_item = data_manager.get_item('host', hostname)
app_backend.query_services(host_item.item_id)

services = data_manager.get_host_services(host_item.item_id)
if not services:
app_backend.query_services(host_item.item_id)
services = data_manager.get_host_services(host_item.item_id)

# Set spy button enable or not
not_spied = bool(
Expand All @@ -268,8 +272,7 @@ def display_host(self):
# Update Qwidgets
self.host_widget.update_host(host_item)
self.host_widget.show()
self.services_widget.set_data(host_item)
self.services_widget.update_widget()
self.services_widget.update_widget(host_item, services)
self.services_widget.show()
self.dashboard_widget.update_dashboard()
self.dashboard_widget.show()
Expand Down
8 changes: 4 additions & 4 deletions alignak_app/qobjects/service/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,16 +170,15 @@ def get_actions_widget(self):

return widget

def update_widget(self, service=None):
def update_widget(self, service):
"""
Update ServiceDataQWidget
:param service: Service item with its data
:type service: alignak_app.core.models.service.Service
"""

if service:
self.service_item = service
self.service_item = service

icon_name = get_icon_name(
'service',
Expand All @@ -206,6 +205,7 @@ def update_widget(self, service=None):

self.actions_widget.item = self.service_item
self.actions_widget.update_widget()
self.show()

def periodic_refresh(self):
"""
Expand All @@ -217,4 +217,4 @@ def periodic_refresh(self):
updated_service = data_manager.get_item('service', '_id', self.service_item.item_id)
if updated_service:
self.service_item = updated_service
self.update_widget()
self.update_widget(self.service_item)
132 changes: 61 additions & 71 deletions alignak_app/qobjects/service/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ class ServicesQWidget(QWidget):
def __init__(self, parent=None):
super(ServicesQWidget, self).__init__(parent)
# Fields
self.host_item = None
self.service_items = None
self.host = None
self.services = None
self.services_tree_widget = QTreeWidget()
self.service_data_widget = ServiceDataQWidget()
self.services_dashboard = ServicesDashboardQWidget()
Expand All @@ -69,84 +69,74 @@ def initialize(self):
layout.addWidget(get_frame_separator(), 1, 0, 1, 2)

self.services_tree_widget.setIconSize(QSize(32, 32))
self.services_tree_widget.setAlternatingRowColors(True)
self.services_tree_widget.header().close()
layout.addWidget(self.services_tree_widget, 2, 0, 1, 1)

self.service_data_widget.initialize()
layout.addWidget(self.service_data_widget, 2, 1, 1, 1)

def set_data(self, host_item):
def update_widget(self, host, services):
"""
Set data of host item and its services
Update the QTreeWidget and its items
:param host_item: the Host item
:type host_item: alignak_app.items.host.Host
:param host: the Host item
:type host: alignak_app.items.host.Host
:param services: list of :class:`Services <alignak_app.items.service.Service>` items
:type services: list
"""

# Query services of host
self.host_item = host_item

# Get problems
host_and_services = data_manager.get_host_with_services(host_item.item_id)
self.host_item = host_and_services['host']
self.service_items = host_and_services['services']

def update_widget(self):
"""
Update the service QWidget
"""

if self.services_tree_widget:
self.services_dashboard.setParent(None)
self.services_dashboard = ServicesDashboardQWidget()
self.services_dashboard.initialize()
self.services_dashboard.update_widget(self.service_items, self.host_item.name)
self.layout().addWidget(self.services_dashboard, 0, 0, 1, 2)
self.services_tree_widget.setParent(None)
self.services_tree_widget = QTreeWidget()
self.services_tree_widget.setAlternatingRowColors(True)
self.services_tree_widget.header().close()
self.layout().addWidget(self.services_tree_widget, 2, 0, 1, 1)
self.service_data_widget.setParent(None)
self.service_data_widget = ServiceDataQWidget()
self.service_data_widget.initialize()
self.layout().addWidget(self.service_data_widget, 2, 1, 1, 1)

# Make Global aggregation who are empty
for service in self.service_items:
if not service.data['aggregation']:
service.data['aggregation'] = 'Global'

# First sort list by state then by aggregation
newlist = sorted(
self.service_items,
key=lambda s: itemgetter('ls_state', 'ls_acknowledged', 'aggregation')(s.data)
)
self.service_items = newlist

# Get list of aggregations
aggregations = []
for service in self.service_items:
if service.data['aggregation'] not in aggregations:
aggregations.append(service.data['aggregation'])

# Add QTreeWidgetItems
for aggregation in aggregations:
main_tree = QTreeWidgetItem()
main_tree.setText(0, aggregation)
main_tree.setIcon(0, QIcon(settings.get_image('tree')))
main_tree.setToolTip(0, aggregation)
for service in self.service_items:
if service.data['aggregation'] == aggregation:
service_tree = ServiceTreeItem()
service_tree.initialize(service)
service_tree.setToolTip(0, service.get_tooltip())
self.services_tree_widget.clicked.connect(self.update_service_data)
main_tree.addChild(service_tree)

self.services_tree_widget.addTopLevelItem(main_tree)

def update_service_data(self):
self.host = host
self.services = services

# Update services dashboard
self.services_dashboard.update_widget(self.services, self.host.name)

# Clear QTreeWidget
self.services_tree_widget.clear()
self.services_tree_widget.setIconSize(QSize(16, 16))

if self.services:
# Make Global aggregation who are empty
for service in self.services:
if not service.data['aggregation']:
service.data['aggregation'] = 'Global'

# First sort list by state then by aggregation
newlist = sorted(
self.services,
key=lambda s: itemgetter('ls_state', 'ls_acknowledged', 'aggregation')(s.data)
)
self.services = newlist

# Get list of aggregations
aggregations = []
for service in self.services:
if service.data['aggregation'] not in aggregations:
aggregations.append(service.data['aggregation'])

# Add QTreeWidgetItems
for aggregation in aggregations:
main_tree = QTreeWidgetItem()
main_tree.setText(0, aggregation)
main_tree.setIcon(0, QIcon(settings.get_image('tree')))
main_tree.setToolTip(0, aggregation)
for service in self.services:
if service.data['aggregation'] == aggregation:
service_tree = ServiceTreeItem()
service_tree.initialize(service)
service_tree.setToolTip(0, service.get_tooltip())
self.services_tree_widget.clicked.connect(self.update_service_data)
main_tree.addChild(service_tree)

self.services_tree_widget.addTopLevelItem(main_tree)

self.service_data_widget.hide()
else:
# If no services
self.service_data_widget.hide()

def update_service_data(self): # pragma: no cover
"""
Update ServiceDataqWidget
Expand Down
8 changes: 4 additions & 4 deletions test/test_common_dialogs.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,13 +115,13 @@ def test_edit_dialog_accept_text(self):

timer = QTimer()
timer.timeout.connect(under_test.accept_text)
timer.start(1)
timer.start(0.5)

# Text is same so refused
self.assertEqual(EditQDialog.Rejected, under_test.exec())

under_test.text_edit.setText('text have been edited')
timer.start(1)
timer.start(0.5)

# Accepted because text have changed
self.assertEqual(EditQDialog.Accepted, under_test.exec())
Expand All @@ -130,15 +130,15 @@ def test_edit_dialog_accept_text(self):
under_test.old_text = ''
under_test.text_edit.setText(' ')

timer.start(1)
timer.start(0.5)

# Rejected because there is nothing to change
self.assertEqual(EditQDialog.Rejected, under_test.exec())

under_test.old_text = ''
under_test.text_edit.setText('New text')

timer.start(1)
timer.start(0.5)

# Accepted even if old text is empty
self.assertEqual(EditQDialog.Accepted, under_test.exec())
Expand Down
4 changes: 2 additions & 2 deletions test/test_login_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def test_accept_login(self):

timer = QTimer()
timer.timeout.connect(under_test.accept_login)
timer.start(1)
timer.start(0.5)

# If login failed, Rejected
self.assertEqual(LoginQDialog.Rejected, under_test.exec())
Expand All @@ -76,7 +76,7 @@ def test_accept_login(self):
under_test.username_line.setText('admin')
under_test.password_line.setText('admin')

timer.start(1)
timer.start(0.5)
self.assertEqual(LoginQDialog.Accepted, under_test.exec())

def test_set_proxy_settings(self):
Expand Down
26 changes: 24 additions & 2 deletions test/test_panel_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ class TestPanelQWidget(unittest2.TestCase):
'business_impact': '2',
'notes': 'host notes',
'passive_checks_enabled': False,
'active_checks_enabled': True
'active_checks_enabled': True,
'_overall_state_id': 1
},
'host%d' % i
)
Expand All @@ -84,7 +85,7 @@ class TestPanelQWidget(unittest2.TestCase):
'aggregation': 'disk',
'_overall_state_id': 4,
'passive_checks_enabled': False,
'active_checks_enabled': True
'active_checks_enabled': True,
},
'service%d' % i
)
Expand Down Expand Up @@ -174,3 +175,24 @@ def test_update_panels(self):

# There are only 9 services in CRITICAL condition
self.assertEqual('Problems (19)', under_test.tab_widget.tabText(1))

def test_display_host(self):
"""Display Host in Panel"""

under_test = PanelQWidget()
under_test.initialize()

self.assertTrue(under_test.spy_button.isEnabled())

under_test.display_host()

self.assertTrue(under_test.spy_button.isEnabled())
self.assertTrue(under_test.host_widget.isHidden())
self.assertTrue(under_test.services_widget.isHidden())

under_test.line_search.setText(self.host_list[0].name)
under_test.display_host()

self.assertTrue(under_test.spy_button.isEnabled())
self.assertFalse(under_test.host_widget.isHidden())
self.assertFalse(under_test.services_widget.isHidden())
6 changes: 3 additions & 3 deletions test/test_proxy_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,13 @@ def test_accept_proxy(self):

timer = QTimer()
timer.timeout.connect(under_test.accept_proxy)
timer.start(1)
timer.start(0.5)

# When all proxy settings are empties, dialog Accepted
self.assertTrue(ProxyQDialog.Accepted == under_test.exec())

# Proxy address is set, dialog Accepted
under_test.proxy_address.setText('http://127.0.0.1:8000')
timer.start(1)
timer.start(0.5)

self.assertTrue(ProxyQDialog.Accepted == under_test.exec())
self.assertTrue(ProxyQDialog.Accepted == under_test.exec())

0 comments on commit d697d9a

Please sign in to comment.