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

Source Code for Module Gnumed.wxpython.gmStaffWidgets

  1  """GNUmed staff management widgets.""" 
  2  #========================================================================= 
  3  __author__  = "K. Hilbert <Karsten.Hilbert@gmx.net>" 
  4  __license__ = "GPL v2 or later (details at http://www.gnu.org)" 
  5   
  6  import logging 
  7   
  8   
  9  import wx 
 10   
 11   
 12  from Gnumed.pycommon import gmTools 
 13  from Gnumed.pycommon import gmI18N 
 14  from Gnumed.pycommon import gmMatchProvider 
 15   
 16  from Gnumed.business import gmPerson 
 17  from Gnumed.business import gmStaff 
 18   
 19  from Gnumed.wxpython import gmGuiHelpers 
 20  from Gnumed.wxpython import gmAuthWidgets 
 21  from Gnumed.wxpython import gmPhraseWheel 
 22   
 23   
 24  _log = logging.getLogger('gm.ui') 
 25   
 26  #========================================================================== 
27 -class cProviderPhraseWheel(gmPhraseWheel.cPhraseWheel):
28
29 - def __init__(self, *args, **kwargs):
30 31 gmPhraseWheel.cPhraseWheel.__init__ ( 32 self, 33 *args, 34 **kwargs 35 ) 36 self.matcher = gmPerson.cMatchProvider_Provider() 37 self.SetToolTipString(_('Select a healthcare provider.')) 38 self.selection_only = True
39 40 #==========================================================================
41 -class cUserRolePRW(gmPhraseWheel.cPhraseWheel):
42
43 - def __init__(self, *args, **kwargs):
44 45 gmPhraseWheel.cPhraseWheel.__init__(self, *args, **kwargs) 46 47 items = [ 48 {'list_label': _('Public (no clinical or demographic access)'), 'field_label': _('public'), 'data': 'public', 'weight': 1}, 49 {'list_label': _('Staff (demographic access only)'), 'field_label': _('staff (clerical)'), 'data': 'staff', 'weight': 1}, 50 {'list_label': _('Doctor (full access)'), 'field_label': _('doctor'), 'data': 'doctor', 'weight': 1}, 51 ] 52 mp = gmMatchProvider.cMatchProvider_FixedList(items) 53 mp.setThresholds(1, 2, 3) 54 mp.word_separators = None 55 #mp.ignored_chars = r"[.'\\(){}\[\]<>~#*$%^_=&@\t0123456789]+" + r'"' 56 #self.SetToolTipString(_('The preparation (form) of the substance or brand.')) 57 self.matcher = mp 58 self.selection_only = True
59 60 #========================================================================== 61 from Gnumed.wxGladeWidgets import wxgEditStaffListDlg 62
63 -class cEditStaffListDlg(wxgEditStaffListDlg.wxgEditStaffListDlg):
64
65 - def __init__(self, *args, **kwds):
66 wxgEditStaffListDlg.wxgEditStaffListDlg.__init__(self, *args, **kwds) 67 68 self._LCTRL_staff.InsertColumn(0, _('Alias')) 69 self._LCTRL_staff.InsertColumn(1, _('DB account')) 70 self._LCTRL_staff.InsertColumn(2, _('Role')) 71 self._LCTRL_staff.InsertColumn(3, _('Name')) 72 self._LCTRL_staff.InsertColumn(4, _('Comment')) 73 self._LCTRL_staff.InsertColumn(5, _('Status')) 74 75 self.__init_ui_data()
76 #-------------------------------------------------------- 77 # internal API 78 #--------------------------------------------------------
79 - def __init_ui_data(self):
80 lbl_active = {True: _('active'), False: _('inactive')} 81 lbl_login = {True: _('can login'), False: _('can not login')} 82 83 self._LCTRL_staff.DeleteAllItems() 84 staff_list = gmStaff.get_staff_list() 85 pos = len(staff_list) + 1 86 for staff in staff_list: 87 row_num = self._LCTRL_staff.InsertStringItem(pos, label=staff['short_alias']) 88 self._LCTRL_staff.SetStringItem(index = row_num, col = 1, label = staff['db_user']) 89 self._LCTRL_staff.SetStringItem(index = row_num, col = 2, label = staff['l10n_role']) 90 title = gmTools.coalesce(staff['title'], '') 91 self._LCTRL_staff.SetStringItem(index = row_num, col = 3, label = '%s %s, %s' % (title, staff['lastnames'], staff['firstnames'])) 92 self._LCTRL_staff.SetStringItem(index = row_num, col = 4, label = gmTools.coalesce(staff['comment'], '')) 93 self._LCTRL_staff.SetStringItem(index = row_num, col = 5, label = '%s / %s' % (lbl_active[bool(staff['is_active'])], lbl_login[bool(staff['can_login'])])) 94 # color 95 if staff['is_active'] and staff['can_login']: 96 #self._LCTRL_staff.SetItemTextColour(row_num, col=wx.NamedColour('BLUE')) 97 pass 98 elif not staff['is_active'] and not staff['can_login']: 99 self._LCTRL_staff.SetItemTextColour(row_num, col=wx.LIGHT_GREY) 100 else: 101 self._LCTRL_staff.SetItemTextColour(row_num, col=wx.NamedColour('RED')) 102 # data 103 self._LCTRL_staff.SetItemData(item = row_num, data = staff['pk_staff']) 104 105 if len(staff_list) > 0: 106 self._LCTRL_staff.SetColumnWidth(col=0, width=wx.LIST_AUTOSIZE) 107 self._LCTRL_staff.SetColumnWidth(col=1, width=wx.LIST_AUTOSIZE_USEHEADER) 108 self._LCTRL_staff.SetColumnWidth(col=2, width=wx.LIST_AUTOSIZE) 109 self._LCTRL_staff.SetColumnWidth(col=3, width=wx.LIST_AUTOSIZE) 110 self._LCTRL_staff.SetColumnWidth(col=4, width=wx.LIST_AUTOSIZE) 111 self._LCTRL_staff.SetColumnWidth(col=5, width=wx.LIST_AUTOSIZE) 112 113 # disable buttons 114 self._btn_save.Enable(False) 115 self._btn_delete.Enable(False) 116 self._btn_deactivate.Enable(False) 117 self._btn_activate.Enable(False) 118 # clear editor 119 self._TCTRL_name.SetValue('') 120 self._TCTRL_alias.SetValue('') 121 self._TCTRL_account.SetValue('') 122 self._PRW_user_role.SetText(value = u'', data = None) 123 self._TCTRL_comment.SetValue('')
124 #-------------------------------------------------------- 125 # event handlers 126 #--------------------------------------------------------
127 - def _on_listitem_selected(self, evt):
128 self._btn_save.Enable(True) 129 self._btn_delete.Enable(True) 130 self._btn_deactivate.Enable(True) 131 self._btn_activate.Enable(True) 132 # fill editor 133 pk_staff = self._LCTRL_staff.GetItemData(self._LCTRL_staff.GetFirstSelected()) 134 staff = gmStaff.cStaff(aPK_obj=pk_staff) 135 self._TCTRL_name.SetValue('%s.%s %s' % (staff['title'], staff['firstnames'], staff['lastnames'])) 136 self._TCTRL_alias.SetValue(staff['short_alias']) 137 self._TCTRL_account.SetValue(staff['db_user']) 138 self._PRW_user_role.SetText(value = staff['l10n_role'], data = staff['role'], suppress_smarts = True) 139 self._TCTRL_comment.SetValue(gmTools.coalesce(staff['comment'], ''))
140 #--------------------------------------------------------
141 - def _on_listitem_deselected(self, evt):
142 self._btn_save.Enable(False) 143 self._btn_delete.Enable(False) 144 self._btn_deactivate.Enable(False) 145 self._btn_activate.Enable(False) 146 # clear editor 147 self._TCTRL_name.SetValue('') 148 self._TCTRL_alias.SetValue('') 149 self._TCTRL_account.SetValue('') 150 self._PRW_user_role.SetText(value = u'', data = None) 151 self._TCTRL_comment.SetValue('')
152 #--------------------------------------------------------
153 - def _on_activate_button_pressed(self, evt):
154 pk_staff = self._LCTRL_staff.GetItemData(self._LCTRL_staff.GetFirstSelected()) 155 conn = gmAuthWidgets.get_dbowner_connection(procedure = _('Activating GNUmed user.')) 156 if conn is None: 157 return False 158 gmStaff.activate_staff(conn = conn, pk_staff = pk_staff) 159 conn.close() 160 self.__init_ui_data() 161 return True
162 #--------------------------------------------------------
163 - def _on_deactivate_button_pressed(self, evt):
164 pk_staff = self._LCTRL_staff.GetItemData(self._LCTRL_staff.GetFirstSelected()) 165 conn = gmAuthWidgets.get_dbowner_connection(procedure = _('Deactivating GNUmed user.')) 166 if conn is None: 167 return False 168 gmStaff.deactivate_staff(conn = conn, pk_staff = pk_staff) 169 conn.close() 170 self.__init_ui_data() 171 return True
172 #--------------------------------------------------------
173 - def _on_delete_button_pressed(self, event):
174 pk_staff = self._LCTRL_staff.GetItemData(self._LCTRL_staff.GetFirstSelected()) 175 conn = gmAuthWidgets.get_dbowner_connection(procedure = _('Removing GNUmed user.')) 176 if conn is None: 177 return False 178 success, msg = gmStaff.delete_staff(conn = conn, pk_staff = pk_staff) 179 conn.close() 180 self.__init_ui_data() 181 if not success: 182 gmGuiHelpers.gm_show_error(aMessage = msg, aTitle = _('Removing GNUmed user')) 183 return False 184 return True
185 #--------------------------------------------------------
186 - def _on_save_button_pressed(self, event):
187 pk_staff = self._LCTRL_staff.GetItemData(self._LCTRL_staff.GetFirstSelected()) 188 189 conn = gmAuthWidgets.get_dbowner_connection(procedure = _('Modifying GNUmed user.')) 190 if conn is None: 191 return False 192 193 staff = gmStaff.cStaff(aPK_obj = pk_staff) 194 staff['short_alias'] = self._TCTRL_alias.GetValue() 195 staff['db_user'] = self._TCTRL_account.GetValue() 196 staff['comment'] = self._TCTRL_comment.GetValue() 197 success, data = staff.save_payload(conn = conn) 198 if not success: 199 conn.close() 200 gmGuiHelpers.gm_show_error ( 201 aMessage = _('Failed to save changes to GNUmed database user.'), 202 aTitle = _('Modifying GNUmed user') 203 ) 204 return False 205 206 target_role = self._PRW_user_role.GetData() 207 if target_role is not None: 208 if not staff.set_role(conn = conn, role = target_role): 209 gmGuiHelpers.gm_show_error ( 210 aMessage = _('Failed to set role [%s] for GNUmed database user.') % self._PRW_user_role.GetValue().strip(), 211 aTitle = _('Modifying GNUmed user') 212 ) 213 214 conn.close() 215 self.__init_ui_data() 216 return True
217 #========================================================================== 218 from Gnumed.wxGladeWidgets import wxgAddPatientAsStaffDlg 219
220 -class cAddPatientAsStaffDlg(wxgAddPatientAsStaffDlg.wxgAddPatientAsStaffDlg):
221
222 - def __init__(self, *args, **kwds):
223 wxgAddPatientAsStaffDlg.wxgAddPatientAsStaffDlg.__init__(self, *args, **kwds) 224 self.__init_ui_data()
225 #-------------------------------------------------------- 226 # internal API 227 #--------------------------------------------------------
228 - def __init_ui_data(self):
229 pat = gmPerson.gmCurrentPatient() 230 name = pat.get_active_name() 231 txt = _(""" 232 %s "%s" %s 233 born: %s""") % (name['firstnames'], name['preferred'], name['lastnames'], pat.get_formatted_dob(format = '%Y %b %d', encoding = gmI18N.get_encoding())) 234 self._TXT_person.SetValue(txt) 235 txt = name['firstnames'][:2] + name['lastnames'][:2] 236 self._TXT_short_alias.SetValue(txt) 237 self._TXT_account.SetValue(txt.lower())
238 #-------------------------------------------------------- 239 # event handlers 240 #--------------------------------------------------------
241 - def _on_cancel_button_pressed(self, evt):
242 self.Close()
243 #--------------------------------------------------------
244 - def _on_enlist_button_pressed(self, evt):
245 # sanity checks 246 if self._TXT_password.GetValue() != self._TXT_password_again.GetValue(): 247 gmGuiHelpers.gm_show_error ( 248 aMessage = _('Password entries do not match. Please type in the passwords again to rule out typos.'), 249 aTitle = _('Adding GNUmed user') 250 ) 251 self._TXT_password.SetValue('') 252 self._TXT_password_again.SetValue('') 253 return False 254 255 if self._TXT_password.GetValue().strip() == u'': 256 really_wants_empty_password = gmGuiHelpers.gm_show_question ( 257 aMessage = _( 258 'Are you positively sure you want to create\n' 259 'a user with an empty password ?\n' 260 '\n' 261 'Think about the record access implications !' 262 ), 263 aTitle = _('Adding GNUmed user') 264 ) 265 if not really_wants_empty_password: 266 return False 267 268 # connect as "gm-dbo" 269 conn = gmAuthWidgets.get_dbowner_connection ( 270 procedure = _('Enlisting person as user.'), 271 dbo_password = gmTools.none_if(self._TXT_dbo_password.GetValue(), u'') 272 ) 273 if conn is None: 274 return False 275 276 # create new user 277 success, msg = gmStaff.create_staff ( 278 conn = conn, 279 db_account = self._TXT_account.GetValue(), 280 password = self._TXT_password.GetValue(), 281 identity = gmPerson.gmCurrentPatient().ID, 282 short_alias = self._TXT_short_alias.GetValue().strip() 283 ) 284 conn.close() 285 if not success: 286 gmGuiHelpers.gm_show_error(aMessage = msg, aTitle = _('Adding GNUmed user')) 287 return False 288 289 if self.IsModal(): 290 self.EndModal(wx.ID_OK) 291 else: 292 self.Close()
293 294 #========================================================================== 295