def realizarSancion(self): if (self.sancion.value() == 0): ErrorPrompt("Error", "Las sanciones deben durar al menos 1 dia!") return if (self.sancion_books.value() == 7): ErrorPrompt( "Error", "La cantidad de libro por prestamo durante la sanción debe ser menor a 7!" ) return self.query = QSqlQuery() queryText = "UPDATE Estudiante SET days_blocked = '" + str( self.sancion.value()) + "', num_books_per_loan = '" + str( self.sancion_books.value( )) + "', start_blocked_time = '" + str( datetime.date.today()) + "' WHERE carnet = '" + str( self.currentStudent) + "';" success = self.query.exec_(queryText) if (not success): ErrorPrompt("Error", "No se pudo realizar la sanción.") return self.button_finalizar.setEnabled(True) InfoPrompt("Éxito", "La sanción ha sido impuesta con éxito!") # Actualizamos las tablas self.updateDebtTabla() self.updateSancionTable()
def confirmDelete(self): if (int(self.table.item(7, 0).text()) != 0): ErrorPrompt( "Error en la eliminación", "El estudiante posee libros sin devolver, no se puede eliminar" ) else: queryText = "DELETE FROM Estudiante WHERE carnet = \'" + self.table.item( 0, 0).text() + "\' RETURNING carnet" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): InfoPrompt("Eliminación exitosa", "El estudiante ha sido eliminado del sistema") self.search.setEnabled(True) self.confirm.setEnabled(False) self.deleteCancel.setEnabled(False) self.confirm.hide() self.deleteCancel.hide() self.table.clear() self.carnet.setText("") else: ErrorPrompt("Error en la eliminación", "El estudiante no pudo ser eliminado") self.confirm.hide() self.deleteCancel.hide()
def renovarPrestamo(self): titles = "" self.query = QSqlQuery() start_date = str(datetime.datetime.now()) hours = start_date.split() self.query = QSqlQuery() self.queryTitle = QSqlQuery() self.queryMail = QSqlQuery() self.queryMail.exec_("SELECT email FROM Estudiante WHERE carnet = \'" + self.currentStudent + "\'") if self.queryMail.first(): address = str(self.queryMail.value(0)) else: ErrorPrompt( "Error", "No se pudo realizar la renovación. Estudiante no tiene email") return i = 0 while (i != self.tabla_libros_prestamos.rowCount()): if (self.tabla_libros_prestamos.item(i, 0).text() != ""): self.query.exec_( "SELECT loan_duration FROM Book WHERE book_id = '" + self.tabla_libros_prestamos.item(i, 0).text() + "';") if (self.query.first()): return_date = str( datetime.date.today() + datetime.timedelta( days=(self.query.value(0)))) + " " + str(hours[1]) self.query.exec_( "UPDATE Loan SET estimated_return_time = '" + return_date + "' WHERE book_id = '" + self.tabla_libros_prestamos.item(i, 0).text() + "' AND carnet = '" + str(self.currentStudent) + "';") self.renovarToLog( self.currentStudent, self.tabla_libros_prestamos.item(i, 0).text(), return_date) self.queryTitle.exec_( "SELECT title FROM Book WHERE book_id = " + str(self.tabla_libros_prestamos.item(i, 0).text())) if self.queryTitle.first(): titles += str(self.queryTitle.value(0)) else: titles += str( self.tabla_libros_prestamos.item(i, 0).text()) titles += "\n" i += 1 else: ErrorPrompt("Error", "Ocurrió un error renovando el préstamo") else: break self.sendConfirmEmail(address, "Renovación", titles, return_date) InfoPrompt("Éxito", "El préstamo se renovó con éxito!") self.updateActiveLoanTable()
def anadir(self): fields = [self.ingresarNombre.text(), self.ingresarApellido.text()] author_id = int(self.query[0][0]) + 1 correct = check_name(str(fields[0]), 1) and check_name( str(fields[1]), 0) and check_quantity(str(author_id)) if not correct: return self.query = QSqlQuery() self.query.prepare( "INSERT INTO Author(first_name, last_name, author_id) VALUES(:first_name, :last_name, :author_id) RETURNING author_id" ) self.query.bindValue(0, fields[0]) self.query.bindValue(1, fields[1]) self.query.bindValue(2, int(fields[2])) self.query.exec_() if self.query.first(): InfoPrompt( "Éxito", "La información del autor ha sido agregada exitosamente") self.table.llenarAutores() else: ErrorPrompt("Fracaso", "El autor no fue agregado al sistema")
def emailStudent(self, receiver, text): port = 465 # For SSL smtp_server = "smtp.gmail.com" sender_email = "*****@*****.**" receiver_email = receiver password = "******" msg = MIMEMultipart() msg['Subject'] = "Notificación" msg['From'] = sender_email msg['To'] = receiver_email content = text content = MIMEText(content) msg.attach(content) try: context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: server.login(sender_email, password) server.sendmail(sender_email, receiver_email, content.as_string().encode("utf8")) except: ErrorPrompt( "Error", "No se pudo mandar email de notificación. Vuelva a intentar más tarde" )
def consultaAux(self, inputUser): queryText = "SELECT username, first_name, last_name, email, permission_mask, last_login,\ creation_date FROM CEIC_User WHERE username = '******';" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): self.currentUser = inputUser self.table.setEditTriggers(QAbstractItemView.NoEditTriggers | QAbstractItemView.DoubleClicked) for i in range(self.table.rowCount()): if (i < 4): self.table.item(i, 0).setText(str(self.query.value(i))) elif i == 4: if int(self.query.value(i)) == 0: self.table.cellWidget(i, 0).setCurrentIndex(0) else: self.table.cellWidget(i, 0).setCurrentIndex(1) self.old_perm_mask = str( self.table.cellWidget(4, 0).currentText()) else: auxiliar = QDateTime.toString(self.query.value(i)).split() self.table.item(i, 0).setText( str(auxiliar[0] + ' ' + auxiliar[2] + ' ' + auxiliar[1] + ' ' + auxiliar[4] + ' ' + auxiliar[3])) self.modificar.setEnabled(True) self.eliminar.setEnabled(True) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) else: ErrorPrompt( "Error", "El usuario no existe, ingrese otro nombre de usuario ")
def saveUpdate(self): fields = self.table.getFields() correct = verification_books(fields, 7) if not correct: return values = self.table.getValues() queryText = "UPDATE Book SET " + values + " WHERE book_id = '" + self.table.item( 0, 0).text() + "' returning book_id" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): InfoPrompt( "Actualización completada", "La información del libro ha sido actualizada exitosamente") self.search.setEnabled(True) self.author.setEnabled(True) self.eliminar.setEnabled(True) self.modificar.setEnabled(True) self.guardar.setEnabled(False) self.cancel.setEnabled(False) self.guardar.hide() self.cancel.hide() self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) else: ErrorPrompt("Error", "La información del libro no pudo ser modificada") self.author.setEnabled(True) self.guardar.hide() self.cancel.hide()
def sendConfirmEmail(self, receiver, subject, text, return_date): port = 465 # For SSL smtp_server = "smtp.gmail.com" sender_email = "*****@*****.**" receiver_email = receiver password = "******" msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = sender_email msg['To'] = receiver_email if subject == "Préstamo": content = "Hola:\n\nHas pedido prestado(s) el(los) siguinte(s) libro(s): \n\n" content += text content += "Fecha de devolución: " content += return_date.split(".")[0] else: content = "Hola:\n\nHas renovado el préstamo de: \n\n" content += text content += "Fecha de devolución: " content += return_date.split(".")[0] content = MIMEText(content) msg.attach(content) try: context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: server.login(sender_email, password) server.sendmail(sender_email, receiver_email, content.as_string().encode("utf8")) except: ErrorPrompt("Error", "No se pudo enviar el correo de confimación")
def AgregarLibro(self): global autores fields = [self.IDInput.text(), self.titleBookInput.text(), autores, self.ISBNInput.text(),\ self.quantityInput.text()] correct = verification_books(fields, 5) if not correct: return self.query = QSqlQuery() self.query.prepare("INSERT INTO Book(book_id, title, authors, isbn, quantity, quantity_lent) VALUES(:ID, :title, \ :authors, :ISBN, :quantity, '0') RETURNING book_id") self.query.bindValue(0, int(fields[0])) self.query.bindValue(1, fields[1]) self.query.bindValue(2, fields[2]) self.query.bindValue(3, fields[3]) self.query.bindValue(4, int(fields[4])) self.query.exec_() if self.query.first(): InfoPrompt("Éxito", "La información del libro ha sido agregada exitosamente") else: ErrorPrompt("Fracaso", "El libro no fue agregado al sistema") for i in range(int(fields[4])): self.query.exec_("INSERT INTO Book_copy (copy_id, book_id) VALUES('" + str(i+1) + "', '" + str(fields[0]) + "');")
def agregarEstudiante(self): fields = [self.carnetInput.text(), self.fnameInput.text(), self.lnameInput.text(), self.CIInput.text(),\ self.phoneInput.text(), self.emailInput.text()] correct = verification_estudiantes(fields, 6) if not correct: return self.query = QSqlQuery() self.query.prepare( "INSERT INTO Estudiante(carnet, first_name, last_name, CI, phone, email) VALUES(:carnet, :fname, \ :lname, :CI, :phone, :email ) RETURNING carnet") self.query.bindValue(0, fields[0]) self.query.bindValue(1, fields[1]) self.query.bindValue(2, fields[2]) self.query.bindValue(3, int(fields[3])) self.query.bindValue(4, int(fields[4])) self.query.bindValue(5, fields[5]) self.query.exec_() if self.query.first(): InfoPrompt( "Éxito", "La información del estudiante ha sido agregada exitosamente") self.clean() else: ErrorPrompt("Fracaso", "El estudiante no fue agregado al sistema")
def buscarEstudiante(self, carnetBuscado): if(check_carnet(carnetBuscado)): queryText = "SELECT * FROM Estudiante WHERE carnet = '" + carnetBuscado + "';" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): self.currentStudent = carnetBuscado self.nombre.setText(str(self.query.value(1))) self.apellido.setText(str(self.query.value(2))) self.deuda.setText(str(self.query.value(9))) if(float(self.deuda.text()) != 0.0): self.tipo.setEnabled(True) self.monto.setReadOnly(False) self.banco.setReadOnly(False) self.codigo.setReadOnly(False) self.button_aplicar.setEnabled(True) else: self.tipo.setEnabled(False) self.monto.setReadOnly(True) self.monto.setText("") self.banco.setReadOnly(True) self.banco.setText("") self.codigo.setReadOnly(True) self.codigo.setText("") self.button_aplicar.setEnabled(False) else: ErrorPrompt("Error", "No se encontró un Estudiante con ese carnet")
def buscarEstudiante(self, carnetBuscado): if (check_carnet(carnetBuscado)): queryText = "SELECT * FROM Estudiante WHERE carnet = '" + carnetBuscado + "';" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): self.currentStudent = carnetBuscado self.nombre.setText(str(self.query.value(1))) self.apellido.setText(str(self.query.value(2))) self.sancion.setValue(int(self.query.value(6))) self.sancion_books.setValue(int(self.query.value(7))) self.deuda.setText(str(self.query.value(9))) self.sancion.setReadOnly(False) self.sancion.setStyleSheet( "QSpinBox\n{\n border: 1px solid #C9C9C9;\n border-radius: 3px;\n background-color: white;\n}" ) self.sancion_books.setReadOnly(False) self.sancion_books.setStyleSheet( "QSpinBox\n{\n border: 1px solid #C9C9C9;\n border-radius: 3px;\n background-color: white;\n}" ) self.button_aplicar.setEnabled(True) if (self.query.value(6) >= 1): self.button_finalizar.setEnabled(True) else: self.button_finalizar.setEnabled(False) else: ErrorPrompt("Error", "No se encontró un Estudiante con ese carnet") # Actualizamos las tablas self.updateDebtTabla() self.updateSancionTable()
def changePasswordForm(self, username, codigo): if (self.code.text() != codigo): ErrorPrompt("Error", "Código Erroneo!") return self.labelInfo.setText("Ingrese la Nueva Contraseña") self.labelInfo.move(77, 20) self.code.setText("") self.code.setPlaceholderText("Nueva Contraseña") self.code.setEchoMode(QLineEdit.Password) self.code.setFixedHeight(40) self.code.move(72, 90) self.repeat_password.setText("") self.repeat_password.setPlaceholderText("Repetir Contraseña") self.repeat_password.setEchoMode(QLineEdit.Password) self.repeat_password.setFixedHeight(40) self.repeat_password.move(72, 140) # Conexion self.code.returnPressed.connect(lambda: self.changePassword(username)) self.repeat_password.returnPressed.connect( lambda: self.changePassword(username))
def anadir(self): fields = [self.nombreInput.text(), self.apellidoInput.text()] correct = check_name(fields[0], 1) and check_name(fields[1], 0) if not correct: return self.query = QSqlQuery() self.query.prepare( "INSERT INTO Author(first_name, last_name) VALUES(:first_name, :last_name) RETURNING author_id" ) self.query.bindValue(0, fields[0]) self.query.bindValue(1, fields[1]) self.query.exec_() if self.query.first(): InfoPrompt( "Éxito", "La información del autor ha sido agregada exitosamente") self.close() else: ErrorPrompt("Fracaso", "El autor no fue agregado al sistema") self.close()
def changePassword(self, username): if (self.code.text() != self.repeat_password.text()): ErrorPrompt("Error", "Las contraseñas no coinciden!") return self.query = QSqlQuery() success = self.query.exec_("UPDATE CEIC_User SET password_ = crypt('" + str(self.code.text()) + "', gen_salt('bf', 8)) WHERE username = '******';") if (success): InfoPrompt("Success", "La contraseña ha sido modificada!") else: ErrorPrompt("Error", "Error Desconocido") self.close()
def check_username(username): if len(username) < 33: return True else: ErrorPrompt( "Error", "Nombre de usuario inválido, verifique la longitud del mismo") return False
def consulta(self): inputUser = self.User.text() if (check_username(inputUser)): self.consultaAux(inputUser) else: ErrorPrompt("Error de usuario", "El username no sigue el patrón correspondiente")
def consulta(self): inputCarnet = self.carnet.text() if (self.carnetPattern.match(inputCarnet) is None): ErrorPrompt("Error de formato", "Error: Ese no es el formato de un carnet") return self.consultaAux(inputCarnet)
def actualizarMontoDeuda(self): self.query = QSqlQuery() if(self.act_deuda.text() == ""): self.query.exec_("SELECT monto_deuda FROM Deuda WHERE id = 0;") if(self.query.first()): self.montoDeuda = float(self.query.value(0)) self.act_deuda.setText(str(self.montoDeuda)) else: ErrorPrompt("Error", "No se pudo actualizar el monto de deuda agregada por día.") else: if(check_debt(self.act_deuda.text())): success = self.query.exec_("UPDATE Deuda SET monto_deuda = '" + self.act_deuda.text() + "' WHERE id = 0;") if(success): self.montoDeuda = float(self.act_deuda.text()) InfoPrompt("Éxito", "El monto de deuda agregada por día se ha actualizado!") else: ErrorPrompt("Error", "No se pudo actualizar el monto de deuda agregada por día.")
def consulta(self): inputTitulo = self.titulo.text() if (self.libroPattern.match(inputTitulo) is None): ErrorPrompt("Error de formato", "Error: Ese no es el formato del título de un libro") return self.consultaAux(inputTitulo)
def saveUpdate(self, loggedUser): fields = self.table.getFields() self.query = QSqlQuery() if (self.old_perm_mask != fields[4]): Input = QInputDialog() input_logged_user_password = Input.getText(self, "Ingresar Contraseña", "Contraseña:") queryText = "SELECT * FROM CEIC_User WHERE username = '******' and password_ = crypt(\'" + input_logged_user_password[ 0] + "\', password_);" self.query.exec_(queryText) if (not self.query.first()): ErrorPrompt("Error", "Contraseña Inválida!") return correct = verification_users(fields, 5) if not correct: return values = self.table.getValues() queryText = "UPDATE CEIC_User SET " + values + " WHERE username = '******' returning username" self.query.exec_(queryText) if self.query.first(): InfoPrompt( "Actualización completada", "La información del usuario ha sido actualizada exitosamente") self.search.setEnabled(True) self.eliminar.setEnabled(True) self.modificar.setEnabled(True) self.guardar.setEnabled(False) self.cancel.setEnabled(False) self.guardar.hide() self.cancel.hide() self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table.cellWidget(4, 0).setEnabled(False) else: ErrorPrompt("Error", "La información del usuario no pudo ser modificada")
def finalizarPrestamo(self, Username): self.query = QSqlQuery() success = self.query.exec_("DELETE FROM Loan WHERE carnet='" + str(self.currentStudent) + "';") self.queryMail = QSqlQuery() self.queryMail.exec_("SELECT email FROM Estudiante WHERE carnet = \'" + self.currentStudent + "\'") if self.queryMail.first(): address = str(self.queryMail.value(0)) else: ErrorPrompt("Error", "Estudiante no tiene email") return if (success): i = 0 # Actualizamos la cantidad prestada de cada libro while (i != self.tabla_libros_prestamos.rowCount()): if (self.tabla_libros_prestamos.item(i, 0).text() != ""): self.query.exec_( "UPDATE Book SET quantity_lent = quantity_lent - 1 WHERE book_id='" + str(self.tabla_libros_prestamos.item(i, 0).text()) + "';") self.query.exec_( "UPDATE Estudiante SET current_books = current_books - 1 WHERE carnet='" + str(self.currentStudent) + "';") self.finalizarToLog( self.currentStudent, Username, str(self.tabla_libros_prestamos.item(i, 0).text())) i += 1 else: break else: ErrorPrompt("Error", "No se pudo marcar el préstamo como finalizado") return self.booksReturnesEmail(address, "Finalización de préstamo") InfoPrompt("Éxito", "Se marcó el préstamo como finalizado!") self.updateActiveLoanTable() self.buscarEstudiante(self.currentStudent)
def updateBooksPerLoan(self): self.query = QSqlQuery() success = self.query.exec_( "UPDATE Books_per_loan SET monto_libro_per_loan = '" + str(self.books_per_loan.value()) + "' WHERE id = 0;") if (success): InfoPrompt("Éxito", "Máximo de libros por prestamo actualizado!") else: ErrorPrompt( "Error", "No se pudo actualizar la cantidad máxima de libros por prestamo" )
def pagarDeuda(self, Username): debt = check_debt(self.monto.text()) # Variable debt permite no hacer el llamado dos veces al remover el nested if if(debt and (float(self.deuda.text()) < float(self.monto.text()))): ErrorPrompt("Error", "El monto a pagar sobrepasa el monto de la deuda.") return elif (not debt): return self.query = QSqlQuery() if(self.tipo.currentIndex() == 0 and ((self.banco.text() == "") or (self.codigo.text() == ""))): ErrorPrompt("Error", "Los campos de banco o código de transferencia no fueron llenados.") return deuda_restante = float(self.deuda.text()) - float(self.monto.text()) success_deuda = self.query.exec_("UPDATE Estudiante SET book_debt = '"+ str(deuda_restante) + "' WHERE carnet = '" + self.currentStudent + "';") # Si se logro pagar la deuda, se registra el pago si es transferencia. Si es en efectivo, no se hace nada. if(success_deuda and self.tipo.currentIndex() == 0): success_transf = self.query.exec_("INSERT INTO Transferencias(username, cliente, monto, banco, codigo) VALUES('" + Username +"', '" + self.currentStudent + "', '" + self.monto.text() + "', '" + self.banco.text() + "', '" + self.codigo.text() + "');") if(success_transf): InfoPrompt("Éxito", "Se ingresó con éxito el pago de la multa!") self.updateTablaTransf() self.button_aplicar.setEnabled(False) self.deuda.setText(str(deuda_restante)) self.monto.setText("") self.banco.setText("") self.codigo.setText("") else: ErrorPrompt("Error", "Ocurrió un error procesando los datos de la transferencia.") elif(success_deuda): self.button_aplicar.setEnabled(False) self.monto.setText("") self.deuda.setText(str(deuda_restante)) InfoPrompt("Éxito", "Se ingresó con éxito el pago de la multa!") # Si se pago la deuda completa, se elimina de los deudores if(deuda_restante == 0): self.updateDebtTabla()
def confirmDelete(self): if (int(self.table.item(5, 0).text()) != 0): ErrorPrompt( "Error en la eliminación", "Una copia del libro está siendo prestada a un estudiante, no se puede eliminar" ) else: queryText = "DELETE FROM Book_copy WHERE book_id = " + self.table.item( 0, 0).text() + " RETURNING book_id" self.query = QSqlQuery() self.query.exec_(queryText) queryText = "DELETE FROM WrittenBy WHERE book_id = " + self.table.item( 0, 0).text() + " RETURNING book_id" self.query = QSqlQuery() self.query.exec_(queryText) queryText = "DELETE FROM Book WHERE book_id = " + self.table.item( 0, 0).text() + " RETURNING book_id" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): InfoPrompt("Eliminación exitosa", "El libro ha sido eliminado del sistema") self.search.setEnabled(True) self.author.setEnabled(True) self.confirm.setEnabled(False) self.deleteCancel.setEnabled(False) self.confirm.hide() self.deleteCancel.hide() self.table.clear() self.titulo.setText("") else: ErrorPrompt("Error en la eliminación", "El libro no pudo ser eliminado") self.author.setEnabled(True) self.confirm.hide() self.deleteCancel.hide()
def finalizarSancion(self, carnet, prompt): self.query = QSqlQuery() queryText = "UPDATE Estudiante SET days_blocked = '0', num_books_per_loan = '7', start_blocked_time = NULL WHERE carnet = '" + str( carnet) + "';" success = self.query.exec_(queryText) if (not success and prompt): ErrorPrompt("Error", "No se pudo finalizar la sanción.") return elif (success and prompt): self.button_finalizar.setEnabled(False) self.sancion.setValue(0) self.sancion_books.setValue(7) InfoPrompt("Éxito", "La sanción ha sido finalizada con éxito!") # Actualizamos las tablas self.updateDebtTabla() self.updateSancionTable()
def deleteRequest(self): if (self.permission != 1): ErrorPrompt( "Se necesitan permisos adicionales", "Usted no dispone de los permisos necesarios para esta acción") return ConfirmPrompt( "Eliminación de estudiante", "Se ha solicitado eliminar estudiante. Marque botón de eliminación para\ confirmar") self.search.setEnabled(False) self.modificar.setEnabled(False) self.eliminar.setEnabled(False) self.confirm.setEnabled(True) self.deleteCancel.setEnabled(True) self.confirm.show() self.deleteCancel.show()
def consultaAux(self, tituloBuscado): queryText = "SELECT * FROM Book WHERE title = '" + tituloBuscado + "';" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): self.currentBook = tituloBuscado self.table.setEditTriggers(QAbstractItemView.NoEditTriggers | QAbstractItemView.DoubleClicked) for i in range(self.table.rowCount()): if (i == 4): self.noCopy = int(self.query.value(i)) self.table.item(i, 0).setText(str(self.query.value(i))) self.modificar.setEnabled(True) self.eliminar.setEnabled(True) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) else: ErrorPrompt("Error de búsqueda", "Error: Libro no encontrado")
def consultaAux(self, carnetBuscado): queryText = "SELECT carnet, first_name, last_name, CI, phone, email, days_blocked, current_books, book_debt FROM Estudiante WHERE carnet = '" + carnetBuscado + "';" self.query = QSqlQuery() self.query.exec_(queryText) if self.query.first(): self.currentStudent = carnetBuscado self.table.setEditTriggers(QAbstractItemView.NoEditTriggers | QAbstractItemView.DoubleClicked) for i in range(self.table.rowCount() - 1): if (i < 8): self.table.item(i, 0).setText(str(self.query.value(i))) else: self.table.item(i, 0).setText( str(round(self.query.value(i), 2))) self.table.item(9, 0).setText( str(round(self.query.value(i) / 18500, 2))) self.table.item(9, 0).setFlags(Qt.ItemIsEnabled) self.modificar.setEnabled(True) self.eliminar.setEnabled(True) self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) else: ErrorPrompt("ENE Piso 3", "Error ENE_Piso3: Estudiante Not Found")
def booksReturnesEmail(self, receiver, subject): port = 465 # For SSL smtp_server = "smtp.gmail.com" sender_email = "*****@*****.**" receiver_email = receiver password = "******" msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = sender_email msg['To'] = receiver_email content = "Hola:\n\nHas finalizado tu préstamo de libros" content = MIMEText(content) msg.attach(content) try: context = ssl.create_default_context() with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: server.login(sender_email, password) server.sendmail(sender_email, receiver_email, content.as_string().encode("utf8")) except: ErrorPrompt("Error", "No se pudo mandar email de confirmación")