mirror of
https://github.com/SELinuxProject/setools
synced 2025-03-31 15:56:22 +00:00
Split SEToolsTableModel and SEToolsListModel into separate modules.
Signed-off-by: Chris PeBenito <pebenito@ieee.org>
This commit is contained in:
parent
af7754076e
commit
40254914ae
@ -7,7 +7,7 @@ from PyQt5.QtCore import Qt
|
|||||||
from PyQt5.QtGui import QPalette, QTextCursor
|
from PyQt5.QtGui import QPalette, QTextCursor
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def boolean_detail(parent, boolean):
|
def boolean_detail(parent, boolean):
|
||||||
@ -33,10 +33,10 @@ class BooleanTableModel(SEToolsTableModel):
|
|||||||
headers = ["Name", "Default State"]
|
headers = ["Name", "Default State"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
boolean = self.resultlist[row]
|
boolean = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class BoundsTableModel(SEToolsTableModel):
|
class BoundsTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class BoundsTableModel(SEToolsTableModel):
|
|||||||
headers = ["Rule Type", "Parent", "Child"]
|
headers = ["Rule Type", "Parent", "Child"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -9,7 +9,7 @@ from PyQt5.QtGui import QPalette, QTextCursor
|
|||||||
from setools.exception import NoCommon
|
from setools.exception import NoCommon
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def common_detail(parent, common):
|
def common_detail(parent, common):
|
||||||
@ -37,10 +37,10 @@ class CommonTableModel(SEToolsTableModel):
|
|||||||
headers = ["Name", "Permissions"]
|
headers = ["Name", "Permissions"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
from setools.exception import ConstraintUseError
|
from setools.exception import ConstraintUseError
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class ConstraintTableModel(SEToolsTableModel):
|
class ConstraintTableModel(SEToolsTableModel):
|
||||||
@ -16,10 +16,10 @@ class ConstraintTableModel(SEToolsTableModel):
|
|||||||
headers = ["Rule Type", "Class", "Permissions", "Expression"]
|
headers = ["Rule Type", "Class", "Permissions", "Expression"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -7,7 +7,7 @@ from contextlib import suppress
|
|||||||
|
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class DefaultTableModel(SEToolsTableModel):
|
class DefaultTableModel(SEToolsTableModel):
|
||||||
@ -17,10 +17,10 @@ class DefaultTableModel(SEToolsTableModel):
|
|||||||
headers = ["Rule Type", "Class", "Default", "Default Range"]
|
headers = ["Rule Type", "Class", "Default", "Default Range"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class FSUseTableModel(SEToolsTableModel):
|
class FSUseTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class FSUseTableModel(SEToolsTableModel):
|
|||||||
headers = ["Ruletype", "FS Type", "Context"]
|
headers = ["Ruletype", "FS Type", "Context"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -7,7 +7,7 @@ import stat
|
|||||||
|
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class GenfsconTableModel(SEToolsTableModel):
|
class GenfsconTableModel(SEToolsTableModel):
|
||||||
@ -27,10 +27,10 @@ class GenfsconTableModel(SEToolsTableModel):
|
|||||||
stat.S_IFSOCK: "Socket"}
|
stat.S_IFSOCK: "Socket"}
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class IbendportconTableModel(SEToolsTableModel):
|
class IbendportconTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class IbendportconTableModel(SEToolsTableModel):
|
|||||||
headers = ["Device", "Endport", "Context"]
|
headers = ["Device", "Endport", "Context"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class IbpkeyconTableModel(SEToolsTableModel):
|
class IbpkeyconTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class IbpkeyconTableModel(SEToolsTableModel):
|
|||||||
headers = ["Subnet Prefix", "Partition Keys", "Context"]
|
headers = ["Subnet Prefix", "Partition Keys", "Context"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class InitialSIDTableModel(SEToolsTableModel):
|
class InitialSIDTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class InitialSIDTableModel(SEToolsTableModel):
|
|||||||
headers = ["SID", "Context"]
|
headers = ["SID", "Context"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
93
setoolsgui/widgets/models/list.py
Normal file
93
setoolsgui/widgets/models/list.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
# Copyright 2015, Tresys Technology, LLC
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-only
|
||||||
|
#
|
||||||
|
#
|
||||||
|
import logging
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from PyQt5 import QtCore
|
||||||
|
|
||||||
|
from . import modelroles
|
||||||
|
from .typing import MetaclassFix
|
||||||
|
|
||||||
|
T = typing.TypeVar("T")
|
||||||
|
|
||||||
|
|
||||||
|
class SEToolsListModel(QtCore.QAbstractListModel, typing.Generic[T], metaclass=MetaclassFix):
|
||||||
|
|
||||||
|
"""
|
||||||
|
The purpose of this model is to have the
|
||||||
|
objects return their string representations
|
||||||
|
for Qt.DisplayRole and return the object
|
||||||
|
for Qt.UserRole.
|
||||||
|
|
||||||
|
Some Python list-like functions are provided
|
||||||
|
for altering the model: append and remove
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, parent: QtCore.QObject | None = None) -> None:
|
||||||
|
super().__init__(parent)
|
||||||
|
self.log = logging.getLogger(self.__module__)
|
||||||
|
self._item_list: typing.List[T] = []
|
||||||
|
|
||||||
|
@property
|
||||||
|
def item_list(self) -> typing.List[T]:
|
||||||
|
"""The list of items in the model."""
|
||||||
|
return self._item_list
|
||||||
|
|
||||||
|
@item_list.setter
|
||||||
|
def item_list(self, item_list: typing.List[T]) -> None:
|
||||||
|
self.beginResetModel()
|
||||||
|
self._item_list = item_list
|
||||||
|
self.endResetModel()
|
||||||
|
|
||||||
|
def rowCount(self, parent=QtCore.QModelIndex()) -> int:
|
||||||
|
"""The number of rows in the model."""
|
||||||
|
return len(self.item_list)
|
||||||
|
|
||||||
|
def columnCount(self, parent=QtCore.QModelIndex()) -> int:
|
||||||
|
"""The number of columns in the model."""
|
||||||
|
return 1
|
||||||
|
|
||||||
|
def append(self, item: T) -> None:
|
||||||
|
"""Append the item to the list."""
|
||||||
|
index = self.rowCount()
|
||||||
|
self.beginInsertRows(QtCore.QModelIndex(), index, index)
|
||||||
|
self.item_list.append(item)
|
||||||
|
self.endInsertRows()
|
||||||
|
|
||||||
|
def remove(self, item: T) -> None:
|
||||||
|
"""Remove the first instance of the specified item from the list."""
|
||||||
|
try:
|
||||||
|
row = self.item_list.index(item)
|
||||||
|
self.beginRemoveRows(QtCore.QModelIndex(), row, row)
|
||||||
|
del self.item_list[row]
|
||||||
|
self.endRemoveRows()
|
||||||
|
except ValueError:
|
||||||
|
self.log.debug(f"Attempted to remove item {item!r} but it is not in the list")
|
||||||
|
|
||||||
|
def data(self, index: QtCore.QModelIndex, role: int = QtCore.Qt.ItemDataRole.DisplayRole):
|
||||||
|
"""Get the data at the specified index for the specified role."""
|
||||||
|
if not self.item_list or not index.isValid():
|
||||||
|
return None
|
||||||
|
|
||||||
|
row = index.row()
|
||||||
|
item = self.item_list[row]
|
||||||
|
|
||||||
|
match role:
|
||||||
|
case QtCore.Qt.ItemDataRole.DisplayRole:
|
||||||
|
return str(item)
|
||||||
|
case modelroles.PolicyObjRole:
|
||||||
|
return item
|
||||||
|
case modelroles.ContextMenuRole:
|
||||||
|
return ()
|
||||||
|
case _:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def flags(self, index: QtCore.QModelIndex = QtCore.QModelIndex()) -> QtCore.Qt.ItemFlags:
|
||||||
|
"""Get the flags for the specified index."""
|
||||||
|
return QtCore.Qt.ItemFlags() | \
|
||||||
|
QtCore.Qt.ItemFlag.ItemIsEnabled | \
|
||||||
|
QtCore.Qt.ItemFlag.ItemIsSelectable | \
|
||||||
|
QtCore.Qt.ItemFlag.ItemNeverHasChildren
|
@ -7,7 +7,7 @@ from PyQt5.QtCore import Qt
|
|||||||
from PyQt5.QtGui import QPalette, QTextCursor
|
from PyQt5.QtGui import QPalette, QTextCursor
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def _mls_detail(parent, obj, objtype):
|
def _mls_detail(parent, obj, objtype):
|
||||||
@ -58,10 +58,10 @@ class MLSComponentTableModel(SEToolsTableModel):
|
|||||||
headers = ["Name", "Aliases"]
|
headers = ["Name", "Aliases"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class MLSRuleTableModel(SEToolsTableModel):
|
class MLSRuleTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class MLSRuleTableModel(SEToolsTableModel):
|
|||||||
headers = ["Rule Type", "Source", "Target", "Object Class", "Default Range"]
|
headers = ["Rule Type", "Source", "Target", "Object Class", "Default Range"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
7
setoolsgui/widgets/models/modelroles.py
Normal file
7
setoolsgui/widgets/models/modelroles.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# SPDX-License-Identifier: LGPL-2.1-only
|
||||||
|
from typing import Final
|
||||||
|
|
||||||
|
from PyQt5 import QtCore
|
||||||
|
|
||||||
|
PolicyObjRole: Final[int] = QtCore.Qt.ItemDataRole.UserRole
|
||||||
|
ContextMenuRole: Final[int] = QtCore.Qt.ItemDataRole.UserRole + 1
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class NetifconTableModel(SEToolsTableModel):
|
class NetifconTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class NetifconTableModel(SEToolsTableModel):
|
|||||||
headers = ["Device", "Device Context", "Packet Context"]
|
headers = ["Device", "Device Context", "Packet Context"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class NodeconTableModel(SEToolsTableModel):
|
class NodeconTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class NodeconTableModel(SEToolsTableModel):
|
|||||||
headers = ["Network", "Context"]
|
headers = ["Network", "Context"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -11,7 +11,7 @@ from PyQt5.QtGui import QPalette, QTextCursor
|
|||||||
from setools.exception import NoCommon
|
from setools.exception import NoCommon
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def class_detail(parent, class_):
|
def class_detail(parent, class_):
|
||||||
@ -53,10 +53,10 @@ class ObjClassTableModel(SEToolsTableModel):
|
|||||||
headers = ["Name", "Permissions"]
|
headers = ["Name", "Permissions"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#
|
#
|
||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class PortconTableModel(SEToolsTableModel):
|
class PortconTableModel(SEToolsTableModel):
|
||||||
@ -15,10 +15,10 @@ class PortconTableModel(SEToolsTableModel):
|
|||||||
headers = ["Port/Port Range", "Protocol", "Context"]
|
headers = ["Port/Port Range", "Protocol", "Context"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
from setools.exception import RuleUseError
|
from setools.exception import RuleUseError
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class RBACRuleTableModel(SEToolsTableModel):
|
class RBACRuleTableModel(SEToolsTableModel):
|
||||||
@ -16,10 +16,10 @@ class RBACRuleTableModel(SEToolsTableModel):
|
|||||||
headers = ["Rule Type", "Source", "Target", "Object Class", "Default Role"]
|
headers = ["Rule Type", "Source", "Target", "Object Class", "Default Role"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -9,7 +9,7 @@ from PyQt5.QtGui import QPalette, QTextCursor
|
|||||||
from setools.exception import MLSDisabled
|
from setools.exception import MLSDisabled
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def role_detail(parent, role):
|
def role_detail(parent, role):
|
||||||
@ -42,10 +42,10 @@ class RoleTableModel(SEToolsTableModel):
|
|||||||
# There are two roles here.
|
# There are two roles here.
|
||||||
# The parameter, role, is the Qt role
|
# The parameter, role, is the Qt role
|
||||||
# The below item is a role in the list.
|
# The below item is a role in the list.
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
77
setoolsgui/widgets/models/table.py
Normal file
77
setoolsgui/widgets/models/table.py
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# Copyright 2015, Tresys Technology, LLC
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1-only
|
||||||
|
#
|
||||||
|
#
|
||||||
|
import logging
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from PyQt5 import QtCore
|
||||||
|
|
||||||
|
from . import modelroles
|
||||||
|
from .typing import MetaclassFix
|
||||||
|
|
||||||
|
T = typing.TypeVar("T")
|
||||||
|
|
||||||
|
|
||||||
|
class SEToolsTableModel(QtCore.QAbstractTableModel, typing.Generic[T], metaclass=MetaclassFix):
|
||||||
|
|
||||||
|
"""Base class for SETools table models, modeling a list in a tabular form."""
|
||||||
|
|
||||||
|
headers: typing.List[str] = []
|
||||||
|
|
||||||
|
def __init__(self, parent: QtCore.QObject | None = None):
|
||||||
|
super().__init__(parent)
|
||||||
|
self.log = logging.getLogger(self.__module__)
|
||||||
|
self._item_list: typing.List[T] = []
|
||||||
|
|
||||||
|
@property
|
||||||
|
def item_list(self) -> typing.List[T]:
|
||||||
|
"""The list of items in the model."""
|
||||||
|
return self._item_list
|
||||||
|
|
||||||
|
@item_list.setter
|
||||||
|
def item_list(self, item_list: typing.List[T]) -> None:
|
||||||
|
self.beginResetModel()
|
||||||
|
self._item_list = item_list
|
||||||
|
self.endResetModel()
|
||||||
|
|
||||||
|
def headerData(self, section: int, orientation: QtCore.Qt.Orientation,
|
||||||
|
role: int = QtCore.Qt.ItemDataRole.DisplayRole):
|
||||||
|
|
||||||
|
if role == QtCore.Qt.ItemDataRole.DisplayRole and \
|
||||||
|
orientation == QtCore.Qt.Orientation.Horizontal:
|
||||||
|
|
||||||
|
return self.headers[section]
|
||||||
|
|
||||||
|
def rowCount(self, parent: QtCore.QModelIndex = QtCore.QModelIndex()) -> int:
|
||||||
|
"""The number of rows in the model."""
|
||||||
|
return len(self.item_list)
|
||||||
|
|
||||||
|
def columnCount(self, parent: QtCore.QModelIndex = QtCore.QModelIndex()) -> int:
|
||||||
|
"""The number of columns in the model."""
|
||||||
|
return len(self.headers)
|
||||||
|
|
||||||
|
def data(self, index: QtCore.QModelIndex, role: int = QtCore.Qt.ItemDataRole.DisplayRole):
|
||||||
|
"""Get the data at the specified index for the specified role."""
|
||||||
|
if not self.item_list or not index.isValid():
|
||||||
|
return None
|
||||||
|
|
||||||
|
row = index.row()
|
||||||
|
|
||||||
|
match role:
|
||||||
|
case QtCore.Qt.ItemDataRole.DisplayRole:
|
||||||
|
raise NotImplementedError
|
||||||
|
case modelroles.PolicyObjRole:
|
||||||
|
return self.item_list[row]
|
||||||
|
case modelroles.ContextMenuRole:
|
||||||
|
return ()
|
||||||
|
case _:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def flags(self, index: QtCore.QModelIndex = QtCore.QModelIndex()) -> QtCore.Qt.ItemFlags:
|
||||||
|
"""Get the flags for the specified index."""
|
||||||
|
return QtCore.Qt.ItemFlags() | \
|
||||||
|
QtCore.Qt.ItemFlag.ItemIsEnabled | \
|
||||||
|
QtCore.Qt.ItemFlag.ItemIsSelectable | \
|
||||||
|
QtCore.Qt.ItemFlag.ItemNeverHasChildren
|
@ -6,7 +6,7 @@
|
|||||||
from PyQt5.QtCore import Qt
|
from PyQt5.QtCore import Qt
|
||||||
from setools.exception import RuleNotConditional, RuleUseError
|
from setools.exception import RuleNotConditional, RuleUseError
|
||||||
|
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
class TERuleTableModel(SEToolsTableModel):
|
class TERuleTableModel(SEToolsTableModel):
|
||||||
@ -17,10 +17,10 @@ class TERuleTableModel(SEToolsTableModel):
|
|||||||
"Conditional Expression", "Conditional Block"]
|
"Conditional Expression", "Conditional Block"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
rule = self.resultlist[row]
|
rule = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -9,7 +9,7 @@ from PyQt5.QtGui import QPalette, QTextCursor
|
|||||||
from setools.exception import MLSDisabled
|
from setools.exception import MLSDisabled
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def type_detail(parent, type_):
|
def type_detail(parent, type_):
|
||||||
@ -45,10 +45,10 @@ class TypeTableModel(SEToolsTableModel):
|
|||||||
headers = ["Name", "Attributes", "Aliases", "Permissive"]
|
headers = ["Name", "Attributes", "Aliases", "Permissive"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
@ -9,7 +9,7 @@ from PyQt5.QtGui import QPalette, QTextCursor
|
|||||||
from setools.exception import MLSDisabled
|
from setools.exception import MLSDisabled
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def typeattr_detail(parent, attr):
|
def typeattr_detail(parent, attr):
|
||||||
@ -39,10 +39,10 @@ class TypeAttributeTableModel(SEToolsTableModel):
|
|||||||
headers = ["Name", "Types"]
|
headers = ["Name", "Types"]
|
||||||
|
|
||||||
def data(self, index, role):
|
def data(self, index, role):
|
||||||
if self.resultlist and index.isValid():
|
if self.item_list and index.isValid():
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
item = self.resultlist[row]
|
item = self.item_list[row]
|
||||||
|
|
||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
if col == 0:
|
if col == 0:
|
||||||
|
20
setoolsgui/widgets/models/typing.py
Normal file
20
setoolsgui/widgets/models/typing.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
# SPDX-License-Identifier: LGPL-2.1-only
|
||||||
|
|
||||||
|
import abc
|
||||||
|
|
||||||
|
from PyQt5 import QtCore
|
||||||
|
|
||||||
|
QObjectType: type = type(QtCore.QObject)
|
||||||
|
|
||||||
|
|
||||||
|
class MetaclassFix(QObjectType, abc.ABC):
|
||||||
|
|
||||||
|
"""
|
||||||
|
Fix metaclass issues.
|
||||||
|
|
||||||
|
Use this when doing a Generic[] with a PyQt type. Fixes this error:
|
||||||
|
|
||||||
|
TypeError: metaclass conflict: the metaclass of a derived class must be a
|
||||||
|
(non-strict) subclass of the metaclasses of all its bases
|
||||||
|
"""
|
||||||
|
pass
|
@ -7,7 +7,7 @@ from PyQt5.QtCore import Qt, QModelIndex
|
|||||||
from setools.exception import MLSDisabled
|
from setools.exception import MLSDisabled
|
||||||
|
|
||||||
from .details import DetailsPopup
|
from .details import DetailsPopup
|
||||||
from .models import SEToolsTableModel
|
from .table import SEToolsTableModel
|
||||||
|
|
||||||
|
|
||||||
def user_detail(parent, user):
|
def user_detail(parent, user):
|
||||||
@ -59,7 +59,7 @@ class UserTableModel(SEToolsTableModel):
|
|||||||
if role == Qt.ItemDataRole.DisplayRole:
|
if role == Qt.ItemDataRole.DisplayRole:
|
||||||
row = index.row()
|
row = index.row()
|
||||||
col = index.column()
|
col = index.column()
|
||||||
user = self.resultlist[row]
|
user = self.item_list[row]
|
||||||
|
|
||||||
if col == 0:
|
if col == 0:
|
||||||
return user.name
|
return user.name
|
||||||
|
Loading…
Reference in New Issue
Block a user