| 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 True
98 #------------------------------------------------------------
99 # eventually this should become superfluous when there's a
100 # standard engine wrapper around OOo
102
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 True
151 #------------------------------------------------------------
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 #============================================================
264
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 = None
281 #--------------------------------------------------------
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 error
355 #--------------------------------------------------------
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 True
385 #--------------------------------------------------------
386 # event handlers
387 #--------------------------------------------------------
403 #============================================================
405
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 #--------------------------------------------------------
423 #============================================================
424 # main
425 #------------------------------------------------------------
426 if __name__ == '__main__':
427
428 gmI18N.activate_locale()
429 gmI18N.install_domain(domain = 'gnumed')
430
431 #----------------------------------------
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 return
438 #----------------------------------------
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 |