Trees | Indices | Help |
|
---|
|
1 """GNUmed form/letter handling widgets. 2 """ 3 #================================================================ 4 # $Source: /cvsroot/gnumed/gnumed/gnumed/client/wxpython/gmFormWidgets.py,v $ 5 # $Id: gmFormWidgets.py,v 1.16 2010/01/09 18:30:10 ncq Exp $ 6 __version__ = "$Revision: 1.16 $" 7 __author__ = "Karsten Hilbert <Karsten.Hilbert@gmx.net>" 8 9 import os.path, sys, logging 10 11 12 import wx 13 14 15 if __name__ == '__main__': 16 sys.path.insert(0, '../../') 17 from Gnumed.pycommon import gmI18N, gmTools, gmDispatcher, gmPrinting 18 from Gnumed.business import gmForms, gmPerson 19 from Gnumed.wxpython import gmGuiHelpers, gmListWidgets, gmMacro 20 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl, wxgFormTemplateEditAreaDlg 21 22 23 _log = logging.getLogger('gm.ui') 24 _log.info(__version__) 25 26 #============================================================ 27 # convenience functions 28 #============================================================29 -def print_doc_from_template(parent=None, jobtype=None, keep_a_copy=True, episode=None, cleanup=True):30 31 if parent is None: 32 parent = wx.GetApp().GetTopWindow() 33 34 # 1) get template 35 template = manage_form_templates(parent = parent) 36 if template is None: 37 gmDispatcher.send(signal = 'statustext', msg = _('No document template selected.')) 38 return None 39 40 if template['engine'] == u'O': 41 return print_doc_from_ooo_template(template = template) 42 43 wx.BeginBusyCursor() 44 45 # 2) process template 46 doc = template.instantiate() 47 ph = gmMacro.gmPlaceholderHandler() 48 #ph.debug = True 49 doc.substitute_placeholders(data_source = ph) 50 doc.edit() 51 printable_file = doc.generate_output(cleanup = cleanup) 52 if cleanup: 53 doc.cleanup() 54 if printable_file is None: 55 wx.EndBusyCursor() 56 gmGuiHelpers.gm_show_error ( 57 aMessage = _('Error creating printable document.'), 58 aTitle = _('Printing document') 59 ) 60 return False 61 62 # 3) print template 63 if jobtype is None: 64 jobtype = 'generic_document' 65 66 printed = gmPrinting.print_file_by_shellscript(filename = printable_file, jobtype = jobtype) 67 if not printed: 68 wx.EndBusyCursor() 69 gmGuiHelpers.gm_show_error ( 70 aMessage = _('Error printing document (%s).') % jobtype, 71 aTitle = _('Printing document') 72 ) 73 return False 74 75 pat = gmPerson.gmCurrentPatient() 76 emr = pat.get_emr() 77 if episode is None: 78 episode = emr.add_episode(episode_name = 'administration', is_open = False) 79 emr.add_clin_narrative ( 80 soap_cat = None, 81 note = _('%s printed from template [%s - %s]') % (jobtype, template['name_long'], template['external_version']), 82 episode = episode 83 ) 84 85 # 4) keep a copy 86 if keep_a_copy: 87 # tell UI to import the file 88 gmDispatcher.send ( 89 signal = u'import_document_from_file', 90 filename = printable_file, 91 document_type = template['instance_type'], 92 unlock_patient = True 93 ) 94 95 wx.EndBusyCursor() 96 97 return True98 #------------------------------------------------------------ 99 # eventually this should become superfluous when there's a 100 # standard engine wrapper around OOo102 103 # export template to file 104 filename = template.export_to_file() 105 if filename is None: 106 gmGuiHelpers.gm_show_error ( 107 _( 'Error exporting form template\n' 108 '\n' 109 ' "%s" (%s)' 110 ) % (template['name_long'], template['external_version']), 111 _('Letter template export') 112 ) 113 return False 114 115 try: 116 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type']) 117 except ImportError: 118 gmGuiHelpers.gm_show_error ( 119 _('Cannot connect to OpenOffice.\n\n' 120 'The UNO bridge module for Python\n' 121 'is not installed.' 122 ), 123 _('Letter writer') 124 ) 125 return False 126 127 if not doc.open_in_ooo(): 128 gmGuiHelpers.gm_show_error ( 129 _('Cannot connect to OpenOffice.\n' 130 '\n' 131 'You may want to increase the option\n' 132 '\n' 133 ' <%s>' 134 ) % _('OOo startup time'), 135 _('Letter writer') 136 ) 137 try: os.remove(filename) 138 except: pass 139 return False 140 141 doc.show(False) 142 ph_handler = gmMacro.gmPlaceholderHandler() 143 doc.replace_placeholders(handler = ph_handler) 144 145 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-') 146 doc.save_in_ooo(filename = filename) 147 148 doc.show(True) 149 150 return True151 #------------------------------------------------------------153 154 if parent is None: 155 parent = wx.GetApp().GetTopWindow() 156 157 #------------------------- 158 def edit(template=None): 159 dlg = cFormTemplateEditAreaDlg(parent, -1, template=template) 160 result = dlg.ShowModal() 161 return (result == wx.ID_OK)162 #------------------------- 163 def delete(template): 164 delete = gmGuiHelpers.gm_show_question ( 165 aTitle = _('Deleting form template.'), 166 aMessage = _( 167 'Are you sure you want to delete\n' 168 'the following form template ?\n\n' 169 ' "%s (%s)"\n\n' 170 'You can only delete templates which\n' 171 'have not yet been used to generate\n' 172 'any forms from.' 173 ) % (template['name_long'], template['external_version']) 174 ) 175 if delete: 176 # FIXME: make this a priviledged operation ? 177 gmForms.delete_form_template(template = template) 178 return True 179 return False 180 #------------------------- 181 def refresh(lctrl): 182 templates = gmForms.get_form_templates(active_only = False) 183 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ]) 184 lctrl.set_data(data = templates) 185 #------------------------- 186 template = gmListWidgets.get_choices_from_list ( 187 parent = parent, 188 caption = _('Select letter or form template.'), 189 columns = [_('Template'), _('Version'), _('Type')], 190 edit_callback = edit, 191 new_callback = edit, 192 delete_callback = delete, 193 refresh_callback = refresh, 194 single_selection = True 195 ) 196 197 return template 198 #------------------------------------------------------------200 201 # 1) have user select template 202 template = manage_form_templates(parent = parent) 203 if template is None: 204 return 205 206 wx.BeginBusyCursor() 207 208 # 2) export template to file 209 filename = template.export_to_file() 210 if filename is None: 211 wx.EndBusyCursor() 212 gmGuiHelpers.gm_show_error ( 213 _( 'Error exporting form template\n' 214 '\n' 215 ' "%s" (%s)' 216 ) % (template['name_long'], template['external_version']), 217 _('Letter template export') 218 ) 219 return 220 221 try: 222 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type']) 223 except ImportError: 224 wx.EndBusyCursor() 225 gmGuiHelpers.gm_show_error ( 226 _('Cannot connect to OpenOffice.\n\n' 227 'The UNO bridge module for Python\n' 228 'is not installed.' 229 ), 230 _('Letter writer') 231 ) 232 return 233 234 if not doc.open_in_ooo(): 235 wx.EndBusyCursor() 236 gmGuiHelpers.gm_show_error ( 237 _('Cannot connect to OpenOffice.\n' 238 '\n' 239 'You may want to increase the option\n' 240 '\n' 241 ' <%s>' 242 ) % _('OOo startup time'), 243 _('Letter writer') 244 ) 245 try: os.remove(filename) 246 except: pass 247 return 248 249 doc.show(False) 250 ph_handler = gmMacro.gmPlaceholderHandler() 251 252 wx.EndBusyCursor() 253 254 doc.replace_placeholders(handler = ph_handler) 255 256 wx.BeginBusyCursor() 257 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-') 258 doc.save_in_ooo(filename = filename) 259 wx.EndBusyCursor() 260 261 doc.show(True)262 #============================================================264403 #============================================================266 try: 267 self.__template = kwargs['template'] 268 del kwargs['template'] 269 except KeyError: 270 self.__template = None 271 272 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs) 273 274 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider() 275 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider() 276 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider() 277 278 self.refresh() 279 280 self.full_filename = None281 #--------------------------------------------------------283 if template is not None: 284 self.__template = template 285 286 if self.__template is None: 287 self._PRW_name_long.SetText(u'') 288 self._PRW_name_short.SetText(u'') 289 self._TCTRL_external_version.SetValue(u'') 290 self._PRW_template_type.SetText(u'') 291 self._PRW_instance_type.SetText(u'') 292 self._TCTRL_filename.SetValue(u'') 293 self._CH_engine.SetSelection(0) 294 self._CHBOX_active.SetValue(True) 295 296 self._TCTRL_date_modified.SetValue(u'') 297 self._TCTRL_modified_by.SetValue(u'') 298 299 else: 300 self._PRW_name_long.SetText(self.__template['name_long']) 301 self._PRW_name_short.SetText(self.__template['name_short']) 302 self._TCTRL_external_version.SetValue(self.__template['external_version']) 303 self._PRW_template_type.SetText(self.__template['l10n_template_type'], data = self.__template['pk_template_type']) 304 self._PRW_instance_type.SetText(self.__template['l10n_instance_type'], data = self.__template['instance_type']) 305 self._TCTRL_filename.SetValue(self.__template['filename']) 306 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.__template['engine'])) 307 self._CHBOX_active.SetValue(self.__template['in_use']) 308 309 self._TCTRL_date_modified.SetValue(self.__template['last_modified'].strftime('%x')) 310 self._TCTRL_modified_by.SetValue(self.__template['modified_by']) 311 312 self._TCTRL_filename.Enable(True) 313 self._BTN_load.Enable(not self.__template['has_instances']) 314 315 self._PRW_name_long.SetFocus()316 #--------------------------------------------------------318 error = False 319 320 if gmTools.coalesce(self._PRW_name_long.GetValue(), u'').strip() == u'': 321 error = True 322 self._PRW_name_long.SetBackgroundColour('pink') 323 else: 324 self._PRW_name_long.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 325 326 if gmTools.coalesce(self._PRW_name_short.GetValue(), u'').strip() == u'': 327 error = True 328 self._PRW_name_short.SetBackgroundColour('pink') 329 else: 330 self._PRW_name_short.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 331 332 if gmTools.coalesce(self._TCTRL_external_version.GetValue(), u'').strip() == u'': 333 error = True 334 self._TCTRL_external_version.SetBackgroundColour('pink') 335 else: 336 self._TCTRL_external_version.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 337 338 if gmTools.coalesce(self._PRW_template_type.GetValue(), u'').strip() == u'': 339 error = True 340 self._PRW_template_type.SetBackgroundColour('pink') 341 else: 342 self._PRW_template_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 343 344 if gmTools.coalesce(self._PRW_instance_type.GetValue(), u'').strip() == u'': 345 error = True 346 self._PRW_instance_type.SetBackgroundColour('pink') 347 else: 348 self._PRW_instance_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 349 350 if self.__template is None and self.full_filename is None: 351 error = True 352 gmDispatcher.send(signal = 'statustext', msg = _('You must select a template file before saving.'), beep = True) 353 354 return not error355 #--------------------------------------------------------357 if not self.__valid_for_save(): 358 return False 359 360 if self.__template is None: 361 self.__template = gmForms.create_form_template ( 362 template_type = self._PRW_template_type.GetData(), 363 name_short = self._PRW_name_short.GetValue().strip(), 364 name_long = self._PRW_name_long.GetValue().strip() 365 ) 366 else: 367 self.__template['pk_template_type'] = self._PRW_template_type.GetData() 368 self.__template['name_short'] = self._PRW_name_short.GetValue().strip() 369 self.__template['name_long'] = self._PRW_name_long.GetValue().strip() 370 371 if not self.__template['has_instances']: 372 if self.full_filename is not None: 373 self.__template.update_template_from_file(filename = self.full_filename) 374 375 self.__template['external_version'] = self._TCTRL_external_version.GetValue() 376 tmp = self._PRW_instance_type.GetValue().strip() 377 if tmp not in [self.__template['instance_type'], self.__template['l10n_instance_type']]: 378 self.__template['instance_type'] = tmp 379 self.__template['filename'] = self._TCTRL_filename.GetValue() 380 self.__template['in_use'] = self._CHBOX_active.GetValue() 381 self.__template['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 382 383 self.__template.save() 384 return True385 #-------------------------------------------------------- 386 # event handlers 387 #--------------------------------------------------------405423 #============================================================ 424 # main 425 #------------------------------------------------------------ 426 if __name__ == '__main__': 427 428 gmI18N.activate_locale() 429 gmI18N.install_domain(domain = 'gnumed') 430 431 #----------------------------------------407 try: 408 template = kwargs['template'] 409 del kwargs['template'] 410 except KeyError: 411 template = None 412 413 wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg.__init__(self, *args, **kwargs) 414 415 self._PNL_edit_area.refresh(template=template)416 #--------------------------------------------------------433 app = wx.PyWidgetTester(size = (400, 300)) 434 pnl = cFormTemplateEditAreaPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4)) 435 app.frame.Show(True) 436 app.MainLoop() 437 return438 #---------------------------------------- 439 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'): 440 test_cFormTemplateEditAreaPnl() 441 442 #============================================================ 443 # $Log: gmFormWidgets.py,v $ 444 # Revision 1.16 2010/01/09 18:30:10 ncq 445 # - include LaTeX template shell glob pattern to template picker 446 # 447 # Revision 1.15 2010/01/06 14:39:05 ncq 448 # - make cleanup configurable 449 # 450 # Revision 1.14 2010/01/03 18:18:05 ncq 451 # - run edit before generating printout data on generic letters 452 # 453 # Revision 1.13 2010/01/01 21:50:54 ncq 454 # - generic print-doc-from-template 455 # 456 # Revision 1.12 2009/12/25 21:44:43 ncq 457 # - let-user-select-form-template -> manage-form-templates 458 # - handle setting engine type in form template EA 459 # 460 # Revision 1.11 2009/06/11 12:37:25 ncq 461 # - much simplified initial setup of list ctrls 462 # 463 # Revision 1.10 2008/10/12 16:20:11 ncq 464 # - add busy cursor around letter creation 465 # 466 # Revision 1.9 2008/03/05 22:30:14 ncq 467 # - new style logging 468 # 469 # Revision 1.8 2008/01/27 21:14:16 ncq 470 # - gracefully handle UNO import errors 471 # 472 # Revision 1.7 2007/11/10 20:57:04 ncq 473 # - handle failing OOo connection 474 # - cleanup leftover templates on failure 475 # 476 # Revision 1.6 2007/09/16 22:40:15 ncq 477 # - allow editing templates when there are no instances 478 # 479 # Revision 1.5 2007/09/10 18:40:19 ncq 480 # - allow setting data on existing templates if it hasn't been set before 481 # 482 # Revision 1.4 2007/09/02 20:57:28 ncq 483 # - improve edit/delete callbacks 484 # - add refresh callback 485 # 486 # Revision 1.3 2007/09/01 23:33:04 ncq 487 # - implement save()/delete on form templates 488 # 489 # Revision 1.2 2007/08/29 14:38:55 ncq 490 # - remove spurious , 491 # 492 # Revision 1.1 2007/08/28 14:40:12 ncq 493 # - factored out from gmMedDocWidgets.py 494 # 495 # 496 497 498 #============================================================ 499 # Log: gmMedDocWidgets.py 500 # Revision 1.142 2007/08/28 14:18:13 ncq 501 # - no more gm_statustext() 502
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Tue Feb 9 04:02:09 2010 | http://epydoc.sourceforge.net |