| Home | Trees | Indices | Help |
|
|---|
|
|
1 """GNUmed patient overview widgets.
2
3 copyright: authors
4 """
5 #============================================================
6 __author__ = "K.Hilbert"
7 __license__ = "GPL v2 or later (details at http://www.gnu.org)"
8
9 import logging, sys
10
11
12 import wx
13
14
15 if __name__ == '__main__':
16 sys.path.insert(0, '../../')
17 from Gnumed.pycommon import gmTools
18 from Gnumed.pycommon import gmDispatcher
19 from Gnumed.pycommon import gmDateTime
20 from Gnumed.pycommon import gmNetworkTools
21
22 from Gnumed.business import gmPerson
23 from Gnumed.business import gmStaff
24 from Gnumed.business import gmDemographicRecord
25 from Gnumed.business import gmEMRStructItems
26 from Gnumed.business import gmFamilyHistory
27 from Gnumed.business import gmVaccination
28 from Gnumed.business import gmDocuments
29 from Gnumed.business import gmProviderInbox
30
31 from Gnumed.wxpython import gmRegetMixin
32 from Gnumed.wxpython import gmDemographicsWidgets
33 from Gnumed.wxpython import gmContactWidgets
34 from Gnumed.wxpython import gmMedicationWidgets
35 from Gnumed.wxpython import gmEditArea
36 from Gnumed.wxpython import gmEMRStructWidgets
37 from Gnumed.wxpython import gmFamilyHistoryWidgets
38 from Gnumed.wxpython import gmVaccWidgets
39 from Gnumed.wxpython import gmDocumentWidgets
40 from Gnumed.wxpython import gmGuiHelpers
41
42
43 _log = logging.getLogger('gm.patient')
44 #============================================================
45 from Gnumed.wxGladeWidgets import wxgPatientOverviewPnl
46
47 -class cPatientOverviewPnl(wxgPatientOverviewPnl.wxgPatientOverviewPnl, gmRegetMixin.cRegetOnPaintMixin):
48
50 wxgPatientOverviewPnl.wxgPatientOverviewPnl.__init__(self, *args, **kwargs)
51 gmRegetMixin.cRegetOnPaintMixin.__init__(self)
52
53 self.__init_ui()
54 self.__register_interests()
55 #--------------------------------------------------------
56 # internal API
57 #--------------------------------------------------------
59 # left
60 self._LCTRL_identity.set_columns(columns = [u''])
61 self._LCTRL_identity.item_tooltip_callback = self._calc_identity_item_tooltip
62 self._LCTRL_identity.activate_callback = self._on_identity_item_activated
63
64 self._LCTRL_contacts.set_columns(columns = [u''])
65 self._LCTRL_contacts.item_tooltip_callback = self._calc_contacts_list_item_tooltip
66 self._LCTRL_contacts.activate_callback = self._on_contacts_item_activated
67
68 self._LCTRL_encounters.set_columns(columns = [u''])
69 self._LCTRL_encounters.item_tooltip_callback = self._calc_encounters_list_item_tooltip
70 self._LCTRL_encounters.activate_callback = self._on_encounter_activated
71
72 # middle
73 self._LCTRL_problems.set_columns(columns = [u''])
74 self._LCTRL_problems.item_tooltip_callback = self._calc_problem_list_item_tooltip
75 self._LCTRL_problems.activate_callback = self._on_problem_activated
76
77 self._LCTRL_meds.set_columns(columns = [u''])
78 self._LCTRL_meds.item_tooltip_callback = self._calc_meds_list_item_tooltip
79 self._LCTRL_meds.activate_callback = self._on_meds_item_activated
80
81 self._LCTRL_history.set_columns(columns = [u''])
82 self._LCTRL_history.item_tooltip_callback = self._calc_history_list_item_tooltip
83 self._LCTRL_history.activate_callback = self._on_history_item_activated
84
85 # right hand side
86 self._LCTRL_inbox.set_columns(columns = [u''])
87 self._LCTRL_inbox.item_tooltip_callback = self._calc_inbox_item_tooltip
88 self._LCTRL_inbox.activate_callback = self._on_inbox_item_activated
89
90 self._LCTRL_results.set_columns(columns = [u''])
91 self._LCTRL_results.item_tooltip_callback = self._calc_results_list_item_tooltip
92 self._LCTRL_results.activate_callback = self._on_result_activated
93
94 self._LCTRL_documents.set_columns(columns = [u''])
95 self._LCTRL_documents.item_tooltip_callback = self._calc_documents_list_item_tooltip
96 self._LCTRL_documents.activate_callback = self._on_document_activated
97 #--------------------------------------------------------
99 self._LCTRL_identity.set_string_items()
100 self._LCTRL_contacts.set_string_items()
101 self._LCTRL_encounters.set_string_items()
102 self._PRW_encounter_range.SetText(value = u'', data = None)
103
104 self._LCTRL_problems.set_string_items()
105 self._LCTRL_meds.set_string_items()
106 self._LCTRL_history.set_string_items()
107
108 self._LCTRL_inbox.set_string_items()
109 self._LCTRL_results.set_string_items()
110 self._LCTRL_documents.set_string_items()
111 #-----------------------------------------------------
112 # event handling
113 #-----------------------------------------------------
114 # remember to call
115 # self._schedule_data_reget()
116 # whenever you learn of data changes from database listener
117 # threads, dispatcher signals etc.
119 # client internal signals
120 gmDispatcher.connect(signal = u'pre_patient_selection', receiver = self._on_pre_patient_selection)
121 gmDispatcher.connect(signal = u'post_patient_selection', receiver = self._on_post_patient_selection)
122
123 # database change signals
124 gmDispatcher.connect(signal = u'identity_mod_db', receiver = self._on_post_patient_selection)
125 gmDispatcher.connect(signal = u'name_mod_db', receiver = self._on_post_patient_selection)
126 gmDispatcher.connect(signal = u'comm_channel_mod_db', receiver = self._on_post_patient_selection)
127 gmDispatcher.connect(signal = u'job_mod_db', receiver = self._on_post_patient_selection)
128 # no signal for external IDs yet
129 # no signal for address yet
130 #gmDispatcher.connect(signal = u'current_encounter_modified', receiver = self._on_current_encounter_modified)
131 #gmDispatcher.connect(signal = u'current_encounter_switched', receiver = self._on_current_encounter_switched)
132
133 gmDispatcher.connect(signal = u'episode_mod_db', receiver = self._on_episode_issue_mod_db)
134 gmDispatcher.connect(signal = u'health_issue_mod_db', receiver = self._on_episode_issue_mod_db)
135
136 gmDispatcher.connect(signal = u'substance_intake_mod_db', receiver = self._on_post_patient_selection)
137
138 gmDispatcher.connect(signal = u'hospital_stay_mod_db', receiver = self._on_post_patient_selection)
139 gmDispatcher.connect(signal = u'family_history_mod_db', receiver = self._on_post_patient_selection)
140 gmDispatcher.connect(signal = u'procedure_mod_db', receiver = self._on_post_patient_selection)
141 gmDispatcher.connect(signal = u'vacc_mod_db', receiver = self._on_post_patient_selection)
142
143 gmDispatcher.connect(signal = u'message_inbox_mod_db', receiver = self._on_post_patient_selection)
144 gmDispatcher.connect(signal = u'test_result_mod_db', receiver = self._on_post_patient_selection)
145 gmDispatcher.connect(signal = u'reviewed_test_results_mod_db', receiver = self._on_post_patient_selection)
146 gmDispatcher.connect(signal = u'doc_mod_db', receiver = self._on_post_patient_selection)
147
148 # synchronous signals
149 # self.__pat.register_pre_selection_callback(callback = self._pre_selection_callback)
150 # gmDispatcher.send(signal = u'register_pre_exit_callback', callback = self._pre_exit_callback)
151
152 self._PRW_encounter_range.add_callback_on_selection(callback = self._on_encounter_range_selected)
153 #--------------------------------------------------------
156 #--------------------------------------------------------
158 # only empty out here, do NOT access the patient
159 # or else we will access the old patient while it
160 # may not be valid anymore ...
161 wx.CallAfter(self.__reset_ui_content)
162 #--------------------------------------------------------
165 #--------------------------------------------------------
168 #-----------------------------------------------------
169 # reget-on-paint mixin API
170 #-----------------------------------------------------
172 pat = gmPerson.gmCurrentPatient()
173 if not pat.connected:
174 self.__reset_ui_content()
175 return True
176
177 self.__refresh_identity(patient = pat)
178 self.__refresh_contacts(patient = pat)
179 self.__refresh_encounters(patient = pat)
180
181 self.__refresh_problems(patient = pat)
182 self.__refresh_meds(patient = pat)
183 self.__refresh_history(patient = pat)
184
185 self.__refresh_inbox(patient = pat)
186 self.__refresh_results(patient = pat)
187 self.__refresh_documents(patient = pat)
188
189 return True
190 #-----------------------------------------------------
191 # internal helpers
192 #-----------------------------------------------------
194 list_items = []
195 list_data = []
196
197 emr = patient.get_emr()
198 most_recent = emr.get_most_recent_results(no_of_results = 1)
199 if most_recent is None:
200 self._LCTRL_results.set_string_items(items = [])
201 self._LCTRL_results.set_data(data = [])
202 return
203
204 list_items.append(_('Latest: %s ago (%s %s %s %s%s)') % (
205 gmDateTime.format_interval_medically(gmDateTime.pydt_now_here() - most_recent['clin_when']),
206 most_recent['unified_abbrev'],
207 most_recent['unified_val'],
208 most_recent['val_unit'],
209 gmTools.coalesce(most_recent['abnormality_indicator'], u'', u' %s'),
210 gmTools.bool2subst(most_recent['reviewed'], u'', u' %s' % gmTools.u_writing_hand)
211 ))
212 list_data.append(most_recent)
213 most_recent_needs_red = False
214 if most_recent['is_technically_abnormal'] is True:
215 if most_recent['is_clinically_relevant']:
216 most_recent_needs_red = True
217 else:
218 if most_recent['abnormality_indicator'] not in [None, u'']:
219 most_recent_needs_red = True
220
221 unsigned = emr.get_unsigned_results(order_by = u"(trim(coalesce(abnormality_indicator), '') <> '') DESC NULLS LAST, unified_abbrev")
222 no_of_reds = 0
223 for result in unsigned:
224 if result['pk_test_result'] == most_recent['pk_test_result']:
225 continue
226 if result['abnormality_indicator'] is not None:
227 if result['abnormality_indicator'].strip() != u'':
228 no_of_reds += 1
229 list_items.append(_('%s %s %s %s (%s ago, %s)') % (
230 result['unified_abbrev'],
231 result['unified_val'],
232 result['val_unit'],
233 gmTools.coalesce(result['abnormality_indicator'], u'', u' %s'),
234 gmDateTime.format_interval_medically(gmDateTime.pydt_now_here() - result['clin_when']),
235 gmTools.u_writing_hand
236 ))
237 list_data.append(result)
238
239 self._LCTRL_results.set_string_items(items = list_items)
240 self._LCTRL_results.set_data(data = list_data)
241
242 if most_recent_needs_red:
243 self._LCTRL_results.SetItemTextColour(0, wx.NamedColour('RED'))
244 if no_of_reds > 0:
245 for idx in range(1, no_of_reds + 1):
246 self._LCTRL_results.SetItemTextColour(idx, wx.NamedColour('RED'))
247 #-----------------------------------------------------
250 #-----------------------------------------------------
252 # data = self._LCTRL_inbox.get_selected_item_data(only_one = True)
253 #
254 # if data is not None:
255 # # <ctrl> down ?
256 # if wx.GetKeyState(wx.WXK_CONTROL):
257 # if isinstance(data, gmProviderInbox.cInboxMessage):
258 # xxxxxxxxx
259 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmMeasurementsGridPlugin')
260 return
261 #-----------------------------------------------------
262 #-----------------------------------------------------
264 list_items = []
265 list_data = []
266
267 due_messages = patient.due_messages
268 no_of_dues = len(due_messages)
269 for msg in due_messages:
270 list_items.append(_('due %s: %s') % (
271 gmDateTime.format_interval_medically(msg['interval_due']),
272 gmTools.coalesce(msg['comment'], u'?')
273 ))
274 list_data.append(msg)
275
276 for msg in patient.messages:
277 # already displayed above ?
278 if msg['is_due']:
279 continue
280 # not relevant anymore ?
281 if msg['is_expired']:
282 continue
283 list_items.append(u'%s%s' % (
284 msg['l10n_type'],
285 gmTools.coalesce(msg['comment'], u'', u': %s')
286 ))
287 list_data.append(msg)
288
289 for hint in patient.dynamic_hints:
290 list_items.append(hint['title'])
291 list_data.append(hint)
292
293 self._LCTRL_inbox.set_string_items(items = list_items)
294 self._LCTRL_inbox.set_data(data = list_data)
295
296 if no_of_dues > 0:
297 for idx in range(no_of_dues):
298 self._LCTRL_inbox.SetItemTextColour(idx, wx.NamedColour('RED'))
299 #-----------------------------------------------------
301 if isinstance(data, gmProviderInbox.cInboxMessage):
302 return data.format()
303
304 if isinstance(data, gmProviderInbox.cDynamicHint):
305 return u'%s\n\n%s\n\n%s %s' % (
306 data['title'],
307 gmTools.wrap(data['hint'], width = 50),
308 gmTools.wrap(gmTools.coalesce(data['url'], u'', u'%s\n\n'), width = 50),
309 data['source']
310 )
311
312 return None
313 #-----------------------------------------------------
315
316 data = self._LCTRL_inbox.get_selected_item_data(only_one = True)
317
318 if isinstance(data, gmProviderInbox.cDynamicHint):
319 if data['url'] is not None:
320 gmNetworkTools.open_url_in_browser(data['url'])
321 return
322
323 # <ctrl> down ?
324 if not wx.GetKeyState(wx.WXK_CONTROL):
325 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmProviderInboxPlugin')
326 return
327
328 if data is None:
329 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmProviderInboxPlugin')
330 return
331
332 if not isinstance(data, gmProviderInbox.cInboxMessage):
333 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmProviderInboxPlugin')
334 return
335
336 delete_it = gmGuiHelpers.gm_show_question (
337 question = _('Do you really want to\ndelete this inbox message ?'),
338 title = _('Deleting inbox message')
339 )
340 if not delete_it:
341 return
342
343 gmProviderInbox.delete_inbox_message(inbox_message = data['pk_inbox_message'])
344 return
345 #-----------------------------------------------------
346 #-----------------------------------------------------
348 doc_folder = patient.get_document_folder()
349
350 list_items = []
351 list_data = []
352
353 docs = doc_folder.get_unsigned_documents()
354 no_of_unsigned = len(docs)
355 for doc in docs:
356 list_items.append(u'%s %s (%s)' % (
357 gmDateTime.pydt_strftime(doc['clin_when'], format = '%m/%Y', accuracy = gmDateTime.acc_months),
358 doc['l10n_type'],
359 gmTools.u_writing_hand
360 ))
361 list_data.append(doc)
362
363 docs = doc_folder.get_documents(order_by = u'ORDER BY clin_when DESC', exclude_unsigned = True)
364 for doc in docs[:5]:
365 list_items.append(u'%s %s' % (
366 gmDateTime.pydt_strftime(doc['clin_when'], format = '%m/%Y', accuracy = gmDateTime.acc_months),
367 doc['l10n_type']
368 ))
369 list_data.append(doc)
370 if len(docs) > 5:
371 list_items.append(_('%s %s more not shown %s') % (
372 gmTools.u_ellipsis,
373 len(docs) - 5,
374 gmTools.u_ellipsis
375 ))
376 list_data.append(u'')
377
378 self._LCTRL_documents.set_string_items(items = list_items)
379 self._LCTRL_documents.set_data(data = list_data)
380
381 if no_of_unsigned > 0:
382 for idx in range(no_of_unsigned):
383 self._LCTRL_documents.SetItemTextColour(idx, wx.NamedColour('RED'))
384 #-----------------------------------------------------
386 emr = gmPerson.gmCurrentPatient().get_emr()
387
388 if isinstance(data, gmDocuments.cDocument):
389 return data.format()
390
391 return None
392 #-----------------------------------------------------
394 data = self._LCTRL_documents.get_selected_item_data(only_one = True)
395
396 if data is not None:
397 # <ctrl> down ?
398 if wx.GetKeyState(wx.WXK_CONTROL):
399 if isinstance(data, gmDocuments.cDocument):
400 if len(data.parts) > 0:
401 gmDocumentWidgets.display_document_part(parent = self, part = data.parts[0])
402 else:
403 gmDocumentWidgets.review_document(parent = self, document = data)
404 return
405
406 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmShowMedDocs')
407 return
408 #-----------------------------------------------------
409 #-----------------------------------------------------
411
412 cover_period = self._PRW_encounter_range.GetData()
413 if cover_period is None:
414 if self._PRW_encounter_range.GetValue().strip() != u'':
415 return
416
417 emr = patient.get_emr()
418
419 list_items = []
420 list_data = []
421
422 is_waiting = False
423 wlist = patient.get_waiting_list_entry()
424 if len(wlist) > 0:
425 is_waiting = True
426 w = wlist[0]
427 list_items.append(_('Currently in waiting list [%s]') % w['waiting_zone'])
428 list_data.append({'wlist': gmTools.coalesce(w['comment'], None)})
429
430 first = emr.get_first_encounter()
431 if first is not None:
432 list_items.append (
433 _('first: %s, %s') % (
434 gmDateTime.pydt_strftime (
435 first['started'],
436 format = '%Y %b %d',
437 accuracy = gmDateTime.acc_days
438 ),
439 first['l10n_type']
440 )
441 )
442 list_data.append(first)
443
444 last = emr.get_last_but_one_encounter()
445 if last is not None:
446 list_items.append (
447 _('last: %s, %s') % (
448 gmDateTime.pydt_strftime (
449 last['started'],
450 format = '%Y %b %d',
451 accuracy = gmDateTime.acc_days
452 ),
453 last['l10n_type']
454 )
455 )
456 list_data.append(last)
457
458 if cover_period is not None:
459 item = _('Last %s:') % self._PRW_encounter_range.GetValue().strip()
460 list_items.append(item)
461 list_data.append(_('Statistics cover period'))
462
463 encs = emr.get_encounter_stats_by_type(cover_period = cover_period)
464 for enc in encs:
465 item = u' %s x %s' % (enc['frequency'], enc['l10n_type'])
466 list_items.append(item)
467 list_data.append(item)
468
469 stays = emr.get_hospital_stay_stats_by_hospital(cover_period = cover_period)
470 for stay in stays:
471 item = u' %s x %s' % (
472 stay['frequency'],
473 stay['hospital']
474 )
475 list_items.append(item)
476 list_data.append({'stay': item})
477
478 self._LCTRL_encounters.set_string_items(items = list_items)
479 self._LCTRL_encounters.set_data(data = list_data)
480 if is_waiting:
481 self._LCTRL_encounters.SetItemTextColour(0, wx.NamedColour('RED'))
482 #-----------------------------------------------------
484 emr = gmPerson.gmCurrentPatient().get_emr()
485
486 if isinstance(data, gmEMRStructItems.cEncounter):
487 return data.format (
488 with_vaccinations = False,
489 with_tests = False,
490 with_docs = False,
491 with_co_encountlet_hints = True,
492 with_rfe_aoe = True
493 )
494
495 if type(data) == type({}):
496 key, val = data.items()[0]
497 if key == 'wlist':
498 return val
499 if key == 'stay':
500 return None
501
502 return data
503 #-----------------------------------------------------
505 data = self._LCTRL_encounters.get_selected_item_data(only_one = True)
506 if data is not None:
507 # <ctrl> down ?
508 if wx.GetKeyState(wx.WXK_CONTROL):
509 if isinstance(data, gmEMRStructItems.cEncounter):
510 gmEMRStructWidgets.edit_encounter(parent = self, encounter = data)
511 return
512
513 if type(data) == type({}):
514 key, val = data.items()[0]
515 if key == 'wlist':
516 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmWaitingListPlugin')
517 return
518 if key == 'stay':
519 wx.CallAfter(gmEMRStructWidgets.manage_hospital_stays, parent = self)
520 return
521
522 wx.CallAfter(gmEMRStructWidgets.manage_encounters, parent = self, ignore_OK_button = False)
523 #-----------------------------------------------------
524 #-----------------------------------------------------
526 emr = patient.get_emr()
527
528 list_items = []
529 list_data = []
530
531 issues = [
532 i for i in emr.get_health_issues()
533 if ((i['clinically_relevant'] is False) or (i['is_active'] is False))
534 ]
535 for issue in issues:
536 last_encounter = emr.get_last_encounter(issue_id = issue['pk_health_issue'])
537 if last_encounter is None:
538 last = issue['modified_when'].strftime('%m/%Y')
539 else:
540 last = last_encounter['last_affirmed'].strftime('%m/%Y')
541 list_items.append(u'%s %s' % (last, issue['description']))
542 list_data.append(issue)
543 del issues
544
545 fhxs = emr.get_family_history()
546 for fhx in fhxs:
547 list_items.append(u'%s: %s%s' % (
548 fhx['l10n_relation'],
549 fhx['condition'],
550 gmTools.coalesce(fhx['age_noted'], u'', u' (@ %s)')
551 ))
552 list_data.append(fhx)
553 del fhxs
554
555 stays = emr.get_hospital_stays()
556 for stay in stays:
557 if stay['discharge'] is not None:
558 discharge = u''
559 else:
560 discharge = gmTools.u_ellipsis
561 list_items.append(u'%s%s %s: %s' % (
562 gmDateTime.pydt_strftime(stay['admission'], format = '%Y %b %d'),
563 discharge,
564 stay['hospital'],
565 stay['episode']
566 ))
567 list_data.append(stay)
568 del stays
569
570 procs = emr.get_performed_procedures()
571 for proc in procs:
572 list_items.append(u'%s%s %s' % (
573 gmDateTime.pydt_strftime(proc['clin_when'], format = '%Y %b %d'),
574 gmTools.bool2subst(proc['is_ongoing'], gmTools.u_ellipsis, u'', u''),
575 proc['performed_procedure']
576 ))
577 list_data.append(proc)
578 del procs
579
580 vaccs = emr.get_latest_vaccinations()
581 for ind, tmp in vaccs.items():
582 tmp, vacc = tmp
583 list_items.append(_('%s Vacc: %s') % (
584 gmDateTime.pydt_strftime(vacc['date_given'], format = '%Y %b %d'),
585 ind
586 ))
587 list_data.append(vacc)
588 del vaccs
589
590 self._LCTRL_history.set_string_items(items = list_items)
591 self._LCTRL_history.set_data(data = list_data)
592 #-----------------------------------------------------
594
595 if isinstance(data, gmEMRStructItems.cHealthIssue):
596 return data.format (
597 patient = gmPerson.gmCurrentPatient(),
598 with_medications = False,
599 with_hospital_stays = False,
600 with_procedures = False,
601 with_family_history = False,
602 with_documents = False,
603 with_tests = False,
604 with_vaccinations = False
605 ).strip(u'\n')
606
607 if isinstance(data, gmFamilyHistory.cFamilyHistory):
608 return data.format(include_episode = True, include_comment = True)
609
610 if isinstance(data, gmEMRStructItems.cHospitalStay):
611 return data.format()
612
613 if isinstance(data, gmEMRStructItems.cPerformedProcedure):
614 return data.format(include_episode = True)
615
616 if isinstance(data, gmVaccination.cVaccination):
617 return u'\n'.join(data.format (
618 with_indications = True,
619 with_comment = True,
620 with_reaction = True,
621 date_format = '%Y %b %d'
622 ))
623
624 return None
625 #-----------------------------------------------------
627 data = self._LCTRL_history.get_selected_item_data(only_one = True)
628 if data is None:
629 return
630
631 # <ctrl> down ?
632 if wx.GetKeyState(wx.WXK_CONTROL):
633 if isinstance(data, gmEMRStructItems.cHealthIssue):
634 gmEMRStructWidgets.edit_health_issue(parent = self, issue = data)
635 return
636 if isinstance(data, gmFamilyHistory.cFamilyHistory):
637 FamilyHistoryWidgets.edit_family_history(parent = self, family_history = data)
638 return
639 if isinstance(data, gmEMRStructItems.cHospitalStay):
640 gmEMRStructWidgets.edit_hospital_stay(parent = self, hospital_stay = data)
641 return
642 if isinstance(data, gmEMRStructItems.cPerformedProcedure):
643 gmEMRStructWidgets.edit_procedure(parent = self, procedure = data)
644 return
645 if isinstance(data, gmVaccination.cVaccination):
646 gmVaccWidgets.edit_vaccination(parent = self, vaccination = data, single_entry = True)
647 return
648 return
649
650 if isinstance(data, gmEMRStructItems.cHealthIssue):
651 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmEMRBrowserPlugin')
652 return
653 if isinstance(data, gmFamilyHistory.cFamilyHistory):
654 FamilyHistoryWidgets.manage_family_history(parent = self)
655 return
656 if isinstance(data, gmEMRStructItems.cHospitalStay):
657 gmEMRStructWidgets.manage_hospital_stays(parent = self)
658 return
659 if isinstance(data, gmEMRStructItems.cPerformedProcedure):
660 gmEMRStructWidgets.manage_performed_procedures(parent = self)
661 return
662 if isinstance(data, gmVaccination.cVaccination):
663 gmVaccWidgets.manage_vaccinations(parent = self)
664 return
665
666 return
667 #-----------------------------------------------------
668 #-----------------------------------------------------
670 # list by brand or substance:
671 emr = patient.get_emr()
672 intakes = emr.get_current_substance_intake(include_inactive = False, include_unapproved = True, order_by = u'substance')
673
674 list_items = []
675 multi_brands_already_seen = []
676 data_items = []
677 for intake in intakes:
678 brand = intake.containing_drug
679 if brand is None or len(brand['pk_components']) == 1:
680 list_items.append(_('%s %s %s%s') % (
681 intake['substance'],
682 intake['amount'],
683 intake['unit'],
684 gmTools.coalesce (
685 intake['schedule'],
686 u'',
687 u': %s'
688 )
689 ))
690 data_items.append(intake)
691 else:
692 if intake['brand'] in multi_brands_already_seen:
693 continue
694 multi_brands_already_seen.append(intake['brand'])
695 list_items.append(_('%s %s%s') % (
696 intake['brand'],
697 brand['preparation'],
698 gmTools.coalesce (
699 intake['schedule'],
700 u'',
701 u': %s'
702 )
703 ))
704 data_items.append(intake)
705 self._LCTRL_meds.set_string_items(items = list_items)
706 self._LCTRL_meds.set_data(data = data_items)
707 #-----------------------------------------------------
709 emr = gmPerson.gmCurrentPatient().get_emr()
710 atcs = []
711 if data['atc_substance'] is not None:
712 atcs.append(data['atc_substance'])
713 # if data['atc_brand'] is not None:
714 # atcs.append(data['atc_brand'])
715 # allg = emr.is_allergic_to(atcs = tuple(atcs), inns = (data['substance'],), brand = data['brand'])
716 allg = emr.is_allergic_to(atcs = tuple(atcs), inns = (data['substance'],))
717 if allg is False:
718 allg = None
719 return data.format(one_line = False, allergy = allg, show_all_brand_components = True)
720 #-----------------------------------------------------
722 data = self._LCTRL_meds.get_selected_item_data(only_one = True)
723 if data is not None:
724 # <ctrl> down ?
725 if wx.GetKeyState(wx.WXK_CONTROL):
726 wx.CallAfter(gmMedicationWidgets.edit_intake_of_substance, parent = self, substance = data)
727 return
728
729 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmCurrentSubstancesPlugin')
730 #-----------------------------------------------------
731 #-----------------------------------------------------
733 emr = patient.get_emr()
734
735 list_items = []
736 list_data = []
737 is_in_hospital = False
738
739 stays = emr.get_hospital_stays(ongoing_only = True)
740 if len(stays) > 0:
741 list_items.append(_('** Currently hospitalized: %s **') % stays[0]['hospital'])
742 list_data.append(stays[0])
743 is_in_hospital = True
744
745 adrs = patient.get_addresses()
746 for adr in adrs:
747 list_items.append(adr.format(single_line = True, verbose = False, show_type = True))
748 list_data.append(adr)
749
750 comms = patient.get_comm_channels()
751 for comm in comms:
752 list_items.append(u'%s: %s' % (
753 comm['l10n_comm_type'],
754 comm['url']
755 ))
756 list_data.append(comm)
757
758 ident = patient.emergency_contact_in_database
759 if ident is not None:
760 list_items.append(_('emergency: %s') % ident['description_gender'])
761 list_data.append(ident)
762
763 if patient['emergency_contact'] is not None:
764 list_items.append(_('emergency: %s') % patient['emergency_contact'].split(u'\n')[0])
765 list_data.append(patient['emergency_contact'])
766
767 provider = patient.primary_provider
768 if provider is not None:
769 list_items.append(_('in-praxis: %s') % provider.identity['description_gender'])
770 list_data.append(provider)
771
772 self._LCTRL_contacts.set_string_items(items = list_items)
773 self._LCTRL_contacts.set_data(data = list_data)
774 if is_in_hospital:
775 self._LCTRL_contacts.SetItemTextColour(0, wx.NamedColour('RED'))
776 #-----------------------------------------------------
778
779 if isinstance(data, gmEMRStructItems.cHospitalStay):
780 return data.format()
781
782 if isinstance(data, gmDemographicRecord.cPatientAddress):
783 return u'\n'.join(data.format())
784
785 if isinstance(data, gmDemographicRecord.cCommChannel):
786 parts = []
787 if data['is_confidential']:
788 parts.append(_('*** CONFIDENTIAL ***'))
789 if data['comment'] is not None:
790 parts.append(data['comment'])
791 return u'\n'.join(parts)
792
793 if isinstance(data, gmPerson.cIdentity):
794 return u'%s\n\n%s' % (
795 data['description_gender'],
796 u'\n'.join([
797 u'%s: %s%s' % (
798 c['l10n_comm_type'],
799 c['url'],
800 gmTools.bool2subst(c['is_confidential'], _(' (confidential !)'), u'', u'')
801 )
802 for c in data.get_comm_channels()
803 ])
804 )
805
806 if isinstance(data, basestring):
807 return data
808
809 if isinstance(data, gmStaff.cStaff):
810 ident = data.identity
811 return u'%s: %s\n\n%s%s' % (
812 data['short_alias'],
813 ident['description_gender'],
814 u'\n'.join([
815 u'%s: %s%s' % (
816 c['l10n_comm_type'],
817 c['url'],
818 gmTools.bool2subst(c['is_confidential'], _(' (confidential !)'), u'', u'')
819 )
820 for c in ident.get_comm_channels()
821 ]),
822 gmTools.coalesce(data['comment'], u'', u'\n\n%s')
823 )
824
825 return None
826 #-----------------------------------------------------
828 data = self._LCTRL_contacts.get_selected_item_data(only_one = True)
829 if data is not None:
830 # <ctrl> down ?
831 if wx.GetKeyState(wx.WXK_CONTROL):
832 if isinstance(data, gmEMRStructItems.cHospitalStay):
833 gmEMRStructWidgets.edit_hospital_stay(parent = self, hospital_stay = data)
834 return
835 if isinstance(data, gmDemographicRecord.cPatientAddress):
836 pass
837 if isinstance(data, gmDemographicRecord.cCommChannel):
838 gmContactWidgets.edit_comm_channel(parent = self, comm_channel = data, channel_owner = gmPerson.gmCurrentPatient())
839 return
840 if isinstance(data, gmPerson.cIdentity):
841 pass
842 if isinstance(data, gmStaff.cStaff):
843 pass
844
845 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmNotebookedPatientEditionPlugin')
846 #-----------------------------------------------------
847 #-----------------------------------------------------
849 emr = patient.get_emr()
850
851 problems = [
852 p for p in emr.get_problems(include_closed_episodes = False, include_irrelevant_issues = False)
853 if p['problem_active']
854 ]
855
856 list_items = []
857 for problem in problems:
858 if problem['type'] == 'issue':
859 issue = emr.problem2issue(problem)
860 last_encounter = emr.get_last_encounter(issue_id = issue['pk_health_issue'])
861 if last_encounter is None:
862 last = issue['modified_when'].strftime('%m/%Y')
863 else:
864 last = last_encounter['last_affirmed'].strftime('%m/%Y')
865 list_items.append(u'%s: %s' % (problem['problem'], last))
866
867 elif problem['type'] == 'episode':
868 epi = emr.problem2episode(problem)
869 last_encounter = emr.get_last_encounter(episode_id = epi['pk_episode'])
870 if last_encounter is None:
871 last = epi['episode_modified_when'].strftime('%m/%Y')
872 else:
873 last = last_encounter['last_affirmed'].strftime('%m/%Y')
874 list_items.append(u'%s: %s' % (problem['problem'], last))
875
876 self._LCTRL_problems.set_string_items(items = list_items)
877 self._LCTRL_problems.set_data(data = problems)
878 #-----------------------------------------------------
880 emr = gmPerson.gmCurrentPatient().get_emr()
881
882 if data['type'] == 'issue':
883 issue = emr.problem2issue(data)
884 tt = issue.format (
885 patient = gmPerson.gmCurrentPatient(),
886 with_medications = False,
887 with_hospital_stays = False,
888 with_procedures = False,
889 with_family_history = False,
890 with_documents = False,
891 with_tests = False,
892 with_vaccinations = False
893 ).strip(u'\n')
894 return tt
895
896 if data['type'] == 'episode':
897 epi = emr.problem2episode(data)
898 tt = epi.format (
899 patient = gmPerson.gmCurrentPatient(),
900 with_encounters = False,
901 with_hospital_stays = False,
902 with_procedures = False,
903 with_family_history = False,
904 with_documents = False,
905 with_tests = False,
906 with_vaccinations = False,
907 with_health_issue = True
908 ).strip(u'\n')
909 return tt
910
911 return None
912 #-----------------------------------------------------
914 data = self._LCTRL_problems.get_selected_item_data(only_one = True)
915 if data is not None:
916 # <ctrl> down ?
917 if wx.GetKeyState(wx.WXK_CONTROL):
918 emr = gmPerson.gmCurrentPatient().get_emr()
919 if data['type'] == 'issue':
920 gmEMRStructWidgets.edit_health_issue(parent = self, issue = emr.problem2issue(data))
921 return
922 if data['type'] == 'episode':
923 gmEMRStructWidgets.edit_episode(parent = self, episode = emr.problem2episode(data))
924 return
925
926 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmEMRBrowserPlugin')
927 #-----------------------------------------------------
928 #-----------------------------------------------------
930 # names (.comment -> tooltip)
931 names = patient.get_names(exclude_active = True)
932 items = [
933 _('aka: %(last)s, %(first)s%(nick)s') % {
934 'last': n['lastnames'],
935 'first': n['firstnames'],
936 'nick': gmTools.coalesce(n['preferred'], u'', u" '%s'")
937 } for n in names
938 ]
939 data = names
940
941 # IDs (.issuer & .comment -> tooltip)
942 ids = patient.external_ids
943 for i in ids:
944 items.append(u'%(name)s: %(value)s' % i)
945 data.append({'id': i})
946
947 # occupation
948 jobs = patient.get_occupations()
949 for j in jobs:
950 items.append(_('job: %s (%s)') % (
951 j['l10n_occupation'],
952 j['modified_when'].strftime('%m/%Y')
953 ))
954 data.append({'job': j})
955
956 self._LCTRL_identity.set_string_items(items = items)
957 self._LCTRL_identity.set_data(data = data)
958 #-----------------------------------------------------
960 if isinstance(data, gmPerson.cPersonName):
961 return data['comment']
962 if isinstance(data, type({})):
963 key = data.keys()[0]
964 val = data[key]
965 if key == 'id':
966 return _('issued by: %s%s') % (
967 val['issuer'],
968 gmTools.coalesce(val['comment'], u'', u'\n\n%s')
969 )
970 if key == 'job':
971 tt = _('Last modified: %s') % val['modified_when'].strftime('%m/%Y')
972 if val['activities'] is None:
973 return tt
974 return tt + (u'\n\n' + _('Activities:\n\n%s') % val['activities'])
975
976 return None
977 #-----------------------------------------------------
979 data = self._LCTRL_identity.get_selected_item_data(only_one = True)
980 if data is not None:
981 # <ctrl> down ?
982 if wx.GetKeyState(wx.WXK_CONTROL):
983 if isinstance(data, gmPerson.cPersonName):
984 ea = gmDemographicsWidgets.cPersonNameEAPnl(self, -1, name = data)
985 dlg = gmEditArea.cGenericEditAreaDlg2(self, -1, edit_area = ea, single_entry = True)
986 dlg.SetTitle(_('Cloning name'))
987 dlg.ShowModal()
988 return
989 if isinstance(data, type({})):
990 key = data.keys()[0]
991 val = data[key]
992 if key == 'id':
993 ea = gmDemographicsWidgets.cExternalIDEditAreaPnl(self, -1, external_id = val)
994 ea.identity = gmPerson.gmCurrentPatient()
995 dlg = gmEditArea.cGenericEditAreaDlg2(self, -1, edit_area = ea, single_entry = True)
996 dlg.SetTitle(_('Editing external ID'))
997 dlg.ShowModal()
998 return
999 if key == 'job':
1000 gmDemographicsWidgets.edit_occupation()
1001 return
1002
1003 wx.CallAfter(gmDispatcher.send, signal = 'display_widget', name = 'gmNotebookedPatientEditionPlugin')
1004 #============================================================
1005 # main
1006 #------------------------------------------------------------
1007 if __name__ == "__main__":
1008
1009 if len(sys.argv) < 2:
1010 sys.exit()
1011
1012 if sys.argv[1] != u'test':
1013 sys.exit()
1014
1015 # from Gnumed.pycommon import gmPG2
1016 # from Gnumed.pycommon import gmI18N
1017 # gmI18N.activate_locale()
1018 # gmI18N.install_domain()
1019
1020 #--------------------------------------------------------
1021 #test_org_unit_prw()
1022
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Fri Feb 1 03:57:11 2013 | http://epydoc.sourceforge.net |