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