1 """GNUmed waiting list widgets."""
2
3 __author__ = 'karsten.hilbert@gmx.net'
4 __license__ = 'GPL v2 or later (details at http://www.gnu.org)'
5
6
7 import logging
8 import sys
9
10
11
12 import wx
13
14
15
16 if __name__ == '__main__':
17 sys.path.insert(0, '../../')
18
19 from Gnumed.pycommon import gmDispatcher
20 from Gnumed.pycommon import gmTools
21 from Gnumed.pycommon import gmMatchProvider
22 from Gnumed.pycommon import gmI18N
23 from Gnumed.pycommon import gmExceptions
24
25 from Gnumed.business import gmSurgery
26 from Gnumed.business import gmPerson
27
28 from Gnumed.wxpython import gmEditArea
29 from Gnumed.wxpython import gmPhraseWheel
30 from Gnumed.wxpython import gmRegetMixin
31 from Gnumed.wxpython import gmPatSearchWidgets
32 from Gnumed.wxpython import gmGuiHelpers
33
34
35 _log = logging.getLogger('gm.ui')
36
37
38
40
49
50
52 self.matcher.set_items([ {'data': i, 'list_label': i, 'field_label': i, 'weight': 1} for i in items ])
53
54
55 from Gnumed.wxGladeWidgets import wxgWaitingListEntryEditAreaPnl
56
57 -class cWaitingListEntryEditAreaPnl(wxgWaitingListEntryEditAreaPnl.wxgWaitingListEntryEditAreaPnl, gmEditArea.cGenericEditAreaMixin):
58
59 - def __init__ (self, *args, **kwargs):
60
61 try:
62 self.patient = kwargs['patient']
63 del kwargs['patient']
64 except KeyError:
65 self.patient = None
66
67 try:
68 data = kwargs['entry']
69 del kwargs['entry']
70 except KeyError:
71 data = None
72
73 wxgWaitingListEntryEditAreaPnl.wxgWaitingListEntryEditAreaPnl.__init__(self, *args, **kwargs)
74 gmEditArea.cGenericEditAreaMixin.__init__(self)
75
76 if data is None:
77 self.mode = 'new'
78 else:
79 self.data = data
80 self.mode = 'edit'
81
82 praxis = gmSurgery.gmCurrentPractice()
83 pats = praxis.waiting_list_patients
84 zones = {}
85 zones.update([ [p['waiting_zone'], None] for p in pats if p['waiting_zone'] is not None ])
86 self._PRW_zone.update_matcher(items = zones.keys())
87
88
89
91 if self.patient is None:
92 self._PRW_patient.person = None
93 self._PRW_patient.Enable(True)
94 self._PRW_patient.SetFocus()
95 else:
96 self._PRW_patient.person = self.patient
97 self._PRW_patient.Enable(False)
98 self._TCTRL_comment.SetFocus()
99 self._PRW_patient._display_name()
100
101 self._TCTRL_comment.SetValue(u'')
102 self._PRW_zone.SetValue(u'')
103 self._SPCTRL_urgency.SetValue(0)
104
106 self._PRW_patient.person = gmPerson.cIdentity(aPK_obj = self.data['pk_identity'])
107 self._PRW_patient.Enable(False)
108 self._PRW_patient._display_name()
109
110 self._TCTRL_comment.SetValue(gmTools.coalesce(self.data['comment'], u''))
111 self._PRW_zone.SetValue(gmTools.coalesce(self.data['waiting_zone'], u''))
112 self._SPCTRL_urgency.SetValue(self.data['urgency'])
113
114 self._TCTRL_comment.SetFocus()
115
116 - def _valid_for_save(self):
117 validity = True
118
119 self.display_tctrl_as_valid(tctrl = self._PRW_patient, valid = (self._PRW_patient.person is not None))
120 validity = (self._PRW_patient.person is not None)
121
122 if validity is False:
123 gmDispatcher.send(signal = 'statustext', msg = _('Cannot add to waiting list. Missing essential input.'))
124
125 return validity
126
127 - def _save_as_new(self):
128
129 self._PRW_patient.person.put_on_waiting_list (
130 urgency = self._SPCTRL_urgency.GetValue(),
131 comment = gmTools.none_if(self._TCTRL_comment.GetValue().strip(), u''),
132 zone = gmTools.none_if(self._PRW_zone.GetValue().strip(), u'')
133 )
134
135 self.data = {'pk_identity': self._PRW_patient.person.ID, 'comment': None, 'waiting_zone': None, 'urgency': 0}
136 return True
137
138 - def _save_as_update(self):
139 gmSurgery.gmCurrentPractice().update_in_waiting_list (
140 pk = self.data['pk_waiting_list'],
141 urgency = self._SPCTRL_urgency.GetValue(),
142 comment = self._TCTRL_comment.GetValue().strip(),
143 zone = self._PRW_zone.GetValue().strip()
144 )
145 return True
146
147 from Gnumed.wxGladeWidgets import wxgWaitingListPnl
148
149 -class cWaitingListPnl(wxgWaitingListPnl.wxgWaitingListPnl, gmRegetMixin.cRegetOnPaintMixin):
150
162
163
164
166 self._LCTRL_patients.set_columns ([
167 _('Zone'),
168 _('Urgency'),
169
170 _('Waiting time'),
171 _('Patient'),
172 _('Born'),
173 _('Comment')
174 ])
175 self._LCTRL_patients.set_column_widths(widths = [wx.LIST_AUTOSIZE, wx.LIST_AUTOSIZE_USEHEADER, wx.LIST_AUTOSIZE, wx.LIST_AUTOSIZE, wx.LIST_AUTOSIZE])
176 self._LCTRL_patients.item_tooltip_callback = self._on_get_list_tooltip
177 self._PRW_zone.add_callback_on_selection(callback = self._on_zone_selected)
178 self._PRW_zone.add_callback_on_lose_focus(callback = self._on_zone_selected)
179
181 """
182 This gets called when a patient has been activated, but
183 only when the waiting list is actually in use (that is,
184 the plugin is loaded)
185 """
186 pat = gmPerson.gmCurrentPatient()
187 enc = pat.emr.active_encounter
188 if gmTools.coalesce(enc['reason_for_encounter'], u'').strip() != u'':
189 return
190 entries = pat.waiting_list_entries
191 if len(entries) == 0:
192 if self.__id_most_recently_activated_patient is None:
193 return
194 if self.__id_most_recently_activated_patient != pat.ID:
195 return
196 rfe = self.__comment_most_recently_activated_patient
197 else:
198 entry = entries[0]
199 if gmTools.coalesce(entry['comment'], u'').strip() == u'':
200 return
201 rfe = entry['comment'].strip()
202 enc['reason_for_encounter'] = rfe
203 enc.save()
204 self.__id_most_recently_activated_patient = None
205
244
246 gmDispatcher.connect(signal = u'waiting_list_generic_mod_db', receiver = self._on_waiting_list_modified)
247 gmDispatcher.connect(signal = u'post_patient_selection', receiver = self._on_post_patient_selection)
248
250 self.__id_most_recently_activated_patient = None
251
252 praxis = gmSurgery.gmCurrentPractice()
253 pats = praxis.waiting_list_patients
254
255
256 zones = {}
257 zones.update([ [p['waiting_zone'], None] for p in pats if p['waiting_zone'] is not None ])
258 self._PRW_zone.update_matcher(items = zones.keys())
259
260
261 self.__current_zone = self._PRW_zone.GetValue().strip()
262 if self.__current_zone == u'':
263 pats = [ p for p in pats ]
264 else:
265 pats = [ p for p in pats if p['waiting_zone'] == self.__current_zone ]
266
267
268 curr_pat = gmPerson.gmCurrentPatient()
269 if curr_pat.connected:
270 if self._CHBOX_active_patient_only.IsChecked():
271 pats = [ p for p in pats if p['pk_identity'] == curr_pat.ID ]
272
273 old_pks = [ d['pk_waiting_list'] for d in self._LCTRL_patients.get_selected_item_data() ]
274 self._LCTRL_patients.set_string_items (
275 [ [
276 gmTools.coalesce(p['waiting_zone'], u''),
277 p['urgency'],
278 p['waiting_time_formatted'].replace(u'00 ', u'', 1).replace('00:', u'').lstrip('0'),
279 u'%s, %s (%s)' % (p['lastnames'], p['firstnames'], p['l10n_gender']),
280 gmTools.coalesce (
281 gmTools.coalesce (
282 p['dob'],
283 u'',
284 function_initial = ('strftime', '%d %b %Y')
285 ),
286 u'',
287 function_initial = ('decode', gmI18N.get_encoding())
288 ),
289 gmTools.coalesce(p['comment'], u'').split('\n')[0]
290 ] for p in pats ]
291 )
292 self._LCTRL_patients.set_column_widths()
293 self._LCTRL_patients.set_data(pats)
294 new_selections = []
295 new_pks = [ p['pk_waiting_list'] for p in pats ]
296 for old_pk in old_pks:
297 if old_pk in new_pks:
298 new_selections.append(new_pks.index(old_pk))
299 self._LCTRL_patients.selections = new_selections
300 self._LCTRL_patients.Refresh()
301
302 self._LBL_no_of_patients.SetLabel(_('(%s patients)') % len(pats))
303
304 if len(pats) == 0:
305 self._BTN_activate.Enable(False)
306 self._BTN_activateplus.Enable(False)
307 self._BTN_remove.Enable(False)
308 self._BTN_edit.Enable(False)
309 self._BTN_up.Enable(False)
310 self._BTN_down.Enable(False)
311 else:
312 self._BTN_activate.Enable(True)
313 self._BTN_activateplus.Enable(True)
314 self._BTN_remove.Enable(True)
315 self._BTN_edit.Enable(True)
316 if len(pats) > 1:
317 self._BTN_up.Enable(True)
318 self._BTN_down.Enable(True)
319
320
321
323 self.__id_most_recently_activated_patient = None
324 if self.__current_zone == self._PRW_zone.GetValue().strip():
325 return True
326 wx.CallAfter(self.__refresh_waiting_list)
327 return True
328
330 self.__id_most_recently_activated_patient = None
331 wx.CallAfter(self._schedule_data_reget)
332
333 - def _on_post_patient_selection(self, *args, **kwargs):
334 wx.CallAfter(self.__on_post_patient_selection)
335
337 self._CHBOX_active_patient_only.Enable()
338 self._check_RFE()
339 self._schedule_data_reget()
340
355
370
387
398
408
447
454
461
463 self.__refresh_waiting_list()
464
465
466
467
468
470 self.__refresh_waiting_list()
471 return True
472
473
474
475 if __name__ == '__main__':
476
477 if len(sys.argv) < 2:
478 sys.exit()
479
480 if sys.argv[1] != 'test':
481 sys.exit()
482
483 gmI18N.activate_locale()
484 gmI18N.install_domain()
485
486
487
488
489
490
491
492
493
494
495
496
497 app = wx.PyWidgetTester(size = (200, 40))
498 app.SetWidget(cWaitingListPnl, -1)
499 app.MainLoop()
500
501
502