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 OOo82 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 True131 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 None191 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 354356442 443 #============================================================ 444 # form template management 445 #------------------------------------------------------------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 #--------------------------------------------------------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 False457 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 507508 -class cFormTemplateEAPnl(wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl, gmEditArea.cGenericEditAreaMixin):509754 755 #============================================================ 756 from Gnumed.wxGladeWidgets import wxgReceiverSelectionDlg 757511 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 validity604 #----------------------------------------------------------------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 True623 #----------------------------------------------------------------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 True648 #----------------------------------------------------------------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 #----------------------------------------------------------------7591062 1063 #============================================================ 1064 # main 1065 #------------------------------------------------------------ 1066 if __name__ == '__main__': 1067 1068 gmI18N.activate_locale() 1069 gmI18N.install_domain(domain = 'gnumed') 1070 1071 #----------------------------------------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.address1060 1061 address = property(_get_address, lambda x:x)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 return1078 #---------------------------------------- 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 |