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