Package Gnumed :: Package wxpython :: Module gmCodingWidgets
[frames] | no frames]

Source Code for Module Gnumed.wxpython.gmCodingWidgets

  1  """GNUmed coding related widgets.""" 
  2  #================================================================ 
  3  __version__ = '$Revision: 1.4 $' 
  4  __author__ = 'karsten.hilbert@gmx.net' 
  5  __license__ = 'GPL v2 or later (details at http://www.gnu.org)' 
  6   
  7  # stdlib 
  8  import logging, sys 
  9   
 10   
 11  # 3rd party 
 12  import wx 
 13   
 14   
 15  # GNUmed 
 16  if __name__ == '__main__': 
 17          sys.path.insert(0, '../../') 
 18   
 19  from Gnumed.business import gmCoding 
 20  from Gnumed.pycommon import gmTools 
 21  from Gnumed.pycommon import gmMatchProvider 
 22  from Gnumed.wxpython import gmListWidgets 
 23  from Gnumed.wxpython import gmPhraseWheel 
 24   
 25   
 26  _log = logging.getLogger('gm.ui') 
 27  _log.info(__version__) 
 28   
 29  #================================================================ 
30 -def browse_data_sources(parent=None):
31 32 if parent is None: 33 parent = wx.GetApp().GetTopWindow() 34 #------------------------------------------------------------ 35 def refresh(lctrl): 36 srcs = gmCoding.get_data_sources() 37 items = [ [ 38 u'%s (%s): %s' % ( 39 s['name_short'], 40 gmTools.coalesce(s['lang'], u'?'), 41 s['version'] 42 ), 43 s['name_long'].split(u'\n')[0].split(u'\r')[0], 44 s['source'].split(u'\n')[0].split(u'\r')[0], 45 gmTools.coalesce(s['description'], u'').split(u'\n')[0].split(u'\r')[0], 46 s['pk'] 47 ] for s in srcs ] 48 lctrl.set_string_items(items) 49 lctrl.set_data(srcs)
50 #------------------------------------------------------------ 51 gmListWidgets.get_choices_from_list ( 52 parent = parent, 53 msg = _('Sources of reference data registered in GNUmed.'), 54 caption = _('Showing data sources'), 55 columns = [ _('System'), _('Name'), _('Source'), _('Description'), '#' ], 56 single_selection = True, 57 can_return_empty = False, 58 ignore_OK_button = True, 59 refresh_callback = refresh 60 # edit_callback=None, 61 # new_callback=None, 62 # delete_callback=None, 63 # left_extra_button=None, 64 # middle_extra_button=None, 65 # right_extra_button=None 66 ) 67 68 #================================================================
69 -def browse_coded_terms(parent=None, coding_systems=None, languages=None):
70 71 if parent is None: 72 parent = wx.GetApp().GetTopWindow() 73 #------------------------------------------------------------ 74 def refresh(lctrl): 75 coded_terms = gmCoding.get_coded_terms ( 76 coding_systems = coding_systems, 77 languages = languages, 78 order_by = u'term, coding_system, code' 79 ) 80 items = [ [ 81 ct['term'], 82 ct['code'], 83 ct['coding_system'], 84 gmTools.coalesce(ct['lang'], u''), 85 ct['version'], 86 ct['coding_system_long'] 87 ] for ct in coded_terms ] 88 lctrl.set_string_items(items) 89 lctrl.set_data(coded_terms)
90 #------------------------------------------------------------ 91 gmListWidgets.get_choices_from_list ( 92 parent = parent, 93 msg = _('Coded terms known to GNUmed (may take a while to load).'), 94 caption = _('Showing coded terms.'), 95 columns = [ _('Term'), _('Code'), _('System'), _('Language'), _('Version'), _(u'Coding system details') ], 96 single_selection = True, 97 can_return_empty = True, 98 ignore_OK_button = True, 99 refresh_callback = refresh 100 # edit_callback=None, 101 # new_callback=None, 102 # delete_callback=None, 103 # left_extra_button=None, 104 # middle_extra_button=None, 105 # right_extra_button=None 106 ) 107 108 #================================================================ 109
110 -class cGenericCodesPhraseWheel(gmPhraseWheel.cMultiPhraseWheel):
111
112 - def __init__(self, *args, **kwargs):
113 114 super(cGenericCodesPhraseWheel, self).__init__(*args, **kwargs) 115 116 query = u""" 117 SELECT 118 -- DISTINCT ON (list_label) 119 data, 120 list_label, 121 field_label 122 FROM ( 123 124 SELECT 125 pk_generic_code 126 AS data, 127 (code || ' (' || coding_system || '): ' || term || ' (' || version || coalesce(' - ' || lang, '') || ')') 128 AS list_label, 129 code AS 130 field_label 131 FROM 132 ref.v_coded_terms 133 WHERE 134 term %(fragment_condition)s 135 OR 136 code %(fragment_condition)s 137 %(ctxt_system)s 138 %(ctxt_lang)s 139 140 ) AS applicable_codes 141 ORDER BY list_label 142 LIMIT 30 143 """ 144 ctxt = { 145 'ctxt_system': { # must be a TUPLE ! 146 'where_part': u'AND coding_system IN %(system)s', 147 'placeholder': u'system' 148 }, 149 'ctxt_lang': { 150 'where_part': u'AND lang = %(lang)s', 151 'placeholder': u'lang' 152 } 153 } 154 155 mp = gmMatchProvider.cMatchProvider_SQL2(queries = query, context = ctxt) 156 mp.setThresholds(2, 4, 5) 157 mp.word_separators = '[ \t=+&/:-]+' 158 #mp.print_queries = True 159 160 self.phrase_separators = ';' 161 self.selection_only = False # not sure yet how this fares with multi-phrase input 162 self.SetToolTipString(_('Select one or more codes that apply.')) 163 self.matcher = mp 164 165 self.add_callback_on_lose_focus(callback = self.__on_losing_focus)
166 #------------------------------------------------------------
167 - def __on_losing_focus(self):
168 self._adjust_data_after_text_update() 169 if self.GetValue().strip() == u'': 170 return 171 172 if len(self.data) != len(self.displayed_strings): 173 self.display_as_valid(valid = False, partially_invalid = True) 174 return 175 176 self.display_as_valid(valid = True)
177 #------------------------------------------------------------
178 - def _get_data_tooltip(self):
179 if len(self.data) == 0: 180 return u'' 181 182 return u';\n'.join([ i['list_label'] for i in self.data.values() ]) + u';'
183 #------------------------------------------------------------
184 - def generic_linked_codes2item_dict(self, codes):
185 if len(codes) == 0: 186 return u'', {} 187 188 code_dict = {} 189 val = u'' 190 for code in codes: 191 list_label = u'%s (%s): %s (%s - %s)' % ( 192 code['code'], 193 code['name_short'], 194 code['term'], 195 code['version'], 196 code['lang'] 197 ) 198 field_label = code['code'] 199 code_dict[field_label] = {'data': code['pk_generic_code'], 'field_label': field_label, 'list_label': list_label} 200 val += u'%s; ' % field_label 201 202 return val.strip(), code_dict
203 #================================================================ 204 # main 205 #---------------------------------------------------------------- 206 if __name__ == '__main__': 207 208 if len(sys.argv) < 2: 209 sys.exit() 210 211 if sys.argv[1] != 'test': 212 sys.exit() 213 214 from Gnumed.pycommon import gmI18N 215 gmI18N.activate_locale() 216 gmI18N.install_domain() 217 from Gnumed.pycommon import gmPG2 218 219 #--------------------------------------------------------
220 - def test_generic_codes_prw():
221 gmPG2.get_connection() 222 app = wx.PyWidgetTester(size = (500, 40)) 223 pw = cGenericCodesPhraseWheel(app.frame, -1) 224 #pw.set_context(context = u'zip', val = u'04318') 225 app.frame.Show(True) 226 app.MainLoop()
227 #-------------------------------------------------------- 228 test_generic_codes_prw() 229 230 #================================================================ 231