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

Source Code for Module Gnumed.wxpython.gmAllergyWidgets

  1  """GNUmed allergy related widgets.""" 
  2  ############################################################################ 
  3  __author__  = "R.Terry <rterry@gnumed.net>, H.Herb <hherb@gnumed.net>, K.Hilbert <Karsten.Hilbert@gmx.net>" 
  4  __license__ = 'GPL v2 or later (details at http://www.gnu.org)' 
  5   
  6  import sys, time, datetime as pyDT, logging 
  7   
  8   
  9  import wx 
 10   
 11   
 12  if __name__ == '__main__': 
 13          sys.path.insert(0, '../../') 
 14  from Gnumed.pycommon import gmDispatcher, gmI18N, gmDateTime, gmTools, gmMatchProvider 
 15  from Gnumed.wxpython import gmDateTimeInput, gmTerryGuiParts, gmRegetMixin, gmPatSearchWidgets 
 16  from Gnumed.business import gmPerson, gmAllergy, gmPersonSearch 
 17  from Gnumed.wxGladeWidgets import wxgAllergyEditAreaPnl, wxgAllergyEditAreaDlg, wxgAllergyManagerDlg 
 18   
 19  _log = logging.getLogger('gm.ui') 
 20   
 21  #====================================================================== 
22 -class cAllergyEditAreaPnl(wxgAllergyEditAreaPnl.wxgAllergyEditAreaPnl):
23
24 - def __init__(self, *args, **kwargs):
25 wxgAllergyEditAreaPnl.wxgAllergyEditAreaPnl.__init__(self, *args, **kwargs) 26 27 try: 28 self.__allergy = kwargs['allergy'] 29 except KeyError: 30 self.__allergy = None 31 32 mp = gmMatchProvider.cMatchProvider_SQL2 ( 33 queries = [u""" 34 select substance, substance 35 from clin.allergy 36 where substance %(fragment_condition)s 37 38 union 39 40 select generics, generics 41 from clin.allergy 42 where generics %(fragment_condition)s 43 44 union 45 46 select allergene, allergene 47 from clin.allergy 48 where allergene %(fragment_condition)s 49 50 union 51 52 select atc_code, atc_code 53 from clin.allergy 54 where atc_code %(fragment_condition)s 55 """ 56 ] 57 ) 58 mp.setThresholds(2, 3, 5) 59 self._PRW_trigger.matcher = mp 60 61 mp = gmMatchProvider.cMatchProvider_SQL2 ( 62 queries = [u""" 63 select narrative, narrative 64 from clin.allergy 65 where narrative %(fragment_condition)s 66 """] 67 ) 68 mp.setThresholds(2, 3, 5) 69 self._PRW_reaction.matcher = mp 70 self._PRW_reaction.enable_default_spellchecker() 71 72 # self._RBTN_type_sensitivity.MoveAfterInTabOrder(self._RBTN_type_allergy) 73 # self._ChBOX_definite.MoveAfterInTabOrder(self._RBTN_type_sensitivity) 74 75 self.refresh()
76 #-------------------------------------------------------- 77 # external API 78 #--------------------------------------------------------
79 - def clear(self):
80 self.__allergy = None 81 return self.refresh()
82 #--------------------------------------------------------
83 - def refresh(self, allergy=None):
84 85 if allergy is not None: 86 self.__allergy = allergy 87 88 if self.__allergy is None: 89 ts = gmDateTime.cFuzzyTimestamp ( 90 timestamp = pyDT.datetime.now(tz=gmDateTime.gmCurrentLocalTimezone), 91 accuracy = gmDateTime.acc_days 92 ) 93 self._DPRW_date_noted.SetData(data = ts) 94 self._PRW_trigger.SetText() 95 self._TCTRL_brand_name.SetValue('') 96 self._TCTRL_generic.SetValue('') 97 self._ChBOX_generic_specific.SetValue(0) 98 self._TCTRL_atc_classes.SetValue('') 99 self._PRW_reaction.SetText() 100 self._RBTN_type_allergy.SetValue(1) 101 self._RBTN_type_sensitivity.SetValue(0) 102 self._ChBOX_definite.SetValue(1) 103 return True 104 105 if not isinstance(self.__allergy, gmAllergy.cAllergy): 106 raise ValueError('[%s].refresh(): expected gmAllergy.cAllergy instance, got [%s] instead' % (self.__class__.__name__, self.__allergy)) 107 108 ts = gmDateTime.cFuzzyTimestamp ( 109 timestamp = self.__allergy['date'], 110 accuracy = gmDateTime.acc_days 111 ) 112 self._DPRW_date_noted.SetData(data=ts) 113 self._PRW_trigger.SetText(value = self.__allergy['allergene']) 114 self._TCTRL_brand_name.SetValue(self.__allergy['substance']) 115 self._TCTRL_generic.SetValue(gmTools.coalesce(self.__allergy['generics'], '')) 116 self._ChBOX_generic_specific.SetValue(self.__allergy['generic_specific']) 117 self._TCTRL_atc_classes.SetValue(gmTools.coalesce(self.__allergy['atc_code'], '')) 118 self._PRW_reaction.SetText(value = gmTools.coalesce(self.__allergy['reaction'], '')) 119 if self.__allergy['type'] == 'allergy': 120 self._RBTN_type_allergy.SetValue(1) 121 else: 122 self._RBTN_type_sensitivity.SetValue(1) 123 self._ChBOX_definite.SetValue(self.__allergy['definite'])
124 #--------------------------------------------------------
125 - def __is_valid_for_save(self):
126 127 if self._PRW_trigger.GetValue().strip() == '': 128 #self._PRW_trigger.SetBackgroundColour('pink') 129 #self._PRW_trigger.Refresh() 130 self._PRW_trigger.display_as_valid(False) 131 self._PRW_trigger.SetFocus() 132 return False 133 #self._PRW_trigger.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 134 self._PRW_trigger.display_as_valid(True) 135 self._PRW_trigger.Refresh() 136 137 if not self._DPRW_date_noted.is_valid_timestamp(empty_is_valid = False): 138 self._DPRW_date_noted.display_as_valid(False) 139 self._DPRW_date_noted.SetFocus() 140 return False 141 self._DPRW_date_noted.display_as_valid(True) 142 143 return True
144 #--------------------------------------------------------
145 - def save(self, can_create=True):
146 if not self.__is_valid_for_save(): 147 return False 148 149 if self.__allergy is None: 150 if not can_create: 151 gmDispatcher.send(signal='statustext', msg=_('Creating new allergy not allowed.')) 152 return False 153 154 pat = gmPerson.gmCurrentPatient() 155 emr = pat.get_emr() 156 157 if self._RBTN_type_allergy.GetValue(): 158 allg_type = 'allergy' 159 else: 160 allg_type = 'sensitivity' 161 self.__allergy = emr.add_allergy ( 162 allergene = self._PRW_trigger.GetValue().strip(), 163 allg_type = allg_type 164 ) 165 166 # and update it with known data 167 self.__allergy['date'] = self._DPRW_date_noted.GetData().get_pydt() 168 self.__allergy['allergene'] = self._PRW_trigger.GetValue().strip() 169 # FIXME: determine brandname/generic/etc from substance (trigger field) 170 self.__allergy['generic_specific'] = (True and self._ChBOX_generic_specific.GetValue()) 171 self.__allergy['reaction'] = self._PRW_reaction.GetValue().strip() 172 self.__allergy['definite'] = (True and self._ChBOX_definite.GetValue()) 173 if self._RBTN_type_allergy.GetValue(): 174 self.__allergy['pk_type'] = 'allergy' 175 else: 176 self.__allergy['pk_type'] = 'sensitivity' 177 178 self.__allergy.save_payload() 179 180 return True
181 #======================================================================
182 -class cAllergyEditAreaDlg(wxgAllergyEditAreaDlg.wxgAllergyEditAreaDlg):
183
184 - def __init__(self, *args, **kwargs):
185 186 try: 187 allergy = kwargs['allergy'] 188 del kwargs['allergy'] 189 except KeyError: 190 allergy = None 191 192 wxgAllergyEditAreaDlg.wxgAllergyEditAreaDlg.__init__(self, *args, **kwargs) 193 194 if allergy is None: 195 # self._BTN_save.SetLabel(_('&Save')) 196 self._BTN_clear.SetLabel(_('&Clear')) 197 else: 198 # self._BTN_save.SetLabel(_('Update')) 199 self._BTN_clear.SetLabel(_('&Restore')) 200 201 self._PNL_edit_area.refresh(allergy = allergy)
202 #--------------------------------------------------------
203 - def _on_save_button_pressed(self, evt):
204 if self._PNL_edit_area.save(): 205 if self.IsModal(): 206 self.EndModal(wx.ID_OK) 207 else: 208 self.Close()
209 #--------------------------------------------------------
210 - def _on_clear_button_pressed(self, evt):
211 self._PNL_edit_area.refresh()
212 #======================================================================
213 -class cAllergyManagerDlg(wxgAllergyManagerDlg.wxgAllergyManagerDlg):
214
215 - def __init__(self, *args, **kwargs):
216 217 wxgAllergyManagerDlg.wxgAllergyManagerDlg.__init__(self, *args, **kwargs) 218 219 self.Centre(direction = wx.BOTH) 220 221 self.__set_columns() 222 # MacOSX crashes on this with: 223 # exception type : wx._core.PyAssertionError 224 # exception value: C++ assertion "i" failed at /BUILD/wxPython-src-2.8.3.0/src/common/wincmn.cpp(2634) in DoMoveInTabOrder(): MoveBefore/AfterInTabOrder(): win is not a sibling 225 # while Win/Linux work just fine 226 #self._PNL_edit_area._ChBOX_definite.MoveAfterInTabOrder(self._BTN_save) 227 self.__refresh_state_ui() 228 self.__refresh_details_ui()
229 #-------------------------------------------------------- 230 # internal helpers 231 #--------------------------------------------------------
232 - def __set_columns(self):
233 self._LCTRL_allergies.set_columns (columns = [ 234 _('Type'), 235 _('Certainty'), 236 _('Trigger'), 237 _('Reaction') 238 ])
239 #--------------------------------------------------------
240 - def __refresh_state_ui(self):
241 242 pat = gmPerson.gmCurrentPatient() 243 emr = pat.get_emr() 244 state = emr.allergy_state 245 246 self._TXT_current_state.SetLabel(state.state_string) 247 248 if state['last_confirmed'] is None: 249 self._TXT_last_confirmed.SetLabel(_('<allergy state unasked>')) 250 else: 251 self._TXT_last_confirmed.SetLabel(state['last_confirmed'].strftime('%x %H:%M')) 252 253 if state['has_allergy'] is None: 254 self._RBTN_unknown.SetValue(True) 255 self._RBTN_none.SetValue(False) 256 self._RBTN_some.SetValue(False) 257 258 self._RBTN_unknown.Enable(True) 259 self._RBTN_none.Enable(True) 260 261 elif state['has_allergy'] == 0: 262 self._RBTN_unknown.SetValue(False) 263 self._RBTN_none.SetValue(True) 264 self._RBTN_some.SetValue(False) 265 266 self._RBTN_unknown.Enable(True) 267 self._RBTN_none.Enable(True) 268 269 elif state['has_allergy'] == 1: 270 self._RBTN_unknown.SetValue(False) 271 self._RBTN_none.SetValue(False) 272 self._RBTN_some.SetValue(True) 273 274 self._RBTN_unknown.Enable(True) 275 self._RBTN_none.Enable(False) 276 277 else: 278 self._RBTN_unknown.SetValue(True) 279 self._RBTN_none.SetValue(False) 280 self._RBTN_some.SetValue(False) 281 282 self._RBTN_unknown.Enable(True) 283 self._RBTN_none.Enable(True) 284 285 gmDispatcher.send(signal=u'statustext', msg=_('invalid allergy state [%s]') % state, beep=True) 286 287 if state['comment'] is not None: 288 self._TCTRL_state_comment.SetValue(state['comment'])
289 #--------------------------------------------------------
290 - def __refresh_details_ui(self):
291 292 pat = gmPerson.gmCurrentPatient() 293 emr = pat.get_emr() 294 allergies = emr.get_allergies() 295 no_of_allergies = len(allergies) 296 297 # display allergies 298 self._LCTRL_allergies.DeleteAllItems() 299 if no_of_allergies > 0: 300 emr.allergy_state = 1 301 302 for allergy in allergies: 303 row_idx = self._LCTRL_allergies.InsertStringItem(no_of_allergies, label = allergy['l10n_type']) 304 if allergy['definite']: 305 label = _('definite') 306 else: 307 label = u'' 308 self._LCTRL_allergies.SetStringItem(index = row_idx, col = 1, label = label) 309 self._LCTRL_allergies.SetStringItem(index = row_idx, col = 2, label = allergy['descriptor']) 310 self._LCTRL_allergies.SetStringItem(index = row_idx, col = 3, label = gmTools.coalesce(allergy['reaction'], u'')) 311 self._LCTRL_allergies.set_data(data=allergies) 312 313 self._LCTRL_allergies.Enable(True) 314 self._RBTN_some.SetValue(True) 315 self._RBTN_unknown.Enable(False) 316 self._RBTN_none.Enable(False) 317 else: 318 self._LCTRL_allergies.Enable(False) 319 self._RBTN_unknown.Enable(True) 320 self._RBTN_none.Enable(True) 321 322 self._LCTRL_allergies.set_column_widths (widths = [ 323 wx.LIST_AUTOSIZE, 324 wx.LIST_AUTOSIZE, 325 wx.LIST_AUTOSIZE, 326 wx.LIST_AUTOSIZE 327 ]) 328 329 self._PNL_edit_area.clear() 330 self._BTN_delete.Enable(False)
331 #-------------------------------------------------------- 332 # event handlers 333 #--------------------------------------------------------
334 - def _on_dismiss_button_pressed(self, evt):
335 if self.IsModal(): 336 self.EndModal(wx.ID_OK) 337 else: 338 self.Close()
339 #--------------------------------------------------------
340 - def _on_clear_button_pressed(self, evt):
341 self._LCTRL_allergies.deselect_selected_item() 342 self._PNL_edit_area.clear() 343 self._BTN_delete.Enable(False) 344 self._LBL_message.SetLabel(_('Input new allergy item:'))
345 #--------------------------------------------------------
346 - def _on_delete_button_pressed(self, evt):
347 pat = gmPerson.gmCurrentPatient() 348 emr = pat.get_emr() 349 350 allergy = self._LCTRL_allergies.get_selected_item_data(only_one=True) 351 if allergy is None: 352 return 353 emr.delete_allergy(pk_allergy = allergy['pk_allergy']) 354 355 state = emr.allergy_state 356 state['last_confirmed'] = u'now' 357 state.save_payload() 358 359 self.__refresh_state_ui() 360 self.__refresh_details_ui()
361 #--------------------------------------------------------
362 - def _on_list_item_selected(self, evt):
363 allergy = self._LCTRL_allergies.get_selected_item_data(only_one=True) 364 if allergy is None: 365 return 366 self._PNL_edit_area.refresh(allergy = allergy) 367 self._BTN_delete.Enable(True) 368 self._LBL_message.SetLabel(_('Edit the selected allergy item:'))
369 #--------------------------------------------------------
370 - def _on_confirm_button_pressed(self, evt):
371 pat = gmPerson.gmCurrentPatient() 372 emr = pat.get_emr() 373 allergies = emr.get_allergies() 374 state = emr.allergy_state 375 376 cmt = self._TCTRL_state_comment.GetValue().strip() 377 378 if self._RBTN_unknown.GetValue(): 379 if len(allergies) > 0: 380 gmDispatcher.send(signal = u'statustext', msg = _('Cannot set allergy state to <unknown> because there are allergies stored for this patient.'), beep = True) 381 self._RBTN_some.SetValue(True) 382 state['has_allergy'] = 1 383 return False 384 else: 385 state['has_allergy'] = None 386 387 elif self._RBTN_none.GetValue(): 388 if len(allergies) > 0: 389 gmDispatcher.send(signal = u'statustext', msg = _('Cannot set allergy state to <None> because there are allergies stored for this patient.'), beep = True) 390 self._RBTN_some.SetValue(True) 391 state['has_allergy'] = 1 392 return False 393 else: 394 state['has_allergy'] = 0 395 396 elif self._RBTN_some.GetValue(): 397 if (len(allergies) == 0) and (cmt == u''): 398 gmDispatcher.send(signal = u'statustext', msg = _('Cannot set allergy state to <some> because there are neither allergies nor a comment available for this patient.'), beep = True) 399 return False 400 else: 401 state['has_allergy'] = 1 402 403 state['comment'] = cmt 404 state['last_confirmed'] = u'now' 405 406 state.save_payload() 407 self.__refresh_state_ui()
408 #--------------------------------------------------------
409 - def _on_save_details_button_pressed(self, evt):
410 411 if not self._PNL_edit_area.save(): 412 return False 413 414 pat = gmPerson.gmCurrentPatient() 415 emr = pat.get_emr() 416 state = emr.allergy_state 417 state['last_confirmed'] = u'now' 418 state.save_payload() 419 420 self.__refresh_state_ui() 421 self.__refresh_details_ui()
422 #======================================================================
423 -class cAllergyPanel(wx.Panel, gmRegetMixin.cRegetOnPaintMixin):
424 """Allergy details panel. 425 426 This panel will hold all the allergy details and 427 allow entry of those details via the editing area. 428 """ 429 #----------------------------------------------------
430 - def __init__(self, parent, id=-1):
431 wx.Panel.__init__(self, parent, id, wx.DefaultPosition, wx.DefaultSize, wx.RAISED_BORDER) 432 gmRegetMixin.cRegetOnPaintMixin.__init__(self) 433 self.__do_layout() 434 self.__pat = gmPerson.gmCurrentPatient() 435 self.__register_interests() 436 self.__reset_ui_content()
437 #----------------------------------------------------
438 - def __do_layout(self):
439 # -- top part -- 440 pnl_UpperCaption = gmTerryGuiParts.cHeadingCaption(self, -1, _("ALLERGIES")) 441 self.editarea = gmAllergyEditArea(self, -1) 442 443 # -- middle part -- 444 # divider headings below edit area 445 pnl_MiddleCaption = gmTerryGuiParts.cDividerCaption(self, -1, _("Allergy and Sensitivity - Summary")) 446 # self.sizer_divider_drug_generic = wx.BoxSizer(wxHORIZONTAL) 447 # self.sizer_divider_drug_generic.Add(pnl_MiddleCaption, 1, wxEXPAND) 448 self.LCTRL_allergies = wx.ListCtrl ( 449 parent = self, 450 id = ID_ALLERGY_LIST, 451 pos = wx.DefaultPosition, 452 size = wx.DefaultSize, 453 style = wx.LC_SINGLE_SEL | wx.LC_REPORT | wx.SUNKEN_BORDER | wx.LC_HRULES | wx.LC_VRULES | wx.VSCROLL 454 ) 455 self.LCTRL_allergies.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.NORMAL, False, '')) 456 self.LCTRL_allergies.InsertColumn(0, _("Type")) 457 self.LCTRL_allergies.InsertColumn(1, _("Status")) 458 self.LCTRL_allergies.InsertColumn(2, _("ATC/Class")) 459 self.LCTRL_allergies.InsertColumn(3, _("Substance")) 460 self.LCTRL_allergies.InsertColumn(4, _("Generics")) 461 self.LCTRL_allergies.InsertColumn(5, _("Reaction")) 462 463 # -- bottom part -- 464 pnl_LowerCaption = gmTerryGuiParts.cDividerCaption(self, -1, _('Class notes')) 465 #add a richtext control or a wxTextCtrl multiline to display the class text information 466 #e.g. would contain say information re the penicillins 467 self.class_notes = wx.TextCtrl ( 468 self, 469 -1, 470 "A member of a new class of nonsteroidal anti-inflammatory agents (COX-2 selective NSAIDs) which have a mechanism of action that inhibits prostaglandin synthesis primarily by inhibition of cyclooxygenase 2 (COX-2). At therapeutic doses these have no effect on prostanoids synthesised by activation of COX-1 thereby not interfering with normal COX-1 related physiological processes in tissues, particularly the stomach, intestine and platelets.", 471 size = (200, 100), 472 style = wx.TE_MULTILINE | wx.TE_READONLY 473 ) 474 self.class_notes.SetFont(wx.Font(12, wx.SWISS, wx.NORMAL, wx.NORMAL, False, '')) 475 476 # -- add elements to main background sizer -- 477 self.mainsizer = wx.BoxSizer(wx.VERTICAL) 478 self.mainsizer.Add(pnl_UpperCaption, 0, wx.EXPAND) 479 self.mainsizer.Add(self.editarea, 6, wx.EXPAND) 480 # self.mainsizer.Add(self.sizer_divider_drug_generic,0,wxEXPAND) 481 self.mainsizer.Add(pnl_MiddleCaption, 0, wx.EXPAND) 482 self.mainsizer.Add(self.LCTRL_allergies, 5, wx.EXPAND) 483 self.mainsizer.Add(pnl_LowerCaption, 0, wx.EXPAND) 484 self.mainsizer.Add(self.class_notes, 4, wx.EXPAND) 485 486 self.SetAutoLayout(True) 487 self.SetSizer(self.mainsizer) 488 self.mainsizer.Fit(self)
489 #-----------------------------------------------
490 - def __register_interests(self):
491 wx.EVT_LIST_ITEM_ACTIVATED(self, ID_ALLERGY_LIST, self._on_allergy_activated) 492 493 # client internal signals 494 gmDispatcher.connect(signal = u'post_patient_selection', receiver=self._schedule_data_reget)
495 # gmDispatcher.connect(signal = u'vaccinations_updated', receiver=self._schedule_data_reget) 496 #-----------------------------------------------
497 - def __reset_ui_content(self):
498 self.editarea.set_data() 499 self.LCTRL_allergies.DeleteAllItems()
500 #-----------------------------------------------
501 - def _populate_with_data(self):
502 if not self.__pat.connected: 503 return False 504 505 self.LCTRL_allergies.DeleteAllItems() 506 507 emr = self.__pat.get_emr() 508 allergies = emr.get_allergies() 509 if allergies is None: 510 return False 511 for list_line in range(len(allergies)): 512 allg = allergies[list_line] 513 list_line = self.LCTRL_allergies.InsertStringItem(list_line, allg['l10n_type']) 514 # FIXME: check with Richard design specs 515 if allg['definite']: 516 self.LCTRL_allergies.SetStringItem(list_line, 1, _('definite')) 517 else: 518 self.LCTRL_allergies.SetStringItem(list_line, 1, _('likely')) 519 if allg['atc_code'] is not None: 520 self.LCTRL_allergies.SetStringItem(list_line, 2, allg['atc_code']) 521 self.LCTRL_allergies.SetStringItem(list_line, 3, allg['substance']) 522 if allg['generics'] is not None: 523 self.LCTRL_allergies.SetStringItem(list_line, 4, allg['generics']) 524 self.LCTRL_allergies.SetStringItem(list_line, 5, allg['reaction']) 525 self.LCTRL_allergies.SetItemData(list_line, allg['pk_allergy']) 526 for col in range(5): 527 self.LCTRL_allergies.SetColumnWidth(col, wx.LIST_AUTOSIZE) 528 # FIXME: resize event needed ? 529 return True
530 #-----------------------------------------------
531 - def _on_allergy_activated(self, evt):
532 pk_allg = evt.GetData() 533 emr = self.__pat.get_emr() 534 allgs = emr.get_allergies(ID_list=[pk_allg]) 535 self.editarea.set_data(allergy = allgs[0])
536 #====================================================================== 537 # main 538 #---------------------------------------------------------------------- 539 if __name__ == "__main__": 540 541 gmI18N.activate_locale() 542 gmI18N.install_domain(domain='gnumed') 543 544 #-----------------------------------------------
545 - def test_allergy_edit_area_dlg():
546 app = wx.PyWidgetTester(size = (600, 600)) 547 dlg = cAllergyEditAreaDlg(parent=app.frame, id=-1) 548 dlg.ShowModal() 549 # emr = pat.get_emr() 550 # allergy = emr.get_allergies()[0] 551 # dlg = cAllergyEditAreaDlg(parent=app.frame, id=-1, allergy=allergy) 552 # dlg.ShowModal() 553 return
554 #-----------------------------------------------
555 - def test_allergy_manager_dlg():
556 app = wx.PyWidgetTester(size = (800, 600)) 557 dlg = cAllergyManagerDlg(parent=app.frame, id=-1) 558 dlg.ShowModal() 559 return
560 #----------------------------------------------- 561 if len(sys.argv) > 1 and sys.argv[1] == 'test': 562 563 pat = gmPersonSearch.ask_for_patient() 564 if pat is None: 565 sys.exit(0) 566 gmPatSearchWidgets.set_active_patient(pat) 567 568 #test_allergy_edit_area_dlg() 569 test_allergy_manager_dlg() 570 571 # app = wxPyWidgetTester(size = (600, 600)) 572 # app.SetWidget(cAllergyPanel, -1) 573 # app.MainLoop() 574 #====================================================================== 575