| 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 True
111 #------------------------------------------------------------
112 # eventually this should become superfluous when there's a
113 # standard engine wrapper around OOo
115
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 True
164 #------------------------------------------------------------
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
277
279
281 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 = None
296 #--------------------------------------------------------
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 error
373 #--------------------------------------------------------
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 True
403 #--------------------------------------------------------
404 # event handlers
405 #--------------------------------------------------------
437 #--------------------------------------------------------
471 #============================================================
472 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaDlg
473
475
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 #--------------------------------------------------------
493 #============================================================
494 # main
495 #------------------------------------------------------------
496 if __name__ == '__main__':
497
498 gmI18N.activate_locale()
499 gmI18N.install_domain(domain = 'gnumed')
500
501 #----------------------------------------
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 return
508 #----------------------------------------
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 |