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

Source Code for Module Gnumed.wxpython.gmContactWidgets

  1  """GNUmed generic contact related widgets.""" 
  2  #================================================================ 
  3  __author__ = 'karsten.hilbert@gmx.net' 
  4  __license__ = 'GPL v2 or later (details at http://www.gnu.org)' 
  5   
  6  # stdlib 
  7  import logging, sys 
  8   
  9   
 10  # 3rd party 
 11  import wx 
 12   
 13   
 14  # GNUmed 
 15  if __name__ == '__main__': 
 16          sys.path.insert(0, '../../') 
 17   
 18  from Gnumed.pycommon import gmPG2 
 19  from Gnumed.pycommon import gmTools 
 20  from Gnumed.pycommon import gmMatchProvider 
 21  from Gnumed.pycommon import gmDispatcher 
 22  from Gnumed.business import gmDemographicRecord 
 23  from Gnumed.wxpython import gmListWidgets 
 24  from Gnumed.wxpython import gmPhraseWheel 
 25  from Gnumed.wxpython import gmEditArea 
 26  from Gnumed.wxpython import gmGuiHelpers 
 27   
 28   
 29  _log = logging.getLogger('gm.ui') 
 30  #============================================================ 
 31  # communication channels related widgets 
 32  #============================================================ 
33 -def manage_comm_channel_types(parent=None):
34 35 if parent is None: 36 parent = wx.GetApp().GetTopWindow() 37 38 #------------------------------------------------------------ 39 def delete(channel=None): 40 return gmDemographicRecord.delete_comm_channel_type(pk_channel_type = channel['pk'])
41 #------------------------------------------------------------ 42 def refresh(lctrl): 43 wx.BeginBusyCursor() 44 channel_types = gmDemographicRecord.get_comm_channel_types() 45 lctrl.set_string_items([ (ct['l10n_description'], ct['description'], ct['pk']) for ct in channel_types ]) 46 lctrl.set_data(channel_types) 47 wx.EndBusyCursor() 48 #------------------------------------------------------------ 49 msg = _('\nThis lists the communication channel types known to GNUmed.\n') 50 51 gmListWidgets.get_choices_from_list ( 52 parent = parent, 53 msg = msg, 54 caption = _('Managing communication types ...'), 55 columns = [_('Channel'), _('System type'), '#'], 56 single_selection = True, 57 #new_callback = edit, 58 #edit_callback = edit, 59 delete_callback = delete, 60 refresh_callback = refresh 61 ) 62 63 #------------------------------------------------------------
64 -class cCommChannelTypePhraseWheel(gmPhraseWheel.cPhraseWheel):
65
66 - def __init__(self, *args, **kwargs):
67 68 query = u""" 69 SELECT 70 data, 71 field_label, 72 list_label 73 FROM ( 74 SELECT DISTINCT ON (field_label) 75 pk 76 AS data, 77 _(description) 78 AS field_label, 79 (_(description) || ' (' || description || ')') 80 AS list_label 81 FROM dem.enum_comm_types 82 WHERE 83 _(description) %(fragment_condition)s 84 OR 85 description %(fragment_condition)s 86 ) AS ur 87 ORDER BY 88 ur.list_label 89 """ 90 mp = gmMatchProvider.cMatchProvider_SQL2(queries=query) 91 mp.setThresholds(1, 2, 4) 92 mp.word_separators = u'[ \t]+' 93 gmPhraseWheel.cPhraseWheel.__init__(self, *args, **kwargs) 94 self.matcher = mp 95 self.SetToolTipString(_('Select the type of communications channel.')) 96 self.selection_only = True
97 98 #================================================================ 99 from Gnumed.wxGladeWidgets import wxgCommChannelEditAreaPnl 100
101 -class cCommChannelEditAreaPnl(wxgCommChannelEditAreaPnl.wxgCommChannelEditAreaPnl, gmEditArea.cGenericEditAreaMixin):
102 """An edit area for editing/creating a comms channel. 103 104 Does NOT act on/listen to the current patient. 105 """
106 - def __init__(self, *args, **kwargs):
107 try: 108 data = kwargs['comm_channel'] 109 del kwargs['comm_channel'] 110 except KeyError: 111 data = None 112 113 self.channel_owner = None 114 115 wxgCommChannelEditAreaPnl.wxgCommChannelEditAreaPnl.__init__(self, *args, **kwargs) 116 gmEditArea.cGenericEditAreaMixin.__init__(self) 117 118 self.mode = 'new' 119 self.data = data 120 if data is not None: 121 self.mode = 'edit' 122 123 self.__init_ui()
124 #----------------------------------------------------------------
125 - def __init_ui(self):
126 self._PRW_address.Disable()
127 #---------------------------------------------------------------- 128 # generic Edit Area mixin API 129 #----------------------------------------------------------------
130 - def _valid_for_save(self):
131 validity = True 132 133 if self._TCTRL_url.GetValue().strip() == u'': 134 validity = False 135 self.display_tctrl_as_valid(tctrl = self._TCTRL_url, valid = False) 136 self._TCTRL_url.SetFocus() 137 else: 138 self.display_tctrl_as_valid(tctrl = self._TCTRL_url, valid = True) 139 140 # do not check GetData() because comm 141 # types are created as needed 142 #if self._PRW_type.GetData() is None: 143 if self._PRW_type.GetValue().strip() == u'': 144 validity = False 145 self._PRW_type.display_as_valid(False) 146 self._PRW_type.SetFocus() 147 else: 148 self._PRW_type.display_as_valid(True) 149 150 return validity
151 #----------------------------------------------------------------
152 - def _save_as_new(self):
153 try: 154 data = self.channel_owner.link_comm_channel ( 155 comm_medium = self._PRW_type.GetValue().strip(), 156 pk_channel_type = self._PRW_type.GetData(), 157 url = self._TCTRL_url.GetValue().strip(), 158 is_confidential = self._CHBOX_confidential.GetValue(), 159 ) 160 except gmPG2.dbapi.IntegrityError: 161 _log.exception('error saving comm channel') 162 gmDispatcher.send(signal = u'statustext', msg = _('Cannot save communications channel.'), beep = True) 163 return False 164 165 self.data = data 166 return True
167 #----------------------------------------------------------------
168 - def _save_as_update(self):
169 comm_type = self._PRW_type.GetValue().strip() 170 if comm_type != u'': 171 self.data['comm_type'] = comm_type 172 url = self._TCTRL_url.GetValue().strip() 173 if url != u'': 174 self.data['url'] = url 175 self.data['is_confidential'] = self._CHBOX_confidential.GetValue() 176 177 self.data.save() 178 return True
179 #----------------------------------------------------------------
180 - def _refresh_as_new(self):
181 self._PRW_type.SetText(u'') 182 self._TCTRL_url.SetValue(u'') 183 #self._PRW_address.SetText(value = u'', data = None) 184 self._CHBOX_confidential.SetValue(False) 185 186 self._PRW_type.SetFocus()
187 #----------------------------------------------------------------
189 self._refresh_as_new()
190 #----------------------------------------------------------------
191 - def _refresh_from_existing(self):
192 self._PRW_type.SetText(self.data['l10n_comm_type']) 193 self._TCTRL_url.SetValue(self.data['url']) 194 #self._PRW_address.SetData(data = self.data['pk_address']) 195 self._CHBOX_confidential.SetValue(self.data['is_confidential']) 196 197 self._TCTRL_url.SetFocus()
198 #------------------------------------------------------------
199 -class cCommChannelsManagerPnl(gmListWidgets.cGenericListManagerPnl):
200 """A list for managing a person's comm channels."""
201 - def __init__(self, *args, **kwargs):
202 203 try: 204 self.__channel_owner = kwargs['identity'] 205 del kwargs['identity'] 206 except KeyError: 207 self.__channel_owner = None 208 209 gmListWidgets.cGenericListManagerPnl.__init__(self, *args, **kwargs) 210 211 self.new_callback = self._add_comm 212 self.edit_callback = self._edit_comm 213 self.delete_callback = self._del_comm 214 self.refresh_callback = self.refresh 215 216 self.__init_ui() 217 self.refresh()
218 #-------------------------------------------------------- 219 # external API 220 #--------------------------------------------------------
221 - def refresh(self, *args, **kwargs):
222 if self.__channel_owner is None: 223 self._LCTRL_items.set_string_items() 224 return 225 226 comms = self.__channel_owner.get_comm_channels() 227 self._LCTRL_items.set_string_items ( 228 items = [ [ gmTools.bool2str(c['is_confidential'], u'X', u''), c['l10n_comm_type'], c['url'] ] for c in comms ] 229 ) 230 self._LCTRL_items.set_column_widths() 231 self._LCTRL_items.set_data(data = comms)
232 #-------------------------------------------------------- 233 # internal helpers 234 #--------------------------------------------------------
235 - def __init_ui(self):
236 self._LCTRL_items.SetToolTipString(_('List of known communication channels.')) 237 self._LCTRL_items.set_columns(columns = [ 238 _('confidential'), 239 _('Type'), 240 _('Value') 241 ])
242 #--------------------------------------------------------
243 - def _add_comm(self):
244 ea = cCommChannelEditAreaPnl(self, -1) 245 ea.channel_owner = self.__channel_owner 246 dlg = gmEditArea.cGenericEditAreaDlg2(self, -1, edit_area = ea) 247 dlg.SetTitle(_('Adding new communications channel')) 248 if dlg.ShowModal() == wx.ID_OK: 249 return True 250 return False
251 #--------------------------------------------------------
252 - def _edit_comm(self, comm_channel):
253 ea = cCommChannelEditAreaPnl(self, -1, comm_channel = comm_channel) 254 ea.channel_owner = self.__channel_owner 255 dlg = gmEditArea.cGenericEditAreaDlg2(self, -1, edit_area = ea, single_entry = True) 256 dlg.SetTitle(_('Editing communications channel')) 257 if dlg.ShowModal() == wx.ID_OK: 258 return True 259 return False
260 #--------------------------------------------------------
261 - def _del_comm(self, comm):
262 go_ahead = gmGuiHelpers.gm_show_question ( 263 _( 'Are you sure this communication channel\n' 264 'can no longer be used ?' 265 ), 266 _('Removing communication channel') 267 ) 268 if not go_ahead: 269 return False 270 self.__channel_owner.unlink_comm_channel(comm_channel = comm) 271 return True
272 #-------------------------------------------------------- 273 # properties 274 #--------------------------------------------------------
275 - def __get_channel_owner(self):
276 return self.__channel_owner
277
278 - def __set_channel_owner(self, channel_owner):
279 self.__channel_owner = channel_owner 280 self.refresh()
281 282 channel_owner = property(__get_channel_owner, __set_channel_owner)
283 284 #================================================================ 285 # main 286 #---------------------------------------------------------------- 287 if __name__ == '__main__': 288 289 if len(sys.argv) < 2: 290 sys.exit() 291 292 if sys.argv[1] != 'test': 293 sys.exit() 294 295 from Gnumed.pycommon import gmI18N 296 gmI18N.activate_locale() 297 gmI18N.install_domain() 298 from Gnumed.business import gmPersonSearch 299 300 #--------------------------------------------------------
301 - def test_person_comms_pnl():
302 pat = gmPersonSearch.ask_for_patient() 303 app = wx.PyWidgetTester(size = (600, 400)) 304 widget = cCommChannelsManagerPnl(app.frame, -1) 305 widget.identity = pat 306 app.frame.Show(True) 307 app.MainLoop()
308 #-------------------------------------------------------- 309 test_person_comms_pnl() 310 311 #================================================================ 312