| 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 if len(forms) == 0:
199 return True
200
201 no_of_printables = 0
202 for form in forms:
203 no_of_printables += len(form.final_output_filenames)
204
205 if no_of_printables == 0:
206 return True
207
208 soap_lines = []
209
210 #-----------------------------
211 def save_soap(soap=None):
212 if episode_name is None:
213 return
214 if soap.strip() == '':
215 return
216 pat = gmPerson.gmCurrentPatient()
217 emr = pat.emr
218 epi = emr.add_episode(episode_name = episode_name, is_open = False)
219 emr.add_clin_narrative (
220 soap_cat = None,
221 note = soap,
222 episode = epi
223 )
224
225 #-----------------------------
226 def archive_forms(episode_name=None, comment=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 comment = comment
250 )
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 printed = gmPrinting.print_files(filenames = files2print, jobtype = jobtype)
266 if not printed:
267 gmGuiHelpers.gm_show_error (
268 aMessage = _('Error printing documents.'),
269 aTitle = _('Printing [%s]') % jobtype
270 )
271 return False
272 soap_lines.append(_('Printed: %s') % ', '.join(form_names))
273 return True
274
275 #-----------------------------
276 def export_forms(remote_print=False):
277 pat = gmPerson.gmCurrentPatient()
278 return pat.export_area.add_forms(forms = forms, designation = gmTools.bool2subst(remote_print, 'print', None, None))
279
280 #-----------------------------
281 if parent is None:
282 parent = wx.GetApp().GetTopWindow()
283
284 if jobtype is None:
285 jobtype = 'generic_document'
286
287 dlg = cFormDisposalDlg(parent, -1)
288 dlg.forms = forms
289 dlg.progress_note = progress_note
290 dlg.episode_name = episode_name
291 action_code = dlg.ShowModal()
292
293 if action_code == wx.ID_CANCEL:
294 dlg.Destroy()
295 return True
296
297 forms = dlg._LCTRL_forms.get_item_data()
298 if len(forms) == 0:
299 dlg.Destroy()
300 return True
301
302 progress_note = dlg.progress_note
303 episode_name = dlg._PRW_episode.GetValue().strip()
304 if episode_name == '':
305 episode_name = None
306 also_export = dlg._CHBOX_export.GetValue()
307 dlg.Destroy()
308
309 if action_code == _ID_FORM_DISPOSAL_ARCHIVE_ONLY:
310 success = archive_forms(episode_name = episode_name, comment = progress_note)
311 if not success:
312 return False
313 if progress_note != '':
314 soap_lines.insert(0, progress_note)
315 if len(soap_lines) > 0:
316 save_soap(soap = '\n'.join(soap_lines))
317 return True
318
319 if action_code == _ID_FORM_DISPOSAL_EXPORT_ONLY:
320 success = export_forms()
321 if not success:
322 return False
323 if progress_note != '':
324 soap_lines.insert(0, progress_note)
325 if len(soap_lines) > 0:
326 save_soap(soap = '\n'.join(soap_lines))
327 return True
328
329 success = False
330 if action_code == _ID_FORM_DISPOSAL_PRINT:
331 success = print_forms()
332 if episode_name is not None:
333 archive_forms(episode_name = episode_name, comment = progress_note)
334 if also_export:
335 export_forms()
336
337 elif action_code == _ID_FORM_DISPOSAL_REMOTE_PRINT:
338 success = export_forms(remote_print = True)
339 if episode_name is not None:
340 archive_forms(episode_name = episode_name, comment = progress_note)
341
342 if not success:
343 return False
344
345 if progress_note != '':
346 soap_lines.insert(0, progress_note)
347 if len(soap_lines) > 0:
348 save_soap(soap = '\n'.join(soap_lines))
349
350 return True
351
352 #============================================================
353 from Gnumed.wxGladeWidgets import wxgFormDisposalDlg
354
356
358
359 wxgFormDisposalDlg.wxgFormDisposalDlg.__init__(self, *args, **kwargs)
360
361 self.__init_ui()
362
363 #--------------------------------------------------------
364 # properties
365 #--------------------------------------------------------
369
370 message = property(lambda x:x, _set_msg)
371
372 #--------------------------------------------------------
374 items = [ f.template['name_long'] for f in forms ]
375 self._LCTRL_forms.set_string_items(items)
376 self._LCTRL_forms.set_data(forms)
377
378 forms = property(lambda x:x, _set_forms)
379
380 #--------------------------------------------------------
382 return self._TCTRL_soap.GetValue().strip()
383
388
389 progress_note = property(_get_note, _set_note)
390
391 #--------------------------------------------------------
393 return self._PRW_episode.GetValue().strip()
394
399
400 episode_name = property(_get_episode_name, _set_episode_name)
401
402 #--------------------------------------------------------
403 # internal helpers
404 #--------------------------------------------------------
407 #self._CHBOX_export.SetValue(False)
408 #--------------------------------------------------------
409 # event handlers
410 #--------------------------------------------------------
413 #--------------------------------------------------------
416 #--------------------------------------------------------
419 #--------------------------------------------------------
422 #--------------------------------------------------------
438 #--------------------------------------------------------
442
443 #============================================================
444 # form template management
445 #------------------------------------------------------------
447 ea = cFormTemplateEAPnl(parent, -1)
448 ea.data = template
449 ea.mode = gmTools.coalesce(template, 'new', 'edit')
450 dlg = gmEditArea.cGenericEditAreaDlg2(parent, -1, edit_area = ea, single_entry = single_entry)
451 dlg.SetTitle(gmTools.coalesce(template, _('Adding new form template'), _('Editing form template')))
452 if dlg.ShowModal() == wx.ID_OK:
453 dlg.Destroy()
454 return True
455 dlg.Destroy()
456 return False
457
458 #------------------------------------------------------------
459 -def manage_form_templates(parent=None, template_types=None, active_only=False, excluded_types=None, msg=None):
460
461 if parent is None:
462 parent = wx.GetApp().GetTopWindow()
463
464 #-------------------------
465 def edit(template=None):
466 return edit_template(parent = parent, template = template)
467 #-------------------------
468 def delete(template):
469 delete = gmGuiHelpers.gm_show_question (
470 aTitle = _('Deleting form template.'),
471 aMessage = _(
472 'Are you sure you want to delete\n'
473 'the following form template ?\n\n'
474 ' "%s (%s)"\n\n'
475 'You can only delete templates which\n'
476 'have not yet been used to generate\n'
477 'any forms from.'
478 ) % (template['name_long'], template['external_version'])
479 )
480 if delete:
481 # FIXME: make this a priviledged operation ?
482 gmForms.delete_form_template(template = template)
483 return True
484 return False
485 #-------------------------
486 def refresh(lctrl):
487 templates = gmForms.get_form_templates(active_only = active_only, template_types = template_types, excluded_types = excluded_types)
488 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ])
489 lctrl.set_data(data = templates)
490 #-------------------------
491 template = gmListWidgets.get_choices_from_list (
492 parent = parent,
493 msg = msg,
494 caption = _('Select letter or form template.'),
495 columns = [_('Template'), _('Version'), _('Type')],
496 edit_callback = edit,
497 new_callback = edit,
498 delete_callback = delete,
499 refresh_callback = refresh,
500 single_selection = True
501 )
502
503 return template
504
505 #------------------------------------------------------------
506 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl
507
508 -class cFormTemplateEAPnl(wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl, gmEditArea.cGenericEditAreaMixin):
509
511
512 try:
513 data = kwargs['template']
514 del kwargs['template']
515 except KeyError:
516 data = None
517
518 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs)
519 gmEditArea.cGenericEditAreaMixin.__init__(self)
520
521 self.full_filename = None
522
523 self.mode = 'new'
524 self.data = data
525 if data is not None:
526 self.mode = 'edit'
527
528 self.__init_ui()
529 #----------------------------------------------------------------
531 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider()
532 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider()
533 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider()
534 #----------------------------------------------------------------
535 # generic Edit Area mixin API
536 #----------------------------------------------------------------
538
539 validity = True
540
541 # self._TCTRL_filename
542 self.display_tctrl_as_valid(tctrl = self._TCTRL_filename, valid = True)
543 fname = self._TCTRL_filename.GetValue().strip()
544 # 1) new template: file must exist
545 if self.data is None:
546 try:
547 open(fname, 'r').close()
548 except:
549 validity = False
550 self.display_tctrl_as_valid(tctrl = self._TCTRL_filename, valid = False)
551 self.status_message = _('You must select a template file before saving.')
552 self._TCTRL_filename.SetFocus()
553 # 2) existing template
554 # - empty = no change
555 # - does not exist: name change in DB field
556 # - does exist: reload from filesystem
557
558 # self._PRW_instance_type
559 if self._PRW_instance_type.GetValue().strip() == '':
560 validity = False
561 self._PRW_instance_type.display_as_valid(False)
562 self.status_message = _('You must enter a type for documents created with this template.')
563 self._PRW_instance_type.SetFocus()
564 else:
565 self._PRW_instance_type.display_as_valid(True)
566
567 # self._PRW_template_type
568 if self._PRW_template_type.GetData() is None:
569 validity = False
570 self._PRW_template_type.display_as_valid(False)
571 self.status_message = _('You must enter a type for this template.')
572 self._PRW_template_type.SetFocus()
573 else:
574 self._PRW_template_type.display_as_valid(True)
575
576 # self._TCTRL_external_version
577 if self._TCTRL_external_version.GetValue().strip() == '':
578 validity = False
579 self.display_tctrl_as_valid(tctrl = self._TCTRL_external_version, valid = False)
580 self.status_message = _('You must enter a version for this template.')
581 self._TCTRL_external_version.SetFocus()
582 else:
583 self.display_tctrl_as_valid(tctrl = self._TCTRL_external_version, valid = True)
584
585 # self._PRW_name_short
586 if self._PRW_name_short.GetValue().strip() == '':
587 validity = False
588 self._PRW_name_short.display_as_valid(False)
589 self.status_message = _('Missing short name for template.')
590 self._PRW_name_short.SetFocus()
591 else:
592 self._PRW_name_short.display_as_valid(True)
593
594 # self._PRW_name_long
595 if self._PRW_name_long.GetValue().strip() == '':
596 validity = False
597 self._PRW_name_long.display_as_valid(False)
598 self.status_message = _('Missing long name for template.')
599 self._PRW_name_long.SetFocus()
600 else:
601 self._PRW_name_long.display_as_valid(True)
602
603 return validity
604 #----------------------------------------------------------------
606 data = gmForms.create_form_template (
607 template_type = self._PRW_template_type.GetData(),
608 name_short = self._PRW_name_short.GetValue().strip(),
609 name_long = self._PRW_name_long.GetValue().strip()
610 )
611 data['external_version'] = self._TCTRL_external_version.GetValue()
612 data['instance_type'] = self._PRW_instance_type.GetValue().strip()
613 data['filename'] = os.path.split(self._TCTRL_filename.GetValue().strip())[1]
614 data['in_use'] = self._CHBOX_active.GetValue()
615 data['edit_after_substitution'] = self._CHBOX_editable.GetValue()
616 data['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()]
617 data.save()
618
619 data.update_template_from_file(filename = self._TCTRL_filename.GetValue().strip())
620
621 self.data = data
622 return True
623 #----------------------------------------------------------------
625 self.data['pk_template_type'] = self._PRW_template_type.GetData()
626 self.data['name_short'] = self._PRW_name_short.GetValue().strip()
627 self.data['name_long'] = self._PRW_name_long.GetValue().strip()
628 self.data['external_version'] = self._TCTRL_external_version.GetValue()
629 tmp = self._PRW_instance_type.GetValue().strip()
630 if tmp not in [self.data['instance_type'], self.data['l10n_instance_type']]:
631 self.data['instance_type'] = tmp
632 tmp = os.path.split(self._TCTRL_filename.GetValue().strip())[1]
633 if tmp != '':
634 self.data['filename'] = tmp
635 self.data['in_use'] = self._CHBOX_active.GetValue()
636 self.data['edit_after_substitution'] = self._CHBOX_editable.GetValue()
637 self.data['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()]
638 self.data.save()
639
640 fname = self._TCTRL_filename.GetValue().strip()
641 try:
642 open(fname, 'r').close()
643 self.data.update_template_from_file(filename = fname)
644 except:
645 pass # filename column already updated
646
647 return True
648 #----------------------------------------------------------------
650 self._PRW_name_long.SetText('')
651 self._PRW_name_short.SetText('')
652 self._TCTRL_external_version.SetValue('')
653 self._PRW_template_type.SetText('')
654 self._PRW_instance_type.SetText('')
655 self._TCTRL_filename.SetValue('')
656 self._CH_engine.SetSelection(0)
657 self._CHBOX_active.SetValue(True)
658 self._CHBOX_editable.SetValue(True)
659 self._LBL_status.SetLabel('')
660 self._BTN_export.Enable(False)
661
662 self._PRW_name_long.SetFocus()
663 #----------------------------------------------------------------
666 #----------------------------------------------------------------
668 self._PRW_name_long.SetText(self.data['name_long'])
669 self._PRW_name_short.SetText(self.data['name_short'])
670 self._TCTRL_external_version.SetValue(self.data['external_version'])
671 self._PRW_template_type.SetText(self.data['l10n_template_type'], data = self.data['pk_template_type'])
672 self._PRW_instance_type.SetText(self.data['l10n_instance_type'], data = self.data['instance_type'])
673 self._TCTRL_filename.SetValue(self.data['filename'])
674 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.data['engine']))
675 self._CHBOX_active.SetValue(self.data['in_use'])
676 self._CHBOX_editable.SetValue(self.data['edit_after_substitution'])
677 self._LBL_status.SetLabel(_('last modified %s by %s, internal revision [%s]') % (
678 gmDateTime.pydt_strftime(self.data['last_modified'], '%Y %B %d'),
679 self.data['modified_by'],
680 gmTools.coalesce(self.data['gnumed_revision'], '?')
681 ))
682
683 self._TCTRL_filename.Enable(True)
684 self._BTN_load.Enable(True)
685 self._BTN_export.Enable(True)
686
687 self._BTN_load.SetFocus()
688 #----------------------------------------------------------------
689 # event handlers
690 #----------------------------------------------------------------
720 #----------------------------------------------------------------
754
755 #============================================================
756 from Gnumed.wxGladeWidgets import wxgReceiverSelectionDlg
757
759
761 wxgReceiverSelectionDlg.wxgReceiverSelectionDlg.__init__(self, *args, **kwargs)
762 self.__patient = None
763 self.__init_ui()
764 self.__register_interests()
765
766 #------------------------------------------------------------
768 if self.__patient is None:
769 return
770
771 self._LCTRL_candidates.set_columns([_('Receiver'), _('Details')])
772 self._LCTRL_candidates.set_resize_column()
773 self._LCTRL_candidates.item_tooltip_callback = self._get_candidate_tooltip
774 self.__populate_candidates_list()
775
776 self._LCTRL_addresses.set_resize_column()
777 self._LCTRL_addresses.item_tooltip_callback = self._get_address_tooltip
778 self._LCTRL_addresses.activate_callback = self._on_address_activated_in_list
779 adrs = self.__patient.get_addresses()
780 self.__populate_address_list(addresses = adrs)
781
782 self._TCTRL_final_name.SetValue(self.__patient['description'].strip())
783
784 self.Layout()
785
786 #------------------------------------------------------------
788 self._TCTRL_final_name.add_callback_on_modified(callback = self._on_final_name_modified)
789 self._PRW_other_address.add_callback_on_selection(self._on_address_selected_in_PRW)
790 self._PRW_org_unit.add_callback_on_set_focus(self._on_entering_org_unit_PRW)
791 self._PRW_org_unit.add_callback_on_selection(self._on_org_unit_selected_in_PRW)
792
793 #------------------------------------------------------------
795
796 list_items = [[_('Patient'), self.__patient['description_gender'].strip()]]
797 list_data = [(self.__patient['description'].strip(), self.__patient.get_addresses(), '', None)]
798
799 candidate_type = _('Emergency contact')
800 if self.__patient['emergency_contact'] is not None:
801 name = self.__patient['emergency_contact'].strip()
802 list_items.append([candidate_type, name])
803 list_data.append((name, [], '', None))
804 contact = self.__patient.emergency_contact_in_database
805 if contact is not None:
806 list_items.append([candidate_type, contact['description_gender']])
807 list_data.append((contact['description'].strip(), contact.get_addresses(), '', None))
808
809 candidate_type = _('Primary doctor')
810 prov = self.__patient.primary_provider
811 if prov is not None:
812 ident = prov.identity
813 list_items.append([candidate_type, '%s: %s' % (prov['short_alias'], ident['description_gender'])])
814 list_data.append((ident['description'].strip(), ident.get_addresses(), _('in-praxis primary provider'), None))
815
816 candidate_type = _('This praxis')
817 branches = gmPraxis.get_praxis_branches(order_by = 'branch')
818 for branch in branches:
819 adr = branch.address
820 if adr is None:
821 continue
822 list_items.append([candidate_type, '%s @ %s' % (branch['branch'], branch['praxis'])])
823 list_data.append(('%s @ %s' % (branch['branch'], branch['praxis']), [adr], branch.format(), None))
824 del branches
825
826 candidate_type = _('External care')
827 cares = gmExternalCare.get_external_care_items(pk_identity = self.__patient.ID)
828 for care in cares:
829 details = '%s%s@%s (%s)' % (
830 gmTools.coalesce(care['provider'], '', '%s: '),
831 care['unit'],
832 care['organization'],
833 care['issue']
834 )
835 name = ('%s%s' % (
836 gmTools.coalesce(care['provider'], '', '%s, '),
837 '%s @ %s' % (care['unit'], care['organization'])
838 )).strip()
839 org_unit = care.org_unit
840 adr = org_unit.address
841 if adr is None:
842 addresses = []
843 else:
844 addresses = [adr]
845 list_items.append([candidate_type, details])
846 tt = '\n'.join(care.format(with_health_issue = True, with_address = True, with_comms = True))
847 list_data.append((name, addresses, tt, org_unit))
848 del cares
849
850 emr = self.__patient.emr
851
852 candidate_type = _('Hospital stay')
853 depts = emr.get_attended_hospitals_as_org_units()
854 for dept in depts:
855 adr = dept.address
856 if adr is None:
857 continue
858 list_items.append([candidate_type, '%s @ %s' % (dept['unit'], dept['organization'])])
859 list_data.append(('%s @ %s' % (dept['unit'], dept['organization']), [adr], '\n'.join(dept.format(with_comms = True)), dept))
860 del depts
861
862 candidate_type = _('Procedure')
863 proc_locs = emr.get_procedure_locations_as_org_units()
864 for proc_loc in proc_locs:
865 adr = proc_loc.address
866 if adr is None:
867 continue
868 list_items.append([candidate_type, '%s @ %s' % (proc_loc['unit'], proc_loc['organization'])])
869 list_data.append(('%s @ %s' % (proc_loc['unit'], proc_loc['organization']), [adr], '\n'.join(proc_loc.format(with_comms = True)), proc_loc))
870 del proc_locs
871
872 candidate_type = _('Lab')
873 labs = emr.get_labs_as_org_units()
874 for lab in labs:
875 adr = lab.address
876 if adr is None:
877 continue
878 list_items.append([candidate_type, '%s @ %s' % (lab['unit'], lab['organization'])])
879 list_data.append(('%s @ %s' % (lab['unit'], lab['organization']), [adr], '\n'.join(lab.format(with_comms = True)), lab))
880 del labs
881
882 candidate_type = _('Bill receiver')
883 bills = self.__patient.bills
884 adrs_seen = []
885 for bill in bills:
886 if bill['pk_receiver_address'] in adrs_seen:
887 continue
888 adr = bill.address
889 if adr is None:
890 continue
891 adrs_seen.append(bill['pk_receiver_address'])
892 details = '%s%s' % (bill['invoice_id'], gmDateTime.pydt_strftime(dt = bill['close_date'], format = ' (%Y %b %d)', none_str = ''))
893 list_items.append([candidate_type, details])
894 list_data.append(('', [adr], '\n'.join(adr.format()), None))
895
896 candidate_type = _('Document')
897 doc_folder = self.__patient.document_folder
898 doc_units = doc_folder.all_document_org_units
899 for doc_unit in doc_units:
900 adr = doc_unit.address
901 if adr is None:
902 continue
903 list_items.append([candidate_type, '%s @ %s' % (doc_unit['unit'], doc_unit['organization'])])
904 list_data.append(('%s @ %s' % (doc_unit['unit'], doc_unit['organization']), [adr], '\n'.join(doc_unit.format(with_comms = True)), doc_unit))
905 del doc_units
906
907 self._LCTRL_candidates.set_string_items(list_items)
908 self._LCTRL_candidates.set_column_widths()
909 self._LCTRL_candidates.set_data(list_data)
910
911 #------------------------------------------------------------
917
918 #------------------------------------------------------------
920 if adr is None:
921 self._LBL_address_details.SetLabel('')
922 self._LBL_final_country.SetLabel('')
923 self._LBL_final_region.SetLabel('')
924 self._LBL_final_zip.SetLabel('')
925 self._LBL_final_location.SetLabel('')
926 self._LBL_final_street.SetLabel('')
927 self._LBL_final_number.SetLabel('')
928 self.Layout()
929 return
930 self._LBL_address_details.SetLabel('\n'.join(adr.format()))
931 self._LBL_final_country.SetLabel(adr['l10n_country'])
932 self._LBL_final_region.SetLabel(adr['l10n_region'])
933 self._LBL_final_zip.SetLabel(adr['postcode'])
934 self._LBL_final_location.SetLabel('%s%s' % (adr['urb'], gmTools.coalesce(adr['suburb'], '', ' - %s')))
935 self._LBL_final_street.SetLabel(adr['street'])
936 self._LBL_final_number.SetLabel('%s%s' % (adr['number'], gmTools.coalesce(adr['subunit'], '', ' %s')))
937 self.Layout()
938
939 #------------------------------------------------------------
941 self._LCTRL_addresses.Enable()
942 cols = [_(u'Address')]
943 list_items = []
944 for a in addresses:
945 try:
946 list_items.append([a['l10n_address_type'], a.format(single_line = True, verbose = False, show_type = False)])
947 cols = [_('Type'), _('Address')]
948 except KeyError:
949 list_items.append([a.format(single_line = True, verbose = False, show_type = False)])
950 cols = [_('Address')]
951
952 self._LCTRL_addresses.set_columns(cols)
953 self._LCTRL_addresses.set_string_items(list_items)
954 self._LCTRL_candidates.set_column_widths()
955 self._LCTRL_addresses.set_data(addresses)
956 self._PRW_other_address.SetText(value = '', data = None)
957 self.__update_address_info(None)
958
959 #------------------------------------------------------------
961 return '\n'.join(adr.format(show_type = True))
962
963 #------------------------------------------------------------
964 #------------------------------------------------------------
967
968 #------------------------------------------------------------
970 self.__update_address_info(self._PRW_other_address.GetData(as_instance = True))
971
972 #------------------------------------------------------------
974 self._LCTRL_addresses.Disable()
975
976 #------------------------------------------------------------
978 if unit is None:
979 self._LCTRL_addresses.remove_items_safely(max_tries = 3)
980 self._PRW_other_address.SetText(value = '', data = None)
981 self.__update_address_info(None)
982 self._TCTRL_org_unit_details.SetValue('')
983 return
984
985 unit = self._PRW_org_unit.GetData(as_instance = True)
986 adr = unit.address
987 if adr is None:
988 self._LCTRL_addresses.remove_items_safely(max_tries = 3)
989 self._PRW_other_address.SetText(value = '', data = None)
990 self.__update_address_info(None)
991 else:
992 self.__populate_address_list(addresses = [adr])
993 self._PRW_other_address.SetData(data = adr['pk_address'])
994 self.__update_address_info(adr)
995
996 name = '%s @ %s' % (unit['unit'], unit['organization'])
997 self._TCTRL_final_name.SetValue(name)
998 self._TCTRL_org_unit_details.SetValue('\n'.join(unit.format(with_comms = True)))
999 self.Layout()
1000
1001 #------------------------------------------------------------
1002 #------------------------------------------------------------
1004 event.Skip()
1005 name, addresses, tt, unit = self._LCTRL_candidates.get_selected_item_data(only_one = True)
1006 self.__populate_address_list(addresses = addresses)
1007 if unit is None:
1008 self._PRW_org_unit.SetText(value = '', data = None)
1009 self._TCTRL_org_unit_details.SetValue('')
1010 else:
1011 self._PRW_org_unit.SetData(data = unit['pk_org_unit'])
1012 self._TCTRL_org_unit_details.SetValue('\n'.join(unit.format(with_comms = True)))
1013 self._TCTRL_final_name.SetValue(name.strip())
1014 self._LBL_final_name.SetLabel(name.strip())
1015
1016 #------------------------------------------------------------
1018 evt.Skip()
1019 adr = self._LCTRL_addresses.get_selected_item_data(only_one = True)
1020 self._PRW_other_address.address = adr
1021 self.__update_address_info(adr)
1022
1023 #------------------------------------------------------------
1024 #------------------------------------------------------------
1028
1029 #------------------------------------------------------------
1034
1035 #------------------------------------------------------------
1043
1044 #------------------------------------------------------------
1048
1049 patient = property(lambda x:x, _set_patient)
1050
1051 #------------------------------------------------------------
1053 return self._TCTRL_final_name.GetValue().strip()
1054
1055 name = property(_get_name, lambda x:x)
1056
1057 #------------------------------------------------------------
1059 return self._PRW_other_address.address
1060
1061 address = property(_get_address, lambda x:x)
1062
1063 #============================================================
1064 # main
1065 #------------------------------------------------------------
1066 if __name__ == '__main__':
1067
1068 gmI18N.activate_locale()
1069 gmI18N.install_domain(domain = 'gnumed')
1070
1071 #----------------------------------------
1073 app = wx.PyWidgetTester(size = (400, 300))
1074 pnl = cFormTemplateEAPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4))
1075 app.frame.Show(True)
1076 app.MainLoop()
1077 return
1078 #----------------------------------------
1079 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'):
1080 test_cFormTemplateEAPnl()
1081
1082 #============================================================
1083
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Sun Aug 19 01:55:20 2018 | http://epydoc.sourceforge.net |