| Home | Trees | Indices | Help |
|
|---|
|
|
1 """GNUmed form/letter handling widgets."""
2
3 #================================================================
4 __author__ = "Karsten Hilbert <Karsten.Hilbert@gmx.net>"
5 __license__ = "GPL v2 or later"
6
7
8 import os.path
9 import sys
10 import logging
11 import shutil
12
13
14 import wx
15
16
17 if __name__ == '__main__':
18 sys.path.insert(0, '../../')
19 from Gnumed.pycommon import gmI18N
20 from Gnumed.pycommon import gmTools
21 from Gnumed.pycommon import gmDispatcher
22 from Gnumed.pycommon import gmPrinting
23 from Gnumed.pycommon import gmDateTime
24 from Gnumed.pycommon import gmShellAPI
25 from Gnumed.pycommon import gmMimeLib
26 from Gnumed.pycommon import gmCfg2
27
28 from Gnumed.business import gmForms
29 from Gnumed.business import gmPerson
30 from Gnumed.business import gmExternalCare
31 from Gnumed.business import gmPraxis
32
33 from Gnumed.wxpython import gmGuiHelpers
34 from Gnumed.wxpython import gmListWidgets
35 from Gnumed.wxpython import gmMacro
36 from Gnumed.wxpython import gmEditArea
37 from Gnumed.wxpython.gmDocumentWidgets import save_files_as_new_document
38
39
40 _log = logging.getLogger('gm.ui')
41
42 _ID_FORM_DISPOSAL_PRINT, \
43 _ID_FORM_DISPOSAL_REMOTE_PRINT, \
44 _ID_FORM_DISPOSAL_EXPORT_ONLY, \
45 _ID_FORM_DISPOSAL_ARCHIVE_ONLY = range(4)
46
47 #============================================================
48 # generic form generation and handling convenience functions
49 #------------------------------------------------------------
51
52 form = generate_form_from_template (
53 parent = parent,
54 excluded_template_types = [
55 'gnuplot script',
56 'visual progress note',
57 'invoice'
58 ],
59 edit = edit_form # default None = respect template setting
60 )
61 if form is None:
62 return False
63
64 if form in [True, False]: # returned by special OOo/LO handling
65 return form
66
67 if episode is None:
68 epi_name = 'administrative'
69 else:
70 epi_name = episode['description']
71 return act_on_generated_forms (
72 parent = parent,
73 forms = [form],
74 jobtype = jobtype,
75 episode_name = epi_name,
76 review_copy_as_normal = True
77 )
78
79 #------------------------------------------------------------
80 # eventually this should become superfluous when there's a
81 # standard engine wrapper around OOo
83
84 # export template to file
85 filename = template.save_to_file()
86 if filename is None:
87 gmGuiHelpers.gm_show_error (
88 _( 'Error exporting form template\n'
89 '\n'
90 ' "%s" (%s)'
91 ) % (template['name_long'], template['external_version']),
92 _('Letter template export')
93 )
94 return False
95
96 try:
97 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type'])
98 except ImportError:
99 gmGuiHelpers.gm_show_error (
100 _('Cannot connect to OpenOffice.\n\n'
101 'The UNO bridge module for Python\n'
102 'is not installed.'
103 ),
104 _('Letter writer')
105 )
106 return False
107
108 if not doc.open_in_ooo():
109 gmGuiHelpers.gm_show_error (
110 _('Cannot connect to OpenOffice.\n'
111 '\n'
112 'You may want to increase the option\n'
113 '\n'
114 ' <%s>'
115 ) % _('OOo startup time'),
116 _('Letter writer')
117 )
118 try: os.remove(filename)
119 except Exception: pass
120 return False
121
122 doc.show(False)
123 ph_handler = gmMacro.gmPlaceholderHandler()
124 doc.replace_placeholders(handler = ph_handler)
125
126 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-')
127 doc.save_in_ooo(filename = filename)
128
129 doc.show(True)
130
131 return True
132
133 #------------------------------------------------------------
134 -def generate_form_from_template(parent=None, template_types=None, edit=None, template=None, excluded_template_types=None):
135 """If <edit> is None it will honor the template setting."""
136
137 if parent is None:
138 parent = wx.GetApp().GetTopWindow()
139
140 # 1) get template to use
141 if template is None:
142 template = manage_form_templates (
143 parent = parent,
144 active_only = True,
145 template_types = template_types,
146 excluded_types = excluded_template_types
147 )
148 if template is None:
149 gmDispatcher.send(signal = 'statustext', msg = _('No document template selected.'), beep = False)
150 return None
151
152 if template['engine'] == 'O':
153 return print_doc_from_ooo_template(template = template)
154
155 wx.BeginBusyCursor()
156
157 # 2) process template
158 try:
159 form = template.instantiate()
160 except KeyError:
161 _log.exception('cannot instantiate document template [%s]', template)
162 gmGuiHelpers.gm_show_error (
163 aMessage = _('Invalid document template [%s - %s (%s)]') % (name, ver, template['engine']),
164 aTitle = _('Generating document from template')
165 )
166 wx.EndBusyCursor()
167 return None
168 ph = gmMacro.gmPlaceholderHandler()
169 #ph.debug = True
170 form.substitute_placeholders(data_source = ph)
171 if edit is None:
172 if form.template['edit_after_substitution']:
173 edit = True
174 else:
175 edit = False
176 if edit:
177 wx.EndBusyCursor()
178 form.edit()
179 wx.BeginBusyCursor()
180
181 # 3) generate output
182 pdf_name = form.generate_output()
183 wx.EndBusyCursor()
184 if pdf_name is not None:
185 return form
186
187 gmGuiHelpers.gm_show_error (
188 aMessage = _('Error generating document printout.'),
189 aTitle = _('Generating document printout')
190 )
191 return None
192
193 #------------------------------------------------------------
194 -def act_on_generated_forms(parent=None, forms=None, jobtype=None, episode_name=None, progress_note=None, review_copy_as_normal=False):
195 """This function assumes that .generate_output() has already been called on each form.
196
197 It operates on the active patient.
198 """
199 if len(forms) == 0:
200 return True
201
202 no_of_printables = 0
203 for form in forms:
204 no_of_printables += len(form.final_output_filenames)
205
206 if no_of_printables == 0:
207 return True
208
209 soap_lines = []
210
211 #-----------------------------
212 def save_soap(soap=None):
213 if episode_name is None:
214 return
215 if soap.strip() == '':
216 return
217 pat = gmPerson.gmCurrentPatient()
218 emr = pat.emr
219 epi = emr.add_episode(episode_name = episode_name, is_open = False)
220 emr.add_clin_narrative (
221 soap_cat = None,
222 note = soap,
223 episode = epi
224 )
225
226 #-----------------------------
227 def archive_forms(episode_name=None, comment=None):
228 if episode_name is None:
229 epi = None # will ask for episode further down
230 else:
231 pat = gmPerson.gmCurrentPatient()
232 emr = pat.emr
233 epi = emr.add_episode(episode_name = episode_name, is_open = False)
234 for form in forms:
235 files2import = []
236 files2import.extend(form.final_output_filenames)
237 files2import.extend(form.re_editable_filenames)
238 if len(files2import) == 0:
239 continue
240 save_files_as_new_document (
241 parent = parent,
242 filenames = files2import,
243 document_type = form.template['instance_type'],
244 unlock_patient = False,
245 episode = epi,
246 review_as_normal = review_copy_as_normal,
247 reference = None,
248 pk_org_unit = gmPraxis.gmCurrentPraxisBranch()['pk_org_unit'],
249 comment = comment,
250 date_generated = gmDateTime.pydt_now_here()
251 )
252 return True
253
254 #-----------------------------
255 def print_forms():
256 # anything to do ?
257 files2print = []
258 form_names = []
259 for form in forms:
260 files2print.extend(form.final_output_filenames)
261 form_names.append('%s (%s)' % (form.template['name_long'], form.template['external_version']))
262 if len(files2print) == 0:
263 return True
264 # print
265 _cfg = gmCfg2.gmCfgData()
266 printed = gmPrinting.print_files(filenames = files2print, jobtype = jobtype, verbose = _cfg.get(option = 'debug'))
267 if not printed:
268 gmGuiHelpers.gm_show_error (
269 aMessage = _('Error printing documents.'),
270 aTitle = _('Printing [%s]') % jobtype
271 )
272 return False
273 soap_lines.append(_('Printed: %s') % ', '.join(form_names))
274 return True
275
276 #-----------------------------
277 def export_forms(remote_print=False):
278 pat = gmPerson.gmCurrentPatient()
279 return pat.export_area.add_forms(forms = forms, designation = gmTools.bool2subst(remote_print, 'print', None, None))
280
281 #-----------------------------
282 if parent is None:
283 parent = wx.GetApp().GetTopWindow()
284
285 if jobtype is None:
286 jobtype = 'generic_document'
287
288 dlg = cFormDisposalDlg(parent, -1)
289 dlg.forms = forms
290 dlg.progress_note = progress_note
291 dlg.episode_name = episode_name
292 action_code = dlg.ShowModal()
293
294 if action_code == wx.ID_CANCEL:
295 dlg.DestroyLater()
296 return True
297
298 forms = dlg._LCTRL_forms.get_item_data()
299 if len(forms) == 0:
300 dlg.DestroyLater()
301 return True
302
303 progress_note = dlg.progress_note
304 episode_name = dlg._PRW_episode.GetValue().strip()
305 if episode_name == '':
306 episode_name = None
307 also_export = dlg._CHBOX_export.GetValue()
308 dlg.DestroyLater()
309
310 if action_code == _ID_FORM_DISPOSAL_ARCHIVE_ONLY:
311 success = archive_forms(episode_name = episode_name, comment = progress_note)
312 if not success:
313 return False
314 if progress_note != '':
315 soap_lines.insert(0, progress_note)
316 if len(soap_lines) > 0:
317 save_soap(soap = '\n'.join(soap_lines))
318 return True
319
320 if action_code == _ID_FORM_DISPOSAL_EXPORT_ONLY:
321 success = export_forms()
322 if not success:
323 return False
324 if progress_note != '':
325 soap_lines.insert(0, progress_note)
326 if len(soap_lines) > 0:
327 save_soap(soap = '\n'.join(soap_lines))
328 return True
329
330 success = False
331 if action_code == _ID_FORM_DISPOSAL_PRINT:
332 success = print_forms()
333 if episode_name is not None:
334 archive_forms(episode_name = episode_name, comment = progress_note)
335 if also_export:
336 export_forms()
337
338 elif action_code == _ID_FORM_DISPOSAL_REMOTE_PRINT:
339 success = export_forms(remote_print = True)
340 if episode_name is not None:
341 archive_forms(episode_name = episode_name, comment = progress_note)
342
343 if not success:
344 return False
345
346 if progress_note != '':
347 soap_lines.insert(0, progress_note)
348 if len(soap_lines) > 0:
349 save_soap(soap = '\n'.join(soap_lines))
350
351 return True
352
353 #============================================================
354 from Gnumed.wxGladeWidgets import wxgFormDisposalDlg
355
357
359
360 wxgFormDisposalDlg.wxgFormDisposalDlg.__init__(self, *args, **kwargs)
361
362 self.__init_ui()
363
364 #--------------------------------------------------------
365 # properties
366 #--------------------------------------------------------
370
371 message = property(lambda x:x, _set_msg)
372
373 #--------------------------------------------------------
375 items = [ f.template['name_long'] for f in forms ]
376 self._LCTRL_forms.set_string_items(items)
377 self._LCTRL_forms.set_data(forms)
378
379 forms = property(lambda x:x, _set_forms)
380
381 #--------------------------------------------------------
383 return self._TCTRL_soap.GetValue().strip()
384
389
390 progress_note = property(_get_note, _set_note)
391
392 #--------------------------------------------------------
394 return self._PRW_episode.GetValue().strip()
395
400
401 episode_name = property(_get_episode_name, _set_episode_name)
402
403 #--------------------------------------------------------
404 # internal helpers
405 #--------------------------------------------------------
407 self._LCTRL_forms.set_columns([_('Form')])
408 #self._CHBOX_export.SetValue(False)
409 #--------------------------------------------------------
410 # event handlers
411 #--------------------------------------------------------
414 #--------------------------------------------------------
417 #--------------------------------------------------------
420 #--------------------------------------------------------
423 #--------------------------------------------------------
439 #--------------------------------------------------------
443
444 #============================================================
445 # form template management
446 #------------------------------------------------------------
448 ea = cFormTemplateEAPnl(parent, -1)
449 ea.data = template
450 ea.mode = gmTools.coalesce(template, 'new', 'edit')
451 dlg = gmEditArea.cGenericEditAreaDlg2(parent, -1, edit_area = ea, single_entry = single_entry)
452 dlg.SetTitle(gmTools.coalesce(template, _('Adding new form template'), _('Editing form template')))
453 if dlg.ShowModal() == wx.ID_OK:
454 dlg.DestroyLater()
455 return True
456 dlg.DestroyLater()
457 return False
458
459 #------------------------------------------------------------
460 -def manage_form_templates(parent=None, template_types=None, active_only=False, excluded_types=None, msg=None):
461
462 if parent is None:
463 parent = wx.GetApp().GetTopWindow()
464
465 #-------------------------
466 def edit(template=None):
467 return edit_template(parent = parent, template = template)
468 #-------------------------
469 def delete(template):
470 delete = gmGuiHelpers.gm_show_question (
471 aTitle = _('Deleting form template.'),
472 aMessage = _(
473 'Are you sure you want to delete\n'
474 'the following form template ?\n\n'
475 ' "%s (%s)"\n\n'
476 'You can only delete templates which\n'
477 'have not yet been used to generate\n'
478 'any forms from.'
479 ) % (template['name_long'], template['external_version'])
480 )
481 if delete:
482 # FIXME: make this a priviledged operation ?
483 gmForms.delete_form_template(template = template)
484 return True
485 return False
486 #-------------------------
487 def refresh(lctrl):
488 templates = gmForms.get_form_templates(active_only = active_only, template_types = template_types, excluded_types = excluded_types)
489 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ])
490 lctrl.set_data(data = templates)
491 #-------------------------
492 template = gmListWidgets.get_choices_from_list (
493 parent = parent,
494 msg = msg,
495 caption = _('Select letter or form template.'),
496 columns = [_('Template'), _('Version'), _('Type')],
497 edit_callback = edit,
498 new_callback = edit,
499 delete_callback = delete,
500 refresh_callback = refresh,
501 single_selection = True
502 )
503
504 return template
505
506 #------------------------------------------------------------
507 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl
508
509 -class cFormTemplateEAPnl(wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl, gmEditArea.cGenericEditAreaMixin):
510
512
513 try:
514 data = kwargs['template']
515 del kwargs['template']
516 except KeyError:
517 data = None
518
519 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs)
520 gmEditArea.cGenericEditAreaMixin.__init__(self)
521
522 self.full_filename = None
523
524 self.mode = 'new'
525 self.data = data
526 if data is not None:
527 self.mode = 'edit'
528
529 self.__init_ui()
530 #----------------------------------------------------------------
532 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider()
533 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider()
534 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider()
535 #----------------------------------------------------------------
536 # generic Edit Area mixin API
537 #----------------------------------------------------------------
539
540 validity = True
541
542 # self._TCTRL_filename
543 self.display_tctrl_as_valid(tctrl = self._TCTRL_filename, valid = True)
544 fname = self._TCTRL_filename.GetValue().strip()
545 # 1) new template: file must exist
546 if self.data is None:
547 try:
548 open(fname, 'r').close()
549 except Exception:
550 validity = False
551 self.display_tctrl_as_valid(tctrl = self._TCTRL_filename, valid = False)
552 self.StatusText = _('You must select a template file before saving.')
553 self._TCTRL_filename.SetFocus()
554 # 2) existing template
555 # - empty = no change
556 # - does not exist: name change in DB field
557 # - does exist: reload from filesystem
558
559 # self._PRW_instance_type
560 if self._PRW_instance_type.GetValue().strip() == '':
561 validity = False
562 self._PRW_instance_type.display_as_valid(False)
563 self.StatusText = _('You must enter a type for documents created with this template.')
564 self._PRW_instance_type.SetFocus()
565 else:
566 self._PRW_instance_type.display_as_valid(True)
567
568 # self._PRW_template_type
569 if self._PRW_template_type.GetData() is None:
570 validity = False
571 self._PRW_template_type.display_as_valid(False)
572 self.StatusText = _('You must enter a type for this template.')
573 self._PRW_template_type.SetFocus()
574 else:
575 self._PRW_template_type.display_as_valid(True)
576
577 # self._TCTRL_external_version
578 if self._TCTRL_external_version.GetValue().strip() == '':
579 validity = False
580 self.display_tctrl_as_valid(tctrl = self._TCTRL_external_version, valid = False)
581 self.StatusText = _('You must enter a version for this template.')
582 self._TCTRL_external_version.SetFocus()
583 else:
584 self.display_tctrl_as_valid(tctrl = self._TCTRL_external_version, valid = True)
585
586 # self._PRW_name_short
587 if self._PRW_name_short.GetValue().strip() == '':
588 validity = False
589 self._PRW_name_short.display_as_valid(False)
590 self.StatusText = _('Missing short name for template.')
591 self._PRW_name_short.SetFocus()
592 else:
593 self._PRW_name_short.display_as_valid(True)
594
595 # self._PRW_name_long
596 if self._PRW_name_long.GetValue().strip() == '':
597 validity = False
598 self._PRW_name_long.display_as_valid(False)
599 self.StatusText = _('Missing long name for template.')
600 self._PRW_name_long.SetFocus()
601 else:
602 self._PRW_name_long.display_as_valid(True)
603
604 return validity
605 #----------------------------------------------------------------
607 data = gmForms.create_form_template (
608 template_type = self._PRW_template_type.GetData(),
609 name_short = self._PRW_name_short.GetValue().strip(),
610 name_long = self._PRW_name_long.GetValue().strip()
611 )
612 data['external_version'] = self._TCTRL_external_version.GetValue()
613 data['instance_type'] = self._PRW_instance_type.GetValue().strip()
614 data['filename'] = os.path.split(self._TCTRL_filename.GetValue().strip())[1]
615 data['in_use'] = self._CHBOX_active.GetValue()
616 data['edit_after_substitution'] = self._CHBOX_editable.GetValue()
617 data['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()]
618 data.save()
619
620 data.update_template_from_file(filename = self._TCTRL_filename.GetValue().strip())
621
622 self.data = data
623 return True
624 #----------------------------------------------------------------
626 self.data['pk_template_type'] = self._PRW_template_type.GetData()
627 self.data['name_short'] = self._PRW_name_short.GetValue().strip()
628 self.data['name_long'] = self._PRW_name_long.GetValue().strip()
629 self.data['external_version'] = self._TCTRL_external_version.GetValue()
630 tmp = self._PRW_instance_type.GetValue().strip()
631 if tmp not in [self.data['instance_type'], self.data['l10n_instance_type']]:
632 self.data['instance_type'] = tmp
633 tmp = os.path.split(self._TCTRL_filename.GetValue().strip())[1]
634 if tmp != '':
635 self.data['filename'] = tmp
636 self.data['in_use'] = self._CHBOX_active.GetValue()
637 self.data['edit_after_substitution'] = self._CHBOX_editable.GetValue()
638 self.data['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()]
639 self.data.save()
640
641 fname = self._TCTRL_filename.GetValue().strip()
642 try:
643 open(fname, 'r').close()
644 self.data.update_template_from_file(filename = fname)
645 except Exception:
646 pass # filename column already updated
647
648 return True
649 #----------------------------------------------------------------
651 self._PRW_name_long.SetText('')
652 self._PRW_name_short.SetText('')
653 self._TCTRL_external_version.SetValue('')
654 self._PRW_template_type.SetText('')
655 self._PRW_instance_type.SetText('')
656 self._TCTRL_filename.SetValue('')
657 self._CH_engine.SetSelection(0)
658 self._CHBOX_active.SetValue(True)
659 self._CHBOX_editable.SetValue(True)
660 self._LBL_status.SetLabel('')
661 self._BTN_export.Enable(False)
662
663 self._PRW_name_long.SetFocus()
664 #----------------------------------------------------------------
667 #----------------------------------------------------------------
669 self._PRW_name_long.SetText(self.data['name_long'])
670 self._PRW_name_short.SetText(self.data['name_short'])
671 self._TCTRL_external_version.SetValue(self.data['external_version'])
672 self._PRW_template_type.SetText(self.data['l10n_template_type'], data = self.data['pk_template_type'])
673 self._PRW_instance_type.SetText(self.data['l10n_instance_type'], data = self.data['instance_type'])
674 self._TCTRL_filename.SetValue(self.data['filename'])
675 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.data['engine']))
676 self._CHBOX_active.SetValue(self.data['in_use'])
677 self._CHBOX_editable.SetValue(self.data['edit_after_substitution'])
678 self._LBL_status.SetLabel(_('last modified %s by %s, internal revision [%s]') % (
679 gmDateTime.pydt_strftime(self.data['last_modified'], '%Y %B %d'),
680 self.data['modified_by'],
681 gmTools.coalesce(self.data['gnumed_revision'], '?')
682 ))
683
684 self._TCTRL_filename.Enable(True)
685 self._BTN_load.Enable(True)
686 self._BTN_export.Enable(True)
687
688 self._BTN_load.SetFocus()
689 #----------------------------------------------------------------
690 # event handlers
691 #----------------------------------------------------------------
721 #----------------------------------------------------------------
755
756 #============================================================
757 from Gnumed.wxGladeWidgets import wxgReceiverSelectionDlg
758
760
762 wxgReceiverSelectionDlg.wxgReceiverSelectionDlg.__init__(self, *args, **kwargs)
763 self.__patient = None
764 self.__init_ui()
765 self.__register_interests()
766
767 #------------------------------------------------------------
769 if self.__patient is None:
770 return
771
772 self._LCTRL_candidates.set_columns([_('Receiver'), _('Details')])
773 self._LCTRL_candidates.set_resize_column()
774 self._LCTRL_candidates.item_tooltip_callback = self._get_candidate_tooltip
775 self.__populate_candidates_list()
776
777 self._LCTRL_addresses.set_resize_column()
778 self._LCTRL_addresses.item_tooltip_callback = self._get_address_tooltip
779 self._LCTRL_addresses.activate_callback = self._on_address_activated_in_list
780 adrs = self.__patient.get_addresses()
781 self.__populate_address_list(addresses = adrs)
782
783 self._TCTRL_final_name.SetValue(self.__patient['description'].strip())
784
785 self.Layout()
786
787 #------------------------------------------------------------
789 self._TCTRL_final_name.add_callback_on_modified(callback = self._on_final_name_modified)
790 self._PRW_other_address.add_callback_on_selection(self._on_address_selected_in_PRW)
791 self._PRW_org_unit.add_callback_on_set_focus(self._on_entering_org_unit_PRW)
792 self._PRW_org_unit.add_callback_on_selection(self._on_org_unit_selected_in_PRW)
793
794 #------------------------------------------------------------
796
797 list_items = [[_('Patient'), self.__patient['description_gender'].strip()]]
798 list_data = [(self.__patient['description'].strip(), self.__patient.get_addresses(), '', None)]
799
800 candidate_type = _('Emergency contact')
801 if self.__patient['emergency_contact'] is not None:
802 name = self.__patient['emergency_contact'].strip()
803 list_items.append([candidate_type, name])
804 list_data.append((name, [], '', None))
805 contact = self.__patient.emergency_contact_in_database
806 if contact is not None:
807 list_items.append([candidate_type, contact['description_gender']])
808 list_data.append((contact['description'].strip(), contact.get_addresses(), '', None))
809
810 candidate_type = _('Primary doctor')
811 prov = self.__patient.primary_provider
812 if prov is not None:
813 ident = prov.identity
814 list_items.append([candidate_type, '%s: %s' % (prov['short_alias'], ident['description_gender'])])
815 list_data.append((ident['description'].strip(), ident.get_addresses(), _('in-praxis primary provider'), None))
816
817 candidate_type = _('This praxis')
818 branches = gmPraxis.get_praxis_branches(order_by = 'branch')
819 for branch in branches:
820 adr = branch.address
821 if adr is None:
822 continue
823 list_items.append([candidate_type, '%s @ %s' % (branch['branch'], branch['praxis'])])
824 list_data.append(('%s @ %s' % (branch['branch'], branch['praxis']), [adr], branch.format(), None))
825 del branches
826
827 candidate_type = _('External care')
828 cares = gmExternalCare.get_external_care_items(pk_identity = self.__patient.ID)
829 for care in cares:
830 details = '%s%s@%s (%s)' % (
831 gmTools.coalesce(care['provider'], '', '%s: '),
832 care['unit'],
833 care['organization'],
834 care['issue']
835 )
836 name = ('%s%s' % (
837 gmTools.coalesce(care['provider'], '', '%s, '),
838 '%s @ %s' % (care['unit'], care['organization'])
839 )).strip()
840 org_unit = care.org_unit
841 adr = org_unit.address
842 if adr is None:
843 addresses = []
844 else:
845 addresses = [adr]
846 list_items.append([candidate_type, details])
847 tt = '\n'.join(care.format(with_health_issue = True, with_address = True, with_comms = True))
848 list_data.append((name, addresses, tt, org_unit))
849 del cares
850
851 emr = self.__patient.emr
852
853 candidate_type = _('Hospital stay')
854 depts = emr.get_attended_hospitals_as_org_units()
855 for dept in depts:
856 adr = dept.address
857 if adr is None:
858 continue
859 list_items.append([candidate_type, '%s @ %s' % (dept['unit'], dept['organization'])])
860 list_data.append(('%s @ %s' % (dept['unit'], dept['organization']), [adr], '\n'.join(dept.format(with_comms = True)), dept))
861 del depts
862
863 candidate_type = _('Procedure')
864 proc_locs = emr.get_procedure_locations_as_org_units()
865 for proc_loc in proc_locs:
866 adr = proc_loc.address
867 if adr is None:
868 continue
869 list_items.append([candidate_type, '%s @ %s' % (proc_loc['unit'], proc_loc['organization'])])
870 list_data.append(('%s @ %s' % (proc_loc['unit'], proc_loc['organization']), [adr], '\n'.join(proc_loc.format(with_comms = True)), proc_loc))
871 del proc_locs
872
873 candidate_type = _('Lab')
874 labs = emr.get_labs_as_org_units()
875 for lab in labs:
876 adr = lab.address
877 if adr is None:
878 continue
879 list_items.append([candidate_type, '%s @ %s' % (lab['unit'], lab['organization'])])
880 list_data.append(('%s @ %s' % (lab['unit'], lab['organization']), [adr], '\n'.join(lab.format(with_comms = True)), lab))
881 del labs
882
883 candidate_type = _('Bill receiver')
884 bills = self.__patient.bills
885 adrs_seen = []
886 for bill in bills:
887 if bill['pk_receiver_address'] in adrs_seen:
888 continue
889 adr = bill.address
890 if adr is None:
891 continue
892 adrs_seen.append(bill['pk_receiver_address'])
893 details = '%s%s' % (bill['invoice_id'], gmDateTime.pydt_strftime(dt = bill['close_date'], format = ' (%Y %b %d)', none_str = ''))
894 list_items.append([candidate_type, details])
895 list_data.append(('', [adr], '\n'.join(adr.format()), None))
896
897 candidate_type = _('Document')
898 doc_folder = self.__patient.document_folder
899 doc_units = doc_folder.all_document_org_units
900 for doc_unit in doc_units:
901 adr = doc_unit.address
902 if adr is None:
903 continue
904 list_items.append([candidate_type, '%s @ %s' % (doc_unit['unit'], doc_unit['organization'])])
905 list_data.append(('%s @ %s' % (doc_unit['unit'], doc_unit['organization']), [adr], '\n'.join(doc_unit.format(with_comms = True)), doc_unit))
906 del doc_units
907
908 self._LCTRL_candidates.set_string_items(list_items)
909 self._LCTRL_candidates.set_column_widths()
910 self._LCTRL_candidates.set_data(list_data)
911
912 #------------------------------------------------------------
918
919 #------------------------------------------------------------
921 if adr is None:
922 self._LBL_address_details.SetLabel('')
923 self._LBL_final_country.SetLabel('')
924 self._LBL_final_region.SetLabel('')
925 self._LBL_final_zip.SetLabel('')
926 self._LBL_final_location.SetLabel('')
927 self._LBL_final_street.SetLabel('')
928 self._LBL_final_number.SetLabel('')
929 self.Layout()
930 return
931 self._LBL_address_details.SetLabel('\n'.join(adr.format()))
932 self._LBL_final_country.SetLabel(adr['l10n_country'])
933 self._LBL_final_region.SetLabel(adr['l10n_region'])
934 self._LBL_final_zip.SetLabel(adr['postcode'])
935 self._LBL_final_location.SetLabel('%s%s' % (adr['urb'], gmTools.coalesce(adr['suburb'], '', ' - %s')))
936 self._LBL_final_street.SetLabel(adr['street'])
937 self._LBL_final_number.SetLabel('%s%s' % (adr['number'], gmTools.coalesce(adr['subunit'], '', ' %s')))
938 self.Layout()
939
940 #------------------------------------------------------------
942 self._LCTRL_addresses.Enable()
943 cols = [_(u'Address')]
944 list_items = []
945 for a in addresses:
946 try:
947 list_items.append([a['l10n_address_type'], a.format(single_line = True, verbose = False, show_type = False)])
948 cols = [_('Type'), _('Address')]
949 except KeyError:
950 list_items.append([a.format(single_line = True, verbose = False, show_type = False)])
951 cols = [_('Address')]
952
953 self._LCTRL_addresses.set_columns(cols)
954 self._LCTRL_addresses.set_string_items(list_items)
955 self._LCTRL_candidates.set_column_widths()
956 self._LCTRL_addresses.set_data(addresses)
957 self._PRW_other_address.SetText(value = '', data = None)
958 self.__update_address_info(None)
959
960 #------------------------------------------------------------
962 return '\n'.join(adr.format(show_type = True))
963
964 #------------------------------------------------------------
965 #------------------------------------------------------------
968
969 #------------------------------------------------------------
971 self.__update_address_info(self._PRW_other_address.GetData(as_instance = True))
972
973 #------------------------------------------------------------
975 self._LCTRL_addresses.Disable()
976
977 #------------------------------------------------------------
979 if unit is None:
980 self._LCTRL_addresses.remove_items_safely(max_tries = 3)
981 self._PRW_other_address.SetText(value = '', data = None)
982 self.__update_address_info(None)
983 self._TCTRL_org_unit_details.SetValue('')
984 return
985
986 unit = self._PRW_org_unit.GetData(as_instance = True)
987 adr = unit.address
988 if adr is None:
989 self._LCTRL_addresses.remove_items_safely(max_tries = 3)
990 self._PRW_other_address.SetText(value = '', data = None)
991 self.__update_address_info(None)
992 else:
993 self.__populate_address_list(addresses = [adr])
994 self._PRW_other_address.SetData(data = adr['pk_address'])
995 self.__update_address_info(adr)
996
997 name = '%s @ %s' % (unit['unit'], unit['organization'])
998 self._TCTRL_final_name.SetValue(name)
999 self._TCTRL_org_unit_details.SetValue('\n'.join(unit.format(with_comms = True)))
1000 self.Layout()
1001
1002 #------------------------------------------------------------
1003 #------------------------------------------------------------
1005 event.Skip()
1006 name, addresses, tt, unit = self._LCTRL_candidates.get_selected_item_data(only_one = True)
1007 self.__populate_address_list(addresses = addresses)
1008 if unit is None:
1009 self._PRW_org_unit.SetText(value = '', data = None)
1010 self._TCTRL_org_unit_details.SetValue('')
1011 else:
1012 self._PRW_org_unit.SetData(data = unit['pk_org_unit'])
1013 self._TCTRL_org_unit_details.SetValue('\n'.join(unit.format(with_comms = True)))
1014 self._TCTRL_final_name.SetValue(name.strip())
1015 self._LBL_final_name.SetLabel(name.strip())
1016
1017 #------------------------------------------------------------
1019 evt.Skip()
1020 adr = self._LCTRL_addresses.get_selected_item_data(only_one = True)
1021 self._PRW_other_address.address = adr
1022 self.__update_address_info(adr)
1023
1024 #------------------------------------------------------------
1025 #------------------------------------------------------------
1029
1030 #------------------------------------------------------------
1035
1036 #------------------------------------------------------------
1044
1045 #------------------------------------------------------------
1049
1050 patient = property(lambda x:x, _set_patient)
1051
1052 #------------------------------------------------------------
1054 return self._TCTRL_final_name.GetValue().strip()
1055
1056 name = property(_get_name, lambda x:x)
1057
1058 #------------------------------------------------------------
1060 return self._PRW_other_address.address
1061
1062 address = property(_get_address, lambda x:x)
1063
1064 #============================================================
1065 # main
1066 #------------------------------------------------------------
1067 if __name__ == '__main__':
1068
1069 gmI18N.activate_locale()
1070 gmI18N.install_domain(domain = 'gnumed')
1071
1072 #----------------------------------------
1074 app = wx.PyWidgetTester(size = (400, 300))
1075 pnl = cFormTemplateEAPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4))
1076 app.frame.Show(True)
1077 app.MainLoop()
1078 return
1079 #----------------------------------------
1080 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'):
1081 test_cFormTemplateEAPnl()
1082
1083 #============================================================
1084
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Thu Jul 23 01:55:31 2020 | http://epydoc.sourceforge.net |