From 72f043f45050704ef092723a2e223131f95f962f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20=C5=A0tercl?= <stercjak@fit.cvut.cz>
Date: Wed, 15 Mar 2017 15:31:16 +0100
Subject: [PATCH] groups overview: groups table displays as intended, members
 table displays correct data

---
 .../controllers/group_edit_controller.py      |  8 ++++
 .../controllers/groups_overview_controller.py | 39 ++++++++++++++++---
 .../controllers/mainwindow_controller.py      | 16 +-------
 Implementace/database.py                      |  4 +-
 Implementace/model/group.py                   |  4 ++
 .../model/qtmodels/GroupTableModel.py         | 21 +++++++---
 .../model/qtmodels/PersonListModel.py         | 20 ----------
 .../model/qtmodels/PersonTableModel.py        | 33 ++++++++++++++++
 8 files changed, 97 insertions(+), 48 deletions(-)
 create mode 100644 Implementace/controllers/group_edit_controller.py
 delete mode 100644 Implementace/model/qtmodels/PersonListModel.py
 create mode 100644 Implementace/model/qtmodels/PersonTableModel.py

diff --git a/Implementace/controllers/group_edit_controller.py b/Implementace/controllers/group_edit_controller.py
new file mode 100644
index 0000000..26e3b32
--- /dev/null
+++ b/Implementace/controllers/group_edit_controller.py
@@ -0,0 +1,8 @@
+from windows import groupedit
+from PyQt5 import QtWidgets as Qt
+
+class GroupEditWindow(Qt.QMdiSubWindow, groupedit.Ui_Dialog):
+    def __init__(self, db, parent=None):
+        super(GroupEditWindow, self).__init__(parent)
+        self.db = db
+        self.setupUi(self)
\ No newline at end of file
diff --git a/Implementace/controllers/groups_overview_controller.py b/Implementace/controllers/groups_overview_controller.py
index fa69800..241fa54 100644
--- a/Implementace/controllers/groups_overview_controller.py
+++ b/Implementace/controllers/groups_overview_controller.py
@@ -1,6 +1,8 @@
+from PyQt5.QtCore import *
 from PyQt5.QtWidgets import *
 from globals import Global
 from model.qtmodels.GroupTableModel import GroupTableModel
+from model.qtmodels.PersonTableModel import PersonTableModel
 from windows import groupsoverview
 
 
@@ -9,17 +11,44 @@ class GroupsOverview(QWidget, groupsoverview.Ui_Form):
         super(GroupsOverview, self).__init__(parent)
         self.setupUi(self)
         #self.btnCreateGroup.clicked.connect()
-        model = GroupTableModel(Global.db.get_groups())
+        self._initializeGroupsTable()
+
+    def _initializeGroupsTable(self):
+
+        # initialize contents
+        model = GroupTableModel(Global.db.getGroups())
+        model.dataChanged.connect(self.nameButtons)
         self.tableGroups.setModel(model)
+        self._buttons = []
         for i in range(model.rowCount()):
-            edit_button = QPushButton("edit" + str(i))
-            group = model.data(self.tableGroups.model().index(i, 0), model.modelRole)
-            edit_button.setObjectName(str(group.id))
+            edit_button = QPushButton("edit")
+            self._buttons.append(edit_button)
+            self.nameButtons()
             edit_button.clicked.connect(self.editGroup)
             self.tableGroups.setIndexWidget(self.tableGroups.model().index(i, 1), edit_button)
+
+        # initialize table settings (and signals)
         header_view = self.tableGroups.horizontalHeader()
         header_view.setSectionResizeMode(0, QHeaderView.Stretch)
         header_view.resizeSection(1, 50)
+        self.tableGroups.clicked.connect(self.showMembers)
+        self.tableGroups.activated.connect(self.showMembers)
+        self.tableGroups.sortByColumn(0, Qt.AscendingOrder)
+
+    @pyqtSlot()
+    def nameButtons(self):
+        model = self.tableGroups.model()
+        for i, button in enumerate(self._buttons):
+            group = model.data(model.index(i, 0), model.MODEL_ROLE)
+            button.setObjectName(str(group.id))
 
     def editGroup(self):
-        print(self.sender().objectName())
\ No newline at end of file
+        print(self.sender().objectName())
+
+    def showMembers(self):
+        index = self.tableGroups.currentIndex()
+        model = self.tableGroups.model()
+        group = model.data(index, model.MODEL_ROLE)
+        members = group.getMembers()
+        model = PersonTableModel(members)
+        self.tableMembers.setModel(model)
\ No newline at end of file
diff --git a/Implementace/controllers/mainwindow_controller.py b/Implementace/controllers/mainwindow_controller.py
index 7145007..bb504fc 100644
--- a/Implementace/controllers/mainwindow_controller.py
+++ b/Implementace/controllers/mainwindow_controller.py
@@ -2,7 +2,7 @@ from PyQt5 import QtWidgets as Qt
 
 from controllers.groups_overview_controller import GroupsOverview
 from model.qtmodels.GroupTableModel import GroupTableModel
-from model.qtmodels.PersonListModel import PersonListModel
+from model.qtmodels.PersonTableModel import PersonTableModel
 from windows import mainwindow
 from globals import Global
 
@@ -21,21 +21,7 @@ class Mainwindow(Qt.QMainWindow, mainwindow.Ui_MainWindow):
         for controller in self._screens:
             self.stackedWidget.addWidget(controller)
         self.go_to_group_overview()
-        # model = GroupListModel(self.db.get_groups())
-        # self.listGroups.setModel(model)
-        # self.listGroups.activated.connect(self.show_members)
-        # self.listGroups.clicked.connect(self.show_members)
-        #for group in self.db.get_groups():
-         #   self.listGroups.addItem(group.name)
-        #self.listGroups.currentItemChanged.connect(self.show_people)
-        #self.btnBrowse.clicked.connect(self.browse_folder)
-        #self.list1.currentItemChanged.connect(self.show_content)
 
     def go_to_group_overview(self):
         self.stackedWidget.setCurrentWidget(self._screens[0])
 
-    # def show_members(self, current):
-    #     group = current.data(GroupListModel.modelRole)
-    #     members = Global.db.get_group_members(group.id)
-    #     model = PersonListModel(members)
-    #     self.listPeople.setModel(model)
diff --git a/Implementace/database.py b/Implementace/database.py
index 14e0566..ddce0e2 100644
--- a/Implementace/database.py
+++ b/Implementace/database.py
@@ -8,7 +8,7 @@ class Database:
         self.connection = sqlite.connect('database.db')
         self.connection.isolation_level = None  # so we don't have to use self.connection.commit()
 
-    def get_groups(self, person_id = None):
+    def getGroups(self, person_id = None):
         if person_id is not None:
             curs = self.connection.execute("SELECT * FROM GROUPS WHERE person_id = ?", str(person_id))
         else:
@@ -18,7 +18,7 @@ class Database:
             res.append(Group(row))
         return res
 
-    def get_group_members(self, group_id):
+    def getGroupMembers(self, group_id):
         curs = self.connection.execute('''SELECT person.*
                                     FROM person
                                         JOIN person_to_group USING (person_id)
diff --git a/Implementace/model/group.py b/Implementace/model/group.py
index 582b041..d77d5f1 100644
--- a/Implementace/model/group.py
+++ b/Implementace/model/group.py
@@ -1,6 +1,10 @@
+from globals import Global
 
 
 class Group:
     def __init__(self, db_row):
         self.id = db_row[0]
         self.name = db_row[1]
+
+    def getMembers(self):
+        return Global.db.getGroupMembers(self.id)
\ No newline at end of file
diff --git a/Implementace/model/qtmodels/GroupTableModel.py b/Implementace/model/qtmodels/GroupTableModel.py
index 444f0eb..76a7d08 100644
--- a/Implementace/model/qtmodels/GroupTableModel.py
+++ b/Implementace/model/qtmodels/GroupTableModel.py
@@ -3,7 +3,7 @@ from PyQt5.QtWidgets import QPushButton
 
 
 class GroupTableModel(QtCore.QAbstractTableModel):
-    modelRole = -1
+    MODEL_ROLE = -1
 
     def __init__(self, groups=[], parent=None):
         super(GroupTableModel, self).__init__(parent)
@@ -16,15 +16,24 @@ class GroupTableModel(QtCore.QAbstractTableModel):
         return 2
 
     def headerData(self, p_int, Qt_Orientation, role=None):
-        if role == QtCore.Qt.DisplayRole:
-            return 'x'
+        if role == QtCore.Qt.DisplayRole and p_int == 0:
+            return 'Jméno skupiny'
 
     def data(self, index, role=None):
         if role == QtCore.Qt.DisplayRole:
             if index.column() == 0:
                 return self._groups[index.row()].name
-            if index.column() == 1:
-                return QPushButton("karel")
 
-        if role == GroupTableModel.modelRole:
+        if role == GroupTableModel.MODEL_ROLE:
             return self._groups[index.row()]
+
+    def sort(self, p_int, order=None):
+        if p_int != 0:
+            return
+        if order == QtCore.Qt.AscendingOrder:
+            self._groups.sort(key=lambda group: group.name)
+        if order == QtCore.Qt.DescendingOrder:
+            self._groups.sort(key=lambda group: group.name, reverse=True)
+        self.dataChanged.emit(self.index(0, 0),
+                         self.index(self.rowCount(), 0),
+                         [])
diff --git a/Implementace/model/qtmodels/PersonListModel.py b/Implementace/model/qtmodels/PersonListModel.py
deleted file mode 100644
index 5a34169..0000000
--- a/Implementace/model/qtmodels/PersonListModel.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from PyQt5 import QtGui, QtCore, uic
-
-
-class PersonListModel(QtCore.QAbstractListModel):
-    modelRole = -1
-
-    def __init__(self, people=[], parent=None):
-        super(PersonListModel, self).__init__(parent)
-        self._people = people
-
-    def rowCount(self, parent=None, *args, **kwargs):
-        return len(self._people)
-
-    def data(self, index, role=None):
-        person = self._people[index.row()]
-        if role == QtCore.Qt.DisplayRole:
-            return person.name + " " + person.surname
-
-        if role == PersonListModel.modelRole:
-            return self._people[index.row()]
diff --git a/Implementace/model/qtmodels/PersonTableModel.py b/Implementace/model/qtmodels/PersonTableModel.py
new file mode 100644
index 0000000..a0dfb01
--- /dev/null
+++ b/Implementace/model/qtmodels/PersonTableModel.py
@@ -0,0 +1,33 @@
+from PyQt5 import QtGui, QtCore, uic
+
+
+class PersonTableModel(QtCore.QAbstractTableModel):
+    MODEL_ROLE = -1
+
+    def __init__(self, people=[], parent=None):
+        super(PersonTableModel, self).__init__(parent)
+        self._people = people
+
+    def rowCount(self, parent=None, *args, **kwargs):
+        return len(self._people)
+
+    def columnCount(self, parent=None, *args, **kwargs):
+        return 3
+
+    def headerData(self, p_int, Qt_Orientation, role=None):
+        if role == QtCore.Qt.DisplayRole:
+            if p_int == 0:
+                return 'Jméno'
+            if p_int == 1:
+                return 'Příjmení'
+
+    def data(self, index, role=None):
+        person = self._people[index.row()]
+        if role == QtCore.Qt.DisplayRole:
+            if index.column() == 0:
+                return person.name
+            if index.column() == 1:
+                return person.surname
+
+        if role == PersonTableModel.MODEL_ROLE:
+            return self._people[index.row()]
-- 
GitLab