| 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
9 import sys
10 import logging
11 import shutil
12
13
14 import wx
15
16
17 if __name__ == '__main__':
18 sys.path.insert(0, '../../')
19 from Gnumed.pycommon import gmI18N
20 from Gnumed.pycommon import gmTools
21 from Gnumed.pycommon import gmDispatcher
22 from Gnumed.pycommon import gmPrinting
23 from Gnumed.pycommon import gmDateTime
24 from Gnumed.pycommon import gmShellAPI
25 from Gnumed.pycommon import gmMimeLib
26
27 from Gnumed.business import gmForms
28 from Gnumed.business import gmPerson
29
30 from Gnumed.wxpython import gmGuiHelpers
31 from Gnumed.wxpython import gmListWidgets
32 from Gnumed.wxpython import gmMacro
33 from Gnumed.wxpython.gmDocumentWidgets import save_files_as_new_document
34
35
36 _log = logging.getLogger('gm.ui')
37
38 _ID_FORM_DISPOSAL_PRINT_NOW, \
39 _ID_FORM_DISPOSAL_MAIL_NOW, \
40 _ID_FORM_DISPOSAL_FAX_NOW, \
41 _ID_FORM_DISPOSAL_TRAY_NOW, \
42 _ID_FORM_DISPOSAL_ARCHIVE_NOW, \
43 _ID_FORM_DISPOSAL_SAVE_NOW = range(6)
44
45 #============================================================
46 # convenience functions
47 #============================================================
49
50 form = generate_form_from_template (
51 parent = parent,
52 excluded_template_types = [
53 u'gnuplot script',
54 u'visual progress note',
55 u'invoice'
56 ],
57 edit = True
58 )
59 if form is None:
60 return False
61
62 if form.template['engine'] == u'O':
63 return True
64
65 return act_on_generated_forms (
66 parent = parent,
67 forms = [form],
68 jobtype = jobtype,
69 episode_name = u'administration',
70 review_copy_as_normal = True
71 )
72
73 #------------------------------------------------------------
74 # eventually this should become superfluous when there's a
75 # standard engine wrapper around OOo
77
78 # export template to file
79 filename = template.export_to_file()
80 if filename is None:
81 gmGuiHelpers.gm_show_error (
82 _( 'Error exporting form template\n'
83 '\n'
84 ' "%s" (%s)'
85 ) % (template['name_long'], template['external_version']),
86 _('Letter template export')
87 )
88 return False
89
90 try:
91 doc = gmForms.cOOoLetter(template_file = filename, instance_type = template['instance_type'])
92 except ImportError:
93 gmGuiHelpers.gm_show_error (
94 _('Cannot connect to OpenOffice.\n\n'
95 'The UNO bridge module for Python\n'
96 'is not installed.'
97 ),
98 _('Letter writer')
99 )
100 return False
101
102 if not doc.open_in_ooo():
103 gmGuiHelpers.gm_show_error (
104 _('Cannot connect to OpenOffice.\n'
105 '\n'
106 'You may want to increase the option\n'
107 '\n'
108 ' <%s>'
109 ) % _('OOo startup time'),
110 _('Letter writer')
111 )
112 try: os.remove(filename)
113 except: pass
114 return False
115
116 doc.show(False)
117 ph_handler = gmMacro.gmPlaceholderHandler()
118 doc.replace_placeholders(handler = ph_handler)
119
120 filename = filename.replace('.ott', '.odt').replace('-FormTemplate-', '-FormInstance-')
121 doc.save_in_ooo(filename = filename)
122
123 doc.show(True)
124
125 return True
126 #------------------------------------------------------------
127 -def manage_form_templates(parent=None, template_types=None, active_only=False, excluded_types=None, msg=None):
128
129 if parent is None:
130 parent = wx.GetApp().GetTopWindow()
131
132 #-------------------------
133 def edit(template=None):
134 dlg = cFormTemplateEditAreaDlg(parent, -1, template=template)
135 return (dlg.ShowModal() == wx.ID_OK)
136 #-------------------------
137 def delete(template):
138 delete = gmGuiHelpers.gm_show_question (
139 aTitle = _('Deleting form template.'),
140 aMessage = _(
141 'Are you sure you want to delete\n'
142 'the following form template ?\n\n'
143 ' "%s (%s)"\n\n'
144 'You can only delete templates which\n'
145 'have not yet been used to generate\n'
146 'any forms from.'
147 ) % (template['name_long'], template['external_version'])
148 )
149 if delete:
150 # FIXME: make this a priviledged operation ?
151 gmForms.delete_form_template(template = template)
152 return True
153 return False
154 #-------------------------
155 def refresh(lctrl):
156 templates = gmForms.get_form_templates(active_only = active_only, template_types = template_types, excluded_types = excluded_types)
157 lctrl.set_string_items(items = [ [t['name_long'], t['external_version'], gmForms.form_engine_names[t['engine']]] for t in templates ])
158 lctrl.set_data(data = templates)
159 #-------------------------
160 template = gmListWidgets.get_choices_from_list (
161 parent = parent,
162 msg = msg,
163 caption = _('Select letter or form template.'),
164 columns = [_('Template'), _('Version'), _('Type')],
165 edit_callback = edit,
166 new_callback = edit,
167 delete_callback = delete,
168 refresh_callback = refresh,
169 single_selection = True
170 )
171
172 return template
173
174 #------------------------------------------------------------
175 -def generate_form_from_template(parent=None, template_types=None, edit=None, template=None, excluded_template_types=None):
176 """If <edit> is None it will honor the template setting."""
177
178 if parent is None:
179 parent = wx.GetApp().GetTopWindow()
180
181 # 1) get template to use
182 if template is None:
183 template = manage_form_templates (
184 parent = parent,
185 active_only = True,
186 template_types = template_types,
187 excluded_types = excluded_template_types
188 )
189 if template is None:
190 gmDispatcher.send(signal = 'statustext', msg = _('No document template selected.'), beep = False)
191 return None
192
193 if template['engine'] == u'O':
194 return print_doc_from_ooo_template(template = template)
195
196 wx.BeginBusyCursor()
197
198 # 2) process template
199 try:
200 form = template.instantiate()
201 except KeyError:
202 _log.exception('cannot instantiate document template [%s]', template)
203 gmGuiHelpers.gm_show_error (
204 aMessage = _('Invalid document template [%s - %s (%s)]') % (name, ver, template['engine']),
205 aTitle = _('Generating document from template')
206 )
207 wx.EndBusyCursor()
208 return None
209 ph = gmMacro.gmPlaceholderHandler()
210 #ph.debug = True
211 form.substitute_placeholders(data_source = ph)
212 if edit is None:
213 if form.template['edit_after_substitution']:
214 edit = True
215 else:
216 edit = False
217 if edit:
218 wx.EndBusyCursor()
219 form.edit()
220 wx.BeginBusyCursor()
221
222 # 3) generate output
223 pdf_name = form.generate_output()
224 wx.EndBusyCursor()
225 if pdf_name is not None:
226 return form
227
228 gmGuiHelpers.gm_show_error (
229 aMessage = _('Error generating document printout.'),
230 aTitle = _('Generating document printout')
231 )
232 return None
233
234 #------------------------------------------------------------
235 -def act_on_generated_forms(parent=None, forms=None, jobtype=None, episode_name=None, progress_note=None, review_copy_as_normal=False):
236 """This function assumes that .generate_output() has already been called on each form."""
237
238 if len(forms) == 0:
239 return True
240
241 no_of_printables = 0
242 for form in forms:
243 no_of_printables += len(form.final_output_filenames)
244
245 if no_of_printables == 0:
246 return True
247
248 soap_lines = []
249
250 #-----------------------------
251 def save_soap(soap=None):
252 if soap.strip() == u'':
253 return
254 pat = gmPerson.gmCurrentPatient()
255 emr = pat.get_emr()
256 epi = emr.add_episode(episode_name = episode_name, is_open = False)
257 emr.add_clin_narrative (
258 soap_cat = None,
259 note = soap,
260 episode = epi
261 )
262 #-----------------------------
263 def archive_forms(episode_name=None):
264 if episode_name is None:
265 epi = None # will ask for episode further down
266 else:
267 pat = gmPerson.gmCurrentPatient()
268 emr = pat.get_emr()
269 epi = emr.add_episode(episode_name = episode_name, is_open = False)
270
271 for form in forms:
272 files2import = []
273 files2import.extend(form.final_output_filenames)
274 files2import.extend(form.re_editable_filenames)
275 if len(files2import) == 0:
276 continue
277 save_files_as_new_document (
278 parent = parent,
279 filenames = files2import,
280 document_type = form.template['instance_type'],
281 unlock_patient = False,
282 episode = epi,
283 review_as_normal = review_copy_as_normal,
284 reference = None
285 )
286
287 return True
288 #-----------------------------
289 def save_forms():
290 # anything to do ?
291 files2save = []
292 form_names = []
293 for form in forms:
294 files2save.extend(form.final_output_filenames)
295 form_names.append(u'%s (%s)' % (form.template['name_long'], form.template['external_version']))
296 if len(files2save) == 0:
297 return True
298 # get path
299 path = os.path.expanduser(os.path.join('~', 'gnumed'))
300 dlg = wx.DirDialog (
301 parent = parent,
302 message = _('Select directory in which to create patient directory ...'),
303 defaultPath = path,
304 style = wx.DD_DEFAULT_STYLE
305 )
306 result = dlg.ShowModal()
307 path = dlg.GetPath()
308 dlg.Destroy()
309 if result != wx.ID_OK:
310 return
311 # save forms
312 pat = gmPerson.gmCurrentPatient()
313 path = os.path.join(path, pat.dirname)
314 gmTools.mkdir(path)
315 _log.debug('form saving path: %s', path)
316 for form in forms:
317 for filename in form.final_output_filenames:
318 shutil.copy2(filename, path)
319 soap_lines.append(_('Saved to disk: %s') % u', '.join(form_names))
320 return True
321 #-----------------------------
322 def print_forms():
323 # anything to do ?
324 files2print = []
325 form_names = []
326 for form in forms:
327 files2print.extend(form.final_output_filenames)
328 form_names.append(u'%s (%s)' % (form.template['name_long'], form.template['external_version']))
329 if len(files2print) == 0:
330 return True
331 # print
332 printed = gmPrinting.print_files(filenames = files2print, jobtype = jobtype)
333 if not printed:
334 gmGuiHelpers.gm_show_error (
335 aMessage = _('Error printing documents.'),
336 aTitle = _('Printing [%s]') % jobtype
337 )
338 return False
339 soap_lines.append(_('Printed: %s') % u', '.join(form_names))
340 return True
341 #-----------------------------
342 def mail_forms():
343 # anything to do ?
344 files2mail = []
345 form_names = []
346 for form in forms:
347 files2mail.extend(form.final_output_filenames)
348 form_names.append(u'%s (%s)' % (form.template['name_long'], form.template['external_version']))
349 if len(files2mail) == 0:
350 return True
351 found, external_cmd = gmShellAPI.detect_external_binary('gm-mail_doc')
352 if not found:
353 return False
354 # send mail
355 cmd = u'%s %s' % (external_cmd, u' '.join(files2mail))
356 if os.name == 'nt':
357 blocking = True
358 else:
359 blocking = False
360 success = gmShellAPI.run_command_in_shell (
361 command = cmd,
362 blocking = blocking
363 )
364 if not success:
365 gmGuiHelpers.gm_show_error (
366 aMessage = _('Error mailing documents.'),
367 aTitle = _('Mailing documents')
368 )
369 return False
370 soap_lines.append(_('Mailed: %s') % u', '.join(form_names))
371 return True
372 #-----------------------------
373 def fax_forms(fax_number=None):
374 # anything to do ?
375 files2fax = []
376 form_names = []
377 for form in forms:
378 files2fax.extend(form.final_output_filenames)
379 form_names.append(u'%s (%s)' % (form.template['name_long'], form.template['external_version']))
380 if len(files2fax) == 0:
381 return True
382 found, external_cmd = gmShellAPI.detect_external_binary('gm-fax_doc')
383 if not found:
384 return False
385 # send fax
386 cmd = u'%s "%s" %s' % (external_cmd, fax_number, u' '.join(files2fax))
387 if os.name == 'nt':
388 blocking = True
389 else:
390 blocking = False
391 success = gmShellAPI.run_command_in_shell (
392 command = cmd,
393 blocking = blocking
394 )
395 if not success:
396 gmGuiHelpers.gm_show_error (
397 aMessage = _('Error faxing documents to\n\n %s') % fax_number,
398 aTitle = _('Faxing documents')
399 )
400 return False
401 soap_lines.append(_('Faxed to %s: %s') % (fax_number, u', '.join(form_names)))
402 return True
403 #-----------------------------
404
405 if parent is None:
406 parent = wx.GetApp().GetTopWindow()
407
408 if jobtype is None:
409 jobtype = 'generic_document'
410
411 dlg = cFormDisposalDlg(parent, -1)
412 dlg.forms = forms
413 dlg.progress_note = progress_note
414 dlg.episode_name = episode_name
415 action_code = dlg.ShowModal()
416
417 if action_code == wx.ID_CANCEL:
418 dlg.Destroy()
419 return True
420
421 forms = dlg._LCTRL_forms.get_item_data()
422 if len(forms) == 0:
423 dlg.Destroy()
424 return True
425
426 progress_note = dlg.progress_note
427 episode_name = dlg._PRW_episode.GetValue().strip()
428 do_save = dlg._CHBOX_save.GetValue()
429 do_print = dlg._CHBOX_print.GetValue()
430 do_mail = dlg._CHBOX_mail.GetValue()
431 fax_number = dlg._PRW_fax.GetValue().strip()
432 dlg.Destroy()
433
434 if action_code == wx.ID_OK:
435 if episode_name != u'':
436 result = archive_forms(episode_name = episode_name)
437 if do_save:
438 result = save_forms()
439 if do_print:
440 result = print_forms()
441 if do_mail:
442 result = mail_forms()
443 if fax_number != u'':
444 result = fax_forms(fax_number = fax_number)
445 if progress_note != u'':
446 soap_lines.insert(0, progress_note)
447 if len(soap_lines) > 0:
448 save_soap(soap = u'\n'.join(soap_lines))
449 return result
450
451 success = False
452 keep_a_copy = False
453 if action_code == _ID_FORM_DISPOSAL_PRINT_NOW:
454 if episode_name != u'':
455 keep_a_copy = True
456 success = print_forms()
457
458 elif action_code == _ID_FORM_DISPOSAL_ARCHIVE_NOW:
459 if episode_name == u'':
460 episode_name = None
461 keep_a_copy = True
462 success = True
463
464 elif action_code == _ID_FORM_DISPOSAL_SAVE_NOW:
465 if episode_name != u'':
466 keep_a_copy = True
467 success = save_forms()
468
469 elif action_code == _ID_FORM_DISPOSAL_MAIL_NOW:
470 if episode_name != u'':
471 keep_a_copy = True
472 success = mail_forms()
473
474 elif action_code == _ID_FORM_DISPOSAL_FAX_NOW:
475 if episode_name != u'':
476 keep_a_copy = True
477 success = fax_forms(fax_number = fax_number)
478
479 elif action_code == _ID_FORM_DISPOSAL_TRAY_NOW:
480 # not implemented
481 success = False
482
483 if not success:
484 return False
485
486 if progress_note != u'':
487 soap_lines.insert(0, progress_note)
488 if len(soap_lines) > 0:
489 save_soap(soap = u'\n'.join(soap_lines))
490
491 if keep_a_copy:
492 archive_forms(episode_name = episode_name)
493
494 return True
495
496 #============================================================
497 from Gnumed.wxGladeWidgets import wxgFormDisposalDlg
498
500
502
503 wxgFormDisposalDlg.wxgFormDisposalDlg.__init__(self, *args, **kwargs)
504
505 self.__init_ui()
506
507 #--------------------------------------------------------
508 # properties
509 #--------------------------------------------------------
513
514 message = property(lambda x:x, _set_msg)
515
516 #--------------------------------------------------------
518 items = [ f.template['name_long'] for f in forms ]
519 self._LCTRL_forms.set_string_items(items)
520 self._LCTRL_forms.set_data(forms)
521
522 forms = property(lambda x:x, _set_forms)
523
524 #--------------------------------------------------------
526 return self._TCTRL_soap.GetValue().strip()
527
532
533 progress_note = property(_get_note, _set_note)
534
535 #--------------------------------------------------------
537 return self._PRW_episode.GetValue().strip()
538
543
544 episode_name = property(_get_episode_name, _set_episode_name)
545
546 #--------------------------------------------------------
547 # internal helpers
548 #--------------------------------------------------------
550 self._LCTRL_forms.set_columns([_('Form')])
551
552 self.__mail_script_exists, path = gmShellAPI.detect_external_binary(binary = r'gm-mail_doc')
553 if not self.__mail_script_exists:
554 self._LBL_mail.Disable()
555 self._CHBOX_mail.SetLabel(_('<gm-mail_doc(.bat) not found>'))
556 self._CHBOX_mail.SetValue(False)
557 self._CHBOX_mail.Disable()
558 self._BTN_mail.Disable()
559
560 self.__fax_script_exists, path = gmShellAPI.detect_external_binary(binary = r'gm-fax_doc')
561 if not self.__fax_script_exists:
562 self._LBL_fax.Disable()
563 self._PRW_fax.SetText(_('<gm-fax_doc(.bat) not found>'), data = None)
564 self._PRW_fax.display_as_disabled(True)
565 self._PRW_fax.Disable()
566 self._BTN_fax.Disable()
567
568 self._LBL_tray.Disable()
569 self._CHBOX_tray.SetValue(False)
570 self._CHBOX_tray.Disable()
571 self._BTN_tray.Disable()
572
573 #--------------------------------------------------------
574 # event handlers
575 #--------------------------------------------------------
578 #--------------------------------------------------------
584 #--------------------------------------------------------
590 #--------------------------------------------------------
593 #--------------------------------------------------------
596 #--------------------------------------------------------
599 #--------------------------------------------------------
608 #--------------------------------------------------------
612 #--------------------------------------------------------
615 #============================================================
616 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaPnl
617
619
621 try:
622 self.__template = kwargs['template']
623 del kwargs['template']
624 except KeyError:
625 self.__template = None
626
627 wxgFormTemplateEditAreaPnl.wxgFormTemplateEditAreaPnl.__init__(self, *args, **kwargs)
628
629 self._PRW_name_long.matcher = gmForms.cFormTemplateNameLong_MatchProvider()
630 self._PRW_name_short.matcher = gmForms.cFormTemplateNameShort_MatchProvider()
631 self._PRW_template_type.matcher = gmForms.cFormTemplateType_MatchProvider()
632
633 self.refresh()
634
635 self.full_filename = None
636 #--------------------------------------------------------
638 if template is not None:
639 self.__template = template
640
641 if self.__template is None:
642 self._PRW_name_long.SetText(u'')
643 self._PRW_name_short.SetText(u'')
644 self._TCTRL_external_version.SetValue(u'')
645 self._PRW_template_type.SetText(u'')
646 self._PRW_instance_type.SetText(u'')
647 self._TCTRL_filename.SetValue(u'')
648 self._CH_engine.SetSelection(0)
649 self._CHBOX_active.SetValue(True)
650 self._CHBOX_editable.SetValue(True)
651
652 self._TCTRL_date_modified.SetValue(u'')
653 self._TCTRL_modified_by.SetValue(u'')
654
655 self._BTN_export.Enable(False)
656 else:
657 self._PRW_name_long.SetText(self.__template['name_long'])
658 self._PRW_name_short.SetText(self.__template['name_short'])
659 self._TCTRL_external_version.SetValue(self.__template['external_version'])
660 self._PRW_template_type.SetText(self.__template['l10n_template_type'], data = self.__template['pk_template_type'])
661 self._PRW_instance_type.SetText(self.__template['l10n_instance_type'], data = self.__template['instance_type'])
662 self._TCTRL_filename.SetValue(self.__template['filename'])
663 self._CH_engine.SetSelection(gmForms.form_engine_abbrevs.index(self.__template['engine']))
664 self._CHBOX_active.SetValue(self.__template['in_use'])
665 self._CHBOX_editable.SetValue(self.__template['edit_after_substitution'])
666
667 self._TCTRL_date_modified.SetValue(gmDateTime.pydt_strftime(self.__template['last_modified'], '%Y %b %d'))
668 self._TCTRL_modified_by.SetValue(self.__template['modified_by'])
669
670 self._TCTRL_filename.Enable(True)
671 #self._BTN_load.Enable(not self.__template['has_instances'])
672 self._BTN_load.Enable(True)
673
674 self._BTN_export.Enable(True)
675
676 self._PRW_name_long.SetFocus()
677 #--------------------------------------------------------
679 error = False
680
681 if gmTools.coalesce(self._PRW_name_long.GetValue(), u'').strip() == u'':
682 error = True
683 self._PRW_name_long.SetBackgroundColour('pink')
684 else:
685 self._PRW_name_long.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
686
687 if gmTools.coalesce(self._PRW_name_short.GetValue(), u'').strip() == u'':
688 error = True
689 self._PRW_name_short.SetBackgroundColour('pink')
690 else:
691 self._PRW_name_short.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
692
693 if gmTools.coalesce(self._TCTRL_external_version.GetValue(), u'').strip() == u'':
694 error = True
695 self._TCTRL_external_version.SetBackgroundColour('pink')
696 else:
697 self._TCTRL_external_version.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
698
699 if gmTools.coalesce(self._PRW_template_type.GetValue(), u'').strip() == u'':
700 error = True
701 self._PRW_template_type.SetBackgroundColour('pink')
702 else:
703 self._PRW_template_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
704
705 if gmTools.coalesce(self._PRW_instance_type.GetValue(), u'').strip() == u'':
706 error = True
707 self._PRW_instance_type.SetBackgroundColour('pink')
708 else:
709 self._PRW_instance_type.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
710
711 if self.__template is None and self.full_filename is None:
712 error = True
713 gmDispatcher.send(signal = 'statustext', msg = _('You must select a template file before saving.'), beep = True)
714
715 return not error
716 #--------------------------------------------------------
718 if not self.__valid_for_save():
719 return False
720
721 if self.__template is None:
722 self.__template = gmForms.create_form_template (
723 template_type = self._PRW_template_type.GetData(),
724 name_short = self._PRW_name_short.GetValue().strip(),
725 name_long = self._PRW_name_long.GetValue().strip()
726 )
727 else:
728 self.__template['pk_template_type'] = self._PRW_template_type.GetData()
729 self.__template['name_short'] = self._PRW_name_short.GetValue().strip()
730 self.__template['name_long'] = self._PRW_name_long.GetValue().strip()
731
732 # if not self.__template['has_instances']:
733 if self.full_filename is not None:
734 self.__template.update_template_from_file(filename = self.full_filename)
735
736 self.__template['external_version'] = self._TCTRL_external_version.GetValue()
737 tmp = self._PRW_instance_type.GetValue().strip()
738 if tmp not in [self.__template['instance_type'], self.__template['l10n_instance_type']]:
739 self.__template['instance_type'] = tmp
740 self.__template['filename'] = self._TCTRL_filename.GetValue()
741 self.__template['in_use'] = self._CHBOX_active.GetValue()
742 self.__template['edit_after_substitution'] = self._CHBOX_editable.GetValue()
743 self.__template['engine'] = gmForms.form_engine_abbrevs[self._CH_engine.GetSelection()]
744
745 self.__template.save()
746 return True
747 #--------------------------------------------------------
748 # event handlers
749 #--------------------------------------------------------
781 #--------------------------------------------------------
815 #============================================================
816 from Gnumed.wxGladeWidgets import wxgFormTemplateEditAreaDlg
817
819
821 try:
822 template = kwargs['template']
823 del kwargs['template']
824 except KeyError:
825 template = None
826
827 wxgFormTemplateEditAreaDlg.wxgFormTemplateEditAreaDlg.__init__(self, *args, **kwargs)
828
829 self._PNL_edit_area.refresh(template=template)
830 #--------------------------------------------------------
837 #============================================================
838 # main
839 #------------------------------------------------------------
840 if __name__ == '__main__':
841
842 gmI18N.activate_locale()
843 gmI18N.install_domain(domain = 'gnumed')
844
845 #----------------------------------------
847 app = wx.PyWidgetTester(size = (400, 300))
848 pnl = cFormTemplateEditAreaPnl(app.frame, -1, template = gmForms.cFormTemplate(aPK_obj=4))
849 app.frame.Show(True)
850 app.MainLoop()
851 return
852 #----------------------------------------
853 if (len(sys.argv) > 1) and (sys.argv[1] == 'test'):
854 test_cFormTemplateEditAreaPnl()
855
856 #============================================================
857
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Fri Jul 12 03:56:16 2013 | http://epydoc.sourceforge.net |