Skip to content

Commit

Permalink
Move problems QTableWidget in a separate file, add Unit Tests
Browse files Browse the repository at this point in the history
Ref #268
  • Loading branch information
algorys committed Mar 12, 2018
1 parent b9d1261 commit 217a661
Show file tree
Hide file tree
Showing 4 changed files with 290 additions and 174 deletions.
140 changes: 19 additions & 121 deletions alignak_app/qobjects/alignak/problems.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,22 @@
"""
Problems
++++++++
Problems manage creation of QWidget to display problems found in Alignak backend:
Problems manage creation of QWidgets to display problems found in Alignak backend:
* **Hosts**: ``DOWN``
* **Hosts**: ``DOWN``, ``UNREACHABLE``
* **Services**: ``WARNING``, ``CRITICAL``, ``UNKNOWN``
"""

from logging import getLogger

from PyQt5.Qt import QWidget, QIcon, QTableWidget, QTableWidgetItem, QVBoxLayout, QPushButton, Qt
from PyQt5.Qt import QAbstractItemView, QLabel, QHBoxLayout, QSize
from PyQt5.Qt import QWidget, QIcon, QVBoxLayout, QPushButton, Qt, QLabel, QHBoxLayout

from alignak_app.backend.datamanager import data_manager
from alignak_app.utils.config import settings
from alignak_app.items.item import get_icon_name_from_state

from alignak_app.qobjects.common.actions import ActionsQWidget
from alignak_app.qobjects.alignak.problems_table import ProblemsQTableWidget

logger = getLogger(__name__)

Expand All @@ -52,51 +51,29 @@ def __init__(self, parent=None):
super(ProblemsQWidget, self).__init__(parent)
self.setWindowIcon(QIcon(settings.get_image('icon')))
# Fields
self.problem_table = QTableWidget()
self.headers_list = [
_('Items in problem'), _('Output')
]
self.problem_table = ProblemsQTableWidget()
self.problems_title = QLabel()
self.actions_widget = ActionsQWidget()
self.spy_btn = QPushButton()
self.spy_widget = None

def initialize(self, spy_listwidget):
def initialize(self, spy_widget):
"""
Initialize QWidget
Initialize QWidget and set SpyQWidget
:param spy_listwidget: instance of SpyQListWidget to add spy events
:type spy_listwidget: alignak_app.qobjects.events.spy.SpyQWidget
:param spy_widget: instance of SpyQWidget to manage spy events
:type spy_widget: alignak_app.qobjects.events.spy.SpyQWidget
"""

problem_layout = QVBoxLayout()
self.setLayout(problem_layout)

self.spy_widget = spy_listwidget
self.spy_btn.setEnabled(False)

self.actions_widget.initialize(None)
self.actions_widget.acknowledge_btn.setEnabled(False)
self.actions_widget.downtime_btn.setEnabled(False)
self.spy_widget = spy_widget

problem_layout.addWidget(self.get_problems_widget_title())

self.problem_table.setObjectName('problems')
self.problem_table.verticalHeader().hide()
self.problem_table.verticalHeader().setDefaultSectionSize(40)
self.problem_table.setColumnCount(len(self.headers_list))
self.problem_table.setColumnWidth(0, 500)
self.problem_table.setColumnWidth(1, 300)
self.problem_table.setSortingEnabled(True)
self.problem_table.setIconSize(QSize(24, 24))
self.problem_table.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
self.problem_table.setHorizontalHeaderLabels(self.headers_list)
self.problem_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.problem_table.horizontalHeader().setStretchLastSection(True)
self.problem_table.horizontalHeader().setMinimumHeight(40)
self.problem_table.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)
self.problem_table.initialize()
self.problem_table.currentItemChanged.connect(self.update_action_buttons)
self.problem_table.setDragEnabled(True)
problem_layout.addWidget(self.problem_table)

self.update_problems_data()
Expand Down Expand Up @@ -140,6 +117,10 @@ def get_problems_widget_title(self):
layout_title.addWidget(self.problems_title)

layout_title.addWidget(self.get_spy_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_btn = QPushButton(_('Refresh'))
Expand All @@ -150,70 +131,6 @@ def get_problems_widget_title(self):

return widget_title

def get_tableitem(self, item):
"""
Return centered QTableWidgetItem with problem
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
:return: table item with text
:rtype: QTableWidgetItem
"""

tableitem = AppQTableWidgetItem(self.get_item_text(item))
tableitem.add_backend_item(item)

icon = QIcon(settings.get_image(
get_icon_name_from_state(item.item_type, item.data['ls_state'])
))
tableitem.setIcon(icon)
tableitem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)

return tableitem

@staticmethod
def get_output_tableitem(item):
"""
Return centered QTableWidgetItem with output
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
:return: table item with text
:rtype: QTableWidgetItem
"""

tableitem = AppQTableWidgetItem(item.data['ls_output'])
tableitem.add_backend_item(item)

tableitem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)

return tableitem

@staticmethod
def get_item_text(item):
"""
Return item text depends if it's a host or service
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
:return: text of item
:rtype: str
"""

if 'host' in item.data:
hostname = data_manager.get_item('host', '_id', item.data['host']).get_display_name()
service_name = item.get_display_name()
else:
hostname = item.get_display_name()
service_name = ''

if service_name:
text = '%s is %s (Attached to %s)' % (service_name, item.data['ls_state'], hostname)
else:
text = '%s is %s' % (hostname, item.data['ls_state'])

return text

def get_spy_widget(self):
"""
Return QWidget with spy QPushButton
Expand All @@ -228,6 +145,7 @@ def get_spy_widget(self):

self.spy_btn.setIcon(QIcon(settings.get_image('spy')))
self.spy_btn.setFixedSize(80, 20)
self.spy_btn.setEnabled(False)
self.spy_btn.clicked.connect(self.add_spied_host)

layout_btn.addWidget(self.spy_btn)
Expand Down Expand Up @@ -255,7 +173,7 @@ def add_spied_host(self):

def update_problems_data(self):
"""
Update data of QTableWidget and problems title
Update data of Problems QTableWidget and problems title
"""

Expand All @@ -272,26 +190,6 @@ def update_problems_data(self):

row = 0
for item in problems_data['problems']:
self.problem_table.setItem(row, 0, self.get_tableitem(item))
self.problem_table.setItem(row, 1, self.get_output_tableitem(item))
self.problem_table.setItem(row, 0, self.problem_table.get_tableitem(item))
self.problem_table.setItem(row, 1, self.problem_table.get_output_tableitem(item))
row += 1


class AppQTableWidgetItem(QTableWidgetItem): # pylint: disable=too-few-public-methods
"""
Class who create QTableWidgetItem for App, with an item field
"""

def __init__(self, parent=None):
super(AppQTableWidgetItem, self).__init__(parent)
self.item = None

def add_backend_item(self, item):
"""
Add backend item
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
"""

self.item = item
160 changes: 160 additions & 0 deletions alignak_app/qobjects/alignak/problems_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Copyright (c) 2015-2018:
# Matthieu Estrada, ttamalfor@gmail.com
#
# This file is part of (AlignakApp).
#
# (AlignakApp) is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# (AlignakApp) is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with (AlignakApp). If not, see <http://www.gnu.org/licenses/>.

"""
Problems
++++++++
Problems manage creation of QWidget to display problems found in Alignak backend:
* **Hosts**: ``DOWN``
* **Services**: ``WARNING``, ``CRITICAL``, ``UNKNOWN``
"""

from logging import getLogger

from PyQt5.Qt import QIcon, QTableWidget, QTableWidgetItem, Qt, QAbstractItemView, QSize

from alignak_app.backend.datamanager import data_manager
from alignak_app.utils.config import settings
from alignak_app.items.item import get_icon_name_from_state

logger = getLogger(__name__)


class ProblemsQTableWidget(QTableWidget):
"""
Class who create Problems QTableWidget to display each problem
"""

def __init__(self, parent=None):
super(ProblemsQTableWidget, self).__init__(parent)
self.setWindowIcon(QIcon(settings.get_image('icon')))
# Fields
self.headers_list = [
_('Items in problem'), _('Output')
]

def initialize(self):
"""
Initialize Problems QTableWidget cells, rows
"""

self.setObjectName('problems')
self.verticalHeader().hide()
self.verticalHeader().setDefaultSectionSize(40)
self.setColumnCount(len(self.headers_list))
self.setColumnWidth(0, 500)
self.setColumnWidth(1, 300)
self.setSortingEnabled(True)
self.setIconSize(QSize(24, 24))
self.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
self.setHorizontalHeaderLabels(self.headers_list)
self.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.horizontalHeader().setStretchLastSection(True)
self.horizontalHeader().setMinimumHeight(40)
self.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)
self.setDragEnabled(True)

def get_tableitem(self, item):
"""
Return centered QTableWidgetItem with problem
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
:return: table item with text
:rtype: QTableWidgetItem
"""

tableitem = AppQTableWidgetItem(self.get_item_text(item))
tableitem.add_backend_item(item)

icon = QIcon(settings.get_image(
get_icon_name_from_state(item.item_type, item.data['ls_state'])
))
tableitem.setIcon(icon)
tableitem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)

return tableitem

@staticmethod
def get_output_tableitem(item):
"""
Return centered QTableWidgetItem with output
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
:return: table item with text
:rtype: QTableWidgetItem
"""

tableitem = AppQTableWidgetItem(item.data['ls_output'])
tableitem.add_backend_item(item)

tableitem.setTextAlignment(Qt.AlignLeft | Qt.AlignVCenter)

return tableitem

@staticmethod
def get_item_text(item):
"""
Return item text depends if it's a host or service
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
:return: text of item
:rtype: str
"""

if 'host' in item.data:
hostname = data_manager.get_item('host', '_id', item.data['host']).get_display_name()
service_name = item.get_display_name()
else:
hostname = item.get_display_name()
service_name = ''

if service_name:
text = '%s is %s (Attached to %s)' % (service_name, item.data['ls_state'], hostname)
else:
text = '%s is %s' % (hostname, item.data['ls_state'])

return text


class AppQTableWidgetItem(QTableWidgetItem): # pylint: disable=too-few-public-methods
"""
Class who create QTableWidgetItem for App, with an item field
"""

def __init__(self, parent=None):
super(AppQTableWidgetItem, self).__init__(parent)
self.item = None

def add_backend_item(self, item):
"""
Add backend item
:param item: host or service item
:type item: alignak_app.items.host.Host | alignak_app.items.service.Service
"""

self.item = item

0 comments on commit 217a661

Please sign in to comment.