def __init__(self, parent=None): super(ControlMainWindow, self).__init__(parent) # Esto es siempre lo mismo self.ui = Ui_Form() self.ui.setupUi(self) ''' Aqui se conectan todos los objetos con sus slot ''' QtCore.QObject.connect(self.ui.btnBuscar, QtCore.SIGNAL("clicked()"), self.tipoBusqueda) QtCore.QObject.connect(self.ui.btnLimpiar, QtCore.SIGNAL("clicked()"), self.limpiarText) QtCore.QObject.connect(self.ui.btnExportar, QtCore.SIGNAL("clicked()"), self.exportarExcel) self.connect(self.ui.btnSalir, QtCore.SIGNAL('clicked()'),QtGui.qApp, QtCore.SLOT('quit()')) self.statusBar().showMessage("Listo") self.main()
class ControlMainWindow(QtGui.QMainWindow): ''' ''' def __init__(self, parent=None): super(ControlMainWindow, self).__init__(parent) # Esto es siempre lo mismo self.ui = Ui_Form() self.ui.setupUi(self) ''' Aqui se conectan todos los objetos con sus slot ''' QtCore.QObject.connect(self.ui.btnBuscar, QtCore.SIGNAL("clicked()"), self.tipoBusqueda) QtCore.QObject.connect(self.ui.btnLimpiar, QtCore.SIGNAL("clicked()"), self.limpiarText) QtCore.QObject.connect(self.ui.btnExportar, QtCore.SIGNAL("clicked()"), self.exportarExcel) self.connect(self.ui.btnSalir, QtCore.SIGNAL('clicked()'),QtGui.qApp, QtCore.SLOT('quit()')) self.statusBar().showMessage("Listo") self.main() def main(self): ''' Este metodo se ejecuta al iniciar la Aplicacion, en las variables host, db, user, clave, se almacenaran los valores necesarios para realizar las consultas a el servidor de Base de Datos PostGreSQL y estas a su vez crearan una Cadena de Conexion que sera utilizada por toda la aplicacion como variable Publica ''' self.archivoCfg() #Antes: #host, db, user, clave = fc.opcion_consultar('POSTGRESQL') #self.cadconex = "host='%s' dbname='%s' user='******' password='******'" % (host[1], db[1], user[1], clave[1]) #Ahora self.prepararPostGreSQL() self.ui.txtFechaDesde.setFocus() self.registros = [] #Si la Plataforma es Windows aumento de tamaño los Iconos de los botones ya que se ven muy pequeños if sys.platform == 'win32': self.ui.btnBuscar.setIconSize(QtCore.QSize(45, 45)) self.ui.btnLimpiar.setIconSize(QtCore.QSize(35, 35)) self.ui.btnExportar.setIconSize(QtCore.QSize(35, 35)) self.ui.btnSalir.setIconSize(QtCore.QSize(35, 35)) def archivoCfg(self): '''Inicializa y Obtiene Informacion del archivo de Configuracion .cfg''' self.nombreArchivoConf = 'pymanati.cfg' self.fc = ConfigParser.ConfigParser() self.ruta_arch_conf = os.path.dirname(os.path.abspath(__file__)) self.archivo_configuracion = os.path.join(self.ruta_arch_conf, self.nombreArchivoConf) self.fc.read(self.archivo_configuracion) def prepararPostGreSQL(self): seccion = 'POSTGRESQL' if self.fc.has_section(seccion): host, dbname, user, password = [valores[1] for valores in self.fc.items(seccion)] self.cadConex = 'host={0} dbname={1} user={2} password={3} '.format(host, dbname, user, password) else: mensaje = 'No existe la seccion:"{0}" dentro del archivo de configuracion'.format(seccion) self.logger.error(mensaje) sys.exit(0) def conectarPostGreSQL(self): try: self.prepararPostGreSQL() self.conn = psycopg2.connect(self.cadConex) self.cur = self.conn.cursor() except: # Obtiene la ecepcion mas reciente exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() self.logger.error(exceptionValue) sys.exit(0) def ejecutarPostGreSQL(self, comandoSQL): '''Este Metodo permite elecutar una sentencia SQL pasada como parametro y devuelve una lista con los registros''' self.devolver = [] try: self.cur.execute(comandoSQL) self.records = self.cur.fetchall() self.devolver = self.records except: # Obtiene la ecepcion mas reciente exceptionType, exceptionValue, exceptionTraceback = sys.exc_info() # sale del Script e Imprime un error con lo que sucedio. self.logger.error(exceptionValue) sys.exit(0) return self.devolver def tipoBusqueda(self): if self.ui.radiobBuscar.isChecked(): self.validarBusqueda() else: self.Filtrar() def validarBusqueda(self): campos = [] lcFechaDesde = self.ui.txtFechaDesde.text() lcFechaHasta = self.ui.txtFechaHasta.text() lcPuerto = self.ui.txtPuerto.text() lcIP = self.ui.txtIP.text() lcComputador = self.ui.txtComputador.text() lcWeb = self.ui.txtWeb.text().upper() #para saber cuantos campos de consultaran for f in lcFechaDesde, lcFechaHasta, lcPuerto , lcIP, lcComputador, lcWeb: if f: campos.append(f) #saber de cuantos dias es la consulta, si no se coloca nada se elimina el caracter '/' f1 = datetime.datetime.strptime(lcFechaDesde, '%d/%m/%Y').date() if lcFechaDesde.replace('/', '') else 0 f2 = datetime.datetime.strptime(lcFechaHasta, '%d/%m/%Y').date() if lcFechaHasta.replace('/', '') else 0 ''' Si el valor de FechaDesde y El Valor de Fecha hasta esta Vacio entonces la variable dias se establece a 0, en python 0 devuelve False ''' dias = (f2 - f1).days if f1 and f2 else 0 if dias >30 or len(campos) <3: mensaje = 'Para que la Busqueda sea mas eficiente y rapida Verifique que la consulta no sobrepase los 30 dias \ o que realice una busqueda de almenos 3 campos' msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, 'Aviso de Sistema', mensaje) msgBox.exec_() else: self.Buscar() def Buscar(self): ''' Metodo que se utiliza para realizar la busqueda segun lo que ingresa el usuario en las cajas de texto. ''' #registros = self.obtenerDatos('select id, fecha, puerto, ip, pc, puerto_acceso, metodo, direccion from log_squid limit 10') #print registros listaCabecera = [('ID', 90), ('FECHA', 160), ('PUERTO', 60), ('IP', 100), ('PC', 160), ('P_ACCESO', 100), ('METODO', 80), ('DIRECCION_WEB', 300)] cadSql = self.armarSelect() print cadSql if cadSql: self.statusBar().showMessage("Espere mientras se obtienen los registros de la base de datos....!") self.setCursor(QtCore.Qt.WaitCursor) self.registros = '' self.registros = self.obtenerDatos(cadSql) # Ejecuta en PostGreSQL la cadena sql pasada self.PrepararTableWidget(self.registros, listaCabecera) # Configurar el tableWidget self.InsertarRegistros(self.registros) # Insertar los Registros en el TableWidget self.statusBar().showMessage("Consulta realizada con exito, se obtuvieron %s registro(s)" % (len(self.registros))) self.setCursor(QtCore.Qt.ArrowCursor) else: msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, 'Lo siento', 'Es necesario que seleccione una opcion de Busqueda') msgBox.exec_() def Filtrar(self): ''' ''' print('Click') l = self.registros lcFechaDesde = self.ui.txtFechaDesde.text() lcFechaHasta = self.ui.txtFechaHasta.text() lcPuerto = self.ui.txtPuerto.text() lcIP = self.ui.txtIP.text() lcComputador = self.ui.txtComputador.text() lcWeb = self.ui.txtWeb.text().upper() cadFechaD = "'%s' in f and " % (lcFechaDesde) if lcFechaDesde.replace('/', '') else '' cadFechaH = "'%s' in f and " % (lcFechaHasta) if lcFechaHasta.replace('/', '') else '' cadPuerto = "'%s' in f and " % (lcPuerto) if lcPuerto else '' cadIP = "'%s' in f and " % (lcIP) if lcIP.replace('.', '') else '' cadComputador = "'%s' in f and " % (lcComputador) if lcComputador else '' cadWeb = "'%s' in f and " % (lcWeb) if lcWeb else '' filtro = cadFechaD + cadFechaH + cadPuerto + cadIP + cadComputador + cadWeb cadFiltrar = filtro[:-4] for f in l: if eval(cadFiltrar): print f def PrepararTableWidget(self, CantidadReg=0, Columnas=0): ''' Parametros pasados (2) (CantidadReg: Entero) y (Columnas :Lista) Ej: PrepararTableWidget(50, ['ID', 'FECHA', 'PUERTO']) Meotodo que permite asignar y ajustar las columnas que tendra el tablewidget basados en la cantidad de conlumnas y la cantidad de registros que le son pasados como parametro ''' palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(245, 244, 226)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(254, 206, 45)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Highlight, brush) brush = QtGui.QBrush(QtGui.QColor(255, 255, 203)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush) lista = CantidadReg self.ui.tableWidget.setColumnCount(len(Columnas)) self.ui.tableWidget.setRowCount(len(lista)) #Armar Cabeceras de las Columnas cabecera = [] for f in Columnas: nombreCampo = f[0] cabecera.append(nombreCampo) for f in Columnas: posicion = Columnas.index(f) nombreCampo = f[0] ancho = f[1] self.ui.tableWidget.horizontalHeader().resizeSection(posicion, ancho) self.ui.tableWidget.setPalette(palette) self.ui.tableWidget.setAutoFillBackground(False) self.ui.tableWidget.setAlternatingRowColors(True) self.ui.tableWidget.setHorizontalHeaderLabels(cabecera) self.ui.tableWidget.setSelectionMode(QtGui.QTableWidget.SingleSelection) self.ui.tableWidget.setSelectionBehavior(QtGui.QTableView.SelectRows) #ciudades = ["Valencia","Maracay","Barquisimeto","Merida","Caracas"] #self.combo.addItems(ciudades) #deshabilitar() def armarSelect(self): ''' Metodo que permite armar la consulta select segun los datos que hay en los textbox Parametro devuelto(1) String con la cadena sql de busqueda ''' cadenaSql = '' lcFechaDesde = self.ui.txtFechaDesde.text() lcFechaHasta = self.ui.txtFechaHasta.text() lcPuerto = self.ui.txtPuerto.text() lcIP = self.ui.txtIP.text() lcComputador = self.ui.txtComputador.text() lcWeb = self.ui.txtWeb.text().upper() cadFecha = "(fecha between '%s' AND '%s') AND " % (lcFechaDesde, lcFechaHasta) \ if (lcFechaDesde.replace('/', '') and lcFechaHasta.replace('/', '')) else '' cadPuerto = "puerto = %s AND " % (lcPuerto) if lcPuerto else '' cadIP = "ip like '%%%s%%' AND " % (lcIP) if lcIP.replace('.', '') else '' cadComputador = "upper(pc) like '%%%s%%' AND " % (lcComputador.upper()) if lcComputador else '' cadWeb = "upper(direccion) like '%%%s%%' AND " % (lcWeb) if lcWeb else '' cadSoloValidas = "(acceso not like '%DENIED%') and " cadExcluirme = "upper(pc) !='ANLPRG7' AND " #Campos que pide el Form, es necesario que el usuario llene por lo menos uno campos = cadFecha + cadPuerto + cadIP + cadComputador + cadWeb #Si lleno al menos uno, arma el select, de lo contrario devuelde cadenaSql Vacia if campos: campos = campos + cadExcluirme + cadSoloValidas cadenaSql = 'select id, fecha, puerto, ip, pc, puerto_acceso, metodo, direccion from log_squid where ' + \ campos + 'del = 0 ' return cadenaSql def InsertarRegistros(self, cursor): ''' Metodo que permite asignarle registros al tablewidget parametros recibitos (1) Tipo (Lista) Ej:RowSource(['0', 'Carlos', 'Garcia'], ['1', 'Nairesther', 'Gomez']) ''' ListaCursor = cursor for pos, fila in enumerate(ListaCursor): for posc, columna in enumerate(fila): self.ui.tableWidget.setItem(pos, posc, QtGui.QTableWidgetItem(str(columna))) def obtenerDatos(self, cadena_pasada): ''' Ejecuta la Consulta SQl a el servidor PostGreSQL segun la cadena SQL pasada como parametro parametros recibidos: (1) String parametros devueltos: (1) Lista Ej: obtener_datos('select *from tabla where condicion') ''' self.conectarPostGreSQL() registros = self.ejecutarPostGreSQL(cadena_pasada) ''' try: pg = ConectarPG(self.cadconex) registros = pg.ejecutar(cadena_pasada) pg.cur.close() pg.conn.close() except: registros = [] ''' return registros def exportarExcel(self): ''' Permite Exportar a excel los registros obtenidos en la Consulta, estos registros estan contenidos dentro de la variable self.registros devuelto por el Metodo obtenerDatos(), si existen registros estos son exportados a de lo contrario emite un mensaje de Advertencia ''' file = QtGui.QFileDialog.getSaveFileName(self, caption="Guardar Archivo Como..", filter=".xls") nombreArchivo = file[0] + file[1] if self.registros: tuplas = calcular_longitud(self.registros, 0, 65000) exportar_excel(tuplas, nombreArchivo) msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Information, 'Felicidades ....', 'Consulta Guardada con Exito en:%s' % (file[0])) msgBox.exec_() else: msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, 'Lo siento', 'No Existen registros para guardar') msgBox.exec_() def limpiarText(self): ''' Limpia los QlineEdit o Textbox ''' self.ui.txtFechaDesde.clear() self.ui.txtFechaHasta.clear() self.ui.txtPuerto.clear() self.ui.txtIP.clear() self.ui.txtComputador.clear() self.ui.txtWeb.clear() def salir(self): pass def borrar(self): msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Titulo', 'Prueba') #msgBox.setStandardButtons(QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel) GuardarButton = msgBox.addButton("Guardar", QtGui.QMessageBox.ActionRole) AbortarButton = msgBox.addButton("Cancelar", QtGui.QMessageBox.ActionRole) msgBox.exec_() print GuardarButton print AbortarButton def GoFocus(self): lcMensaje = 'Hola' # self.combo.currentText() msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Question, 'Titulo', lcMensaje) msgBox.exec_()