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):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 caption = _('Select letter or form template.'), 201 columns = [_('Template'), _('Version'), _('Type')], 202 edit_callback = edit, 203 new_callback = edit, 204 delete_callback = delete, 205 refresh_callback = refresh, 206 single_selection = True 207 ) 208 209 return template 210 #------------------------------------------------------------212 213 # 1) have user select template 214 template = manage_form_templates(parent = parent, active_only = True, excluded_types = ['gnuplot script', 'visual progress note']) 215 if template is None: 216 return 217 218 wx.BeginBusyCursor() 219 220 # 2) export template to file 221 filename = template.export_to_file() 222 if filename is None: 223 wx.EndBusyCursor() 224 gmGuiHelpers.gm_show_error ( 225 _( 'Error exporting form template\n' 226 '\n' 227 ' "%s" (%s)' 228 ) % (template['name_long'], template['external_version']), 229 _('Letter template export') 230 ) 231 return 232 233 try: 234 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type']) 235 except ImportError: 236 wx.EndBusyCursor() 237 gmGuiHelpers.gm_show_error ( 238 _('Cannot connect to OpenOffice.\n\n' 239 'The UNO bridge module for Python\n' 240 'is not installed.' 241 ), 242 _('Letter writer') 243 ) 244 return 245 246 if not doc.open_in_ooo(): 247 wx.EndBusyCursor() 248 gmGuiHelpers.gm_show_error ( 249 _('Cannot connect to OpenOffice.\n' 250 '\n' 251 'You may want to increase the option\n' 252 '\n' 253 ' <%s>' 254 ) % _('OOo startup time'), 255 _('Letter writer') 256 ) 257 try: os.remove(filename) 258 except: pass 259 return 260 261 doc.show(False) 262 ph_handler = gmMacro.gmPlaceholderHandler() 263 264 wx.EndBusyCursor() 265 266 doc.replace_placeholders(handler = ph_handler) 267 268 wx.BeginBusyCursor() 269 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-') 270 doc.save_in_ooo(filename = filename) 271 wx.EndBusyCursor() 272 273 doc.show(True)274 #============================================================ 275 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl 276278470 #============================================================ 471 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaDlg 472280 try: 281 self.__template = kwargs['template'] 282 del kwargs['template'] 283 except KeyError: 284 self.__template = None 285 286 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs) 287 288 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider() 289 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider() 290 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider() 291 292 self.refresh() 293 294 self.full_filename = None295 #--------------------------------------------------------297 if template is not None: 298 self.__template = template 299 300 if self.__template is None: 301 self._PRW_name_long.SetText(u'') 302 self._PRW_name_short.SetText(u'') 303 self._TCTRL_external_version.SetValue(u'') 304 self._PRW_template_type.SetText(u'') 305 self._PRW_instance_type.SetText(u'') 306 self._TCTRL_filename.SetValue(u'') 307 self._CH_engine.SetSelection(0) 308 self._CHBOX_active.SetValue(True) 309 310 self._TCTRL_date_modified.SetValue(u'') 311 self._TCTRL_modified_by.SetValue(u'') 312 313 self._BTN_export.Enable(False) 314 else: 315 self._PRW_name_long.SetText(self.__template['name_long']) 316 self._PRW_name_short.SetText(self.__template['name_short']) 317 self._TCTRL_external_version.SetValue(self.__template['external_version']) 318 self._PRW_template_type.SetText(self.__template['l10n_template_type'], data = self.__template['pk_template_type']) 319 self._PRW_instance_type.SetText(self.__template['l10n_instance_type'], data = self.__template['instance_type']) 320 self._TCTRL_filename.SetValue(self.__template['filename']) 321 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.__template['engine'])) 322 self._CHBOX_active.SetValue(self.__template['in_use']) 323 324 self._TCTRL_date_modified.SetValue(self.__template['last_modified'].strftime('%x')) 325 self._TCTRL_modified_by.SetValue(self.__template['modified_by']) 326 327 self._TCTRL_filename.Enable(True) 328 self._BTN_load.Enable(not self.__template['has_instances']) 329 330 self._BTN_export.Enable(True) 331 332 self._PRW_name_long.SetFocus()333 #--------------------------------------------------------335 error = False 336 337 if gmTools.coalesce(self._PRW_name_long.GetValue(), u'').strip() == u'': 338 error = True 339 self._PRW_name_long.SetBackgroundColour('pink') 340 else: 341 self._PRW_name_long.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 342 343 if gmTools.coalesce(self._PRW_name_short.GetValue(), u'').strip() == u'': 344 error = True 345 self._PRW_name_short.SetBackgroundColour('pink') 346 else: 347 self._PRW_name_short.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 348 349 if gmTools.coalesce(self._TCTRL_external_version.GetValue(), u'').strip() == u'': 350 error = True 351 self._TCTRL_external_version.SetBackgroundColour('pink') 352 else: 353 self._TCTRL_external_version.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 354 355 if gmTools.coalesce(self._PRW_template_type.GetValue(), u'').strip() == u'': 356 error = True 357 self._PRW_template_type.SetBackgroundColour('pink') 358 else: 359 self._PRW_template_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 360 361 if gmTools.coalesce(self._PRW_instance_type.GetValue(), u'').strip() == u'': 362 error = True 363 self._PRW_instance_type.SetBackgroundColour('pink') 364 else: 365 self._PRW_instance_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)) 366 367 if self.__template is None and self.full_filename is None: 368 error = True 369 gmDispatcher.send(signal = 'statustext', msg = _('You must select a template file before saving.'), beep = True) 370 371 return not error372 #--------------------------------------------------------374 if not self.__valid_for_save(): 375 return False 376 377 if self.__template is None: 378 self.__template = gmForms.create_form_template ( 379 template_type = self._PRW_template_type.GetData(), 380 name_short = self._PRW_name_short.GetValue().strip(), 381 name_long = self._PRW_name_long.GetValue().strip() 382 ) 383 else: 384 self.__template['pk_template_type'] = self._PRW_template_type.GetData() 385 self.__template['name_short'] = self._PRW_name_short.GetValue().strip() 386 self.__template['name_long'] = self._PRW_name_long.GetValue().strip() 387 388 if not self.__template['has_instances']: 389 if self.full_filename is not None: 390 self.__template.update_template_from_file(filename = self.full_filename) 391 392 self.__template['external_version'] = self._TCTRL_external_version.GetValue() 393 tmp = self._PRW_instance_type.GetValue().strip() 394 if tmp not in [self.__template['instance_type'], self.__template['l10n_instance_type']]: 395 self.__template['instance_type'] = tmp 396 self.__template['filename'] = self._TCTRL_filename.GetValue() 397 self.__template['in_use'] = self._CHBOX_active.GetValue() 398 self.__template['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()] 399 400 self.__template.save() 401 return True402 #-------------------------------------------------------- 403 # event handlers 404 #-------------------------------------------------------- 436 #--------------------------------------------------------474492 #============================================================ 493 # main 494 #------------------------------------------------------------ 495 if __name__ == '__main__': 496 497 gmI18N.activate_locale() 498 gmI18N.install_domain(domain = 'gnumed') 499 500 #----------------------------------------476 try: 477 template = kwargs['template'] 478 del kwargs['template'] 479 except KeyError: 480 template = None 481 482 wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg.__init__(self, *args, **kwargs) 483 484 self._PNL_edit_area.refresh(template=template)485 #--------------------------------------------------------502 app = wx.PyWidgetTester(size = (400, 300)) 503 pnl = cFormTemplateEditAreaPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4)) 504 app.frame.Show(True) 505 app.MainLoop() 506 return507 #---------------------------------------- 508 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'): 509 test_cFormTemplateEditAreaPnl() 510 511 #============================================================ 512
Home | Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Fri Sep 14 03:56:25 2012 | http://epydoc.sourceforge.net |