| 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 True
104 #------------------------------------------------------------
105 # eventually this should become superfluous when there's a
106 # standard engine wrapper around OOo
108
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 True
157 #------------------------------------------------------------
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 #============================================================
270
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 = None
287 #--------------------------------------------------------
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 error
361 #--------------------------------------------------------
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 True
391 #--------------------------------------------------------
392 # event handlers
393 #--------------------------------------------------------
426 #============================================================
428
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 #--------------------------------------------------------
446 #============================================================
447 # main
448 #------------------------------------------------------------
449 if __name__ == '__main__':
450
451 gmI18N.activate_locale()
452 gmI18N.install_domain(domain = 'gnumed')
453
454 #----------------------------------------
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 return
461 #----------------------------------------
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 |