You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
375 lines
14 KiB
Python
375 lines
14 KiB
Python
import typing
|
|
from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt, QSize, QMetaObject, QCoreApplication
|
|
from PyQt5.QtGui import QIcon, QStandardItemModel, QStandardItem
|
|
from PyQt5.QtWidgets import QDockWidget, QTreeView, QTabWidget, QListView, QWidget, QHBoxLayout, QLineEdit,\
|
|
QPushButton, QLabel, QCheckBox, QVBoxLayout, QFrame, QMainWindow
|
|
from DcsUi.DockCLass import NewDockWidget
|
|
from utils.ClientModels import Procedure, Usecase, UsecaseGroup
|
|
from procedure.run_procedure.RunProceduree import ProcedureThread
|
|
from tools.JsonConfig import getProTree
|
|
from static.Png import *
|
|
import json
|
|
import os
|
|
|
|
tabelDict = {
|
|
'规程' : Procedure,
|
|
'用例组' : UsecaseGroup,
|
|
'用例' : Usecase,
|
|
}
|
|
|
|
class TreeDockWidget(NewDockWidget):
|
|
def __init__(self, title, parent = None):
|
|
NewDockWidget.__init__(self, title, parent=parent)
|
|
self.parent = parent
|
|
print(self.__class__.__name__)
|
|
if self.parent.__class__.__name__ != 'MainWindow':
|
|
return
|
|
self.tree = QTreeView(self)
|
|
# 隐藏标题栏
|
|
self.tree.setHeaderHidden(True)
|
|
self.model = TreeDockModel(self.parent)
|
|
self.tree.setModel(self.model)
|
|
|
|
self.proListWidget = proListWidget(MainWindow = parent)
|
|
|
|
self.listview = self.proListWidget.listView
|
|
|
|
|
|
self.tab = QTabWidget()
|
|
self.tab.addTab(self.tree, " 规程 ")
|
|
self.tab.addTab(self.proListWidget, "实验列表")
|
|
|
|
# self.setWidget(self.tree)
|
|
self.setWidget(self.tab)
|
|
self.tree.expandAll()
|
|
self.tree.doubleClicked.connect(self.onTreeClicked)
|
|
self.treeDict = getProTree(self.parent.projectPath)
|
|
|
|
def insertProToJson(self,dic,proName):
|
|
if not dic:
|
|
return
|
|
parentName = self.tree.currentIndex().data()
|
|
# print(parentName)
|
|
for key, value in dic.items():
|
|
if key == 'name' and value == parentName:
|
|
l = dic['children']
|
|
proDict = {
|
|
'name' : proName,
|
|
'children' : []
|
|
}
|
|
l.append(proDict)
|
|
# print(l)
|
|
r = []
|
|
for i in l:
|
|
if i not in r:
|
|
# print(i['name'])
|
|
# print([x['name'] for x in r])
|
|
r.append(i)
|
|
# print(r,l)
|
|
dic['children'] = r
|
|
return dic
|
|
else:
|
|
# if dic:
|
|
if dic['children'] != []:
|
|
# for d in dic['children']:
|
|
# newDict = self.insertProToJson(d,proName)
|
|
a = []
|
|
for x in dic['children']:
|
|
a.append(self.insertProToJson(x, proName))
|
|
# print(a)
|
|
dic['children'] = a
|
|
else:
|
|
return dic
|
|
return dic
|
|
|
|
|
|
|
|
def onTreeClicked(self, index: QModelIndex):
|
|
if index.parent().data() not in [self.parent.projectName, None]:
|
|
try:
|
|
self.parent.runCountEdit = self.proListWidget.runCountEdit
|
|
# Procedure.get(name = index.data())
|
|
self.parent.proType = Procedure.get(name = index.data()).type
|
|
# self.parent.dockTop.addExcel(index.data())
|
|
self.proListWidget.listView.addItems(index.data())
|
|
self.parent.currentPro = index.data()
|
|
self.parent.procedureRunPath = index.data()
|
|
except:
|
|
# print(1)
|
|
pass
|
|
# if index.parent().data() == '规程':
|
|
# tabelDb = tabelDict[index.parent().data()]
|
|
# for x in tabelDb.get_all().where(tabelDb.name == index.data()):
|
|
# self.parent.procedureRunPath = x.path
|
|
# self.parent.dockTop.addExcel(x.path)
|
|
# self.parent.dockBottom.setMaximumHeight(1000)
|
|
# elif index.parent().data() == '用例':
|
|
# self.parent.dockTop.addUseCase(index.data())
|
|
# self.parent.procedureRunPath = index.data()
|
|
# elif index.parent().data() == '用例组':
|
|
# self.parent.dockTop.addUsecaseGroup(index.data())
|
|
# self.parent.procedureRunPath = index.data()
|
|
|
|
def refreshTree(self):
|
|
self.model.updateData()
|
|
self.tree.expandAll()
|
|
|
|
class TreeItem(object):
|
|
# 重写树item类
|
|
def __init__(self):
|
|
self.children = []
|
|
|
|
def appendChild(self, child: 'TreeItem') -> None:
|
|
child.parent = self
|
|
self.children.append(child)
|
|
|
|
class TreeDockModel(QAbstractItemModel):
|
|
def __init__(self, MainWindow):
|
|
QAbstractItemModel.__init__(self)
|
|
self.rootItem = None
|
|
self.MainWindow = MainWindow
|
|
self.updateData()
|
|
|
|
def data(self, index=QModelIndex(), role=Qt.DisplayRole):
|
|
if not index.isValid():
|
|
return None
|
|
# 显示图标
|
|
# if role == Qt.DecorationRole and index.column() == 0:
|
|
# return QIcon()
|
|
# 显示数据
|
|
if role == Qt.DisplayRole:
|
|
item: TreeItem = index.internalPointer()
|
|
item.data = index.internalPointer().data
|
|
return item.data
|
|
return None
|
|
|
|
def updateData(self):
|
|
# 添加规程, 用例等节点
|
|
self.treeDict = getProTree(self.MainWindow.projectPath)
|
|
if self.rootItem:
|
|
self.rootItem = None
|
|
self.rootItem = TreeItem()
|
|
self.rootItem.data = 'Root'
|
|
# self.projectRoot = TreeItem()
|
|
# self.projectRoot.data = self.MainWindow.projectName
|
|
# self.rootItem.appendChild(self.projectRoot)
|
|
# primary = TreeItem()
|
|
# primary.data = self.treeDict['name']
|
|
# primary.parent = self.rootItem
|
|
# self.rootItem.appendChild(primary)
|
|
self.addChild(self.rootItem)
|
|
self.layoutChanged.emit()
|
|
|
|
def addChild(self,parent):
|
|
# 添加子节点
|
|
# allList = [x.name for x in tabelDict[tabelName].get_all()]
|
|
for node1 in self.treeDict['children']:
|
|
child1 = TreeItem()
|
|
child1.data = node1['name']
|
|
child1.parent = parent
|
|
parent.appendChild(child1)
|
|
if node1['children'] == [] or None:
|
|
continue
|
|
for node2 in node1['children']:
|
|
child2 = TreeItem()
|
|
child2.data = node2['name']
|
|
child2.parent = child1
|
|
child1.appendChild(child2)
|
|
if node2['children'] == [] or None:
|
|
continue
|
|
for node3 in node2['children']:
|
|
child3 = TreeItem()
|
|
child3.data = node3['name']
|
|
child3.parent = child2
|
|
child2.appendChild(child3)
|
|
if node3['children'] == [] or None:
|
|
continue
|
|
for node4 in node3['children']:
|
|
child4 = TreeItem()
|
|
child4.data = node4['name']
|
|
child4.parent = child3
|
|
child3.appendChild(child4)
|
|
if node4['children'] == [] or None:
|
|
continue
|
|
for node5 in node4['children']:
|
|
child5 = TreeItem()
|
|
child5.data = node5['name']
|
|
child5.parent = child4
|
|
child4.appendChild(child5)
|
|
if node5['children'] == [] or None:
|
|
continue
|
|
# if tabelName == '用例组':
|
|
# for chilData in json.loads(tabelDict[tabelName].select().where(tabelDict[tabelName].name == child.data)[0].usecase):
|
|
# usecaseChild = TreeItem()
|
|
# usecaseChild.data = chilData
|
|
# usecaseChild.parent = child
|
|
# child.appendChild(usecaseChild)
|
|
|
|
|
|
def flags(self, index: QModelIndex) -> Qt.ItemFlags:
|
|
if not index.isValid():
|
|
return Qt.ItemIsAutoTristate
|
|
return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsAutoTristate
|
|
|
|
def index(self, row: int, column: int, parent=QModelIndex()) -> QModelIndex:
|
|
if not self.hasIndex(row, column, parent):
|
|
return QModelIndex()
|
|
if not parent.isValid():
|
|
parentItem: TreeItem = self.rootItem
|
|
else:
|
|
parentItem: TreeItem = parent.internalPointer()
|
|
if row < len(parentItem.children):
|
|
childItem = parentItem.children[row]
|
|
return self.createIndex(row, column, childItem)
|
|
else:
|
|
return QModelIndex()
|
|
|
|
def parent(self, index: QModelIndex) -> QModelIndex:
|
|
if not index.isValid():
|
|
return QModelIndex()
|
|
child = index.internalPointer()
|
|
parent = child.parent
|
|
# if not index.isValid():
|
|
# parent.index = QModelIndex()
|
|
if parent == self.rootItem:
|
|
return QModelIndex()
|
|
return self.createIndex(index.row(), 0, parent)
|
|
|
|
def columnCount(self, parent=QModelIndex()) -> int:
|
|
return 1
|
|
|
|
def rowCount(self, parent=QModelIndex()) -> int:
|
|
return 999
|
|
|
|
class CustomWidget(QWidget):
|
|
|
|
def __init__(self, text, listview, *args, **kwargs):
|
|
super(CustomWidget, self).__init__(*args, **kwargs)
|
|
layout = QHBoxLayout(self)
|
|
layout.setContentsMargins(0, 0, 0, 0)
|
|
# layout.addWidget(QLabel(text, self))
|
|
self.cb1 = QCheckBox(text, self)
|
|
layout.addWidget(self.cb1)
|
|
self.cb1.clicked.connect(self.cbchange)
|
|
self.listview = listview
|
|
self.text = text
|
|
|
|
def sizeHint(self):
|
|
# 决定item的高度
|
|
return QSize(200, 40)
|
|
|
|
def cbchange(self):
|
|
if self.cb1.checkState() == Qt.Checked:
|
|
self.listview.allCbSet.add(self.text)
|
|
else:
|
|
self.listview.allCbSet.remove(self.text)
|
|
# print(self.listview.allCbSet)
|
|
if self.listview.allCbSet:
|
|
self.listview.MainWindow.dockTop.addUsecaseGroup(self.listview.allCbSet)
|
|
groupName = ' - '.join(self.listview.allCbSet)
|
|
self.listview.MainWindow.dockTop.ExcelTab.currentWidget().proListView.groupName = groupName
|
|
self.createGroup(groupName, list(self.listview.allCbSet))
|
|
self.listview.allCbSet.clear()
|
|
|
|
def createGroup(self, text, lis):
|
|
usecasegroup = UsecaseGroup()
|
|
usecasegroup.name = text # 自己填写的用例组的名称
|
|
usecasegroup.usecase = json.dumps(lis)
|
|
usecasegroup.usecase_group_number = text
|
|
check_usecasegroup = None
|
|
try:
|
|
check_usecasegroup = UsecaseGroup.get(UsecaseGroup.name == text)
|
|
except:
|
|
pass
|
|
if check_usecasegroup:
|
|
UsecaseGroup.delete_obj(check_usecasegroup.id)
|
|
usecasegroup.save()
|
|
else:
|
|
usecasegroup.save()
|
|
|
|
|
|
class CheckListView(QListView):
|
|
|
|
def __init__(self,MainWindow, *args, **kwargs):
|
|
super(CheckListView, self).__init__(*args, **kwargs)
|
|
self.MainWindow = MainWindow
|
|
# 模型
|
|
self._model = QStandardItemModel(self)
|
|
self.setModel(self._model)
|
|
self.allCbSet = set()
|
|
# 循环生成10个自定义控件
|
|
item = QStandardItem()
|
|
self._model.appendRow(item) # 添加item
|
|
|
|
# # 得到索引
|
|
# index = self._model.indexFromItem(item)
|
|
# widget = CustomWidget(str('全选/全不选'), self)
|
|
# item.setSizeHint(widget.sizeHint()) # 主要是调整item的高度
|
|
# # 设置自定义的widget
|
|
# self.setIndexWidget(index, widget)
|
|
|
|
def addItems(self, proName):
|
|
usecaseList = json.loads(Procedure.get(name = proName).usecase)
|
|
# print(type(usecaseList))
|
|
self._model.clear()
|
|
for i in usecaseList:
|
|
print(i)
|
|
item = QStandardItem()
|
|
self._model.appendRow(item) # 添加item
|
|
|
|
# 得到索引
|
|
index = self._model.indexFromItem(item)
|
|
widget = CustomWidget(str(i), self)
|
|
item.setSizeHint(widget.sizeHint()) # 主要是调整item的高度
|
|
# 设置自定义的widget
|
|
self.setIndexWidget(index, widget)
|
|
|
|
|
|
|
|
class proListWidget(QWidget):
|
|
def __init__(self, MainWindow):
|
|
super().__init__()
|
|
self.MainWindow = MainWindow
|
|
self.setupUi()
|
|
|
|
def setupUi(self):
|
|
from PyQt5 import QtWidgets, QtCore, QtGui
|
|
self.setObjectName("self")
|
|
self.resize(300, 562)
|
|
self.verticalLayout = QtWidgets.QVBoxLayout(self)
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
self.listView = CheckListView(self.MainWindow)
|
|
self.listView.setObjectName("listView")
|
|
self.verticalLayout.addWidget(self.listView)
|
|
self.line = QtWidgets.QFrame(self)
|
|
self.line.setFrameShape(QtWidgets.QFrame.HLine)
|
|
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
|
|
self.line.setObjectName("line")
|
|
self.verticalLayout.addWidget(self.line)
|
|
self.horizontalLayout = QtWidgets.QHBoxLayout()
|
|
self.horizontalLayout.setObjectName("horizontalLayout")
|
|
self.label = QtWidgets.QLabel(self)
|
|
self.label.setObjectName("label")
|
|
self.horizontalLayout.addWidget(self.label)
|
|
self.runCountEdit = QtWidgets.QLineEdit(self)
|
|
self.runCountEdit.setObjectName("runCountEdit")
|
|
self.runCountEdit.setText('1')
|
|
self.horizontalLayout.addWidget(self.runCountEdit)
|
|
self.verticalLayout.addLayout(self.horizontalLayout)
|
|
|
|
self.retranslateUi()
|
|
QtCore.QMetaObject.connectSlotsByName(self)
|
|
|
|
def retranslateUi(self):
|
|
_translate = QtCore.QCoreApplication.translate
|
|
self.setWindowTitle(_translate("self", "self"))
|
|
self.label.setText(_translate("Form", " 执行次数:"))
|
|
|
|
|
|
|
|
# if __name__ == '__main__':
|
|
|
|
# app = QApplication(sys.argv)
|
|
# w = AxWidget()
|
|
# w.show()
|
|
# sys.exit(app.exec_()) |