Exemple #1
0
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