def __init_scanner(self): if self.__scanner is not None: return True self.__init_src_manager() if self.__src_manager is None: return False # TWAIN will notify us when the image is scanned self.__src_manager.SetCallback(self._twain_event_callback) # no arg == show "select source" dialog try: self.__scanner = self.__src_manager.OpenSource() except _twain_module.excDSOpenFailed: _log.exception('cannot open TWAIN data source (image capture device)') gmLog2.log_stack_trace() return False if self.__scanner is None: _log.error("user canceled scan source selection dialog") return False _log.info("TWAIN data source: %s" % self.__scanner.GetSourceName()) _log.debug("TWAIN data source config: %s" % str(self.__scanner.GetIdentity())) return True
def _print_files_by_os_startfile(filenames=None): try: os.startfile except AttributeError: _log.error('platform does not support "os.startfile()"') return False _log.debug('printing [%s]', filenames) for filename in filenames: fname = os.path.normcase(os.path.normpath(filename)) _log.debug('%s -> %s', filename, fname) try: try: os.startfile(fname, 'print') except WindowsError, e: _log.exception('no <print> action defined for this type of file') if e.winerror == 1155: # try <view> action os.startfile(fname) except: _log.exception('os.startfile() failed') gmLog2.log_stack_trace() return False return True
def __init__(self, aPK_obj=None, row=None): # by default get staff corresponding to CURRENT_USER if (aPK_obj is None) and (row is None): cmd = _SQL_get_staff_fields % "db_user = CURRENT_USER" try: rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd}], get_col_idx=True) except: _log.exception('cannot instantiate staff instance') gmLog2.log_stack_trace() raise ValueError('cannot instantiate staff instance for database account CURRENT_USER') if len(rows) == 0: raise ValueError('no staff record for database account CURRENT_USER') row = { 'pk_field': 'pk_staff', 'idx': idx, 'data': rows[0] } gmBusinessDBObject.cBusinessDBObject.__init__(self, row = row) else: gmBusinessDBObject.cBusinessDBObject.__init__(self, aPK_obj = aPK_obj, row = row) # are we SELF ? self.__is_current_user = (gmPG2.get_current_user() == self._payload[self._idx['db_user']]) self.__inbox = None
def _print_files_by_os_startfile(filenames=None): try: os.startfile except AttributeError: _log.error('platform does not support "os.startfile()"') return False _log.debug('printing [%s]', filenames) for filename in filenames: fname = os.path.normcase(os.path.normpath(filename)) _log.debug('%s -> %s', filename, fname) try: try: os.startfile(fname, 'print') except WindowsError as e: _log.exception( 'no <print> action defined for this type of file') if e.winerror == 1155: # try <view> action os.startfile(fname) except: _log.exception('os.startfile() failed') gmLog2.log_stack_trace() return False return True
def handle_uncaught_exception_wx(t, v, tb): _log2.debug('unhandled exception caught:', exc_info = (t, v, tb)) if __handle_ctrl_c(t, v, tb): return if __handle_exceptions_on_shutdown(t, v, tb): return if __ignore_dead_objects_from_async(t, v, tb): return if __handle_import_error(t, v, tb): return if __handle_access_violation(t, v, tb): return # other exceptions _cfg = gmCfg2.gmCfgData() if _cfg.get(option = 'debug') is False: _log2.error('enabling debug mode') _cfg.set_option(option = 'debug', value = True) root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) _log2.debug('unhandled exception caught:', exc_info = (t, v, tb)) if __handle_lost_db_connection(t, v, tb): return gmLog2.log_stack_trace(None, t, v, tb) # only do this here or else we can invalidate the stack trace # by Windows throwing an exception ... |-( # careful: MSW does reference counting on Begin/End* :-( wx.EndBusyCursor() name = os.path.basename(_logfile_name) name, ext = os.path.splitext(name) new_name = os.path.expanduser(os.path.join ( '~', '.gnumed', 'error_logs', '%s_%s%s' % (name, pyDT.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'), ext) )) dlg = cUnhandledExceptionDlg(parent = None, id = -1, exception = (t, v, tb), logfile = new_name) dlg.ShowModal() comment = dlg._TCTRL_comment.GetValue() dlg.Destroy() if (comment is not None) and (comment.strip() != u''): _log2.error(u'user comment: %s', comment.strip()) _log2.warning('syncing log file for backup to [%s]', new_name) gmLog2.flush() # keep a copy around shutil.copy2(_logfile_name, new_name)
def handle_uncaught_exception_wx(t, v, tb): _log2.debug("unhandled exception caught:", exc_info=(t, v, tb)) if __handle_ctrl_c(t, v, tb): return if __handle_exceptions_on_shutdown(t, v, tb): return if __ignore_dead_objects_from_async(t, v, tb): return if __handle_import_error(t, v, tb): return if __handle_access_violation(t, v, tb): return # other exceptions _cfg = gmCfg2.gmCfgData() if _cfg.get(option="debug") is False: _log2.error("enabling debug mode") _cfg.set_option(option="debug", value=True) root_logger = logging.getLogger() root_logger.setLevel(logging.DEBUG) _log2.debug("unhandled exception caught:", exc_info=(t, v, tb)) if __handle_lost_db_connection(t, v, tb): return gmLog2.log_stack_trace(None, t, v, tb) # only do this here or else we can invalidate the stack trace # by Windows throwing an exception ... |-( # careful: MSW does reference counting on Begin/End* :-( wx.EndBusyCursor() name = os.path.basename(_logfile_name) name, ext = os.path.splitext(name) new_name = os.path.expanduser( os.path.join( "~", ".gnumed", "error_logs", "%s_%s%s" % (name, pyDT.datetime.now().strftime("%Y-%m-%d_%H-%M-%S"), ext) ) ) dlg = cUnhandledExceptionDlg(parent=None, id=-1, exception=(t, v, tb), logfile=new_name) dlg.ShowModal() comment = dlg._TCTRL_comment.GetValue() dlg.Destroy() if (comment is not None) and (comment.strip() != u""): _log2.error(u"user comment: %s", comment.strip()) _log2.warning("syncing log file for backup to [%s]", new_name) gmLog2.flush() # keep a copy around shutil.copy2(_logfile_name, new_name)
def __handle_lost_db_connection(t, v, tb): if t not in [gmPG2.dbapi.OperationalError, gmPG2.dbapi.InterfaceError]: return False try: msg = gmPG2.extract_msg_from_pg_exception(exc = v) except: msg = u'cannot extract message from PostgreSQL exception' print msg print v return False conn_lost = False if t == gmPG2.dbapi.OperationalError: conn_lost = ( ('erver' in msg) and ( ('term' in msg) or ('abnorm' in msg) or ('end' in msg) or ('oute' in msg) ) ) if t == gmPG2.dbapi.InterfaceError: conn_lost = ( ('onnect' in msg) and (('close' in msg) or ('end' in msg)) ) if not conn_lost: return False gmLog2.log_stack_trace('lost connection', t, v, tb) wx.EndBusyCursor() gmLog2.flush() gmGuiHelpers.gm_show_error ( aTitle = _('Lost connection'), aMessage = _( 'Since you were last working in GNUmed,\n' 'your database connection timed out.\n' '\n' 'This GNUmed session is now expired.\n' '\n' 'You will have to close this client and\n' 'restart a new GNUmed session.' ) ) return True
def test(): try: dto = parse_vcard2dto(filename = sys.argv[2]) print dto print dto.addresses print dto.comm_channels except: _log.exception('cannot parse vCard') gmLog2.log_stack_trace() raise
def test(): try: dto = parse_vcard2dto(filename=sys.argv[2]) print dto print dto.addresses print dto.comm_channels except: _log.exception('cannot parse vCard') gmLog2.log_stack_trace() raise
def __handle_exceptions_on_shutdown(t, v, tb): if not application_is_closing: return False # dead object error ? if t == RuntimeError: return True gmLog2.log_stack_trace('exception on shutdown', t, v, tb) return True
def __handle_exceptions_on_shutdown(t, v, tb): if not application_is_closing: return False # dead object error ? if t == wx._core.PyDeadObjectError: return True gmLog2.log_stack_trace("exception on shutdown", t, v, tb) return True
def download_file(url, filename=None, suffix=None): if filename is None: filename = gmTools.get_unique_filename(prefix='gm-dl-', suffix=suffix) _log.debug('downloading [%s] into [%s]', url, filename) try: dl_name, headers = urllib.request.urlretrieve(url, filename) except (ValueError, OSError, IOError): _log.exception('cannot download from [%s]', url) gmLog2.log_stack_trace() return None _log.debug('%s' % headers) return dl_name
def unzip_data_pack(filename=None): unzip_dir = os.path.splitext(filename)[0] _log.debug('unzipping data pack into [%s]', unzip_dir) gmTools.mkdir(unzip_dir) try: data_pack = zipfile.ZipFile(filename, 'r') except (zipfile.BadZipfile): _log.exception('cannot unzip data pack [%s]', filename) gmLog2.log_stack_trace() return None data_pack.extractall(unzip_dir) return unzip_dir
def download_file(url, filename=None, suffix=None): if filename is None: filename = gmTools.get_unique_filename(prefix = 'gm-dl-', suffix = suffix) _log.debug('downloading [%s] into [%s]', url, filename) try: dl_name, headers = urllib.urlretrieve(url, filename) except (ValueError, OSError, IOError): _log.exception('cannot download from [%s]', url) gmLog2.log_stack_trace() return None _log.debug(u'%s' % headers) return dl_name
def send_email(sender=None, receiver=None, email=None, server=None, auth=None, debug=False): if email is None: raise ValueError('<email> is None, cannot send') if sender is None: sender = default_mail_sender if receiver is None: receiver = [default_mail_receiver] if server is None: server = default_mail_server import smtplib failed = False refused = [] try: session = smtplib.SMTP(server) session.set_debuglevel(debug) try: session.starttls() except smtplib.SMTPException: _log.error('cannot enable TLS on [%s]', server) session.ehlo() if auth is not None: session.login(auth['user'], auth['password']) refused = session.sendmail(sender, receiver, email.as_string()) session.quit() except smtplib.SMTPException: failed = True _log.exception('cannot send email') gmLog2.log_stack_trace() if len(refused) > 0: _log.error("refused recipients: %s" % refused) if failed: return False return True
def __handle_lost_db_connection(t, v, tb): if not gmPG2.exception_is_connection_loss(v): return False gmPG2.log_pg_exception_details(v) gmLog2.log_stack_trace('lost connection', t, v, tb) wx.EndBusyCursor() gmLog2.flush() gmGuiHelpers.gm_show_error(aTitle=_('Lost connection'), aMessage=_( 'Since you were last working in GNUmed,\n' 'your database connection timed out.\n' '\n' 'This GNUmed session is now expired.\n' '\n' 'You will have to close this client and\n' 'restart a new GNUmed session.')) return True
def __handle_lost_db_connection(t, v, tb): if t not in [gmPG2.dbapi.OperationalError, gmPG2.dbapi.InterfaceError]: return False try: msg = gmPG2.extract_msg_from_pg_exception(exc=v) except: msg = u"cannot extract message from PostgreSQL exception" print msg print v return False conn_lost = False if t == gmPG2.dbapi.OperationalError: conn_lost = ("erver" in msg) and (("term" in msg) or ("abnorm" in msg) or ("end" in msg) or ("oute" in msg)) if t == gmPG2.dbapi.InterfaceError: conn_lost = ("onnect" in msg) and (("close" in msg) or ("end" in msg)) if not conn_lost: return False gmLog2.log_stack_trace("lost connection", t, v, tb) wx.EndBusyCursor() gmLog2.flush() gmGuiHelpers.gm_show_error( aTitle=_("Lost connection"), aMessage=_( "Since you were last working in GNUmed,\n" "your database connection timed out.\n" "\n" "This GNUmed session is now expired.\n" "\n" "You will have to close this client and\n" "restart a new GNUmed session." ), ) return True
def __handle_lost_db_connection(t, v, tb): if not gmPG2.exception_is_connection_loss(v): return False gmPG2.log_pg_exception_details(v) gmLog2.log_stack_trace('lost connection', t, v, tb) wx.EndBusyCursor() gmLog2.flush() gmGuiHelpers.gm_show_error ( aTitle = _('Lost connection'), aMessage = _( 'Since you were last working in GNUmed,\n' 'your database connection timed out.\n' '\n' 'This GNUmed session is now expired.\n' '\n' 'You will have to close this client and\n' 'restart a new GNUmed session.' ) ) return True
def send_mail(sender=None, receiver=None, message=None, server=None, auth=None, debug=False, subject=None, encoding='quoted-printable', attachments=None): # FIXME: How to generate and send mails: a step by step tutorial # FIXME: http://groups.google.com/group/comp.lang.python/browse_thread/thread/e0793c1007361398/ # FIXME: google for aspineux blog if message is None: return False message = message.lstrip().lstrip('\r\n').lstrip() if sender is None: sender = default_mail_sender if receiver is None: receiver = [default_mail_receiver] if server is None: server = default_mail_server if subject is None: subject = u'gmTools.py: send_mail() test' msg = StringIO.StringIO() writer = MimeWriter.MimeWriter(msg) writer.addheader('To', u', '.join(receiver)) writer.addheader('From', sender) writer.addheader('Subject', subject[:50].replace('\r', '/').replace('\n', '/')) writer.addheader('MIME-Version', '1.0') writer.startmultipartbody('mixed') # start with a text/plain part part = writer.nextpart() body = part.startbody('text/plain') part.flushheaders() body.write(message.encode(encoding)) # now add the attachments if attachments is not None: for attmt in attachments: filename = os.path.basename(attmt[0]) try: mtype = attmt[1] encoding = attmt[2] except IndexError: mtype, encoding = mimetypes.guess_type(attmt[0]) if mtype is None: mtype = 'application/octet-stream' encoding = 'base64' elif mtype == 'text/plain': encoding = 'quoted-printable' else: encoding = 'base64' part = writer.nextpart() part.addheader('Content-Transfer-Encoding', encoding) body = part.startbody("%s; name=%s" % (mtype, filename)) mimetools.encode(open(attmt[0], 'rb'), body, encoding) writer.lastpart() import smtplib failed = False refused = [] try: session = smtplib.SMTP(server) session.set_debuglevel(debug) session.starttls() session.ehlo() if auth is not None: session.login(auth['user'], auth['password']) refused = session.sendmail(sender, receiver, msg.getvalue()) session.quit() except smtplib.SMTPException: failed = True _log.exception('cannot send mail') gmLog2.log_stack_trace() msg.close() if len(refused) > 0: _log.error("refused recipients: %s" % refused) if failed: return False return True
gmPG2.set_default_client_timezone(timezone="Asia/Colombo") gmPG2.set_default_client_timezone(timezone="Asia/Calcutta") conn = gmPG2.get_connection() cmd = u"""select * from dem.v_staff where db_user = CURRENT_USER""" try: rows, idx = gmPG2.run_ro_queries(queries=[{"cmd": cmd}], verbose=True) for row in rows: _log.info(row) print rows print "==> success" except: _log.exception("query failed") gmLog2.log_stack_trace("query failed") print "==> failure" # ======================================================================= # $Log: test-psycopg2_datetime-as_gnumed.py,v $ # Revision 1.3 2009-02-18 13:46:02 ncq # - add example for succeeding time zone # # Revision 1.2 2009/02/17 17:47:07 ncq # - adjust path # # Revision 1.1 2009/02/10 18:47:25 ncq # - more TZ trouble test cases # #
gmPG2.set_default_client_timezone(timezone = 'Asia/Colombo') gmPG2.set_default_client_timezone(timezone = 'Asia/Calcutta') conn = gmPG2.get_connection() cmd = """select * from dem.v_staff where db_user = CURRENT_USER""" try: rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd}], verbose = True) for row in rows: _log.info(row) print rows print "==> success" except: _log.exception('query failed') gmLog2.log_stack_trace('query failed') print "==> failure" # ======================================================================= # $Log: test-psycopg2_datetime-as_gnumed.py,v $ # Revision 1.3 2009-02-18 13:46:02 ncq # - add example for succeeding time zone # # Revision 1.2 2009/02/17 17:47:07 ncq # - adjust path # # Revision 1.1 2009/02/10 18:47:25 ncq # - more TZ trouble test cases # #
#gmPG2.set_default_client_timezone(timezone = 'Asia/Colombo') #gmPG2.set_default_client_timezone(timezone = 'Asia/Calcutta') conn = gmPG2.get_connection() cmd = """select * from dem.v_staff where db_user = CURRENT_USER""" try: rows, idx = gmPG2.run_ro_queries(queries=[{'cmd': cmd}], verbose=True) for row in rows: _log.info(row) print rows print "==> success" except Exception: _log.exception('query failed') gmLog2.log_stack_trace('query failed') print "==> failure" # ======================================================================= # $Log: test-psycopg2_datetime-as_gnumed.py,v $ # Revision 1.3 2009-02-18 13:46:02 ncq # - add example for succeeding time zone # # Revision 1.2 2009/02/17 17:47:07 ncq # - adjust path # # Revision 1.1 2009/02/10 18:47:25 ncq # - more TZ trouble test cases # #