def update_tables(self): self.set_line_edit_value(self.c_view.ui.lineEditCoeffLineB0, self.c_coefficient_model.line_coefficients_list[0]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffLineB1, self.c_coefficient_model.line_coefficients_list[1]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffLineB2, self.c_coefficient_model.line_coefficients_list[2]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffLineB3, self.c_coefficient_model.line_coefficients_list[3]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffNoLineB0, self.c_coefficient_model.no_line_coefficients_list[0]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffNoLineB1, self.c_coefficient_model.no_line_coefficients_list[1]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffNoLineB2, self.c_coefficient_model.no_line_coefficients_list[2]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffNoLineB3, self.c_coefficient_model.no_line_coefficients_list[3]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffNoLineB12, self.c_coefficient_model.no_line_coefficients_list[4]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffNoLineB13, self.c_coefficient_model.no_line_coefficients_list[5]) self.set_line_edit_value(self.c_view.ui.lineEditCoeffNoLineB23, self.c_coefficient_model.no_line_coefficients_list[6]) for i in range(self.c_coefficient_model.count_experiments): for j in range(len(self.c_coefficient_model.x_values_matrix[i])): cell_info_x_matrix = QTableWidgetItem(str(self.c_coefficient_model.x_values_matrix[i][j])) self.c_view.ui.tableWidgetLineModel.setItem(i, j, cell_info_x_matrix) cell_info_x_matrix = cell_info_x_matrix.clone() self.c_view.ui.tableWidgetNoLineModel.setItem(i, j, cell_info_x_matrix) cell_info_x12 = QTableWidgetItem(str(self.c_coefficient_model.x12_vector[i])) self.c_view.ui.tableWidgetNoLineModel.setItem(i, 3, cell_info_x12) cell_info_x13 = QTableWidgetItem(str(self.c_coefficient_model.x13_vector[i])) self.c_view.ui.tableWidgetNoLineModel.setItem(i, 4, cell_info_x13) cell_info_x23 = QTableWidgetItem(str(self.c_coefficient_model.x23_vector[i])) self.c_view.ui.tableWidgetNoLineModel.setItem(i, 5, cell_info_x23) cell_info_y_practice = QTableWidgetItem(str(round(self.c_coefficient_model.y_practice_vector[i], 3))) self.c_view.ui.tableWidgetLineModel.setItem(i, 3, cell_info_y_practice) cell_info_y_practice = cell_info_y_practice.clone() self.c_view.ui.tableWidgetNoLineModel.setItem(i, 6, cell_info_y_practice) cell_info_y_predict = QTableWidgetItem(str(round(self.c_coefficient_model.y_predict_vector[i], 3))) self.c_view.ui.tableWidgetLineModel.setItem(i, 4, cell_info_y_predict) cell_info_y_predict = cell_info_y_predict.clone() self.c_view.ui.tableWidgetNoLineModel.setItem(i, 7, cell_info_y_predict) diff_y = self.c_coefficient_model.get_diff_y cell_info_diff_y = QTableWidgetItem(str(round(diff_y[i], 3))) self.c_view.ui.tableWidgetLineModel.setItem(i, 5, cell_info_diff_y) cell_info_diff_y = cell_info_diff_y.clone() self.c_view.ui.tableWidgetNoLineModel.setItem(i, 8, cell_info_diff_y) diff_y_pow_2 = self.c_coefficient_model.get_diff_y_pow_2 cell_info_diff_y_pow_2 = QTableWidgetItem(str(round(diff_y_pow_2[i], 5))) self.c_view.ui.tableWidgetLineModel.setItem(i, 6, cell_info_diff_y_pow_2) cell_info_diff_y_pow_2 = cell_info_diff_y_pow_2.clone() self.c_view.ui.tableWidgetNoLineModel.setItem(i, 9, cell_info_diff_y_pow_2)
class AdminPanel(): def __init__(self, gui): self.gui = gui # Connect signals self.gui.admin_close_pushButton.clicked.connect(self.gui.close) self.gui.admin_shutdown_pushButton.clicked.connect(system_pi.shutdown) self.gui.admin_restart_pushButton.clicked.connect(system_pi.reboot) self.gui.admin_email_checkBox.stateChanged.connect( self.switch_email_state) self.gui.admin_email_checkBox.stateChanged.connect( self.gui.countdown.start) self.gui.admin_return_pushButton.clicked.connect(self.return_pressed) self.gui.admin_display_comboBox.activated.connect(self.show_details) self.gui.admin_display_comboBox.activated.connect( self.gui.countdown.start) self.gui.admin_details_table.cellClicked.connect( self.gui.countdown.start) self.gui.admin_addOperation_comboBox.activated.connect( self.do_operation) self.gui.admin_testemail_pushButton.clicked.connect(email.test) self.gui.admin_testemail_pushButton.clicked.connect( self.gui.countdown.start) # Configure tablew widget self.gui.admin_details_table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeToContents) self.gui.admin_details_table.verticalHeader().setVisible(False) self.gui.admin_details_table.cellClicked.connect(self.cell_clicked) self.base_item = QTableWidgetItem() self.base_item.setTextAlignment(Qt.AlignCenter) self.check_box_dict = None # Return countdown self.callback_countdown_update = lambda x: self.gui.admin_return_pushButton.setText( f'Return\n({x})') self.callback_countdown_end = self.return_pressed def start(self): ''' Initialize panel ''' # Email checkBox self.gui.admin_email_checkBox.setChecked(self.gui.send_email) # Admin balance self.gui.admin_balance_label.setText( str(system.get_balance()) + ' \u20ac') # Users nb_users = system.get_nb_users() nb_users_active = system.get_nb_users(only_active=True) self.gui.admin_nbusers_label.setText( f'{nb_users} users ({nb_users_active} active)') # Display self.show_details(self.gui.admin_display_comboBox.currentText()) # Return button self.gui.countdown.start() def stop(self): ''' Uninitialize panel ''' pass def do_operation(self, operation_index): operation_name = self.gui.admin_addOperation_comboBox.currentText() if operation_name == 'Caps purchase': self.start_caps_purchase_operation_part1() elif operation_name == 'Missing caps': self.start_missing_caps_operation() elif operation_name == 'Supplies purchase': self.start_supplies_purchase_operation() elif operation_name == 'System donation': self.start_system_donation_operation() def start_caps_purchase_operation_part1(self): keyboard = self.gui.widgets['keyboard'] keyboard.return_panel = 'admin' keyboard.callback_end = self.start_caps_purchase_operation_part2 keyboard.text_function = lambda value: f"{value} caps bought...\n" keyboard.requested_type = int keyboard.test_function = lambda x: x != 0 keyboard.auto_return = False self.gui.switch_panel_signal.emit('keyboard') def start_caps_purchase_operation_part2(self, qty): keyboard = self.gui.widgets['keyboard'] keyboard.stop() keyboard.return_panel = 'admin' keyboard.callback_end = lambda price, qty=qty: system.add_caps_purchase( qty, price) keyboard.text_function = lambda value: f"{qty} caps bought...\n... for {value} \u20ac" keyboard.requested_type = float keyboard.start() def start_supplies_purchase_operation(self): keyboard = self.gui.widgets['keyboard'] keyboard.return_panel = 'admin' keyboard.callback_end = system.add_supplies_purchase keyboard.text_function = lambda value: f"Supplies bought for {value} \u20ac" keyboard.requested_type = float keyboard.test_function = lambda x: x != 0 self.gui.switch_panel_signal.emit('keyboard') def start_missing_caps_operation(self): keyboard = self.gui.widgets['keyboard'] keyboard.return_panel = 'admin' keyboard.callback_end = system.remove_missing_caps keyboard.text_function = lambda value: f"Declare {value} missing caps" keyboard.requested_type = int keyboard.test_function = lambda x: x != 0 self.gui.switch_panel_signal.emit('keyboard') def start_system_donation_operation(self): keyboard = self.gui.widgets['keyboard'] keyboard.return_panel = 'admin' keyboard.callback_end = system.add_charity_donation keyboard.text_function = lambda value: f"Declare {value} \u20ac to charity" keyboard.requested_type = float keyboard.test_function = lambda x: x != 0 self.gui.switch_panel_signal.emit('keyboard') def add_base_item(self, row, column, text): widget = self.base_item.clone() widget.setText(text) self.gui.admin_details_table.setItem(row, column, widget) def show_details(self, display_id): self.check_box_dict = {} ''' Update the details of the table name selected ''' self.gui.admin_details_table.clear() self.gui.admin_details_table.setColumnCount(0) self.gui.admin_details_table.setRowCount(0) self.gui.admin_sumup_label.setText('') fnt = self.gui.admin_details_table.font() fnt.setPointSize(11) self.gui.admin_details_table.setFont(fnt) display_name = self.gui.admin_display_comboBox.currentText() if display_name == 'Accounts': # Load operations operations = system.get_account_operations() operations.sort_values(by='timestamp', inplace=True, ascending=False) # Configure table widget self.gui.admin_details_table.setColumnCount(5) self.gui.admin_details_table.setRowCount(50) self.gui.admin_details_table.setHorizontalHeaderLabels( ['Timestamp', 'User', 'Label', 'Value', 'Checked']) # Fill table widget for i in range(50): self.add_base_item(i, 0, str(operations.iloc[i].timestamp)) self.add_base_item(i, 1, str(operations.iloc[i].user)) self.add_base_item(i, 2, str(operations.iloc[i].label)) self.add_base_item(i, 3, str(operations.iloc[i].value)) widget = QWidget() checkbox = QCheckBox() checkbox.setChecked(bool(operations.iloc[i].checked)) checkbox.stateChanged.connect( lambda state, ID=int(operations.iloc[i].id), checkbox= checkbox: self.checkbox_state_changed(ID, state, checkbox)) self.check_box_dict[i] = checkbox hboxlayout = QHBoxLayout(widget) hboxlayout.addWidget(checkbox) hboxlayout.setAlignment(Qt.AlignCenter) hboxlayout.setContentsMargins(0, 0, 0, 0) widget.setLayout(hboxlayout) self.gui.admin_details_table.setCellWidget(i, 4, widget) # Sumup sumup = '' sumup += f'Recharges\n{system.get_total_recharges()} \u20ac\n\n' sumup += f'Shares\n{system.get_total_shares()} \u20ac\n\n' self.gui.admin_sumup_label.setText(sumup) elif display_name == 'Caps': # Load operations operations = system.get_system_caps_operations() operations.sort_values(by='timestamp', inplace=True, ascending=False) # Configure table widget self.gui.admin_details_table.setColumnCount(4) self.gui.admin_details_table.setRowCount(len(operations)) self.gui.admin_details_table.setHorizontalHeaderLabels( ['Timestamp', 'Label', 'Qty', 'Value']) # Fill table widget for i in range(len(operations)): self.add_base_item(i, 0, str(operations.iloc[i].timestamp)) self.add_base_item(i, 1, str(operations.iloc[i].label)) self.add_base_item(i, 2, str(operations.iloc[i].qty)) self.add_base_item(i, 3, str(operations.iloc[i].value)) # Sumup sumup = '' sumup += f'System: {system.get_caps_remaining_system()}\n{system.get_caps_balance_system()} \u20ac\n\n' sumup += f'Users: {system.get_caps_remaining_users()}\n{system.get_caps_balance_users()} \u20ac\n\n' sumup += f'Remaining: {system.get_caps_remaining()}\n{system.get_caps_balance()} \u20ac\n\n' sumup += f'Caps price\n{system.get_caps_price()} \u20ac' self.gui.admin_sumup_label.setText(sumup) elif display_name == 'Donations': # Load operations operations = system.get_system_donation_operations() operations.sort_values(by='timestamp', inplace=True, ascending=False) # Configure table widget self.gui.admin_details_table.setColumnCount(3) self.gui.admin_details_table.setRowCount(len(operations)) self.gui.admin_details_table.setHorizontalHeaderLabels( ['Timestamp', 'Label', 'Value']) # Fill table widget for i in range(len(operations)): self.add_base_item(i, 0, str(operations.iloc[i].timestamp)) self.add_base_item(i, 1, str(operations.iloc[i].label)) self.add_base_item(i, 2, str(operations.iloc[i].value)) # Sumup sumup = '' sumup += f'User donations\n{system.get_users_donation_balance()} \u20ac\n\n' sumup += f'System donations\n{system.get_system_donation_balance()} \u20ac\n\n' sumup += f'To be donated\n{system.get_donation_balance()} \u20ac' self.gui.admin_sumup_label.setText(sumup) def cell_clicked(self, row, col): if self.gui.admin_display_comboBox.currentText() == 'Accounts': if col == 4: state = self.check_box_dict[row].isChecked() self.check_box_dict[row].setChecked(not state) def checkbox_state_changed(self, ID, state, checkbox): ''' Change checked state in database and update GUI ''' state = bool(state / 2) system.set_account_operation_checked(ID, state) checkbox.setChecked(system.is_account_operation_checked(ID)) self.gui.countdown.start() def switch_email_state(self): ''' Enable/Disable email sending ''' state = self.gui.admin_email_checkBox.isChecked() self.gui.send_email = state # Return # ========================================================================= def return_pressed(self): ''' Return to main panel ''' self.gui.switch_panel_signal.emit('main')