def __init__(self): self.logger = logging.getLogger('main.controller.Controller') self.view = View() self.view.protocol('WM_DELETE_WINDOW', self.close_app) self.queue_view = QueueView() self.queue_view.hide() self.query_status = {} self._error = False self.view.btn_run.config(command=self.export_query_results) self.view.btn_sql.config(command=self.export_sql_statement) self.view.btn_reset.config(command=self.reset_view) self.view.btn_output.config(command=self.open_output_folder) self.view.btn_queue_window.config(command=self.show_queue_window) self.view.btn_clean_up.config(command=self.clean_up_output_folder) # add custom icons icon_path = find_data_file('app.ico') self.view.iconbitmap(icon_path) self.queue_view.iconbitmap(icon_path) self.view['bg'] = 'dark slate grey' self.view.title('Claim Explorer') center_window(self.view, width_expand=4, height_expand=100 , x_offset=0, y_offset=-100) self.view.resizable(0, 0) self.view.bind('<Return>', self.export_query_results) self.queue = Queue(10) # cap at 10 threads # self.threads = [] self.monitoring_queries = True self.refresh_query_status() self.view.mainloop(0)
class Controller(): def __init__(self): self.logger = logging.getLogger('main.controller.Controller') self.view = View() self.view.protocol('WM_DELETE_WINDOW', self.close_app) self.queue_view = QueueView() self.queue_view.hide() self.query_status = {} self._error = False self.view.btn_run.config(command=self.export_query_results) self.view.btn_sql.config(command=self.export_sql_statement) self.view.btn_reset.config(command=self.reset_view) self.view.btn_output.config(command=self.open_output_folder) self.view.btn_queue_window.config(command=self.show_queue_window) self.view.btn_clean_up.config(command=self.clean_up_output_folder) # add custom icons icon_path = find_data_file('app.ico') self.view.iconbitmap(icon_path) self.queue_view.iconbitmap(icon_path) self.view['bg'] = 'dark slate grey' self.view.title('Claim Explorer') center_window(self.view, width_expand=4, height_expand=100 , x_offset=0, y_offset=-100) self.view.resizable(0, 0) self.view.bind('<Return>', self.export_query_results) self.queue = Queue(10) # cap at 10 threads # self.threads = [] self.monitoring_queries = True self.refresh_query_status() self.view.mainloop(0) def close_app(self): self.logger.info('Closing application...') try: self.monitoring_queries = False # self.queue.join() self.logger.debug('Items remaining in queue: ' + str(self.queue.qsize())) self.queue_view.close() self.view.destroy() sys.exit(0) except Exception as e: self.logger.error(str(e)) sys.exit(1) @property def error(self): if not self._error: self.view.status.set('Ready...') return self._error @error.setter def error(self, message): """ Args: message: str """ if message is not None \ and message != 'Ready...' \ and len(message) > 0: self.logger.error(message) self.view.status.set(message) self._error = True def check_connection(self, tbl, pw): con = Connection(table=tbl, password=pw) con.open() if con.status is not None: self.error = con.status return False con.close() return True def export_to_csv_callback(self, task): self.logger.info(task.result()) result = task.result() for key, val in result.items(): self.query_status[key] = val self.queue_view.set_data(self.query_status) def callback(self, name, start, finish, result): self.logger.info(name + ' returned ' + str(result)) self.query_status[name] = (start, finish, result) def export_query_results(self): self.logger.debug('Validating query parameters') if not self.validate_query_parameters(): return False if not self.check_for_password(): return False self.logger.debug('Query parameters valid.') qry = self.make_query_object() sql = qry.sql tbl = qry.table pw = (self.view.pw.get() or '') name = qry.name self.queue_view.show() ExportSql(parent=self, name=name, tbl=tbl, sql=sql, pw=pw) def export_sql_statement(self): if self.validate_query_parameters(): qry = self.make_query_object() sql = qry.sql if qry.status is not None: self.error = qry.status return False else: name = qry.name path = FSO.write_text(sql, name) FSO.open_file(path) return True return False def make_query_object(self): tbl = self.view.tbl.get() qry = QueryParameters(tbl) params = self.view.get_query_parameters() for key, val in params.items(): qry.add_field(key, val[1], val[0]) return qry def reset_status(self): # reset status variables self.view.status.set('Ready...') self._error = False def validate_query_parameters(self): self.reset_status() table = self.view.tbl.get() if table not in self.view.request_list: err = 'Error: Please select a table first.' self.logger.error(err) self.error = err return False qry = self.make_query_object() if not qry.is_valid: self.logger.error(qry.status) self.error = qry.status return False self.logger.debug('Query parameters are valid.') return True def check_for_password(self): pw = self.view.pw.get() tbl = self.view.tbl.get() cfg = Config(tbl) if cfg.vendor == 'oracle' and len(pw) < 4: err = ('Error: the current request ' + 'uses Oracle; please enter a password.') self.logger.error(err) self.error = err return False return True def reset_view(self): self.reset_status() self.view.mpi.set('') self.view.claim.set('') self.view.facility.set('') self.view.accounting_start_date.set(beginning_of_prior_month()) self.view.accounting_end_date.set(end_of_prior_month()) self.view.service_start_date.set('') self.view.service_end_date.set('') self.view.check.set('') self.view.batch.set('') def open_output_folder(self, path='output'): self.logger.info('Opening ' + path + ' folder...') FSO.make_dir(path) FSO.open_file(path) def hide_queue_window(self): self.queue_view.hide() def show_queue_window(self): self.queue_view.toggle() def refresh_query_status(self): if self.monitoring_queries: self.queue_view.set_data(self.query_status) self.view.after(500, self.refresh_query_status) # refresh every half-second def clean_up_output_folder(self): FSO.clean_up('output')