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