class GroupPresenter: def __init__(self, parent, username): self._user = username self._group_model = Group() self._user_group_model = UserGroup() self._custom_goal = CustomGoal() self.data = self.read_data() self.proxyModel = SortFilterProxyModel() # make a proxy model object self.model = CustomTableModel(self.data) self.proxyModel.setSourceModel(self.model) self.ui = Ui_group(parent, self.proxyModel, self.data) #self.ui.group_table.setModel(self.proxyModel) # At initialisation, the proxyModel is the model itself self.checkGroupSearch() # method for searching the database self.ui.group_table.clicked.connect( partial(self.displayInQlineEdit )) # method for displaying text when row is clicked #self.ui.group_name_output.textEdited.connect(partial(self.addNewGroup)) # method for editing calorific value when portion changes self.ui.create_group_button.clicked.connect(partial( self.addNewGroup)) # method to add new food to database self.ui.join_group_button.clicked.connect(partial( self.joinNewGroup)) # method to add new food to database # self.ui.setupUi(self.group) # pass the diet widget to the ui def read_data(self): session = make_session() # query FoodDictionary to fetch all rows .with_entities(Group.groupName, CustomGoal.goal_description) data = session.query(Group).join(CustomGoal) \ .with_entities(Group.groupName, CustomGoal.goal_description, CustomGoal.date).all() session.close() return data def displayInQlineEdit(self): index = self.ui.group_table.currentIndex( ) # fetched index of row currently selected in the table groupName = self.ui.group_table.model().index(index.row(), 0) groupGoal = self.ui.group_table.model().index(index.row(), 1) self.ui.group_name_output.setText( groupName.data()) # display selected food name self.ui.group_goal_output.setText( groupGoal.data()) # display selected food name def checkGroupSearch(self): self.ui.search_input.textEdited.connect( partial(self.filterRegExpChanged) ) # signal to filter table based on search query def filterRegExpChanged(self): syntax = QtCore.QRegExp.PatternSyntax(QtCore.QRegExp.FixedString) regExp = QtCore.QRegExp(self.ui.search_input.text(), QtCore.Qt.CaseInsensitive, syntax) self.proxyModel.setFilterRegExp(regExp) def addNewGroup(self): if (self.ui.group_name_input.text() == '' or self.ui.group_goal_input.text() == ''): # disallow adding food with empty text print('not allowed') display_message('Input cannot be empty', 'Please enter valid group name and description') else: groupName = self.ui.group_name_input.text() groupType = self.ui.group_type.currentText().upper() groupGoal = self.ui.group_goal_input.text() completionDate = self.ui.completion_date.date().toPyDate() try: groupID = Group.createGroup(groupName, groupType, completionDate) self._user_group_model.createUserGroup(self._user, groupID) self._custom_goal.create_custom_goal(self._user, groupGoal, date.today(), group_id=groupID) self.data = self.read_data() self.model = CustomTableModel(self.data) # reset model self.proxyModel.setSourceModel( self.model ) # display added food without a need for refreshing self.ui.group_table.setModel(self.proxyModel) display_message('New group added', 'You have added a new group successfully', False) except Exception as e: display_message( 'Invalid input', 'Please enter a valid group name or description!') print(e) # function to put user into a group def joinNewGroup(self): groupName = self.ui.group_name_output.text() groupGoal = self.ui.group_goal_output.text() try: self._user_group_model.addUserGroup( self._user, self._group_model.get_id_by_name(groupName)) self.data = self.read_data() self.model = CustomTableModel(self.data) # reset model self.proxyModel.setSourceModel( self.model) # display added food without a need for refreshing self.ui.group_table.setModel(self.proxyModel) display_message('Joined group', 'You have joined a new group successfully', False) except Exception as e: display_message( 'Fail to join group', 'Error joining the group, please check your input and try again!' ) print(e) def page(self): return self.ui.scrollArea