| 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 #============================================================
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()
58 if printable_file is None:
59 wx.EndBusyCursor()
60 gmGuiHelpers.gm_show_error (
61 aMessage = _('Error creating printable document.'),
62 aTitle = _('Printing document')
63 )
64 return False
65
66 # 3) print template
67 if jobtype is None:
68 jobtype = 'generic_document'
69
70 printed = gmPrinting.print_file(filename = printable_file, jobtype = jobtype)
71 if not printed:
72 wx.EndBusyCursor()
73 gmGuiHelpers.gm_show_error (
74 aMessage = _('Error printing document (%s).') % jobtype,
75 aTitle = _('Printing document')
76 )
77 return False
78
79 pat = gmPerson.gmCurrentPatient()
80 emr = pat.get_emr()
81 if episode is None:
82 episode = emr.add_episode(episode_name = 'administration', is_open = False)
83 emr.add_clin_narrative (
84 soap_cat = None,
85 note = _('%s printed from template [%s - %s]') % (jobtype, template['name_long'], template['external_version']),
86 episode = episode
87 )
88
89 # 4) keep a copy
90 if keep_a_copy:
91 # tell UI to import the file
92 gmDispatcher.send (
93 signal = u'import_document_from_file',
94 filename = printable_file,
95 document_type = template['instance_type'],
96 unlock_patient = True
97 )
98
99 wx.EndBusyCursor()
100
101 return True
102 #------------------------------------------------------------
103 # eventually this should become superfluous when there's a
104 # standard engine wrapper around OOo
106
107 # export template to file
108 filename = template.export_to_file()
109 if filename is None:
110 gmGuiHelpers.gm_show_error (
111 _( 'Error exporting form template\n'
112 '\n'
113 ' "%s" (%s)'
114 ) % (template['name_long'], template['external_version']),
115 _('Letter template export')
116 )
117 return False
118
119 try:
120 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type'])
121 except ImportError:
122 gmGuiHelpers.gm_show_error (
123 _('Cannot connect to OpenOffice.\n\n'
124 'The UNO bridge module for Python\n'
125 'is not installed.'
126 ),
127 _('Letter writer')
128 )
129 return False
130
131 if not doc.open_in_ooo():
132 gmGuiHelpers.gm_show_error (
133 _('Cannot connect to OpenOffice.\n'
134 '\n'
135 'You may want to increase the option\n'
136 '\n'
137 ' <%s>'
138 ) % _('OOo startup time'),
139 _('Letter writer')
140 )
141 try: os.remove(filename)
142 except: pass
143 return False
144
145 doc.show(False)
146 ph_handler = gmMacro.gmPlaceholderHandler()
147 doc.replace_placeholders(handler = ph_handler)
148
149 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-')
150 doc.save_in_ooo(filename = filename)
151
152 doc.show(True)
153
154 return True
155 #------------------------------------------------------------
156 -def manage_form_templates(parent=None, template_types=None, active_only=False, excluded_types=None):
157
158 if parent is None:
159 parent = wx.GetApp().GetTopWindow()
160
161 #-------------------------
162 def edit(template=None):
163 dlg = cFormTemplateEditAreaDlg(parent, -1, template=template)
164 result = dlg.ShowModal()
165 return (result == wx.ID_OK)
166 #-------------------------
167 def delete(template):
168 delete = gmGuiHelpers.gm_show_question (
169 aTitle = _('Deleting form template.'),
170 aMessage = _(
171 'Are you sure you want to delete\n'
172 'the following form template ?\n\n'
173 ' "%s (%s)"\n\n'
174 'You can only delete templates which\n'
175 'have not yet been used to generate\n'
176 'any forms from.'
177 ) % (template['name_long'], template['external_version'])
178 )
179 if delete:
180 # FIXME: make this a priviledged operation ?
181 gmForms.delete_form_template(template = template)
182 return True
183 return False
184 #-------------------------
185 def refresh(lctrl):
186 templates = gmForms.get_form_templates(active_only = active_only, template_types = template_types, excluded_types = excluded_types)
187 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ])
188 lctrl.set_data(data = templates)
189 #-------------------------
190 template = gmListWidgets.get_choices_from_list (
191 parent = parent,
192 caption = _('Select letter or form template.'),
193 columns = [_('Template'), _('Version'), _('Type')],
194 edit_callback = edit,
195 new_callback = edit,
196 delete_callback = delete,
197 refresh_callback = refresh,
198 single_selection = True
199 )
200
201 return template
202 #------------------------------------------------------------
204
205 # 1) have user select template
206 template = manage_form_templates(parent = parent, active_only = True, excluded_types = ['gnuplot script', 'visual progress note'])
207 if template is None:
208 return
209
210 wx.BeginBusyCursor()
211
212 # 2) export template to file
213 filename = template.export_to_file()
214 if filename is None:
215 wx.EndBusyCursor()
216 gmGuiHelpers.gm_show_error (
217 _( 'Error exporting form template\n'
218 '\n'
219 ' "%s" (%s)'
220 ) % (template['name_long'], template['external_version']),
221 _('Letter template export')
222 )
223 return
224
225 try:
226 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type'])
227 except ImportError:
228 wx.EndBusyCursor()
229 gmGuiHelpers.gm_show_error (
230 _('Cannot connect to OpenOffice.\n\n'
231 'The UNO bridge module for Python\n'
232 'is not installed.'
233 ),
234 _('Letter writer')
235 )
236 return
237
238 if not doc.open_in_ooo():
239 wx.EndBusyCursor()
240 gmGuiHelpers.gm_show_error (
241 _('Cannot connect to OpenOffice.\n'
242 '\n'
243 'You may want to increase the option\n'
244 '\n'
245 ' <%s>'
246 ) % _('OOo startup time'),
247 _('Letter writer')
248 )
249 try: os.remove(filename)
250 except: pass
251 return
252
253 doc.show(False)
254 ph_handler = gmMacro.gmPlaceholderHandler()
255
256 wx.EndBusyCursor()
257
258 doc.replace_placeholders(handler = ph_handler)
259
260 wx.BeginBusyCursor()
261 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-')
262 doc.save_in_ooo(filename = filename)
263 wx.EndBusyCursor()
264
265 doc.show(True)
266 #============================================================
268
270 try:
271 self.__template = kwargs['template']
272 del kwargs['template']
273 except KeyError:
274 self.__template = None
275
276 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs)
277
278 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider()
279 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider()
280 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider()
281
282 self.refresh()
283
284 self.full_filename = None
285 #--------------------------------------------------------
287 if template is not None:
288 self.__template = template
289
290 if self.__template is None:
291 self._PRW_name_long.SetText(u'')
292 self._PRW_name_short.SetText(u'')
293 self._TCTRL_external_version.SetValue(u'')
294 self._PRW_template_type.SetText(u'')
295 self._PRW_instance_type.SetText(u'')
296 self._TCTRL_filename.SetValue(u'')
297 self._CH_engine.SetSelection(0)
298 self._CHBOX_active.SetValue(True)
299
300 self._TCTRL_date_modified.SetValue(u'')
301 self._TCTRL_modified_by.SetValue(u'')
302
303 self._BTN_export.Enable(False)
304 else:
305 self._PRW_name_long.SetText(self.__template['name_long'])
306 self._PRW_name_short.SetText(self.__template['name_short'])
307 self._TCTRL_external_version.SetValue(self.__template['external_version'])
308 self._PRW_template_type.SetText(self.__template['l10n_template_type'], data = self.__template['pk_template_type'])
309 self._PRW_instance_type.SetText(self.__template['l10n_instance_type'], data = self.__template['instance_type'])
310 self._TCTRL_filename.SetValue(self.__template['filename'])
311 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.__template['engine']))
312 self._CHBOX_active.SetValue(self.__template['in_use'])
313
314 self._TCTRL_date_modified.SetValue(self.__template['last_modified'].strftime('%x'))
315 self._TCTRL_modified_by.SetValue(self.__template['modified_by'])
316
317 self._TCTRL_filename.Enable(True)
318 self._BTN_load.Enable(not self.__template['has_instances'])
319
320 self._BTN_export.Enable(True)
321
322 self._PRW_name_long.SetFocus()
323 #--------------------------------------------------------
325 error = False
326
327 if gmTools.coalesce(self._PRW_name_long.GetValue(), u'').strip() == u'':
328 error = True
329 self._PRW_name_long.SetBackgroundColour('pink')
330 else:
331 self._PRW_name_long.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
332
333 if gmTools.coalesce(self._PRW_name_short.GetValue(), u'').strip() == u'':
334 error = True
335 self._PRW_name_short.SetBackgroundColour('pink')
336 else:
337 self._PRW_name_short.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
338
339 if gmTools.coalesce(self._TCTRL_external_version.GetValue(), u'').strip() == u'':
340 error = True
341 self._TCTRL_external_version.SetBackgroundColour('pink')
342 else:
343 self._TCTRL_external_version.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
344
345 if gmTools.coalesce(self._PRW_template_type.GetValue(), u'').strip() == u'':
346 error = True
347 self._PRW_template_type.SetBackgroundColour('pink')
348 else:
349 self._PRW_template_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
350
351 if gmTools.coalesce(self._PRW_instance_type.GetValue(), u'').strip() == u'':
352 error = True
353 self._PRW_instance_type.SetBackgroundColour('pink')
354 else:
355 self._PRW_instance_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
356
357 if self.__template is None and self.full_filename is None:
358 error = True
359 gmDispatcher.send(signal = 'statustext', msg = _('You must select a template file before saving.'), beep = True)
360
361 return not error
362 #--------------------------------------------------------
364 if not self.__valid_for_save():
365 return False
366
367 if self.__template is None:
368 self.__template = gmForms.create_form_template (
369 template_type = self._PRW_template_type.GetData(),
370 name_short = self._PRW_name_short.GetValue().strip(),
371 name_long = self._PRW_name_long.GetValue().strip()
372 )
373 else:
374 self.__template['pk_template_type'] = self._PRW_template_type.GetData()
375 self.__template['name_short'] = self._PRW_name_short.GetValue().strip()
376 self.__template['name_long'] = self._PRW_name_long.GetValue().strip()
377
378 if not self.__template['has_instances']:
379 if self.full_filename is not None:
380 self.__template.update_template_from_file(filename = self.full_filename)
381
382 self.__template['external_version'] = self._TCTRL_external_version.GetValue()
383 tmp = self._PRW_instance_type.GetValue().strip()
384 if tmp not in [self.__template['instance_type'], self.__template['l10n_instance_type']]:
385 self.__template['instance_type'] = tmp
386 self.__template['filename'] = self._TCTRL_filename.GetValue()
387 self.__template['in_use'] = self._CHBOX_active.GetValue()
388 self.__template['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()]
389
390 self.__template.save()
391 return True
392 #--------------------------------------------------------
393 # event handlers
394 #--------------------------------------------------------
426 #--------------------------------------------------------
460 #============================================================
462
464 try:
465 template = kwargs['template']
466 del kwargs['template']
467 except KeyError:
468 template = None
469
470 wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg.__init__(self, *args, **kwargs)
471
472 self._PNL_edit_area.refresh(template=template)
473 #--------------------------------------------------------
480 #============================================================
481 # main
482 #------------------------------------------------------------
483 if __name__ == '__main__':
484
485 gmI18N.activate_locale()
486 gmI18N.install_domain(domain = 'gnumed')
487
488 #----------------------------------------
490 app = wx.PyWidgetTester(size = (400, 300))
491 pnl = cFormTemplateEditAreaPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4))
492 app.frame.Show(True)
493 app.MainLoop()
494 return
495 #----------------------------------------
496 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'):
497 test_cFormTemplateEditAreaPnl()
498
499 #============================================================
500
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Wed May 4 03:58:30 2011 | http://epydoc.sourceforge.net |