Home | Trees | Indices | Help |
|
---|
|
1 """GNUmed form/letter handling widgets. 2 """ 3 #================================================================ 4 __version__ = "$Revision: 1.16 $" 5 __author__ = "Karsten Hilbert <Karsten.Hilbert@gmx.net>" 6 7 import os.path, sys, logging 8 9 10 import wx 11 12 13 if __name__ == '__main__': 14 sys.path.insert(0, '../../') 15 from Gnumed.pycommon import gmI18N, gmTools, gmDispatcher, gmPrinting 16 from Gnumed.business import gmForms, gmPerson 17 from Gnumed.wxpython import gmGuiHelpers, gmListWidgets, gmMacro 18 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl, wxgFormTemplateEditAreaDlg 19 20 21 _log = logging.getLogger('gm.ui') 22 _log.info(__version__) 23 24 #============================================================ 25 # convenience functions 26 #============================================================27 -def print_doc_from_template(parent=None, jobtype=None, keep_a_copy=True, episode=None, cleanup=True):28 29 if parent is None: 30 parent = wx.GetApp().GetTopWindow() 31 32 # 1) get template 33 template = manage_form_templates(parent = parent, active_only = True, excluded_types = ['gnuplot script', 'visual progress note']) 34 if template is None: 35 gmDispatcher.send(signal = 'statustext', msg = _('No document template selected.')) 36 return None 37 38 if template['engine'] == u'O': 39 return print_doc_from_ooo_template(template = template) 40 41 wx.BeginBusyCursor() 42 43 # 2) process template 44 try: 45 doc = template.instantiate() 46 except KeyError: 47 wx.EndBusyCursor() 48 gmGuiHelpers.gm_show_error ( 49 aMessage = _('Error creating printable document.\n\nThere is no engine for this type of template.'), 50 aTitle = _('Printing document') 51 ) 52 return False 53 ph = gmMacro.gmPlaceholderHandler() 54 #ph.debug = True 55 doc.substitute_placeholders(data_source = ph) 56 doc.edit() 57 printable_file = doc.generate_output(cleanup = cleanup) 58 if cleanup: 59 doc.cleanup() 60 if printable_file is None: 61 wx.EndBusyCursor() 62 gmGuiHelpers.gm_show_error ( 63 aMessage = _('Error creating printable document.'), 64 aTitle = _('Printing document') 65 ) 66 return False 67 68 # 3) print template 69 if jobtype is None: 70 jobtype = 'generic_document' 71 72 printed = gmPrinting.print_file_by_shellscript(filename = printable_file, jobtype = jobtype) 73 if not printed: 74 wx.EndBusyCursor() 75 gmGuiHelpers.gm_show_error ( 76 aMessage = _('Error printing document (%s).') % jobtype, 77 aTitle = _('Printing document') 78 ) 79 return False 80 81 pat = gmPerson.gmCurrentPatient() 82 emr = pat.get_emr() 83 if episode is None: 84 episode = emr.add_episode(episode_name = 'administration', is_open = False) 85 emr.add_clin_narrative ( 86 soap_cat = None, 87 note = _('%s printed from template [%s - %s]') % (jobtype, template['name_long'], template['external_version']), 88 episode = episode 89 ) 90 91 # 4) keep a copy 92 if keep_a_copy: 93 # tell UI to import the file 94 gmDispatcher.send ( 95 signal = u'import_document_from_file', 96 filename = printable_file, 97 document_type = template['instance_type'], 98 unlock_patient = True 99 ) 100 101 wx.EndBusyCursor() 102 103 return True104 #------------------------------------------------------------ 105 # eventually this should become superfluous when there's a 106 # standard engine wrapper around OOo108 109 # export template to file 110 filename = template.export_to_file() 111 if filename is None: 112 gmGuiHelpers.gm_show_error ( 113 _( 'Error exporting form template\n' 114 '\n' 115 ' "%s" (%s)' 116 ) % (template['name_long'], template['external_version']), 117 _('Letter template export') 118 ) 119 return False 120 121 try: 122 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type']) 123 except ImportError: 124 gmGuiHelpers.gm_show_error ( 125 _('Cannot connect to OpenOffice.\n\n' 126 'The UNO bridge module for Python\n' 127 'is not installed.' 128 ), 129 _('Letter writer') 130 ) 131 return False 132 133 if not doc.open_in_ooo(): 134 gmGuiHelpers.gm_show_error ( 135 _('Cannot connect to OpenOffice.\n' 136 '\n' 137 'You may want to increase the option\n' 138 '\n' 139 ' <%s>' 140 ) % _('OOo startup time'), 141 _('Letter writer') 142 ) 143 try: os.remove(filename) 144 except: pass 145 return False 146 147 doc.show(False) 148 ph_handler = gmMacro.gmPlaceholderHandler() 149 doc.replace_placeholders(handler = ph_handler) 150 151 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-') 152 doc.save_in_ooo(filename = filename) 153 154 doc.show(True) 155 156 return True157 #------------------------------------------------------------158 -def manage_form_templates(parent=None, template_types=None, active_only=False, excluded_types=None):159 160 if parent is None: 161 parent = wx.GetApp().GetTopWindow() 162 163 #------------------------- 164 def edit(template=None): 165 dlg = cFormTemplateEditAreaDlg(parent, -1, template=template) 166 result = dlg.ShowModal() 167 return (result == wx.ID_OK)168 #------------------------- 169 def delete(template): 170 delete = gmGuiHelpers.gm_show_question ( 171 aTitle = _('Deleting form template.'), 172 aMessage = _( 173 'Are you sure you want to delete\n' 174 'the following form template ?\n\n' 175 ' "%s (%s)"\n\n' 176 'You can only delete templates which\n' 177 'have not yet been used to generate\n' 178 'any forms from.' 179 ) % (template['name_long'], template['external_version']) 180 ) 181 if delete: 182 # FIXME: make this a priviledged operation ? 183 gmForms.delete_form_template(template = template) 184 return True 185 return False 186 #------------------------- 187 def refresh(lctrl): 188 templates = gmForms.get_form_templates(active_only = active_only, template_types = template_types, excluded_types = excluded_types) 189 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ]) 190 lctrl.set_data(data = templates) 191 #------------------------- 192 template = gmListWidgets.get_choices_from_list ( 193 parent = parent, 194 caption = _('Select letter or form template.'), 195 columns = [_('Template'), _('Version'), _('Type')], 196 edit_callback = edit, 197 new_callback = edit, 198 delete_callback = delete, 199 refresh_callback = refresh, 200 single_selection = True 201 ) 202 203 return template 204 #------------------------------------------------------------206 207 # 1) have user select template 208 template = manage_form_templates(parent = parent, active_only = True, excluded_types = ['gnuplot script', 'visual progress note']) 209 if template is None: 210 return 211 212 wx.BeginBusyCursor() 213 214 # 2) export template to file 215 filename = template.export_to_file() 216 if filename is None: 217 wx.EndBusyCursor() 218 gmGuiHelpers.gm_show_error ( 219 _( 'Error exporting form template\n' 220 '\n' 221 ' "%s" (%s)' 222 ) % (template['name_long'], template['external_version']), 223 _('Letter template export') 224 ) 225 return 226 227 try: 228 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type']) 229 except ImportError: 230 wx.EndBusyCursor() 231 gmGuiHelpers.gm_show_error ( 232 _('Cannot connect to OpenOffice.\n\n' 233 'The UNO bridge module for Python\n' 234 'is not installed.' 235 ), 236 _('Letter writer') 237 ) 238 return 239 240 if not doc.open_in_ooo(): 241 wx.EndBusyCursor() 242 gmGuiHelpers.gm_show_error ( 243 _('Cannot connect to OpenOffice.\n' 244 '\n' 245 'You may want to increase the option\n' 246 '\n' 247 ' <%s>' 248 ) % _('OOo startup time'), 249 _('Letter writer') 250 ) 251 try: os.remove(filename) 252 except: pass 253 return 254 255 doc.show(False) 256 ph_handler = gmMacro.gmPlaceholderHandler() 257 258 wx.EndBusyCursor() 259 260 doc.replace_placeholders(handler = ph_handler) 261 262 wx.BeginBusyCursor() 263 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-') 264 doc.save_in_ooo(filename = filename) 265 wx.EndBusyCursor() 266 267 doc.show(True)268 #============================================================270426 #============================================================272 try: 273 self.__template = kwargs['template'] 274 del kwargs['template'] 275 except KeyError: 276 self.__template = None 277 278 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs) 279 280 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider() 281 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider() 282 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider() 283 284 self.refresh() 285 286 self.full_filename = None287 #--------------------------------------------------------289 if template is not None: 290 self.__template = template 291 292 if self.__template is None: 293 self._PRW_name_long.SetText(u'') 294 self._PRW_name_short.SetText(u'') 295 self._TCTRL_external_version.SetValue(u'') 296 self._PRW_template_type.SetText(u'') 297 self._PRW_instance_type.SetText(u'') 298 self._TCTRL_filename.SetValue(u'') 299 self._CH_engine.SetSelection(0) 300 self._CHBOX_active.SetValue(True) 301 302 self._TCTRL_date_modified.SetValue(u'') 303 self._TCTRL_modified_by.SetValue(u'') 304 305 else: 306 self._PRW_name_long.SetText(self.__template['name_long']) 307 self._PRW_name_short.SetText(self.__template['name_short']) 308 self._TCTRL_external_version.SetValue(self.__template['external_version']) 309 self._PRW_template_type.SetText(self.__template['l10n_template_type'], data = self.__template['pk_template_type']) 310 self._PRW_instance_type.SetText(self.__template['l10n_instance_type'], data = self.__template['instance_type']) 311 self._TCTRL_filename.SetValue(self.__template['filename']) 312 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.__template['engine'])) 313 self._CHBOX_active.SetValue(self.__template['in_use']) 314 315 self._TCTRL_date_modified.SetValue(self.__template['last_modified'].strftime('%x')) 316 self._TCTRL_modified_by.SetValue(self.__template['modified_by']) 317 318 self._TCTRL_filename.Enable(True) 319 self._BTN_load.Enable(not self.__template['has_instances']) 320 321 self._PRW_name_long.SetFocus()322 #--------------------------------------------------------324 error = False 325 326 if gmTools.coalesce(self._PRW_name_long.GetValue(), u'').strip() == u'': 327 error = True 328 self._PRW_name_long.SetBackgroundColour('pink') 329 else: 330 self._PRW_name_long.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 331 332 if gmTools.coalesce(self._PRW_name_short.GetValue(), u'').strip() == u'': 333 error = True 334 self._PRW_name_short.SetBackgroundColour('pink') 335 else: 336 self._PRW_name_short.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 337 338 if gmTools.coalesce(self._TCTRL_external_version.GetValue(), u'').strip() == u'': 339 error = True 340 self._TCTRL_external_version.SetBackgroundColour('pink') 341 else: 342 self._TCTRL_external_version.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 343 344 if gmTools.coalesce(self._PRW_template_type.GetValue(), u'').strip() == u'': 345 error = True 346 self._PRW_template_type.SetBackgroundColour('pink') 347 else: 348 self._PRW_template_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 349 350 if gmTools.coalesce(self._PRW_instance_type.GetValue(), u'').strip() == u'': 351 error = True 352 self._PRW_instance_type.SetBackgroundColour('pink') 353 else: 354 self._PRW_instance_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 355 356 if self.__template is None and self.full_filename is None: 357 error = True 358 gmDispatcher.send(signal = 'statustext', msg = _('You must select a template file before saving.'), beep = True) 359 360 return not error361 #--------------------------------------------------------363 if not self.__valid_for_save(): 364 return False 365 366 if self.__template is None: 367 self.__template = gmForms.create_form_template ( 368 template_type = self._PRW_template_type.GetData(), 369 name_short = self._PRW_name_short.GetValue().strip(), 370 name_long = self._PRW_name_long.GetValue().strip() 371 ) 372 else: 373 self.__template['pk_template_type'] = self._PRW_template_type.GetData() 374 self.__template['name_short'] = self._PRW_name_short.GetValue().strip() 375 self.__template['name_long'] = self._PRW_name_long.GetValue().strip() 376 377 if not self.__template['has_instances']: 378 if self.full_filename is not None: 379 self.__template.update_template_from_file(filename = self.full_filename) 380 381 self.__template['external_version'] = self._TCTRL_external_version.GetValue() 382 tmp = self._PRW_instance_type.GetValue().strip() 383 if tmp not in [self.__template['instance_type'], self.__template['l10n_instance_type']]: 384 self.__template['instance_type'] = tmp 385 self.__template['filename'] = self._TCTRL_filename.GetValue() 386 self.__template['in_use'] = self._CHBOX_active.GetValue() 387 self.__template['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 388 389 self.__template.save() 390 return True391 #-------------------------------------------------------- 392 # event handlers 393 #--------------------------------------------------------428446 #============================================================ 447 # main 448 #------------------------------------------------------------ 449 if __name__ == '__main__': 450 451 gmI18N.activate_locale() 452 gmI18N.install_domain(domain = 'gnumed') 453 454 #----------------------------------------430 try: 431 template = kwargs['template'] 432 del kwargs['template'] 433 except KeyError: 434 template = None 435 436 wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg.__init__(self, *args, **kwargs) 437 438 self._PNL_edit_area.refresh(template=template)439 #--------------------------------------------------------456 app = wx.PyWidgetTester(size = (400, 300)) 457 pnl = cFormTemplateEditAreaPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4)) 458 app.frame.Show(True) 459 app.MainLoop() 460 return461 #---------------------------------------- 462 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'): 463 test_cFormTemplateEditAreaPnl() 464 465 #============================================================ 466
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Mon Nov 29 04:06:04 2010 | http://epydoc.sourceforge.net |