def slot_actionFactory_reset(self): """ Ritorna alle preferenze di base eliminando la directory di lavoro. Al termine il programma viene chiuso senza salvare """ if message_question_yes_no('Do you want delete the preferences files in folder ' + self.o_preferenze.work_dir + '?') == 'Yes': if message_question_yes_no('Are you sure?') == 'Yes': self.o_preferenze.cancella_tutto() message_info('Preferences files deleted! Close and restart the program!')
def pubblica(self, p_tipo_server): """ Pubblica il file Oracle Form o Oracle Report nei server indicati se p_tipo_server = 1 compila in SMILE, altrimenti in ICOM """ from compile_oracle_form_report import pubblica_form_report # ricerco la posizione dell'indice selezionato e ne ricavo il contenuto try: v_index = self.o_lst1.selectedIndexes()[0] except: return v_item = self.lista_risultati.itemFromIndex(v_index) v_file = v_item.text() # tipo server if p_tipo_server == '1': v_nome = 'SMILE' else: v_nome = 'ICOM' # se è stato selezionato qualcosa if v_file != '' and message_question_yes_no( "Do you want to compile the file " + chr(10) + v_file + chr(10) + "and post it in " + v_nome + " system?") == 'Yes': #sono ammessi solo file con suffissi specifici if '.fmb' not in v_file and '.rdf' not in v_file: message_error( 'File is not in format "Oracle Form" or "Oracle Report"!') else: # apro una nuova finestra figlia della principale pubblica_form_report(v_file, self.o_preferenze.work_dir, p_tipo_server)
def slot_clear(self): """ Cancella l'intera lista """ if message_question_yes_no( 'Do you want to clear result list?') == 'Yes': self.lista_risultati.clear()
def killa_sessione(p_sid, p_serial, p_oracle_user_sys, p_oracle_password_sys, p_oracle_dsn_real): """ killa la sessione oracle dalla coppia p_sid e p_serial """ if message_question_yes_no( "Do you want to kill the selected session?") == 'Yes': try: # connessione al DB come amministratore v_connection = cx_Oracle.connect(user=p_oracle_user_sys, password=p_oracle_password_sys, dsn=p_oracle_dsn_real, mode=cx_Oracle.SYSDBA) v_ok = True except: message_error( 'Connection to oracle rejected. Please control login information.' ) v_ok = False if v_ok: v_cursor = v_connection.cursor() v_cursor.execute("ALTER SYSTEM KILL SESSION '" + str(p_sid).strip() + "," + str(p_serial).strip() + "'") v_cursor.close() v_connection.close() message_info('The session is being closed.')
def slot_actionReset_main_window_position(self): """ Reimposta la posizione e la dimensione della finestra principale """ if message_question_yes_no('Do you want to reset position and size of main window?') == 'Yes': # dimensione finestra self.resize( 800, 600 ) # centratura della window qr = self.frameGeometry() cp = QtWidgets.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())
def slot_startjob(self): """ Avvia un job """ if hasattr(self, 'lista_risultati'): # ottengo un oggetto index-qt della riga selezionata index = self.o_lst1.currentIndex() # non devo prendere la cella selezionata ma la cella 0 della riga selezionata (quella che contiene il nome del job) v_item_0 = self.lista_risultati.itemFromIndex( index.sibling(index.row(), 0)) if v_item_0 != None: v_job_name = v_item_0.text() if message_question_yes_no( 'Do you want start ' + v_job_name + ' job?\nNotice! MGrep will be waiting the end of job!' ) == 'Yes': try: # connessione al DB come amministratore v_connection = cx_Oracle.connect( user=self.o_preferenze.v_oracle_user_sys, password=self.o_preferenze.v_oracle_password_sys, dsn=self.e_server_name.currentText(), mode=cx_Oracle.SYSDBA) except: message_error( 'Connection to oracle rejected. Please control login information.' ) return [] # apro cursore v_cursor = v_connection.cursor() # imposto l'istruzione v_istruzione = "BEGIN DBMS_SCHEDULER.RUN_JOB (job_name => 'SMILE." + v_job_name + "'); END;" # eseguo istruzione monitorando eventuali errori (attivo l'icona della clessidra) try: QtWidgets.QApplication.setOverrideCursor( QtGui.QCursor(QtCore.Qt.WaitCursor)) v_cursor.execute(v_istruzione) QtWidgets.QApplication.restoreOverrideCursor() message_info('Job finished :-)') # se riscontrato errore --> emetto sia codice che messaggio except cx_Oracle.Error as e: errorObj, = e.args message_error("Error: " + errorObj.message) # chiudo e disattivo icona della clessidra v_cursor.close() v_connection.close() QtWidgets.QApplication.restoreOverrideCursor()
def slot_actionSave_the_windows_position(self): """ Salva la posizione delle finestre per riaprirle identiche all'avvio del programma """ if message_question_yes_no('Do you want to save the windows position and set them for the next program startup?') == 'Yes': # pulisco la lista delle posizioni delle window self.o_preferenze.l_windows_pos.clear() # ricerco informazioni della window principale (è l'unica window di cui salvo sia posizione che dimensione) o_pos = self.geometry() o_rect = o_pos.getRect() self.o_preferenze.l_windows_pos.append( "MainWindow " + str(o_rect[0]) + " " + str(o_rect[1]) + " " + str(o_rect[2]) + " " + str(o_rect[3]) ) # salvo i nomi delle varie finestre aperte o_window_list = self.mdiArea.subWindowList() for i in range(0,len(o_window_list)): self.o_preferenze.l_windows_pos.append( str(o_window_list[i].windowTitle()).replace(' ','_') ) # salvo la lista self.o_preferenze.salva_pos_finestre()
def slot_enablejob(self): """ Riattiva un job """ if hasattr(self, 'lista_risultati'): # ottengo un oggetto index-qt della riga selezionata index = self.o_lst1.currentIndex() # non devo prendere la cella selezionata ma la cella 0 della riga selezionata (quella che contiene il nome del job) v_item_0 = self.lista_risultati.itemFromIndex( index.sibling(index.row(), 0)) if v_item_0 != None: v_job_name = v_item_0.text() if message_question_yes_no('Do you want enable ' + v_job_name + ' job?') == 'Yes': try: # connessione al DB come amministratore v_connection = cx_Oracle.connect( user=self.o_preferenze.v_oracle_user_sys, password=self.o_preferenze.v_oracle_password_sys, dsn=self.e_server_name.currentText(), mode=cx_Oracle.SYSDBA) except: message_error( 'Connection to oracle rejected. Please control login information.' ) return [] # apro cursore v_cursor = v_connection.cursor() # imposto l'istruzione v_istruzione = "BEGIN DBMS_SCHEDULER.ENABLE (name => 'SMILE." + v_job_name + "'); END;" # eseguo istruzione monitorando eventuali errori try: v_cursor.execute(v_istruzione) message_info(v_job_name + ' was enabled!') # se riscontrato errore --> emetto sia codice che messaggio except cx_Oracle.Error as e: errorObj, = e.args message_error("Error: " + errorObj.message) # chiudo v_cursor.close() v_connection.close()
def slot_backup_line(self): """ Copia il file indicato all'interno di un file zip di nome Old, presente nella medesima cartella del file di partenza. Se il file zip non esiste, viene creato. Se esiste il file indicato viene accodato """ if message_question_yes_no( "Do you want to backup file into old.zip?") == 'Yes': # ricerco la posizione dell'indice selezionato e ne ricavo il contenuto try: v_index = self.o_lst1.selectedIndexes()[0] except: return v_item = self.lista_risultati.itemFromIndex(v_index) v_seltext = v_item.text() #scompongo l'intera pathname in tutte le sue componenti (directory, nome file, suffisso) v_directory = os.path.split(v_seltext)[0] v_solo_nome_file = os.path.split(v_seltext)[1] v_solo_nome_file_senza_suffisso = os.path.splitext( v_solo_nome_file)[0] v_suffisso_nome_file = os.path.splitext(v_solo_nome_file)[1] #prendo la data di sistema che servirà per dare un suffisso al nome del file che viene zippato v_system_date = datetime.datetime.now() v_str_data = '_' + str(v_system_date.year) + '_' + str( v_system_date.month) + '_' + str(v_system_date.day) if v_directory != '': try: #apro il file zip (se non esiste lo creo) v_zip = zipfile.ZipFile(v_directory + '\\old.zip', 'a') #accodo il file indicato allo zip (il nome di arrivo è il nome del file più suffisso data) v_zip.write( v_seltext, v_solo_nome_file_senza_suffisso + v_str_data + '.' + v_suffisso_nome_file) #chiudo lo zip e emetto messaggio che procedura terminata v_zip.close() message_info('The file ' + v_solo_nome_file + ' is been copied into Old.zip') except: message_error('Error to copy the file into Old zip!')
def copia_tabella(self, v_user_db, v_password_db, v_dsn_db, v_table_name, v_table_where, v_sqlite_db_name, v_blob_pathname): #Collegamento a Oracle try: v_oracle_db = cx_Oracle.connect(user=v_user_db, password=v_password_db, dsn=v_dsn_db) except: message_error("Connecting problems to Oracle DB!") #esco return 'ko' v_oracle_cursor = v_oracle_db.cursor() #Apre il DB sqlite v_sqlite_conn = sqlite3.connect(database=v_sqlite_db_name) #Indico al db di funzionare in modalità byte altrimenti ci sono problemi nel gestire utf-8 v_sqlite_conn.text_factory = bytes v_sqlite_cur = v_sqlite_conn.cursor() #Controllo se tabella SQLite esiste già v_sqlite_cur.execute("SELECT COUNT(*) FROM sqlite_master WHERE name='" + v_table_name + "'") #Se la tabella esiste chiedo se posso sovrascrivere if v_sqlite_cur.fetchone()[0] > 0: if message_question_yes_no("Table in SQLite DB already exist! Do you want overwrite it?") == 'Yes': #Cancello la tabella se già presente nel db sqlite query ='DROP TABLE ' + v_table_name v_sqlite_cur.execute(query) else: #esco return 'ko' #Conta dei record nella tabella sorgente Oracle #Aggiungo la where (solo se caricata) query = 'SELECT COUNT(*) FROM ' + v_table_name if len(v_table_where.split()) > 0: query += ' WHERE ' + v_table_where try: v_oracle_cursor.execute(query) except: message_error("Oracle table do not exists or errors in 'where' condition!") #esco return 'ko' v_total_rows = 0 for row in v_oracle_cursor: v_total_rows = row[0] #Calcolo 1% che rappresenta lo spostamento della progress bar v_rif_percent = 0 if v_total_rows > 100: v_rif_percent = v_total_rows // 100 #Creo la tabella in ambiente di backup (ottengo lo script di create table) query = estrae_struttura_tabella_oracle('c', v_oracle_cursor, v_user_db, v_table_name) v_sqlite_cur.execute(query) #Creo una lista con le posizioni dei campi dove si trovano i blob #In pratica un array dove sono segnati le posizioni dei campi #Esempio: #CREATE TABLE ta_files ( # files_nu NUMBER(8,0) NOT NULL, # modul_do VARCHAR2(1) NOT NULL, # files_do VARCHAR2(1) NOT NULL, # filen_co VARCHAR2(200) NOT NULL, # exten_co VARCHAR2(20) NULL, # files_fi BLOB NULL, # .... #) #La lista conterrà un solo elemento con valore 6 indicante la posizione del campo files_fi v_posizioni_blob = estrae_struttura_tabella_oracle('b', v_oracle_cursor, v_user_db, v_table_name) v_estensione_blob = estrae_struttura_tabella_oracle('e', v_oracle_cursor, v_user_db, v_table_name) #Se nella tabella sono presenti dei blob, creo una cartella nel file system dove ci finiranno i blob if v_posizioni_blob: message_info('Table contains blob data! It will be copied in ' + v_blob_pathname + v_table_name) try: os.mkdir(v_blob_pathname + v_table_name) except: message_error('The table contains blob fields! The copy must create the directory ' + v_table_name + ' but this already exists!') exit() #In questa cartella inserisco un file di testo che riporta le posizioni dei blob. Tale file verrà poi utilizzo nel caso #si voglia ricopiare la tabella dentro Oracle v_file_allegato = open(v_blob_pathname + v_table_name + '\\blob_fields_position.ini','w') v_file_allegato.write(str(v_posizioni_blob)) v_file_allegato.close() #Copia dei dati query = estrae_struttura_tabella_oracle('s', v_oracle_cursor, v_user_db, v_table_name) #if v_table_where is not None: if len(v_table_where.split()) > 0: query += ' WHERE ' + v_table_where v_insert_base = estrae_struttura_tabella_oracle('i', v_oracle_cursor, v_user_db, v_table_name) v_oracle_cursor.execute(query) v_progress = 0 v_puntatore_blob = 0 v_valore_colonna = str() for row in v_oracle_cursor: v_1a_volta = True v_insert = v_insert_base for count, column in enumerate(row): if column is None: v_valore_colonna = '' else: v_valore_colonna = column #se la colonna è un blob --> sostituisco il contenuto con quello del puntatore #e scrivo il contenuto della colonna come file separato in directory a parte if v_posizioni_blob: if count+1 in v_posizioni_blob: v_puntatore_blob += 1 v_file_allegato = open(v_blob_pathname + v_table_name + '\\' + str(v_puntatore_blob) + '.zzz','wb') v_file_allegato.write(column.read()) v_file_allegato.close() v_valore_colonna = str(v_puntatore_blob) #compongo la insert con il contenuto della colonna (da notare il replace del carattere " con apice singolo!) v_valore_colonna = str(v_valore_colonna) if v_1a_volta: v_insert += '"' + v_valore_colonna.replace('"',"'") + '"' else: v_insert += ',"' + v_valore_colonna.replace('"',"'") + '"' v_1a_volta = False v_insert += ')' v_sqlite_cur.execute(v_insert) #Emetto percentuale di avanzamento ma solo se righe maggiori di 100 if v_total_rows > 100: v_progress += 1 if v_progress % v_rif_percent == 0: self.avanza_progress('Total records to copy: ' + str(v_total_rows)) #print('Avanzamento scrittura...' + str((v_progress*100//v_total_rows)+1) + '%') #commit v_sqlite_conn.commit() #chiusura dei cursori v_sqlite_conn.close() v_oracle_cursor.close() return 'ok'
def __init__(self, p_csv_name, p_csv_separator, p_modalita_test): # rendo la mia classe una superclasse super(convert_csv_to_excel, self).__init__() # creazione della wait window self.v_progress_step = 0 self.progress = QtWidgets.QProgressDialog(self) self.progress.setMinimumDuration(0) self.progress.setWindowModality(QtCore.Qt.WindowModal) self.progress.setWindowTitle("Copy...") # icona di riferimento icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/icons/icons/MGrep.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.progress.setWindowIcon(icon) # imposto valore minimo e massimo a 0 in modo venga considerata una progress a tempo indefinito # Attenzione! dentro nel ciclo deve essere usata la funzione setvalue altrimenti non visualizza e non avanza nulla! self.progress.setMinimum(0) self.progress.setMaximum(100) # creo un campo label che viene impostato con 100 caratteri in modo venga data una dimensione di base standard self.progress_label = QtWidgets.QLabel() self.progress_label.setText('.' * 100) # collego la label già presente nell'oggetto progress bar con la mia label self.progress.setLabel(self.progress_label) # controllo sia stato indicato il separatore csv if p_csv_separator == '': message_error('Insert a csv separator!') return None #Spezzo il nome del file per ricavare il nome di destinazione e controllo che la destinazione non esista v_solo_nome_file = os.path.split(p_csv_name)[1] v_solo_directory = os.path.split(p_csv_name)[0] v_solo_nome_file_senza_suffisso = os.path.splitext(v_solo_nome_file)[0] v_suffisso_nome_file = os.path.splitext(v_solo_nome_file)[1] v_xls_name = v_solo_directory + '//' + v_solo_nome_file_senza_suffisso + '.xlsx' if os.path.isfile(v_xls_name): if message_question_yes_no( "Destination file already exists. Do you to replace it?" ) == 'No': # esco dalla procedura perché utente ha deciso di non preseguire return None #Apro il file e conto le righe v_total_rows = 0 with open(p_csv_name, encoding='latin-1', mode='r') as v_file: for v_line in v_file: v_total_rows += 1 #Calcolo l'1% che rappresenta lo spostamento della progress bar v_rif_percent = 0 if v_total_rows > 100: v_rif_percent = v_total_rows // 100 #Creazione del file excel workbook = Workbook(v_xls_name) worksheet = workbook.add_worksheet() #Rileggo il file e converto da un formato all'altro v_progress = 0 v_y = 0 with open(p_csv_name, encoding='latin-1', mode='r') as v_file: for v_line in v_file: v_valori = v_line.split(p_csv_separator) v_x = 0 for campo in v_valori: if check_campo_numerico(campo): worksheet.write(v_y, v_x, campo_numerico(campo)) else: worksheet.write(v_y, v_x, campo) v_x += 1 v_y += 1 #Emetto percentuale di avanzamento ma solo se righe maggiori di 100 if v_total_rows > 100: v_progress += 1 if v_progress % v_rif_percent == 0: self.avanza_progress('Total record to copy: ' + str(v_total_rows)) #Chiusura del file e del db self.avanza_progress('Finalizing process...') workbook.close() #Messaggio finale message_info('File conversion completed!') return None