diff --git a/Implementace/controllers/distribution_overview_controller.py b/Implementace/controllers/distribution_overview_controller.py index 65581c6629a9d77a9aca342b37daf422ce46290b..deb7206ee5427e91605844a2edba4f74bbd62ab8 100644 --- a/Implementace/controllers/distribution_overview_controller.py +++ b/Implementace/controllers/distribution_overview_controller.py @@ -8,10 +8,11 @@ from utils.members_drag_drop_table import MembersDragDropTable from windows import distribution_overview class DistributionOverview(Qt.QWidget, distribution_overview.Ui_Form): - def __init__(self, main_window, teams, parent=None): + def __init__(self, main_window, teams, group, parent=None): super(DistributionOverview, self).__init__(parent) self.setupUi(self) self.main_window = main_window + self.group = group self._editName = QLineEdit() self.teamTables = [] for i, team_name in enumerate(teams): @@ -95,7 +96,7 @@ class DistributionOverview(Qt.QWidget, distribution_overview.Ui_Form): for table in self.teamTables: team = Team(table.id_, table.name, table.getAllData()) teams.append(team) - distribution = Distribution(self.lblDistName.text(), teams) + distribution = Distribution(self.lblDistName.text(), teams, self.group.id_) start = timer() distribution.saveToDb() print('total time:', timer() - start) diff --git a/Implementace/controllers/group_edit_controller.py b/Implementace/controllers/group_edit_controller.py index d77166fc67c757eefcebda506f2d51afa460f290..2f0e86e49015994d02e3d698ae0cedf66517a233 100644 --- a/Implementace/controllers/group_edit_controller.py +++ b/Implementace/controllers/group_edit_controller.py @@ -1,6 +1,7 @@ from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QLineEdit from utils.members_table import MembersTable +from utils.qtmodels.distributions_tree_model import DistributionTreeModel from windows import groupedit from PyQt5 import QtWidgets as Qt @@ -35,8 +36,9 @@ class GroupEdit(Qt.QWidget, groupedit.Ui_Form): self.group = group self.membersTable = MembersTable(num_of_buttons=2, button_titles=("View", "-",), data=group.members) self.updateMemberCount() - self.layoutMembers.insertWidget(1, self.membersTable) + self.layoutMembers.addWidget(self.membersTable) self.lblName.setText(group.name) + self.treeDistributions.setModel(DistributionTreeModel(group.distributions)) @pyqtSlot() def editName(self): diff --git a/Implementace/controllers/mainwindow_controller.py b/Implementace/controllers/mainwindow_controller.py index c15f51672efcd32e6cc968a0f7a1b6a662244427..e6050761cdade1396ba15ec5e7d7d41f16ba3e83 100644 --- a/Implementace/controllers/mainwindow_controller.py +++ b/Implementace/controllers/mainwindow_controller.py @@ -65,7 +65,7 @@ class MainWindow(Qt.QMainWindow, mainwindow.Ui_MainWindow): "team 4": [members[5]], "team 5": [members[6], members[7]], } - self._goToWidget(DistributionOverview(self, teams)) + self._goToWidget(DistributionOverview(self, teams, group)) def goToMemberOverview(self, member): """ diff --git a/Implementace/controllers/member_overview.py b/Implementace/controllers/member_overview.py index 5c6f3af98dafd73596ca8800871dd047276c4175..581eefecc962f8e81908403b0295536a6e02a7ff 100644 --- a/Implementace/controllers/member_overview.py +++ b/Implementace/controllers/member_overview.py @@ -17,5 +17,5 @@ class MemberOverview(QWidget, member_overview.Ui_Form): self.lblSurname.setText(self.member.surname) self.lblGroup.setText(self.member.group_name) - self.tableCount = HistoryCountTable(data=Global.db.getHistoryCount(self.member.id_), parent=self) + self.tableCount = HistoryCountTable(data=member.history_count, parent=self) self.tab2_layout.addWidget(self.tableCount) diff --git a/Implementace/database.py b/Implementace/database.py index 814e6833bca0ede912d8a78546d0aaa35ccc6f1e..44679b6ce8f93a764f233bfd59796f98276e0a84 100644 --- a/Implementace/database.py +++ b/Implementace/database.py @@ -106,13 +106,13 @@ class Database: return None return Member(member_id, row['name'], row['surname'], row['group_id']) - def createDistribution(self, name): + def createDistribution(self, name, group_id): """ create new distribution :param name: :return: id of the newly created distribution """ - curs = self.connection.execute('''INSERT INTO distribution (name) VALUES (?)''', (name,)) + curs = self.connection.execute('''INSERT INTO distribution (name, group_id) VALUES (?, ?)''', (name, group_id,)) return curs.lastrowid def createTeam(self, name, distribution_id): @@ -162,11 +162,11 @@ class Database: :param group_id: :return: list of all Distribution(s) of given group """ - curs = self.connection.execute('''SELECT * FROM distribution WHERE group_id = ?''', (group_id,)) + curs = self.connection.execute('''SELECT * FROM distribution WHERE group_id = ? ORDER BY creation_time''', (group_id,)) res = [] for row in curs: teams = self.getTeamsByDistributionID(row['distribution_id']) - res.append(Distribution(row['name'], teams, row['distribution_id'])) + res.append(Distribution(row['name'], teams, row['group_id'], row['distribution_id'])) return res def getTeamsByDistributionID(self, distribution_id): diff --git a/Implementace/model/distribution.py b/Implementace/model/distribution.py index 6fdc115b088d593e55431094331660cec881c717..142be7e51c7d6bb700064379c84942e6927fb38e 100644 --- a/Implementace/model/distribution.py +++ b/Implementace/model/distribution.py @@ -3,13 +3,14 @@ from timeit import default_timer as timer class Distribution: - def __init__(self, name, teams, id_=None): + def __init__(self, name, teams, group_id=None, id_=None): self.id_ = id_ self.name = name self.teams = teams + self.group_id = group_id def saveToDb(self): - self.id_ = Global.db.createDistribution(self.name) + self.id_ = Global.db.createDistribution(self.name, self.group_id) for team in self.teams: start = timer() team_id = Global.db.createTeam(team.name, self.id_) diff --git a/Implementace/model/group.py b/Implementace/model/group.py index ee62e11890fc97214f6cf006ac5f532f7abdc361..228a2bf4b07abe93d8e3b99410964c17cbba69e2 100644 --- a/Implementace/model/group.py +++ b/Implementace/model/group.py @@ -34,6 +34,10 @@ class Group: self.members # to force initialization return len(self._members) + @property + def distributions(self): + return Global.db.getDistributionsByGroupID(self.id_) + def delete(self): Global.db.deleteGroup(self.id_) diff --git a/Implementace/model/member.py b/Implementace/model/member.py index 302f3bb5cede4ac63e0f4ea2d6be6c1faaeb7acd..7e1b2e846752fad47bb913e4e3636f541cf1bb99 100644 --- a/Implementace/model/member.py +++ b/Implementace/model/member.py @@ -1,5 +1,6 @@ from globals import Global + class Member: def __init__(self, id_, name, surname, group_id): self.id_ = id_ @@ -10,3 +11,7 @@ class Member: @property def group_name(self): return Global.db.getGroupName(self.group_id) + + @property + def history_count(self): + return Global.db.getHistoryCount(self.id_) diff --git a/Implementace/utils/qtmodels/distributions_tree_model.py b/Implementace/utils/qtmodels/distributions_tree_model.py new file mode 100644 index 0000000000000000000000000000000000000000..1929f74fffc2dabb4ec7c62abc519c62589fb48e --- /dev/null +++ b/Implementace/utils/qtmodels/distributions_tree_model.py @@ -0,0 +1,74 @@ +from PyQt5.QtCore import QAbstractItemModel, QModelIndex +from PyQt5.QtCore import Qt + +from model.member import Member + + +class DistributionTreeModel(QAbstractItemModel): + def __init__(self, distributions, parent=None): + super(DistributionTreeModel, self).__init__(parent) + self._rootNode = self.buildTree(distributions) + + def buildTree(self, distributions): + root_node = Node(None, None) + for dist in distributions: + dist_node = Node(dist, root_node) + for team in dist.teams: + team_node = Node(team, dist_node) + for member in team.members: + member_node = Node(member, team_node) + team_node.children.append(member_node) + dist_node.children.append(team_node) + root_node.children.append(dist_node) + return root_node + + def parent(self, index=None): + node = index.internalPointer() + parentNode = node.parent + if parentNode == self._rootNode: + return QModelIndex() + + if parentNode.parent is not None: + row = parentNode.parent.children.index(parentNode) + else: + row = None + + return self.createIndex(row, 0, parentNode) + + def index(self, row, column, parent): + if not parent.isValid(): + parentNode = self._rootNode + else: + parentNode = parent.internalPointer() + + childItem = parentNode.children[row] + return self.createIndex(row, column, childItem) + + def columnCount(self, parent): + return 1 + + def rowCount(self, parent): + if not parent.isValid(): + parentNode = self._rootNode + else: + parentNode = parent.internalPointer() + + return len(parentNode.children) + + def data(self, index, role): + if not index.isValid(): + return None + + value = index.internalPointer().data + + if role == Qt.DisplayRole: + if isinstance(value, Member): + return value.surname + " " + value.name + return value.name + + +class Node: + def __init__(self, data, parent): + self.data = data + self.children = [] + self.parent = parent diff --git a/Implementace/windows/groupedit.py b/Implementace/windows/groupedit.py index 1e1aa71e8650d325938440324cecea60f701b875..9d5e9d2666224e5723d7980826020f00aa1b0a27 100644 --- a/Implementace/windows/groupedit.py +++ b/Implementace/windows/groupedit.py @@ -73,26 +73,50 @@ class Ui_Form(object): self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setSpacing(0) self.verticalLayout_3.setObjectName("verticalLayout_3") - self.layoutMembers = QtWidgets.QHBoxLayout() - self.layoutMembers.setObjectName("layoutMembers") - self.label_2 = QtWidgets.QLabel(Form) - self.label_2.setMinimumSize(QtCore.QSize(80, 0)) - self.label_2.setMaximumSize(QtCore.QSize(80, 16777215)) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + spacerItem5 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem5) + self.tabWidget = QtWidgets.QTabWidget(Form) font = QtGui.QFont() - font.setPointSize(10) font.setBold(True) font.setWeight(75) - self.label_2.setFont(font) - self.label_2.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop) - self.label_2.setObjectName("label_2") - self.layoutMembers.addWidget(self.label_2) - spacerItem5 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) - self.layoutMembers.addItem(spacerItem5) - self.verticalLayout_3.addLayout(self.layoutMembers) + self.tabWidget.setFont(font) + self.tabWidget.setObjectName("tabWidget") + self.tabMembers = QtWidgets.QWidget() + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.tabMembers.setFont(font) + self.tabMembers.setObjectName("tabMembers") + self.layoutMembers = QtWidgets.QVBoxLayout(self.tabMembers) + self.layoutMembers.setContentsMargins(0, 0, 0, 0) + self.layoutMembers.setObjectName("layoutMembers") + self.tabWidget.addTab(self.tabMembers, "") + self.tabDistributions = QtWidgets.QWidget() + font = QtGui.QFont() + font.setBold(False) + font.setWeight(50) + self.tabDistributions.setFont(font) + self.tabDistributions.setObjectName("tabDistributions") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tabDistributions) + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.treeDistributions = QtWidgets.QTreeView(self.tabDistributions) + self.treeDistributions.setAnimated(True) + self.treeDistributions.setHeaderHidden(True) + self.treeDistributions.setObjectName("treeDistributions") + self.treeDistributions.header().setVisible(False) + self.horizontalLayout_2.addWidget(self.treeDistributions) + self.tabWidget.addTab(self.tabDistributions, "") + self.horizontalLayout_3.addWidget(self.tabWidget) + spacerItem6 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem6) + self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName("horizontalLayout_4") - spacerItem6 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_4.addItem(spacerItem6) + spacerItem7 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_4.addItem(spacerItem7) self.editNewMemberName = QtWidgets.QLineEdit(Form) self.editNewMemberName.setObjectName("editNewMemberName") self.horizontalLayout_4.addWidget(self.editNewMemberName) @@ -104,12 +128,13 @@ class Ui_Form(object): self.btnAddNew.setDefault(False) self.btnAddNew.setObjectName("btnAddNew") self.horizontalLayout_4.addWidget(self.btnAddNew) - spacerItem7 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) - self.horizontalLayout_4.addItem(spacerItem7) + spacerItem8 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_4.addItem(spacerItem8) self.verticalLayout_3.addLayout(self.horizontalLayout_4) self.verticalLayout.addLayout(self.verticalLayout_3) self.retranslateUi(Form) + self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): @@ -121,7 +146,8 @@ class Ui_Form(object): self.btnDistribute.setText(_translate("Form", "RozdÄ›lit")) self.label.setText(_translate("Form", "PoÄŤet ÄŤlenĹŻ:")) self.lblMemberCount.setText(_translate("Form", "0")) - self.label_2.setText(_translate("Form", "ÄŚlenovĂ©:")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabMembers), _translate("Form", "ÄŚlenovĂ©")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabDistributions), _translate("Form", "Historie")) self.editNewMemberName.setPlaceholderText(_translate("Form", "JmĂ©no")) self.editNewMemberSurname.setPlaceholderText(_translate("Form", "PĹ™ĂjmenĂ")) self.btnAddNew.setText(_translate("Form", "PĹ™idat")) diff --git a/Implementace/windows/qt/groupedit.ui b/Implementace/windows/qt/groupedit.ui index b250fb51c8fb70d222b6f43b0f24b9842e844135..30a91dcd15a78cd00772f0379ceb940ac4ea53e5 100644 --- a/Implementace/windows/qt/groupedit.ui +++ b/Implementace/windows/qt/groupedit.ui @@ -181,34 +181,72 @@ <number>0</number> </property> <item> - <layout class="QHBoxLayout" name="layoutMembers"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> <item> - <widget class="QLabel" name="label_2"> - <property name="minimumSize"> - <size> - <width>80</width> - <height>0</height> - </size> + <spacer name="horizontalSpacer_9"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Maximum</enum> </property> - <property name="maximumSize"> + <property name="sizeHint" stdset="0"> <size> <width>80</width> - <height>16777215</height> + <height>20</height> </size> </property> + </spacer> + </item> + <item> + <widget class="QTabWidget" name="tabWidget"> <property name="font"> <font> - <pointsize>10</pointsize> <weight>75</weight> <bold>true</bold> </font> </property> - <property name="text"> - <string>ÄŚlenovĂ©:</string> - </property> - <property name="alignment"> - <set>Qt::AlignHCenter|Qt::AlignTop</set> + <property name="currentIndex"> + <number>0</number> </property> + <widget class="QWidget" name="tabMembers"> + <property name="font"> + <font> + <weight>50</weight> + <bold>false</bold> + </font> + </property> + <attribute name="title"> + <string>ÄŚlenovĂ©</string> + </attribute> + <layout class="QVBoxLayout" name="layoutMembers"/> + </widget> + <widget class="QWidget" name="tabDistributions"> + <property name="font"> + <font> + <weight>50</weight> + <bold>false</bold> + </font> + </property> + <attribute name="title"> + <string>Historie</string> + </attribute> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QTreeView" name="treeDistributions"> + <property name="animated"> + <bool>true</bool> + </property> + <property name="headerHidden"> + <bool>true</bool> + </property> + <attribute name="headerVisible"> + <bool>false</bool> + </attribute> + </widget> + </item> + </layout> + </widget> </widget> </item> <item>