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