This is an automated email from the git hooks/post-receive script. tille pushed a commit to branch master in repository gnumed-client.
commit 25bd8fe5d691c15fd0f797cac42e83b8df88159f Author: Andreas Tille <[email protected]> Date: Mon Nov 13 13:32:42 2017 +0100 New upstream version 1.6.15+dfsg --- client/CHANGELOG | 18 +++ client/business/gmDICOM.py | 16 +++ client/business/gmXdtObjects.py | 3 - client/doc/gnumed.conf.example | 9 +- client/doc/schema/gnumed-entire_schema.html | 2 +- client/etc/gnumed/gnumed-client.conf.example | 9 +- client/gm-from-vcs.conf | 9 +- client/gnumed.py | 2 +- client/pycommon/gmMimeLib.py | 18 ++- client/pycommon/gmPG2.py | 81 ++++++-------- client/pycommon/gmPsql.py | 154 ++++++++++++-------------- client/wxpython/gmDocumentWidgets.py | 5 +- client/wxpython/gmExceptionHandlingWidgets.py | 12 +- client/wxpython/gmPatOverviewWidgets.py | 2 +- 14 files changed, 182 insertions(+), 158 deletions(-) diff --git a/client/CHANGELOG b/client/CHANGELOG index 1e15d80..55e6a4c 100644 --- a/client/CHANGELOG +++ b/client/CHANGELOG @@ -6,6 +6,16 @@ # rel-1-6-patches ------------------------------------------------ + 1.6.15 + +FIX: exception on tooltipping patient overview inbox item +FIX: exception in cursor/connection state logging w/ older psycopg2's +FIX: exception on import error inside portable app + +IMPROVED: use Dicom[RequestingPhysician] if available +IMPROVED: user visible rendering of raw DICOM strings +IMPROVED: baptize SCRAM for PG passwords in settings check + 1.6.14 FIX: exception when having issues with calculating eGFR in medication plugin @@ -1870,6 +1880,14 @@ FIX: missing cast to ::text in dem.date_trunc_utc() calls # gnumed_v21 ------------------------------------------------ + 21.15 + +FIX: handle SQL_INHERITANCE in a way compatible with PG10 +FIX: untyped UNIONs not tolerated by PG10 anymore +FIX: RETURNS UNKNOWN functions not tolerated by PG10 anymore + +IMPROVED: script to adjust db settings + 21.12 IMPROVED: logging on dem.identity/dem.names uniqueness violation diff --git a/client/business/gmDICOM.py b/client/business/gmDICOM.py index 279df3b..07f22fb 100644 --- a/client/business/gmDICOM.py +++ b/client/business/gmDICOM.py @@ -13,6 +13,7 @@ __author__ = "K.Hilbert <[email protected]>" import io import os import sys +import re as regex import logging import httplib # needed for exception names thrown by httplib2, duh |-( import socket # needed for exception names thrown by httplib2, duh |-( @@ -673,6 +674,7 @@ class cOrthancServer: pat_dict[key] = None if pat_dict[key] == u'': pat_dict[key] = None + pat_dict[key] = cleanup_dicom_string(pat_dict[key]) studies_by_patient.append(pat_dict) # loop over studies of patient @@ -687,6 +689,7 @@ class cOrthancServer: 'time': None, 'description': None, 'referring_doc': None, + 'requesting_doc': None, 'radiology_org': None, 'series': [] } @@ -707,6 +710,10 @@ class cOrthancServer: except KeyError: pass try: + study_dict['requesting_doc'] = orth_study['MainDicomTags'][u'RequestingPhysician'].strip() + except KeyError: + pass + try: study_dict['radiology_org'] = orth_study['MainDicomTags'][u'InstitutionName'].strip() except KeyError: pass @@ -717,6 +724,7 @@ class cOrthancServer: study_dict[key] = None if study_dict[key] == u'': study_dict[key] = None + study_dict[key] = cleanup_dicom_string(study_dict[key]) study_dict['all_tags'] = {} try: orth_study['PatientMainDicomTags'] @@ -794,6 +802,8 @@ class cOrthancServer: if series_dict['time'] == study_dict['time']: _log.debug('<series time> matches <study time>, ignoring time') series_dict['time'] = None + for key in series_dict: + series_dict[key] = cleanup_dicom_string(series_dict[key]) series_dict['all_tags'] = {} for key in orth_series.keys(): if key == 'MainDicomTags': @@ -946,6 +956,12 @@ class cOrthancServer: except StandardError: return content +#------------------------------------------------------------ +def cleanup_dicom_string(dicom_str): + if not isinstance(dicom_str, basestring): + return dicom_str + return regex.sub('\^+', ' ', dicom_str.strip(u'^')) + #============================================================ # main #------------------------------------------------------------ diff --git a/client/business/gmXdtObjects.py b/client/business/gmXdtObjects.py index f130ae4..bbab02e 100644 --- a/client/business/gmXdtObjects.py +++ b/client/business/gmXdtObjects.py @@ -11,9 +11,6 @@ __license__ = "GPL" import os.path, sys, linecache, io, re as regex, time, datetime as pyDT, logging, io -import mx.DateTime as mxDT - - if __name__ == '__main__': sys.path.insert(0, '../../') from Gnumed.pycommon import gmDateTime, gmTools diff --git a/client/doc/gnumed.conf.example b/client/doc/gnumed.conf.example index 47806f8..a62e4af 100644 --- a/client/doc/gnumed.conf.example +++ b/client/doc/gnumed.conf.example @@ -20,7 +20,7 @@ # ------------------------------------------------------------- [preferences] -profile = GNUmed database on this machine ("local": Linux/Mac) (gnumed_v21@) +profile = GNUmed database at publicdb.gnumed.de (PUBLIC) ([email protected]) login = any-doc @@ -111,11 +111,12 @@ public/open access = 1 help desk = GNUmed Development List <[email protected]> last known workplaces = $last known workplaces$ -xxxDEFAULTxxx -Local Default -Front Desk Clinician +Front Desk GNUmed Default +Librarian Release (0.2) +Local Default +xxxDEFAULTxxx $last known workplaces$ # ------------------------------------------------------------- diff --git a/client/doc/schema/gnumed-entire_schema.html b/client/doc/schema/gnumed-entire_schema.html index 6a174d8..69f33fe 100644 --- a/client/doc/schema/gnumed-entire_schema.html +++ b/client/doc/schema/gnumed-entire_schema.html @@ -112,7 +112,7 @@ <body> <!-- Primary Index --> - <p><br><br>Dumped on 2017-08-31</p> + <p><br><br>Dumped on 2017-10-28</p> <h1><a name="index">Index of database - gnumed_v21</a></h1> <ul> diff --git a/client/etc/gnumed/gnumed-client.conf.example b/client/etc/gnumed/gnumed-client.conf.example index 47806f8..a62e4af 100644 --- a/client/etc/gnumed/gnumed-client.conf.example +++ b/client/etc/gnumed/gnumed-client.conf.example @@ -20,7 +20,7 @@ # ------------------------------------------------------------- [preferences] -profile = GNUmed database on this machine ("local": Linux/Mac) (gnumed_v21@) +profile = GNUmed database at publicdb.gnumed.de (PUBLIC) ([email protected]) login = any-doc @@ -111,11 +111,12 @@ public/open access = 1 help desk = GNUmed Development List <[email protected]> last known workplaces = $last known workplaces$ -xxxDEFAULTxxx -Local Default -Front Desk Clinician +Front Desk GNUmed Default +Librarian Release (0.2) +Local Default +xxxDEFAULTxxx $last known workplaces$ # ------------------------------------------------------------- diff --git a/client/gm-from-vcs.conf b/client/gm-from-vcs.conf index 47806f8..a62e4af 100644 --- a/client/gm-from-vcs.conf +++ b/client/gm-from-vcs.conf @@ -20,7 +20,7 @@ # ------------------------------------------------------------- [preferences] -profile = GNUmed database on this machine ("local": Linux/Mac) (gnumed_v21@) +profile = GNUmed database at publicdb.gnumed.de (PUBLIC) ([email protected]) login = any-doc @@ -111,11 +111,12 @@ public/open access = 1 help desk = GNUmed Development List <[email protected]> last known workplaces = $last known workplaces$ -xxxDEFAULTxxx -Local Default -Front Desk Clinician +Front Desk GNUmed Default +Librarian Release (0.2) +Local Default +xxxDEFAULTxxx $last known workplaces$ # ------------------------------------------------------------- diff --git a/client/gnumed.py b/client/gnumed.py index 70e3c7b..db24db2 100644 --- a/client/gnumed.py +++ b/client/gnumed.py @@ -91,7 +91,7 @@ against. Please run GNUmed as a non-root user. sys.exit(1) #---------------------------------------------------------- -current_client_version = u'1.6.14' +current_client_version = u'1.6.15' current_client_branch = u'1.6' _log = None diff --git a/client/pycommon/gmMimeLib.py b/client/pycommon/gmMimeLib.py index 417f853..7b6510d 100644 --- a/client/pycommon/gmMimeLib.py +++ b/client/pycommon/gmMimeLib.py @@ -46,8 +46,13 @@ def guess_mimetype(filename = None): if (prop == 'mimetype') and (val != worst_case): return val except ImportError: - _log.debug('module <extractor> (python wrapper for libextractor) not installed') - + _log.debug(u'module <extractor> (python wrapper for libextractor) not installed') + except OSError as exc: + # winerror 126, errno 22 + if exc.errno == 22: + _log.exception(u'module <extractor> (python wrapper for libextractor) not installed') + else: + raise ret_code = -1 # 2) use "file" system command @@ -385,10 +390,11 @@ if __name__ == "__main__": #_get_system_startfile_cmd(filename) #print(_system_startfile_cmd) - #print(guess_mimetype(filename)) + print(guess_mimetype(filename)) #print(get_viewer_cmd(guess_mimetype(filename), filename)) #print(guess_ext_by_mimetype(mimetype=filename)) #call_viewer_on_file(aFile = filename, block=None) - status, desc = describe_file(filename) - print status - print desc + + #status, desc = describe_file(filename) + #print status + #print desc diff --git a/client/pycommon/gmPG2.py b/client/pycommon/gmPG2.py index 36d2f87..60f5f4c 100644 --- a/client/pycommon/gmPG2.py +++ b/client/pycommon/gmPG2.py @@ -1549,6 +1549,10 @@ def capture_conn_state(conn=None): conn_status = u'%s (%s)' % (conn.status, map_psyco_conn_status2str[conn.status]) if conn.closed != 0: conn_status = u'undefined (%s)' % conn_status + try: + conn_deferrable = conn.deferrable + except AttributeError: + conn_deferrable = u'unavailable' d = { u'identity': id(conn), @@ -1560,7 +1564,7 @@ def capture_conn_state(conn=None): u'autocommit': conn.autocommit, u'isolation level (psyco)': isolation_level, u'async': conn.async, - u'deferrable': conn.deferrable, + u'deferrable': conn_deferrable, u'transaction status': u'%s (%s)' % (tx_status, map_psyco_tx_status2str[tx_status]), u'connection status': conn_status, u'executing async op': conn.isexecuting(), @@ -1597,6 +1601,10 @@ def capture_cursor_state(cursor=None): isolation_level = u'tx aborted or unknown, cannot retrieve' else: isolation_level = conn.isolation_level + try: + conn_deferrable = conn.deferrable + except AttributeError: + conn_deferrable = u'unavailable' if cursor.query is None: query = u'<no query>' @@ -1638,7 +1646,7 @@ Query isolation_level, conn.encoding, conn.async, - conn.deferrable, + conn_deferrable, conn.readonly, map_psyco_tx_status2str[tx_status], map_psyco_conn_status2str[conn.status], @@ -1853,7 +1861,7 @@ def run_rw_queries(link_obj=None, queries=None, end_tx=False, return_data=None, if verbose: _log.debug(capture_cursor_state(curs)) for notice in notices_accessor.notices: - _log.debug(notice.strip(u'\n').strip(u'\r')) + _log.debug(unicode(notice, 'utf8', 'replace').strip(u'\n').strip(u'\r')) del notices_accessor.notices[:] # DB related exceptions except dbapi.Error as pg_exc: @@ -1868,7 +1876,7 @@ def run_rw_queries(link_obj=None, queries=None, end_tx=False, return_data=None, continue _log.error(u'PG diags %s: %s', prop, val) for notice in notices_accessor.notices: - _log.error(notice.strip(u'\n').strip(u'\r')) + _log.error(unicode(notice, 'utf8', 'replace').strip(u'\n').strip(u'\r')) del notices_accessor.notices[:] pg_exc = make_pg_exception_fields_unicode(pg_exc) _log.error(u'PG error code: %s', pg_exc.pgcode) @@ -1912,7 +1920,7 @@ def run_rw_queries(link_obj=None, queries=None, end_tx=False, return_data=None, _log.exception('error running query in RW connection') _log.error(capture_cursor_state(curs)) for notice in notices_accessor.notices: - _log.debug(notice.strip(u'\n').strip(u'\r')) + _log.debug(unicode(notice, 'utf8', 'replace').strip(u'\n').strip(u'\r')) del notices_accessor.notices[:] gmLog2.log_stack_trace() try: @@ -2289,30 +2297,30 @@ def sanity_check_database_settings(): options2check = { # setting: [expected value, risk, fatal?] - u'allow_system_table_mods': [u'off', u'system breakage', False], - u'check_function_bodies': [u'on', u'suboptimal error detection', False], - u'datestyle': [u'ISO', u'faulty timestamp parsing', True], - u'default_transaction_isolation': [u'read committed', u'faulty database reads', True], - u'default_transaction_read_only': [u'on', u'accidental database writes', False], - u'fsync': [u'on', u'data loss/corruption', True], - u'full_page_writes': [u'on', u'data loss/corruption', False], - u'lc_messages': [u'C', u'suboptimal error detection', False], - u'password_encryption': [u'on', u'breach of confidentiality', False], - #u'regex_flavor': [u'advanced', u'query breakage', False], # 9.0 doesn't support this anymore, default now advanced anyway - u'synchronous_commit': [u'on', u'data loss/corruption', False], - u'sql_inheritance': [u'on', u'query breakage, data loss/corruption', True], - u'ignore_checksum_failure': [u'off', u'data loss/corruption', False], # starting with PG 9.3 - u'track_commit_timestamp': [u'on', u'suboptimal auditing', False] # starting with PG 9.3 + u'allow_system_table_mods': [[u'off'], u'system breakage', False], + u'check_function_bodies': [[u'on'], u'suboptimal error detection', False], + u'datestyle': [[u'ISO'], u'faulty timestamp parsing', True], + u'default_transaction_isolation': [[u'read committed'], u'faulty database reads', True], + u'default_transaction_read_only': [[u'on'], u'accidental database writes', False], + u'fsync': [[u'on'], u'data loss/corruption', True], + u'full_page_writes': [[u'on'], u'data loss/corruption', False], + u'lc_messages': [[u'C'], u'suboptimal error detection', False], + u'password_encryption': [[u'on', u'md5', u'scram-sha-256'], u'breach of confidentiality', False], + #u'regex_flavor': [[u'advanced'], u'query breakage', False], # 9.0 doesn't support this anymore, default now advanced anyway + u'synchronous_commit': [[u'on'], u'data loss/corruption', False], + u'sql_inheritance': [[u'on'], u'query breakage, data loss/corruption', True], # IF returned (<PG10): better be ON, if NOT returned (PG10): hardwired + u'ignore_checksum_failure': [[u'off'], u'data loss/corruption', False], # starting with PG 9.3 + u'track_commit_timestamp': [[u'on'], u'suboptimal auditing', False] # starting with PG 9.3 } from Gnumed.pycommon import gmCfg2 _cfg = gmCfg2.gmCfgData() if _cfg.get(option = u'hipaa'): - options2check[u'log_connections'] = [u'on', u'non-compliance with HIPAA', True] - options2check[u'log_disconnections'] = [u'on', u'non-compliance with HIPAA', True] + options2check[u'log_connections'] = [[u'on'], u'non-compliance with HIPAA', True] + options2check[u'log_disconnections'] = [[u'on'], u'non-compliance with HIPAA', True] else: - options2check[u'log_connections'] = [u'on', u'non-compliance with HIPAA', None] - options2check[u'log_disconnections'] = [u'on', u'non-compliance with HIPAA', None] + options2check[u'log_connections'] = [[u'on'], u'non-compliance with HIPAA', None] + options2check[u'log_disconnections'] = [[u'on'], u'non-compliance with HIPAA', None] cmd = u"SELECT name, setting from pg_settings where name in %(settings)s" rows, idx = run_ro_queries ( @@ -2327,10 +2335,10 @@ def sanity_check_database_settings(): for row in rows: option = row['name'] value_found = row['setting'] - value_expected = options2check[option][0] + values_expected = options2check[option][0] risk = options2check[option][1] fatal_setting = options2check[option][2] - if value_found != value_expected: + if value_found not in values_expected: if fatal_setting is True: found_error = True elif fatal_setting is False: @@ -2342,7 +2350,7 @@ def sanity_check_database_settings(): raise ValueError(u'invalid database configuration sanity check') msg.append(_(' option [%s]: %s') % (option, value_found)) msg.append(_(' risk: %s') % risk) - _log.warning('PG option [%s] set to [%s], expected [%s], risk: <%s>' % (option, value_found, value_expected, risk)) + _log.warning('PG option [%s] set to [%s], expected %s, risk: <%s>' % (option, value_found, values_expected, risk)) if found_error: return 2, u'\n'.join(msg) @@ -2491,27 +2499,6 @@ class cAdapterPyDateTime(object): def getquoted(self): return _timestamp_template % self.__dt.isoformat() -## remove for 0.9 -## ---------------------------------------------------------------------- -##class cAdapterMxDateTime(object): -## -## def __init__(self, dt): -## if dt.tz == '???': -## _log.info('[%s]: no time zone string available in (%s), assuming local time zone', self.__class__.__name__, dt) -## self.__dt = dt -## -## def getquoted(self): -## # under some locale settings the mx.DateTime ISO formatter -## # will insert "," into the ISO string, -## # while this is allowed per the ISO8601 spec PostgreSQL -## # cannot currently handle that, -## # so map those "," to "." to make things work: -## return mxDT.ISO.str(self.__dt).replace(',', '.') -## -## ---------------------------------------------------------------------- -## PostgreSQL -> Python -## ---------------------------------------------------------------------- - #======================================================================= # main #----------------------------------------------------------------------- diff --git a/client/pycommon/gmPsql.py b/client/pycommon/gmPsql.py index ad1b963..682d034 100644 --- a/client/pycommon/gmPsql.py +++ b/client/pycommon/gmPsql.py @@ -9,28 +9,16 @@ __author__ = "Ian Haywood" __license__ = "GPL v2 or later (details at http://www.gnu.org)" # stdlib -import sys, os, string, re, urllib2, logging, io +import sys +import os +import re +import logging +import io _log = logging.getLogger('gm.bootstrapper') unformattable_error_id = 12345 -#=================================================================== -def shellrun (cmd): - """ - runs the shell command and returns a string - """ - stdin, stdout = os.popen4 (cmd.group (1)) - r = stdout.read () - stdout.close() - stdin.close() - return r -#------------------------------------------------------------------- -def shell(str): - """ - performs backtick shell extension in a string - """ - return re.sub (r"`(.*)`", shellrun, str) #=================================================================== class Psql: @@ -40,17 +28,16 @@ class Psql: db : the interpreter to connect to, must be a DBAPI compliant interface """ self.conn = conn - self.vars = {'ON_ERROR_STOP':None} + self.vars = {'ON_ERROR_STOP': None} #--------------------------------------------------------------- - def match (self, str): - match = re.match (str, self.line) + def match(self, pattern): + match = re.match(pattern, self.line) if match is None: - ret = 0 - else: - ret = 1 - self.groups = match.groups () - return ret + return 0 + + self.groups = match.groups() + return 1 #--------------------------------------------------------------- def fmt_msg(self, aMsg): @@ -74,18 +61,17 @@ class Psql: filename: a file, containg semicolon-separated SQL commands """ _log.debug('processing [%s]', filename) - if re.match ("http://.*", filename) or re.match ("ftp://.*", filename) or re.match ("gopher://.*", filename): - try: - self.file = urllib2.urlopen (filename) - except URLError: - _log.error(u"cannot access [%s]", filename) - return 1 + curs = self.conn.cursor() + curs.execute(u'show session authorization') + start_auth = curs.fetchall()[0][0] + curs.close() + _log.debug(u'session auth: %s', start_auth) + + if os.access (filename, os.R_OK): + sql_file = io.open(filename, mode = 'rt', encoding = 'utf8') else: - if os.access (filename, os.R_OK): - self.file = io.open(filename, mode = 'rt', encoding = 'utf8') - else: - _log.error(u"cannot open file [%s]", filename) - return 1 + _log.error(u"cannot open file [%s]", filename) + return 1 self.lineno = 0 self.filename = filename @@ -94,31 +80,18 @@ class Psql: curr_cmd = '' curs = self.conn.cursor() - for self.line in self.file.readlines(): + for self.line in sql_file.readlines(): self.lineno += 1 if len(self.line.strip()) == 0: continue - # \echo - if self.match (r"^\\echo (.*)"): - _log.info(self.fmt_msg(shell(self.groups[0]))) - continue - - # \qecho - if self.match (r"^\\qecho (.*)"): - _log.info(self.fmt_msg(shell (self.groups[0]))) - continue - - # \q - if self.match (r"^\\q"): - _log.warning(self.fmt_msg(u"script terminated by \\q")) - return 0 - # \set - if self.match (r"^\\set (\S+) (\S+)"): - self.vars[self.groups[0]] = shell (self.groups[1]) + if self.match(r"^\\set (\S+) (\S+)"): + _log.debug(u'"\set" found: %s', self.groups) + self.vars[self.groups[0]] = self.groups[1] if self.groups[0] == 'ON_ERROR_STOP': - self.vars['ON_ERROR_STOP'] = int (self.vars['ON_ERROR_STOP']) + # adjusting from string to int so that "1" -> 1 -> True + self.vars['ON_ERROR_STOP'] = int(self.vars['ON_ERROR_STOP']) continue # \unset @@ -142,7 +115,7 @@ class Psql: if this_char == "'": in_string = not in_string - # detect -- style comments + # detect "--"-style comments if this_char == '-' and next_char == '-' and not in_string: break @@ -152,31 +125,39 @@ class Psql: if this_char == ')' and not in_string: bracketlevel -= 1 - # found end of command, not inside string, not inside bracket ? - if not (not in_string and (bracketlevel == 0) and (this_char == ';')): + # have we: + # - found end of command ? + # - are not inside a string ? + # - are not inside bracket pair ? + if not ((in_string is False) and (bracketlevel == 0) and (this_char == ';')): curr_cmd += this_char else: - try: - if curr_cmd.strip() != '': - curs.execute (curr_cmd) - except Exception as error: - _log.exception(curr_cmd) - if re.match (r"^NOTICE:.*", str(error)): - _log.warning(self.fmt_msg(error)) - else: - _log.error(self.fmt_msg(error)) - if hasattr(error, 'diag'): - for prop in dir(error.diag): - if prop.startswith(u'__'): - continue - val = getattr(error.diag, prop) - if val is None: - continue - _log.error(u'PG diags %s: %s', prop, val) - if self.vars['ON_ERROR_STOP']: - self.conn.commit() - curs.close() - return 1 + if curr_cmd.strip() != '': + try: + curs.execute(curr_cmd) + try: + data = curs.fetchall() + _log.debug(u'cursor data: %s', data) + except StandardError: # actually: psycopg2.ProgrammingError but no handle + pass + except Exception as error: + _log.exception(curr_cmd) + if re.match(r"^NOTICE:.*", str(error)): + _log.warning(self.fmt_msg(error)) + else: + _log.error(self.fmt_msg(error)) + if hasattr(error, 'diag'): + for prop in dir(error.diag): + if prop.startswith(u'__'): + continue + val = getattr(error.diag, prop) + if val is None: + continue + _log.error(u'PG diags %s: %s', prop, val) + if self.vars['ON_ERROR_STOP']: + self.conn.commit() + curs.close() + return 1 self.conn.commit() curs.close() @@ -184,12 +165,17 @@ class Psql: curr_cmd = '' this_char = next_char - # end of loop over chars # end of loop over lines self.conn.commit() + curs.execute(u'show session authorization') + end_auth = curs.fetchall()[0][0] curs.close() + _log.debug(u'session auth after sql file processing: %s', end_auth) + if start_auth != end_auth: + _log.error('session auth changed before/after processing sql file') + return 0 #=================================================================== @@ -203,7 +189,7 @@ if __name__ == '__main__': sys.exit() #from pyPgSQL import PgSQL - conn = PgSQL.connect (user='gm-dbo', database = 'gnumed') - psql = Psql (conn) - psql.run (sys.argv[1]) - conn.close () + conn = PgSQL.connect(user='gm-dbo', database = 'gnumed') + psql = Psql(conn) + psql.run(sys.argv[1]) + conn.close() diff --git a/client/wxpython/gmDocumentWidgets.py b/client/wxpython/gmDocumentWidgets.py index 36bd8fa..9060797 100644 --- a/client/wxpython/gmDocumentWidgets.py +++ b/client/wxpython/gmDocumentWidgets.py @@ -2800,7 +2800,10 @@ class cPACSPluginPnl(wxgPACSPluginPnl, gmRegetMixin.cRegetOnPaintMixin): gmTools.coalesce(study['description'], u'', u': %s') ), gmTools.coalesce(study['radiology_org'], u''), - gmTools.coalesce(study['referring_doc'], u'') + gmTools.coalesce ( + study['referring_doc'], + gmTools.coalesce(study['requesting_doc'], u'') + ) ] ) study_list_data.append(study) diff --git a/client/wxpython/gmExceptionHandlingWidgets.py b/client/wxpython/gmExceptionHandlingWidgets.py index 2851766..171d13a 100644 --- a/client/wxpython/gmExceptionHandlingWidgets.py +++ b/client/wxpython/gmExceptionHandlingWidgets.py @@ -69,11 +69,18 @@ def __handle_exceptions_on_shutdown(t, v, tb): gmLog2.log_stack_trace('exception on shutdown', t, v, tb) return True + #------------------------------------------------------------------------- def __handle_import_error(t, v, tb): - if t != exceptions.ImportError: - return False + if t == exceptions.OSError: + if not hasattr('winerror'): + return False + if getattr(t, 'winerror') != 126: + return False + else: + if t != exceptions.ImportError: + return False wx.EndBusyCursor() @@ -93,6 +100,7 @@ def __handle_import_error(t, v, tb): ) % v ) return True + #------------------------------------------------------------------------- def __handle_ctrl_c(t, v, tb): diff --git a/client/wxpython/gmPatOverviewWidgets.py b/client/wxpython/gmPatOverviewWidgets.py index 78092d0..6492b10 100644 --- a/client/wxpython/gmPatOverviewWidgets.py +++ b/client/wxpython/gmPatOverviewWidgets.py @@ -340,7 +340,7 @@ class cPatientOverviewPnl(wxgPatientOverviewPnl.wxgPatientOverviewPnl, gmRegetMi #----------------------------------------------------- def _calc_inbox_item_tooltip(self, data): if isinstance(data, gmProviderInbox.cInboxMessage): - return data.format() + return data.format(with_patient = False) if isinstance(data, gmAutoHints.cDynamicHint): return u'%s\n\n%s%s\n\n%s %s' % ( -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/gnumed-client.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
