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 199 if len(forms) == 0: 200 return True 201 202 no_of_printables = 0 203 for form in forms: 204 no_of_printables += len(form.final_output_filenames) 205 206 if no_of_printables == 0: 207 return True 208 209 soap_lines = [] 210 211 #----------------------------- 212 def save_soap(soap=None): 213 if episode_name is None: 214 return 215 if soap.strip() == '': 216 return 217 pat = gmPerson.gmCurrentPatient() 218 emr = pat.emr 219 epi = emr.add_episode(episode_name = episode_name, is_open = False) 220 emr.add_clin_narrative ( 221 soap_cat = None, 222 note = soap, 223 episode = epi 224 )225 #----------------------------- 226 def archive_forms(episode_name=None): 227 if episode_name is None: 228 epi = None # will ask for episode further down 229 else: 230 pat = gmPerson.gmCurrentPatient() 231 emr = pat.emr 232 epi = emr.add_episode(episode_name = episode_name, is_open = False) 233 234 for form in forms: 235 files2import = [] 236 files2import.extend(form.final_output_filenames) 237 files2import.extend(form.re_editable_filenames) 238 if len(files2import) == 0: 239 continue 240 save_files_as_new_document ( 241 parent = parent, 242 filenames = files2import, 243 document_type = form.template['instance_type'], 244 unlock_patient = False, 245 episode = epi, 246 review_as_normal = review_copy_as_normal, 247 reference = None, 248 pk_org_unit = gmPraxis.gmCurrentPraxisBranch()['pk_org_unit'] 249 ) 250 251 return True 252 #----------------------------- 253 def print_forms(): 254 # anything to do ? 255 files2print = [] 256 form_names = [] 257 for form in forms: 258 files2print.extend(form.final_output_filenames) 259 form_names.append('%s (%s)' % (form.template['name_long'], form.template['external_version'])) 260 if len(files2print) == 0: 261 return True 262 # print 263 printed = gmPrinting.print_files(filenames = files2print, jobtype = jobtype) 264 if not printed: 265 gmGuiHelpers.gm_show_error ( 266 aMessage = _('Error printing documents.'), 267 aTitle = _('Printing [%s]') % jobtype 268 ) 269 return False 270 soap_lines.append(_('Printed: %s') % ', '.join(form_names)) 271 return True 272 #----------------------------- 273 def export_forms(remote_print=False): 274 pat = gmPerson.gmCurrentPatient() 275 return pat.export_area.add_forms(forms = forms, designation = gmTools.bool2subst(remote_print, 'print', None, None)) 276 #----------------------------- 277 278 if parent is None: 279 parent = wx.GetApp().GetTopWindow() 280 281 if jobtype is None: 282 jobtype = 'generic_document' 283 284 dlg = cFormDisposalDlg(parent, -1) 285 dlg.forms = forms 286 dlg.progress_note = progress_note 287 dlg.episode_name = episode_name 288 action_code = dlg.ShowModal() 289 290 if action_code == wx.ID_CANCEL: 291 dlg.Destroy() 292 return True 293 294 forms = dlg._LCTRL_forms.get_item_data() 295 if len(forms) == 0: 296 dlg.Destroy() 297 return True 298 299 progress_note = dlg.progress_note 300 episode_name = dlg._PRW_episode.GetValue().strip() 301 if episode_name == '': 302 episode_name = None 303 also_export = dlg._CHBOX_export.GetValue() 304 dlg.Destroy() 305 306 success = False 307 if action_code == _ID_FORM_DISPOSAL_PRINT: 308 success = print_forms() 309 if episode_name is not None: 310 archive_forms(episode_name = episode_name) 311 if also_export: 312 export_forms() 313 314 if action_code == _ID_FORM_DISPOSAL_REMOTE_PRINT: 315 success = export_forms(remote_print = True) 316 if episode_name is not None: 317 archive_forms(episode_name = episode_name) 318 319 elif action_code == _ID_FORM_DISPOSAL_ARCHIVE_ONLY: 320 success = archive_forms(episode_name = episode_name) 321 322 elif action_code == _ID_FORM_DISPOSAL_EXPORT_ONLY: 323 success = export_forms() 324 325 if not success: 326 return False 327 328 if progress_note != '': 329 soap_lines.insert(0, progress_note) 330 if len(soap_lines) > 0: 331 save_soap(soap = '\n'.join(soap_lines)) 332 333 return True 334 335 #============================================================ 336 from Gnumed.wxGladeWidgets import wxgFormDisposalDlg 337339425 426 #============================================================ 427 # form template management 428 #------------------------------------------------------------341 342 wxgFormDisposalDlg.wxgFormDisposalDlg.__init__(self, *args, **kwargs) 343 344 self.__init_ui()345 346 #-------------------------------------------------------- 347 # properties 348 #-------------------------------------------------------- 352 353 message = property(lambda x:x, _set_msg) 354 355 #--------------------------------------------------------357 items = [ f.template['name_long'] for f in forms ] 358 self._LCTRL_forms.set_string_items(items) 359 self._LCTRL_forms.set_data(forms)360 361 forms = property(lambda x:x, _set_forms) 362 363 #--------------------------------------------------------365 return self._TCTRL_soap.GetValue().strip()366 371 372 progress_note = property(_get_note, _set_note) 373 374 #--------------------------------------------------------376 return self._PRW_episode.GetValue().strip()377 382 383 episode_name = property(_get_episode_name, _set_episode_name) 384 385 #-------------------------------------------------------- 386 # internal helpers 387 #-------------------------------------------------------- 390 #self._CHBOX_export.SetValue(False) 391 #-------------------------------------------------------- 392 # event handlers 393 #-------------------------------------------------------- 396 #-------------------------------------------------------- 399 #-------------------------------------------------------- 402 #-------------------------------------------------------- 405 #-------------------------------------------------------- 421 #--------------------------------------------------------430 ea = cFormTemplateEAPnl(parent, -1) 431 ea.data = template 432 ea.mode = gmTools.coalesce(template, 'new', 'edit') 433 dlg = gmEditArea.cGenericEditAreaDlg2(parent, -1, edit_area = ea, single_entry = single_entry) 434 dlg.SetTitle(gmTools.coalesce(template, _('Adding new form template'), _('Editing form template'))) 435 if dlg.ShowModal() == wx.ID_OK: 436 dlg.Destroy() 437 return True 438 dlg.Destroy() 439 return False440 441 #------------------------------------------------------------442 -def manage_form_templates(parent=None, template_types=None, active_only=False, excluded_types=None, msg=None):443 444 if parent is None: 445 parent = wx.GetApp().GetTopWindow() 446 447 #------------------------- 448 def edit(template=None): 449 return edit_template(parent = parent, template = template)450 #------------------------- 451 def delete(template): 452 delete = gmGuiHelpers.gm_show_question ( 453 aTitle = _('Deleting form template.'), 454 aMessage = _( 455 'Are you sure you want to delete\n' 456 'the following form template ?\n\n' 457 ' "%s (%s)"\n\n' 458 'You can only delete templates which\n' 459 'have not yet been used to generate\n' 460 'any forms from.' 461 ) % (template['name_long'], template['external_version']) 462 ) 463 if delete: 464 # FIXME: make this a priviledged operation ? 465 gmForms.delete_form_template(template = template) 466 return True 467 return False 468 #------------------------- 469 def refresh(lctrl): 470 templates = gmForms.get_form_templates(active_only = active_only, template_types = template_types, excluded_types = excluded_types) 471 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ]) 472 lctrl.set_data(data = templates) 473 #------------------------- 474 template = gmListWidgets.get_choices_from_list ( 475 parent = parent, 476 msg = msg, 477 caption = _('Select letter or form template.'), 478 columns = [_('Template'), _('Version'), _('Type')], 479 edit_callback = edit, 480 new_callback = edit, 481 delete_callback = delete, 482 refresh_callback = refresh, 483 single_selection = True 484 ) 485 486 return template 487 488 #------------------------------------------------------------ 489 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl 490491 -class cFormTemplateEAPnl(wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl, gmEditArea.cGenericEditAreaMixin):492737 738 #============================================================ 739 from Gnumed.wxGladeWidgets import wxgReceiverSelectionDlg 740494 495 try: 496 data = kwargs['template'] 497 del kwargs['template'] 498 except KeyError: 499 data = None 500 501 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs) 502 gmEditArea.cGenericEditAreaMixin.__init__(self) 503 504 self.full_filename = None 505 506 self.mode = 'new' 507 self.data = data 508 if data is not None: 509 self.mode = 'edit' 510 511 self.__init_ui()512 #----------------------------------------------------------------514 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider() 515 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider() 516 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider()517 #---------------------------------------------------------------- 518 # generic Edit Area mixin API 519 #----------------------------------------------------------------521 522 validity = True 523 524 # self._TCTRL_filename 525 self.display_tctrl_as_valid(tctrl = self._TCTRL_filename, valid = True) 526 fname = self._TCTRL_filename.GetValue().strip() 527 # 1) new template: file must exist 528 if self.data is None: 529 try: 530 open(fname, 'r').close() 531 except: 532 validity = False 533 self.display_tctrl_as_valid(tctrl = self._TCTRL_filename, valid = False) 534 self.status_message = _('You must select a template file before saving.') 535 self._TCTRL_filename.SetFocus() 536 # 2) existing template 537 # - empty = no change 538 # - does not exist: name change in DB field 539 # - does exist: reload from filesystem 540 541 # self._PRW_instance_type 542 if self._PRW_instance_type.GetValue().strip() == '': 543 validity = False 544 self._PRW_instance_type.display_as_valid(False) 545 self.status_message = _('You must enter a type for documents created with this template.') 546 self._PRW_instance_type.SetFocus() 547 else: 548 self._PRW_instance_type.display_as_valid(True) 549 550 # self._PRW_template_type 551 if self._PRW_template_type.GetData() is None: 552 validity = False 553 self._PRW_template_type.display_as_valid(False) 554 self.status_message = _('You must enter a type for this template.') 555 self._PRW_template_type.SetFocus() 556 else: 557 self._PRW_template_type.display_as_valid(True) 558 559 # self._TCTRL_external_version 560 if self._TCTRL_external_version.GetValue().strip() == '': 561 validity = False 562 self.display_tctrl_as_valid(tctrl = self._TCTRL_external_version, valid = False) 563 self.status_message = _('You must enter a version for this template.') 564 self._TCTRL_external_version.SetFocus() 565 else: 566 self.display_tctrl_as_valid(tctrl = self._TCTRL_external_version, valid = True) 567 568 # self._PRW_name_short 569 if self._PRW_name_short.GetValue().strip() == '': 570 validity = False 571 self._PRW_name_short.display_as_valid(False) 572 self.status_message = _('Missing short name for template.') 573 self._PRW_name_short.SetFocus() 574 else: 575 self._PRW_name_short.display_as_valid(True) 576 577 # self._PRW_name_long 578 if self._PRW_name_long.GetValue().strip() == '': 579 validity = False 580 self._PRW_name_long.display_as_valid(False) 581 self.status_message = _('Missing long name for template.') 582 self._PRW_name_long.SetFocus() 583 else: 584 self._PRW_name_long.display_as_valid(True) 585 586 return validity587 #----------------------------------------------------------------589 data = gmForms.create_form_template ( 590 template_type = self._PRW_template_type.GetData(), 591 name_short = self._PRW_name_short.GetValue().strip(), 592 name_long = self._PRW_name_long.GetValue().strip() 593 ) 594 data['external_version'] = self._TCTRL_external_version.GetValue() 595 data['instance_type'] = self._PRW_instance_type.GetValue().strip() 596 data['filename'] = os.path.split(self._TCTRL_filename.GetValue().strip())[1] 597 data['in_use'] = self._CHBOX_active.GetValue() 598 data['edit_after_substitution'] = self._CHBOX_editable.GetValue() 599 data['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 600 data.save() 601 602 data.update_template_from_file(filename = self._TCTRL_filename.GetValue().strip()) 603 604 self.data = data 605 return True606 #----------------------------------------------------------------608 self.data['pk_template_type'] = self._PRW_template_type.GetData() 609 self.data['name_short'] = self._PRW_name_short.GetValue().strip() 610 self.data['name_long'] = self._PRW_name_long.GetValue().strip() 611 self.data['external_version'] = self._TCTRL_external_version.GetValue() 612 tmp = self._PRW_instance_type.GetValue().strip() 613 if tmp not in [self.data['instance_type'], self.data['l10n_instance_type']]: 614 self.data['instance_type'] = tmp 615 tmp = os.path.split(self._TCTRL_filename.GetValue().strip())[1] 616 if tmp != '': 617 self.data['filename'] = tmp 618 self.data['in_use'] = self._CHBOX_active.GetValue() 619 self.data['edit_after_substitution'] = self._CHBOX_editable.GetValue() 620 self.data['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 621 self.data.save() 622 623 fname = self._TCTRL_filename.GetValue().strip() 624 try: 625 open(fname, 'r').close() 626 self.data.update_template_from_file(filename = fname) 627 except: 628 pass # filename column already updated 629 630 return True631 #----------------------------------------------------------------633 self._PRW_name_long.SetText('') 634 self._PRW_name_short.SetText('') 635 self._TCTRL_external_version.SetValue('') 636 self._PRW_template_type.SetText('') 637 self._PRW_instance_type.SetText('') 638 self._TCTRL_filename.SetValue('') 639 self._CH_engine.SetSelection(0) 640 self._CHBOX_active.SetValue(True) 641 self._CHBOX_editable.SetValue(True) 642 self._LBL_status.SetLabel('') 643 self._BTN_export.Enable(False) 644 645 self._PRW_name_long.SetFocus()646 #---------------------------------------------------------------- 649 #----------------------------------------------------------------651 self._PRW_name_long.SetText(self.data['name_long']) 652 self._PRW_name_short.SetText(self.data['name_short']) 653 self._TCTRL_external_version.SetValue(self.data['external_version']) 654 self._PRW_template_type.SetText(self.data['l10n_template_type'], data = self.data['pk_template_type']) 655 self._PRW_instance_type.SetText(self.data['l10n_instance_type'], data = self.data['instance_type']) 656 self._TCTRL_filename.SetValue(self.data['filename']) 657 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.data['engine'])) 658 self._CHBOX_active.SetValue(self.data['in_use']) 659 self._CHBOX_editable.SetValue(self.data['edit_after_substitution']) 660 self._LBL_status.SetLabel(_('last modified %s by %s, internal revision [%s]') % ( 661 gmDateTime.pydt_strftime(self.data['last_modified'], '%Y %B %d'), 662 self.data['modified_by'], 663 gmTools.coalesce(self.data['gnumed_revision'], '?') 664 )) 665 666 self._TCTRL_filename.Enable(True) 667 self._BTN_load.Enable(True) 668 self._BTN_export.Enable(True) 669 670 self._BTN_load.SetFocus()671 #---------------------------------------------------------------- 672 # event handlers 673 #---------------------------------------------------------------- 703 #----------------------------------------------------------------7421044 1045 #============================================================ 1046 # main 1047 #------------------------------------------------------------ 1048 if __name__ == '__main__': 1049 1050 gmI18N.activate_locale() 1051 gmI18N.install_domain(domain = 'gnumed') 1052 1053 #----------------------------------------744 wxgReceiverSelectionDlg.wxgReceiverSelectionDlg.__init__(self, *args, **kwargs) 745 self.__patient = None 746 self.__init_ui() 747 self.__register_interests()748 749 #------------------------------------------------------------751 if self.__patient is None: 752 return 753 754 self._LCTRL_candidates.set_columns([_('Receiver'), _('Details')]) 755 self._LCTRL_candidates.set_resize_column() 756 self._LCTRL_candidates.item_tooltip_callback = self._get_candidate_tooltip 757 self.__populate_candidates_list() 758 759 self._LCTRL_addresses.set_resize_column() 760 self._LCTRL_addresses.item_tooltip_callback = self._get_address_tooltip 761 self._LCTRL_addresses.activate_callback = self._on_address_activated_in_list 762 adrs = self.__patient.get_addresses() 763 self.__populate_address_list(addresses = adrs) 764 765 self._TCTRL_final_name.SetValue(self.__patient['description'].strip()) 766 767 self.Layout()768 769 #------------------------------------------------------------771 self._TCTRL_final_name.add_callback_on_modified(callback = self._on_final_name_modified) 772 self._PRW_other_address.add_callback_on_selection(self._on_address_selected_in_PRW) 773 self._PRW_org_unit.add_callback_on_set_focus(self._on_entering_org_unit_PRW) 774 self._PRW_org_unit.add_callback_on_selection(self._on_org_unit_selected_in_PRW)775 776 #------------------------------------------------------------778 779 list_items = [[_('Patient'), self.__patient['description_gender'].strip()]] 780 list_data = [(self.__patient['description'].strip(), self.__patient.get_addresses(), '', None)] 781 782 candidate_type = _('Emergency contact') 783 if self.__patient['emergency_contact'] is not None: 784 name = self.__patient['emergency_contact'].strip() 785 list_items.append([candidate_type, name]) 786 list_data.append((name, [], '', None)) 787 contact = self.__patient.emergency_contact_in_database 788 if contact is not None: 789 list_items.append([candidate_type, contact['description_gender']]) 790 list_data.append((contact['description'].strip(), contact.get_addresses(), '', None)) 791 792 candidate_type = _('Primary doctor') 793 prov = self.__patient.primary_provider 794 if prov is not None: 795 ident = prov.identity 796 list_items.append([candidate_type, '%s: %s' % (prov['short_alias'], ident['description_gender'])]) 797 list_data.append((ident['description'].strip(), ident.get_addresses(), _('in-praxis primary provider'), None)) 798 799 candidate_type = _('This praxis') 800 branches = gmPraxis.get_praxis_branches(order_by = 'branch') 801 for branch in branches: 802 adr = branch.address 803 if adr is None: 804 continue 805 list_items.append([candidate_type, '%s @ %s' % (branch['branch'], branch['praxis'])]) 806 list_data.append(('%s @ %s' % (branch['branch'], branch['praxis']), [adr], branch.format(), None)) 807 del branches 808 809 candidate_type = _('External care') 810 cares = gmExternalCare.get_external_care_items(pk_identity = self.__patient.ID) 811 for care in cares: 812 details = '%s%s@%s (%s)' % ( 813 gmTools.coalesce(care['provider'], '', '%s: '), 814 care['unit'], 815 care['organization'], 816 care['issue'] 817 ) 818 name = ('%s%s' % ( 819 gmTools.coalesce(care['provider'], '', '%s, '), 820 '%s @ %s' % (care['unit'], care['organization']) 821 )).strip() 822 org_unit = care.org_unit 823 adr = org_unit.address 824 if adr is None: 825 addresses = [] 826 else: 827 addresses = [adr] 828 list_items.append([candidate_type, details]) 829 tt = '\n'.join(care.format(with_health_issue = True, with_address = True, with_comms = True)) 830 list_data.append((name, addresses, tt, org_unit)) 831 del cares 832 833 emr = self.__patient.emr 834 835 candidate_type = _('Hospital stay') 836 depts = emr.get_attended_hospitals_as_org_units() 837 for dept in depts: 838 adr = dept.address 839 if adr is None: 840 continue 841 list_items.append([candidate_type, '%s @ %s' % (dept['unit'], dept['organization'])]) 842 list_data.append(('%s @ %s' % (dept['unit'], dept['organization']), [adr], '\n'.join(dept.format(with_comms = True)), dept)) 843 del depts 844 845 candidate_type = _('Procedure') 846 proc_locs = emr.get_procedure_locations_as_org_units() 847 for proc_loc in proc_locs: 848 adr = proc_loc.address 849 if adr is None: 850 continue 851 list_items.append([candidate_type, '%s @ %s' % (proc_loc['unit'], proc_loc['organization'])]) 852 list_data.append(('%s @ %s' % (proc_loc['unit'], proc_loc['organization']), [adr], '\n'.join(proc_loc.format(with_comms = True)), proc_loc)) 853 del proc_locs 854 855 candidate_type = _('Lab') 856 labs = emr.get_labs_as_org_units() 857 for lab in labs: 858 adr = lab.address 859 if adr is None: 860 continue 861 list_items.append([candidate_type, '%s @ %s' % (lab['unit'], lab['organization'])]) 862 list_data.append(('%s @ %s' % (lab['unit'], lab['organization']), [adr], '\n'.join(lab.format(with_comms = True)), lab)) 863 del labs 864 865 candidate_type = _('Bill receiver') 866 bills = self.__patient.bills 867 adrs_seen = [] 868 for bill in bills: 869 if bill['pk_receiver_address'] in adrs_seen: 870 continue 871 adr = bill.address 872 if adr is None: 873 continue 874 adrs_seen.append(bill['pk_receiver_address']) 875 details = '%s%s' % (bill['invoice_id'], gmDateTime.pydt_strftime(dt = bill['close_date'], format = ' (%Y %b %d)', none_str = '')) 876 list_items.append([candidate_type, details]) 877 list_data.append(('', [adr], '\n'.join(adr.format()), None)) 878 879 candidate_type = _('Document') 880 doc_folder = self.__patient.document_folder 881 doc_units = doc_folder.all_document_org_units 882 for doc_unit in doc_units: 883 adr = doc_unit.address 884 if adr is None: 885 continue 886 list_items.append([candidate_type, '%s @ %s' % (doc_unit['unit'], doc_unit['organization'])]) 887 list_data.append(('%s @ %s' % (doc_unit['unit'], doc_unit['organization']), [adr], '\n'.join(doc_unit.format(with_comms = True)), doc_unit)) 888 del doc_units 889 890 self._LCTRL_candidates.set_string_items(list_items) 891 self._LCTRL_candidates.set_column_widths() 892 self._LCTRL_candidates.set_data(list_data)893 894 #------------------------------------------------------------ 900 901 #------------------------------------------------------------903 if adr is None: 904 self._LBL_address_details.SetLabel('') 905 self._LBL_final_country.SetLabel('') 906 self._LBL_final_region.SetLabel('') 907 self._LBL_final_zip.SetLabel('') 908 self._LBL_final_location.SetLabel('') 909 self._LBL_final_street.SetLabel('') 910 self._LBL_final_number.SetLabel('') 911 self.Layout() 912 return 913 self._LBL_address_details.SetLabel('\n'.join(adr.format())) 914 self._LBL_final_country.SetLabel(adr['l10n_country']) 915 self._LBL_final_region.SetLabel(adr['l10n_region']) 916 self._LBL_final_zip.SetLabel(adr['postcode']) 917 self._LBL_final_location.SetLabel('%s%s' % (adr['urb'], gmTools.coalesce(adr['suburb'], '', ' - %s'))) 918 self._LBL_final_street.SetLabel(adr['street']) 919 self._LBL_final_number.SetLabel('%s%s' % (adr['number'], gmTools.coalesce(adr['subunit'], '', ' %s'))) 920 self.Layout()921 922 #------------------------------------------------------------924 self._LCTRL_addresses.Enable() 925 list_items = [] 926 for a in addresses: 927 try: 928 list_items.append([a['l10n_address_type'], a.format(single_line = True, verbose = False, show_type = False)]) 929 cols = [_('Type'), _('Address')] 930 except KeyError: 931 list_items.append([a.format(single_line = True, verbose = False, show_type = False)]) 932 cols = [_('Address')] 933 934 self._LCTRL_addresses.set_columns(cols) 935 self._LCTRL_addresses.set_string_items(list_items) 936 self._LCTRL_candidates.set_column_widths() 937 self._LCTRL_addresses.set_data(addresses) 938 self._PRW_other_address.SetText(value = '', data = None) 939 self.__update_address_info(None)940 941 #------------------------------------------------------------943 return '\n'.join(adr.format(show_type = True))944 945 #------------------------------------------------------------ 946 #------------------------------------------------------------ 949 950 #------------------------------------------------------------952 self.__update_address_info(self._PRW_other_address.GetData(as_instance = True))953 954 #------------------------------------------------------------956 self._LCTRL_addresses.Disable()957 958 #------------------------------------------------------------960 if unit is None: 961 self._LCTRL_addresses.remove_items_safely(max_tries = 3) 962 self._PRW_other_address.SetText(value = '', data = None) 963 self.__update_address_info(None) 964 self._TCTRL_org_unit_details.SetValue('') 965 return 966 967 unit = self._PRW_org_unit.GetData(as_instance = True) 968 adr = unit.address 969 if adr is None: 970 self._LCTRL_addresses.remove_items_safely(max_tries = 3) 971 self._PRW_other_address.SetText(value = '', data = None) 972 self.__update_address_info(None) 973 else: 974 self.__populate_address_list(addresses = [adr]) 975 self._PRW_other_address.SetData(data = adr['pk_address']) 976 self.__update_address_info(adr) 977 978 name = '%s @ %s' % (unit['unit'], unit['organization']) 979 self._TCTRL_final_name.SetValue(name) 980 self._TCTRL_org_unit_details.SetValue('\n'.join(unit.format(with_comms = True))) 981 self.Layout()982 983 #------------------------------------------------------------ 984 #------------------------------------------------------------986 event.Skip() 987 name, addresses, tt, unit = self._LCTRL_candidates.get_selected_item_data(only_one = True) 988 self.__populate_address_list(addresses = addresses) 989 if unit is None: 990 self._PRW_org_unit.SetText(value = '', data = None) 991 self._TCTRL_org_unit_details.SetValue('') 992 else: 993 self._PRW_org_unit.SetData(data = unit['pk_org_unit']) 994 self._TCTRL_org_unit_details.SetValue('\n'.join(unit.format(with_comms = True))) 995 self._TCTRL_final_name.SetValue(name.strip()) 996 self._LBL_final_name.SetLabel(name.strip())997 998 #------------------------------------------------------------1000 evt.Skip() 1001 adr = self._LCTRL_addresses.get_selected_item_data(only_one = True) 1002 self._PRW_other_address.address = adr 1003 self.__update_address_info(adr)1004 1005 #------------------------------------------------------------ 1006 #------------------------------------------------------------ 1010 1011 #------------------------------------------------------------ 1016 1017 #------------------------------------------------------------ 1025 1026 #------------------------------------------------------------ 1030 1031 patient = property(lambda x:x, _set_patient) 1032 1033 #------------------------------------------------------------1035 return self._TCTRL_final_name.GetValue().strip()1036 1037 name = property(_get_name, lambda x:x) 1038 1039 #------------------------------------------------------------1041 return self._PRW_other_address.address1042 1043 address = property(_get_address, lambda x:x)1055 app = wx.PyWidgetTester(size = (400, 300)) 1056 pnl = cFormTemplateEAPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4)) 1057 app.frame.Show(True) 1058 app.MainLoop() 1059 return1060 #---------------------------------------- 1061 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'): 1062 test_cFormTemplateEAPnl() 1063 1064 #============================================================ 1065
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Thu May 10 01:55:20 2018 | http://epydoc.sourceforge.net |