Example #1
0
	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
Example #2
0
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
Example #3
0
	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
Example #4
0
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)
Example #6
0
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
Example #8
0
File: gmVCard.py Project: sk/gnumed
	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
Example #9
0
 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
Example #10
0
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 == RuntimeError:
		return True

	gmLog2.log_stack_trace('exception on shutdown', t, v, tb)
	return True
Example #12
0
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
Example #13
0
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
Example #14
0
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
Example #15
0
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
Example #16
0
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
Example #17
0
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
Example #18
0
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
Example #19
0
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
Example #20
0
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
Example #22
0
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
Example #23
0
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
#
#
Example #26
0
#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
#
#