| Home | Trees | Indices | Help |
|
|---|
|
|
1 """GNUmed generic contact related widgets."""
2 #================================================================
3 __author__ = 'karsten.hilbert@gmx.net'
4 __license__ = 'GPL v2 or later (details at http://www.gnu.org)'
5
6 # stdlib
7 import logging, sys
8
9
10 # 3rd party
11 import wx
12
13
14 # GNUmed
15 if __name__ == '__main__':
16 sys.path.insert(0, '../../')
17
18 from Gnumed.pycommon import gmPG2
19 from Gnumed.pycommon import gmTools
20 from Gnumed.pycommon import gmMatchProvider
21 from Gnumed.pycommon import gmDispatcher
22
23 from Gnumed.business import gmDemographicRecord
24
25 from Gnumed.wxpython import gmListWidgets
26 from Gnumed.wxpython import gmPhraseWheel
27 from Gnumed.wxpython import gmEditArea
28 from Gnumed.wxpython import gmGuiHelpers
29
30
31 _log = logging.getLogger('gm.ui')
32 #============================================================
33 # communication channels related widgets
34 #============================================================
36
37 if parent is None:
38 parent = wx.GetApp().GetTopWindow()
39
40 #------------------------------------------------------------
41 def delete(channel=None):
42 return gmDemographicRecord.delete_comm_channel_type(pk_channel_type = channel['pk'])
43 #------------------------------------------------------------
44 def refresh(lctrl):
45 wx.BeginBusyCursor()
46 channel_types = gmDemographicRecord.get_comm_channel_types()
47 lctrl.set_string_items([ (ct['l10n_description'], ct['description'], ct['pk']) for ct in channel_types ])
48 lctrl.set_data(channel_types)
49 wx.EndBusyCursor()
50 #------------------------------------------------------------
51 msg = _('\nThis lists the communication channel types known to GNUmed.\n')
52
53 gmListWidgets.get_choices_from_list (
54 parent = parent,
55 msg = msg,
56 caption = _('Managing communication types ...'),
57 columns = [_('Channel'), _('System type'), '#'],
58 single_selection = True,
59 #new_callback = edit,
60 #edit_callback = edit,
61 delete_callback = delete,
62 refresh_callback = refresh
63 )
64
65 #------------------------------------------------------------
67
69
70 query = """
71 SELECT
72 data,
73 field_label,
74 list_label
75 FROM (
76 SELECT DISTINCT ON (field_label)
77 pk
78 AS data,
79 _(description)
80 AS field_label,
81 (_(description) || ' (' || description || ')')
82 AS list_label
83 FROM dem.enum_comm_types
84 WHERE
85 _(description) %(fragment_condition)s
86 OR
87 description %(fragment_condition)s
88 ) AS ur
89 ORDER BY
90 ur.list_label
91 """
92 mp = gmMatchProvider.cMatchProvider_SQL2(queries=query)
93 mp.setThresholds(1, 2, 4)
94 mp.word_separators = '[ \t]+'
95 gmPhraseWheel.cPhraseWheel.__init__(self, *args, **kwargs)
96 self.matcher = mp
97 self.SetToolTip(_('Select the type of communications channel.'))
98 self.selection_only = True
99
100 #================================================================
102 if parent is None:
103 parent = wx.GetApp().GetTopWindow()
104 ea = cCommChannelEditAreaPnl(parent, -1, comm_channel = comm_channel)
105 ea.channel_owner = channel_owner
106 dlg = gmEditArea.cGenericEditAreaDlg2(self, -1, edit_area = ea, single_entry = True)
107 dlg.SetTitle(_('Editing communications channel'))
108 if dlg.ShowModal() == wx.ID_OK:
109 return True
110 return False
111 #------------------------------------------------------------
112 from Gnumed.wxGladeWidgets import wxgCommChannelEditAreaPnl
113
114 -class cCommChannelEditAreaPnl(wxgCommChannelEditAreaPnl.wxgCommChannelEditAreaPnl, gmEditArea.cGenericEditAreaMixin):
115 """An edit area for editing/creating a comms channel.
116
117 Does NOT act on/listen to the current patient.
118 """
120 try:
121 data = kwargs['comm_channel']
122 del kwargs['comm_channel']
123 except KeyError:
124 data = None
125
126 self.channel_owner = None
127
128 wxgCommChannelEditAreaPnl.wxgCommChannelEditAreaPnl.__init__(self, *args, **kwargs)
129 gmEditArea.cGenericEditAreaMixin.__init__(self)
130
131 self.mode = 'new'
132 self.data = data
133 if data is not None:
134 self.mode = 'edit'
135
136 #self.__init_ui()
137 #----------------------------------------------------------------
138 #def __init_ui(self):
139 #----------------------------------------------------------------
140 # generic Edit Area mixin API
141 #----------------------------------------------------------------
143 validity = True
144
145 if self._TCTRL_url.GetValue().strip() == '':
146 validity = False
147 self.display_tctrl_as_valid(tctrl = self._TCTRL_url, valid = False)
148 self._TCTRL_url.SetFocus()
149 else:
150 self.display_tctrl_as_valid(tctrl = self._TCTRL_url, valid = True)
151
152 # do not check GetData() because comm
153 # types are created as needed
154 #if self._PRW_type.GetData() is None:
155 if self._PRW_type.GetValue().strip() == '':
156 validity = False
157 self._PRW_type.display_as_valid(False)
158 self._PRW_type.SetFocus()
159 else:
160 self._PRW_type.display_as_valid(True)
161
162 return validity
163 #----------------------------------------------------------------
165 try:
166 data = self.channel_owner.link_comm_channel (
167 comm_medium = self._PRW_type.GetValue().strip(),
168 pk_channel_type = self._PRW_type.GetData(),
169 url = self._TCTRL_url.GetValue().strip(),
170 is_confidential = self._CHBOX_confidential.GetValue(),
171 )
172 except gmPG2.dbapi.IntegrityError:
173 _log.exception('error saving comm channel')
174 self.StatusText = _('Cannot save (duplicate ?) communications channel.')
175 return False
176
177 data['comment'] = self._TCTRL_comment.GetValue().strip()
178 data.save()
179
180 self.data = data
181 return True
182 #----------------------------------------------------------------
184 comm_type = self._PRW_type.GetValue().strip()
185 if comm_type != '':
186 self.data['comm_type'] = comm_type
187 url = self._TCTRL_url.GetValue().strip()
188 if url != '':
189 self.data['url'] = url
190 self.data['is_confidential'] = self._CHBOX_confidential.GetValue()
191 self.data['comment'] = self._TCTRL_comment.GetValue().strip()
192
193 self.data.save()
194 return True
195 #----------------------------------------------------------------
197 self._PRW_type.SetText('')
198 self._TCTRL_url.SetValue('')
199 self._CHBOX_confidential.SetValue(False)
200 self._TCTRL_comment.SetValue('')
201
202 self._PRW_type.SetFocus()
203 #----------------------------------------------------------------
206 #----------------------------------------------------------------
214 #------------------------------------------------------------
216 """A list for managing a person's comm channels."""
218
219 try:
220 self.__channel_owner = kwargs['identity']
221 del kwargs['identity']
222 except KeyError:
223 self.__channel_owner = None
224
225 gmListWidgets.cGenericListManagerPnl.__init__(self, *args, **kwargs)
226
227 self.refresh_callback = self.refresh
228 self.new_callback = self._add_comm
229 self.edit_callback = self._edit_comm
230 self.delete_callback = self._del_comm
231
232 self.__init_ui()
233 self.refresh()
234 #--------------------------------------------------------
235 # external API
236 #--------------------------------------------------------
238 if self.__channel_owner is None:
239 self._LCTRL_items.set_string_items()
240 return
241
242 comms = self.__channel_owner.get_comm_channels()
243 self._LCTRL_items.set_string_items (
244 items = [ [
245 gmTools.bool2str(c['is_confidential'], 'X', ''),
246 c['l10n_comm_type'],
247 c['url'],
248 gmTools.coalesce(c['comment'], '')
249 ] for c in comms ]
250 )
251 self._LCTRL_items.set_column_widths()
252 self._LCTRL_items.set_data(data = comms)
253 #--------------------------------------------------------
254 # internal helpers
255 #--------------------------------------------------------
257 self._LCTRL_items.SetToolTip(_('List of known communication channels.'))
258 self._LCTRL_items.set_columns(columns = [
259 _('confidential'),
260 _('Type'),
261 _('Value'),
262 _('Comment')
263 ])
264 #--------------------------------------------------------
266 ea = cCommChannelEditAreaPnl(self, -1)
267 ea.channel_owner = self.__channel_owner
268 dlg = gmEditArea.cGenericEditAreaDlg2(self, -1, edit_area = ea)
269 dlg.SetTitle(_('Adding new communications channel'))
270 if dlg.ShowModal() == wx.ID_OK:
271 return True
272 return False
273 #--------------------------------------------------------
275 ea = cCommChannelEditAreaPnl(self, -1, comm_channel = comm_channel)
276 ea.channel_owner = self.__channel_owner
277 dlg = gmEditArea.cGenericEditAreaDlg2(self, -1, edit_area = ea, single_entry = True)
278 dlg.SetTitle(_('Editing communications channel'))
279 if dlg.ShowModal() == wx.ID_OK:
280 return True
281 return False
282 #--------------------------------------------------------
284 go_ahead = gmGuiHelpers.gm_show_question (
285 _( 'Are you sure this communication channel\n'
286 'can no longer be used ?'
287 ),
288 _('Removing communication channel')
289 )
290 if not go_ahead:
291 return False
292 self.__channel_owner.unlink_comm_channel(comm_channel = comm)
293 return True
294 #--------------------------------------------------------
295 # properties
296 #--------------------------------------------------------
299
303
304 channel_owner = property(__get_channel_owner, __set_channel_owner)
305
306 #================================================================
307 # main
308 #----------------------------------------------------------------
309 if __name__ == '__main__':
310
311 if len(sys.argv) < 2:
312 sys.exit()
313
314 if sys.argv[1] != 'test':
315 sys.exit()
316
317 from Gnumed.pycommon import gmI18N
318 gmI18N.activate_locale()
319 gmI18N.install_domain()
320 from Gnumed.business import gmPersonSearch
321
322 #--------------------------------------------------------
324 pat = gmPersonSearch.ask_for_patient()
325 app = wx.PyWidgetTester(size = (600, 400))
326 widget = cCommChannelsManagerPnl(app.frame, -1)
327 widget.identity = pat
328 app.frame.Show(True)
329 app.MainLoop()
330 #--------------------------------------------------------
331 test_person_comms_pnl()
332
333 #================================================================
334
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Sat Feb 29 02:55:27 2020 | http://epydoc.sourceforge.net |