| Home | Trees | Indices | Help |
|
|---|
|
|
1 """GNUmed data mining related widgets.
2 """
3 #================================================================
4 # $Source: /home/ncq/Projekte/cvs2git/vcs-mirror/gnumed/gnumed/client/wxpython/gmDataMiningWidgets.py,v $
5 # $Id: gmDataMiningWidgets.py,v 1.14 2009-07-30 12:03:34 ncq Exp $
6 __version__ = '$Revision: 1.14 $'
7 __author__ = 'karsten.hilbert@gmx.net'
8 __license__ = 'GPL (details at http://www.gnu.org)'
9
10
11 # stdlib
12 import sys, os, fileinput, webbrowser, logging
13
14
15 # 3rd party
16 import wx
17
18
19 # GNUmed
20 if __name__ == '__main__':
21 sys.path.insert(0, '../../')
22 from Gnumed.pycommon import gmDispatcher, gmMimeLib, gmTools, gmPG2, gmMatchProvider, gmI18N
23 from Gnumed.business import gmPerson, gmDataMining, gmPersonSearch
24 from Gnumed.wxpython import gmGuiHelpers, gmListWidgets
25 from Gnumed.wxGladeWidgets import wxgPatientListingPnl, wxgDataMiningPnl
26
27
28 _log = logging.getLogger('gm.ui')
29 _log.info(__version__)
30 #================================================================
32
34 """<patient_key> must index or name a column in self.__data"""
35 try:
36 self.patient_key = kwargs['patient_key']
37 del kwargs['patient_key']
38 except KeyError:
39 self.patient_key = None
40
41 gmListWidgets.cReportListCtrl.__init__(self, *args, **kwargs)
42
43 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._on_list_item_activated, self)
44 #------------------------------------------------------------
45 # event handling
46 #------------------------------------------------------------
48 if self.patient_key is None:
49 gmDispatcher.send(signal = 'statustext', msg = _('List not known to be patient-related.'))
50 return
51 data = self.get_selected_item_data(only_one=True)
52 try:
53 pat_data = data[self.patient_key]
54 except (KeyError, IndexError, TypeError):
55 gmGuiHelpers.gm_show_info (
56 _(
57 'Cannot activate patient.\n\n'
58 'The row does not contain a column\n'
59 'named or indexed "%s".\n\n'
60 ) % self.patient_key,
61 _('activating patient from list')
62 )
63 return
64 try:
65 pat_pk = int(pat_data)
66 pat = gmPerson.cIdentity(aPK_obj = pat_pk)
67 except (ValueError, TypeError):
68 searcher = gmPersonSearch.cPatientSearcher_SQL()
69 idents = searcher.get_identities(pat_data)
70 if len(idents) == 0:
71 gmDispatcher.send(signal = 'statustext', msg = _('No matching patient found.'))
72 return
73 if len(idents) == 1:
74 pat = idents[0]
75 else:
76 from Gnumed.wxpython import gmPatSearchWidgets
77 dlg = gmPatSearchWidgets.cSelectPersonFromListDlg(parent=wx.GetTopLevelParent(self), id=-1)
78 dlg.set_persons(persons=idents)
79 result = dlg.ShowModal()
80 if result == wx.ID_CANCEL:
81 dlg.Destroy()
82 return
83 pat = dlg.get_selected_person()
84 dlg.Destroy()
85
86 from Gnumed.wxpython import gmPatSearchWidgets
87 gmPatSearchWidgets.set_active_patient(patient = pat)
88 #================================================================
90
92
93 try:
94 button_defs = kwargs['button_defs'][:5]
95 del kwargs['button_defs']
96 except KeyError:
97 button_defs = []
98
99 try:
100 msg = kwargs['message']
101 del kwargs['message']
102 except KeyError:
103 msg = None
104
105 wxgPatientListingPnl.wxgPatientListingPnl.__init__(self, *args, **kwargs)
106
107 if msg is not None:
108 self._lbl_msg.SetLabel(msg)
109
110 buttons = [self._BTN_1, self._BTN_2, self._BTN_3, self._BTN_4, self._BTN_5]
111 for idx in range(len(button_defs)):
112 button_def = button_defs[idx]
113 if button_def['label'].strip() == u'':
114 continue
115 buttons[idx].SetLabel(button_def['label'])
116 buttons[idx].SetToolTipString(button_def['tooltip'])
117 buttons[idx].Enable(True)
118
119 self.Fit()
120 #------------------------------------------------------------
121 # event handling
122 #------------------------------------------------------------
125 #------------------------------------------------------------
128 #------------------------------------------------------------
131 #------------------------------------------------------------
134 #------------------------------------------------------------
137 #================================================================
139
141 wxgDataMiningPnl.wxgDataMiningPnl.__init__(self, *args, **kwargs)
142
143 self.__init_ui()
144
145 # make me a file drop target
146 dt = gmGuiHelpers.cFileDropTarget(self)
147 self.SetDropTarget(dt)
148 #--------------------------------------------------------
150 mp = gmMatchProvider.cMatchProvider_SQL2 (
151 queries = [u'select distinct on (label) cmd, label from cfg.report_query where label %(fragment_condition)s or cmd %(fragment_condition)s']
152 )
153 mp.setThresholds(2,3,5)
154 self._PRW_report_name.matcher = mp
155 self._PRW_report_name.add_callback_on_selection(callback = self._on_report_selected)
156 self._PRW_report_name.add_callback_on_lose_focus(callback = self._auto_load_report)
157 #--------------------------------------------------------
159 if self._TCTRL_query.GetValue() == u'':
160 if self._PRW_report_name.GetData() is not None:
161 self._TCTRL_query.SetValue(self._PRW_report_name.GetData())
162 self._BTN_run.SetFocus()
163 #--------------------------------------------------------
167 #--------------------------------------------------------
168 # file drop target API
169 #--------------------------------------------------------
171 # act on first file only
172 fname = filenames[0]
173 # act on text files only
174 mime_type = gmMimeLib.guess_mimetype(fname)
175 if not mime_type.startswith('text/'):
176 gmDispatcher.send(signal='statustext', msg = _('Cannot read SQL from [%s]. Not a text file.') % fname, beep = True)
177 return False
178 # act on "small" files only
179 stat_val = os.stat(fname)
180 if stat_val.st_size > 2000:
181 gmDispatcher.send(signal='statustext', msg = _('Cannot read SQL from [%s]. File too big (> 2000 bytes).') % fname, beep = True)
182 return False
183 # all checks passed
184 for line in fileinput.input(fname):
185 self._TCTRL_query.AppendText(line)
186 #--------------------------------------------------------
187 # notebook plugin API
188 #--------------------------------------------------------
191 #--------------------------------------------------------
192 # event handlers
193 #--------------------------------------------------------
195 data = self._LCTRL_result.get_selected_item_data()
196
197 try:
198 pk_pat = data['pk_patient']
199 except KeyError:
200 gmGuiHelpers.gm_show_warning (
201 _(
202 'Cannot activate patient.\n\n'
203 'The report result list does not contain\n'
204 'a column named "pk_patient".\n\n'
205 'You may want to use the SQL "AS" column alias\n'
206 'syntax to make your query return such a column.\n'
207 ),
208 _('Activating patient from report result')
209 )
210 return
211
212 try:
213 pat = gmPerson.cPatient(aPK_obj = pk_pat)
214 except StandardError:
215 gmGuiHelpers.gm_show_warning (
216 _(
217 'Cannot activate patient.\n'
218 '\n'
219 'There does not seem to exist a patient\n'
220 'with an internal ID of [%s].\n'
221 ) % pk_pat,
222 _('Activating patient from report result')
223 )
224 return
225
226 from Gnumed.wxpython import gmPatSearchWidgets
227 gmPatSearchWidgets.set_active_patient(patient = pat)
228 #--------------------------------------------------------
283 #--------------------------------------------------------
288 #--------------------------------------------------------
300 #--------------------------------------------------------
306 #--------------------------------------------------------
322 #--------------------------------------------------------
372 #--------------------------------------------------------
439 #================================================================
440 # main
441 #----------------------------------------------------------------
442 if __name__ == '__main__':
443 from Gnumed.pycommon import gmI18N, gmDateTime
444
445 gmI18N.activate_locale()
446 gmI18N.install_domain()
447 gmDateTime.init()
448
449 #------------------------------------------------------------
451 app = wx.PyWidgetTester(size = (400, 500))
452 lst = cPatientListingCtrl(app.frame, patient_key = 0)
453 lst.set_columns(['name', 'comment'])
454 lst.set_string_items([
455 ['Kirk', 'Kirk by name'],
456 ['#12', 'Kirk by ID'],
457 ['unknown', 'unknown patient']
458 ])
459 # app.SetWidget(cPatientListingCtrl, patient_key = 0)
460 app.frame.Show()
461 app.MainLoop()
462 #------------------------------------------------------------
463
464 test_pat_list_ctrl()
465
466 #================================================================
467 # $Log: gmDataMiningWidgets.py,v $
468 # Revision 1.14 2009-07-30 12:03:34 ncq
469 # - improved contribution email
470 #
471 # Revision 1.13 2009/07/18 11:46:53 ncq
472 # - be more robust in the face of non-existant patients being activated
473 #
474 # Revision 1.12 2009/07/15 12:21:10 ncq
475 # - auto-load report from db if name exists and query empty and name loses focus
476 # - clear results, too, on clear button
477 # - improved plot title
478 # - improved error handling around Gnuplot access
479 # - display # of results found
480 #
481 # Revision 1.11 2009/07/06 17:10:35 ncq
482 # - signal errors in sanity check of query before contributing
483 # - show warning before sending contribution
484 # - fix encoding of contribution email
485 #
486 # Revision 1.10 2009/06/04 16:30:30 ncq
487 # - use set active patient from pat search widgets
488 #
489 # Revision 1.9 2008/12/22 18:59:56 ncq
490 # - put \n before appended wrapper query because original query might have
491 # a line starting with "-- " as the last line ...
492 #
493 # Revision 1.8 2008/03/06 18:29:29 ncq
494 # - standard lib logging only
495 #
496 # Revision 1.7 2007/12/11 12:49:25 ncq
497 # - explicit signal handling
498 #
499 # Revision 1.6 2007/11/21 14:33:40 ncq
500 # - fix use of send_mail()
501 #
502 # Revision 1.5 2007/09/24 18:31:16 ncq
503 # - support visualizing data mining results
504 #
505 # Revision 1.4 2007/09/10 13:50:05 ncq
506 # - missing import
507 #
508 # Revision 1.3 2007/08/12 00:07:18 ncq
509 # - no more gmSignals.py
510 #
511 # Revision 1.2 2007/07/09 11:06:24 ncq
512 # - missing import
513 #
514 # Revision 1.1 2007/07/09 11:03:49 ncq
515 # - new file
516 #
517 #
518
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Mon Nov 29 04:04:56 2010 | http://epydoc.sourceforge.net |