diff --git a/Implementace/controllers/groups_overview_controller.py b/Implementace/controllers/groups_overview_controller.py index b638d592a6929194c1dfe51f03646981b847771a..f67983bc6fb3af86eddb7ee9255f23ad2c7fcf08 100644 --- a/Implementace/controllers/groups_overview_controller.py +++ b/Implementace/controllers/groups_overview_controller.py @@ -49,4 +49,4 @@ class GroupsOverview(QWidget, groupsoverview.Ui_Form): @pyqtSlot(Member) def editMember(self, person): - print(person.id_) + self.main_window.goToMemberOverview(person) diff --git a/Implementace/controllers/mainwindow_controller.py b/Implementace/controllers/mainwindow_controller.py index dec7b1811c21f8e540b31a1afe640291f8f03908..c15f51672efcd32e6cc968a0f7a1b6a662244427 100644 --- a/Implementace/controllers/mainwindow_controller.py +++ b/Implementace/controllers/mainwindow_controller.py @@ -5,6 +5,7 @@ from controllers.distribution_overview_controller import DistributionOverview from controllers.distribution_setup_controller import DistributionSetup from controllers.group_edit_controller import GroupEdit from controllers.groups_overview_controller import GroupsOverview +from controllers.member_overview import MemberOverview from globals import Global from windows import mainwindow @@ -14,8 +15,8 @@ class MainWindow(Qt.QMainWindow, mainwindow.Ui_MainWindow): super(MainWindow, self).__init__(parent) self.setupUi(self) self.btnBack.clicked.connect(self.goBack) - # self.goToGroupsOverview() - self.goToDistributionOverview() + self.goToGroupsOverview() + # self.goToDistributionOverview() self._last_changed = 0 def _goToWidget(self, widget): @@ -66,6 +67,13 @@ class MainWindow(Qt.QMainWindow, mainwindow.Ui_MainWindow): } self._goToWidget(DistributionOverview(self, teams)) + def goToMemberOverview(self, member): + """ + change active window to MemberOverview() + :param member: + """ + self._goToWidget(MemberOverview(self, member)) + def reset(self): """ Set application to default state (effectively this means emptying 'back' stack and going to GroupsOverview() diff --git a/Implementace/controllers/member_overview.py b/Implementace/controllers/member_overview.py new file mode 100644 index 0000000000000000000000000000000000000000..5c6f3af98dafd73596ca8800871dd047276c4175 --- /dev/null +++ b/Implementace/controllers/member_overview.py @@ -0,0 +1,21 @@ +from PyQt5.QtWidgets import QWidget + +from utils.history_count_table import HistoryCountTable +from windows import member_overview +from globals import Global + + +class MemberOverview(QWidget, member_overview.Ui_Form): + def __init__(self, mainwindow, member, parent=None): + super(MemberOverview, self).__init__(parent) + self.setupUi(self) + + self.main_window = mainwindow + + self.member = member + self.lblName.setText(self.member.name) + 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.tab2_layout.addWidget(self.tableCount) diff --git a/Implementace/database.py b/Implementace/database.py index 5d4af03a8bdd610f8dec062a3c8b16ed9ba2f256..814e6833bca0ede912d8a78546d0aaa35ccc6f1e 100644 --- a/Implementace/database.py +++ b/Implementace/database.py @@ -1,6 +1,9 @@ import sqlite3 as sqlite + +from model.distribution import Distribution from model.group import Group from model.member import Member +from model.team import Team class Database: @@ -49,6 +52,7 @@ class Database: curs.execute('''INSERT INTO groups (name) VALUES (?) ''', (name,)) return Group(curs.lastrowid, name) + #TODO other tables def deleteGroup(self, group_id): """ delete group and all its members @@ -132,3 +136,60 @@ class Database: curs = self.connection.cursor() for member in members: curs.execute('''INSERT INTO member_to_team (member_id, team_id) VALUES (?, ?)''', (member.id_, team_id,)) + + def getGroupName(self, group_id): + """ + :param group_id: + :return: group name + """ + curs = self.connection.execute('''SELECT name FROM groups WHERE group_id = ?''', (group_id,)) + row = curs.fetchone() + return row['name'] + + def getHistoryCount(self, member_id): + """ + :param member_id: + :return: list (member, count how many times he was in the same team,) + """ + curs = self.connection.execute('''SELECT * FROM member_history_view WHERE member_id = ?''', (member_id,)) + res = [] + for row in curs: + res.append((Member(row['with_member_id'], row['name'], row['surname'], row['group_id']), row['times_together'],)) + return res + + def getDistributionsByGroupID(self, group_id): + """ + :param group_id: + :return: list of all Distribution(s) of given group + """ + curs = self.connection.execute('''SELECT * FROM distribution WHERE group_id = ?''', (group_id,)) + res = [] + for row in curs: + teams = self.getTeamsByDistributionID(row['distribution_id']) + res.append(Distribution(row['name'], teams, row['distribution_id'])) + return res + + def getTeamsByDistributionID(self, distribution_id): + """ + :param distribution_id: + :return: list of Team(s) in given distribution + """ + curs = self.connection.execute('''SELECT * FROM team WHERE distribution_id = ?''', (distribution_id,)) + res = [] + for row in curs: + members = self.getMembersByTeamId(row['team_id']) + res.append(Team(row['team_id'], row['name'], members)) + return res + + def getMembersByTeamId(self, team_id): + """ + :param team_id: + :return: list of Member(s) in given team + """ + curs = self.connection.execute('''SELECT * FROM member_to_team + JOIN member ON member_to_team.member_id = member.member_id + WHERE team_id = ?''', (team_id,)) + res = [] + for row in curs: + res.append(Member(row['member_id'], row['name'], row['surname'], row['group_id'])) + return res diff --git a/Implementace/model/member.py b/Implementace/model/member.py index 544451201c99e0c589d8fe9c89578e2cb2ac3c98..302f3bb5cede4ac63e0f4ea2d6be6c1faaeb7acd 100644 --- a/Implementace/model/member.py +++ b/Implementace/model/member.py @@ -1,4 +1,4 @@ - +from globals import Global class Member: def __init__(self, id_, name, surname, group_id): @@ -6,3 +6,7 @@ class Member: self.name = name self.surname = surname self.group_id = group_id + + @property + def group_name(self): + return Global.db.getGroupName(self.group_id) diff --git a/Implementace/utils/history_count_table.py b/Implementace/utils/history_count_table.py new file mode 100644 index 0000000000000000000000000000000000000000..04245b8b52dd83c15d1f650b255c068d7453e475 --- /dev/null +++ b/Implementace/utils/history_count_table.py @@ -0,0 +1,11 @@ +from utils.qtmodels.history_count_table_model import HistoryCountTableModel +from utils.table import ElemTable + + +class HistoryCountTable(ElemTable): + def __init__(self, num_of_buttons=0, button_titles=(), data=[], parent=None): + super(HistoryCountTable, self).__init__(HistoryCountTableModel(data, num_of_buttons + 3), num_of_buttons, button_titles, parent) + + + def changeData(self, data): + self.setModel(HistoryCountTableModel(data, self._btn_amount + 2)) \ No newline at end of file diff --git a/Implementace/utils/members_table.py b/Implementace/utils/members_table.py index 84542b4954a6c38f75e46f0d15665d7895275afb..eca698482be7285e2f9226410b5de7e45a44c65d 100644 --- a/Implementace/utils/members_table.py +++ b/Implementace/utils/members_table.py @@ -8,4 +8,4 @@ class MembersTable(ElemTable): def changeData(self, data): - self.setModel(MembersTableModel(data, self._btn_amount + 2)) \ No newline at end of file + self.setModel(MembersTableModel(data, self._btn_amount + 2)) diff --git a/Implementace/utils/qtmodels/history_count_table_model.py b/Implementace/utils/qtmodels/history_count_table_model.py new file mode 100644 index 0000000000000000000000000000000000000000..8b4a81854fe2001a21945d5725417aa25bbac661 --- /dev/null +++ b/Implementace/utils/qtmodels/history_count_table_model.py @@ -0,0 +1,39 @@ +from PyQt5 import QtGui, QtCore, uic + + +class HistoryCountTableModel(QtCore.QAbstractTableModel): + def __init__(self, data={}, num_columns=3, parent=None): + super(HistoryCountTableModel, self).__init__(parent) + self._data = data + self._columns = num_columns + + def rowCount(self, parent=None, *args, **kwargs): + return len(self._data) + + def columnCount(self, parent=None, *args, **kwargs): + return self._columns + + def headerData(self, p_int, Qt_Orientation, role=None): + if role == QtCore.Qt.DisplayRole: + if p_int == 0: + return 'PĹ™ĂjmenĂ' + if p_int == 1: + return 'JmĂ©no' + if p_int ==2: + return 'Ve stejnĂ©m tĂ˝mu' + + def data(self, index, role=None): + person, count = self._data[index.row()] + if role == QtCore.Qt.DisplayRole: + if index.column() == 0: + return person.surname + if index.column() == 1: + return person.name + if index.column() == 2: + return str(count) + "x" + + if role == QtCore.Qt.UserRole: + return person + + def getElementById(self, person_id): + return next((person for person in self._data if person.id_ == int(person_id)), None) diff --git a/Implementace/windows/member_overview.py b/Implementace/windows/member_overview.py new file mode 100644 index 0000000000000000000000000000000000000000..c35d55c77d552791c9621df7546e7affa4d5de84 --- /dev/null +++ b/Implementace/windows/member_overview.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'memberoverview.ui' +# +# Created by: PyQt5 UI code generator 5.8.1 +# +# WARNING! All changes made in this file will be lost! + +from PyQt5 import QtCore, QtGui, QtWidgets + +class Ui_Form(object): + def setupUi(self, Form): + Form.setObjectName("Form") + Form.resize(837, 640) + self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem) + spacerItem1 = QtWidgets.QSpacerItem(50, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem1) + self.lblName = QtWidgets.QLabel(Form) + font = QtGui.QFont() + font.setPointSize(11) + font.setBold(True) + font.setWeight(75) + self.lblName.setFont(font) + self.lblName.setObjectName("lblName") + self.horizontalLayout_3.addWidget(self.lblName) + self.lblSurname = QtWidgets.QLabel(Form) + font = QtGui.QFont() + font.setPointSize(11) + font.setBold(True) + font.setWeight(75) + self.lblSurname.setFont(font) + self.lblSurname.setObjectName("lblSurname") + self.horizontalLayout_3.addWidget(self.lblSurname) + self.btnEdit = QtWidgets.QPushButton(Form) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.btnEdit.sizePolicy().hasHeightForWidth()) + self.btnEdit.setSizePolicy(sizePolicy) + self.btnEdit.setMinimumSize(QtCore.QSize(30, 0)) + self.btnEdit.setMaximumSize(QtCore.QSize(50, 16777215)) + self.btnEdit.setObjectName("btnEdit") + self.horizontalLayout_3.addWidget(self.btnEdit) + spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem2) + self.verticalLayout.addLayout(self.horizontalLayout_3) + self.lblGroup = QtWidgets.QLabel(Form) + self.lblGroup.setAlignment(QtCore.Qt.AlignCenter) + self.lblGroup.setObjectName("lblGroup") + self.verticalLayout.addWidget(self.lblGroup) + self.tabWidget = QtWidgets.QTabWidget(Form) + self.tabWidget.setObjectName("tabWidget") + self.tab = QtWidgets.QWidget() + self.tab.setObjectName("tab") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.tab) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setObjectName("horizontalLayout") + self.treeView = QtWidgets.QTreeView(self.tab) + self.treeView.setObjectName("treeView") + self.horizontalLayout.addWidget(self.treeView) + self.tabWidget.addTab(self.tab, "") + self.tab2 = QtWidgets.QWidget() + self.tab2.setObjectName("tab2") + self.tab2_layout = QtWidgets.QHBoxLayout(self.tab2) + self.tab2_layout.setContentsMargins(0, 0, 0, 0) + self.tab2_layout.setObjectName("tab2_layout") + self.tabWidget.addTab(self.tab2, "") + self.verticalLayout.addWidget(self.tabWidget) + self.verticalLayout_2.addLayout(self.verticalLayout) + + self.retranslateUi(Form) + self.tabWidget.setCurrentIndex(1) + QtCore.QMetaObject.connectSlotsByName(Form) + + def retranslateUi(self, Form): + _translate = QtCore.QCoreApplication.translate + Form.setWindowTitle(_translate("Form", "Form")) + self.lblName.setText(_translate("Form", "Name")) + self.lblSurname.setText(_translate("Form", "Surname")) + self.btnEdit.setText(_translate("Form", "edit")) + self.lblGroup.setText(_translate("Form", "Group")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "Tab 1")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab2), _translate("Form", "Tab 2")) + diff --git a/Implementace/windows/qt/memberoverview.ui b/Implementace/windows/qt/memberoverview.ui new file mode 100644 index 0000000000000000000000000000000000000000..ebf35804960061f2f1eaa7fe067aef92de7b8247 --- /dev/null +++ b/Implementace/windows/qt/memberoverview.ui @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Form</class> + <widget class="QWidget" name="Form"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>837</width> + <height>640</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Fixed</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>50</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="lblName"> + <property name="font"> + <font> + <pointsize>11</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Name</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="lblSurname"> + <property name="font"> + <font> + <pointsize>11</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Surname</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="btnEdit"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>30</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>50</width> + <height>16777215</height> + </size> + </property> + <property name="text"> + <string>edit</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QLabel" name="lblGroup"> + <property name="text"> + <string>Group</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>1</number> + </property> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Tab 1</string> + </attribute> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QTreeView" name="treeView"/> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab2"> + <attribute name="title"> + <string>Tab 2</string> + </attribute> + <layout class="QHBoxLayout" name="tab2_layout"/> + </widget> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/Implementace/windows/qt/qt.pro.user b/Implementace/windows/qt/qt.pro.user index 6b06d064eb6a147ed5010bc43e52b956cdf6c392..60dab174ca0d68672b233863ff016759e7914852 100644 --- a/Implementace/windows/qt/qt.pro.user +++ b/Implementace/windows/qt/qt.pro.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 4.2.1, 2017-04-09T18:45:14. --> +<!-- Written by QtCreator 4.2.1, 2017-04-09T22:19:03. --> <qtcreator> <data> <variable>EnvironmentId</variable>