1
2 """GNUmed keyword snippet expansions
3
4 Copyright: authors
5 """
6
7 __author__ = "Karsten Hilbert <Karsten.Hilbert@gmx.net>"
8 __license__ = 'GPL v2 or later (details at http://www.gnu.org)'
9
10 import sys
11 import os
12 import logging
13
14
15 if __name__ == '__main__':
16 sys.path.insert(0, '../../')
17 from Gnumed.pycommon import gmPG2
18 from Gnumed.pycommon import gmBusinessDBObject
19 from Gnumed.pycommon import gmTools
20 from Gnumed.pycommon import gmMimeLib
21
22
23 _log = logging.getLogger('gm.kwd_exp')
24
25
26 _SQL_get_keyword_expansions = u"SELECT * FROM ref.v_your_keyword_expansions WHERE %s"
27
29 """Keyword indexed text snippets or chunks of data. Used as text macros or to put into documents."""
30 _cmd_fetch_payload = _SQL_get_keyword_expansions % u"pk_expansion = %s"
31 _cmds_store_payload = [
32 u"""
33 UPDATE ref.keyword_expansion SET
34 keyword = gm.nullify_empty_string(%(keyword)s),
35 textual_data = gm.nullify_empty_string(%(expansion)s)
36 WHERE
37 pk = %(pk_expansion)s
38 AND
39 xmin = %(xmin_expansion)s
40 RETURNING
41 xmin as xmin_expansion
42 """
43 ]
44 _updatable_fields = [
45 u'keyword',
46 u'expansion',
47 u'key_id'
48 ]
49
50
51 - def export_to_file(self, aChunkSize=0, target_mime=None, target_extension=None, ignore_conversion_problems=False):
52
53 if self._payload[self._idx['data_size']] == 0:
54 return None
55
56 filename = gmTools.get_unique_filename(prefix = 'gm-data_snippet-')
57 success = gmPG2.bytea2file (
58 data_query = {
59 'cmd': u'SELECT substring(binary_data from %(start)s for %(size)s) FROM ref.keyword_expansion WHERE pk = %(pk)s',
60 'args': {'pk': self.pk_obj}
61 },
62 filename = filename,
63 chunk_size = aChunkSize,
64 data_size = self._payload[self._idx['data_size']]
65 )
66
67 if not success:
68 return None
69
70 if target_mime is None:
71 return filename
72
73 if target_extension is None:
74 target_extension = gmMimeLib.guess_ext_by_mimetype(mimetype = target_mime)
75
76 target_fname = gmTools.get_unique_filename (
77 prefix = 'gm-data_snippet-converted-',
78 suffix = target_extension
79 )
80 _log.debug('attempting conversion: [%s] -> [<%s>:%s]', filename, target_mime, target_fname)
81 if gmMimeLib.convert_file (
82 filename = filename,
83 target_mime = target_mime,
84 target_filename = target_fname
85 ):
86 return target_fname
87
88 _log.warning('conversion failed')
89 if not ignore_conversion_problems:
90 return None
91
92 _log.warning('programmed to ignore conversion problems, hoping receiver can handle [%s]', filename)
93 return filename
94
115
150
151
152 __keyword_expansions = None
153
169
170
171 -def get_expansion(keyword=None, textual_only=True, binary_only=False):
172
173 if False not in [textual_only, binary_only]:
174 raise ValueError('one of <textual_only> and <binary_only> must be False')
175
176 where_parts = [u'keyword = %(kwd)s']
177 args = {'kwd': keyword}
178
179 if textual_only:
180 where_parts.append(u'is_textual IS TRUE')
181
182 cmd = _SQL_get_keyword_expansions % u' AND '.join(where_parts)
183 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True)
184
185 if len(rows) == 0:
186 return None
187
188 return cKeywordExpansion(row = {'data': rows[0], 'idx': idx, 'pk_field': 'pk_expansion'})
189
190
192
193 if None not in [text, data_file]:
194 raise ValueError('either <text> or <data> must be non-NULL')
195
196
197 cmd = u"SELECT 1 FROM ref.v_your_keyword_expansions WHERE public_expansion IS %(public)s AND keyword = %(kwd)s"
198 args = {'kwd': keyword, 'public': public}
199 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}])
200 if len(rows) != 0:
201
202 return False
203
204 if data_file is not None:
205 text = u'fake data'
206 args = {u'kwd': keyword, u'txt': text}
207 if public:
208 cmd = u"""
209 INSERT INTO ref.keyword_expansion (keyword, textual_data, fk_staff)
210 VALUES (
211 gm.nullify_empty_string(%(kwd)s),
212 gm.nullify_empty_string(%(txt)s),
213 null
214 )
215 RETURNING pk
216 """
217 else:
218 cmd = u"""
219 INSERT INTO ref.keyword_expansion (keyword, textual_data, fk_staff)
220 VALUES (
221 gm.nullify_empty_string(%(kwd)s),
222 gm.nullify_empty_string(%(txt)s),
223 (SELECT pk FROM dem.staff WHERE db_user = current_user)
224 )
225 RETURNING pk
226 """
227 rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False)
228 expansion = cKeywordExpansion(aPK_obj = rows[0]['pk'])
229 expansion.update_data_from_file(filename = data_file)
230
231 global __textual_expansion_keywords
232 __textual_expansion_keywords = None
233 global __keyword_expansions
234 __keyword_expansions = None
235
236 return expansion
237
249
250
251
252
253
254 __textual_expansion_keywords = None
255
257 global __textual_expansion_keywords
258 if __textual_expansion_keywords is not None:
259 return __textual_expansion_keywords
260
261 cmd = u"""SELECT keyword, public_expansion, private_expansion, owner FROM ref.v_keyword_expansions WHERE is_textual IS TRUE"""
262 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd}])
263 __textual_expansion_keywords = rows
264
265 _log.info('retrieved %s textual expansion keywords', len(__textual_expansion_keywords))
266
267 return __textual_expansion_keywords
268
270
271 if fragment is None:
272 return []
273
274 return [ kwd['keyword'] for kwd in get_textual_expansion_keywords() if kwd['keyword'].startswith(fragment) ]
275
276
278
279
280 if keyword == u'$$steffi':
281 return u'Hai, play ! Versucht das ! (Keks dazu ?) :-)'
282
283 cmd = u"""SELECT expansion FROM ref.v_your_keyword_expansions WHERE keyword = %(kwd)s"""
284 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': {'kwd': keyword}}])
285
286 if len(rows) == 0:
287 return None
288
289 return rows[0]['expansion']
290
291 -def add_text_expansion(keyword=None, expansion=None, public=None):
292
293 if public:
294 cmd = u"SELECT 1 FROM ref.v_keyword_expansions WHERE public_expansion IS TRUE AND keyword = %(kwd)s"
295 else:
296 cmd = u"SELECT 1 FROM ref.v_your_keyword_expansions WHERE private_expansion IS TRUE AND keyword = %(kwd)s"
297
298 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': {'kwd': keyword}}])
299 if len(rows) != 0:
300 return False
301
302 if public:
303 cmd = u"""
304 INSERT INTO ref.keyword_expansion (keyword, textual_data, fk_staff)
305 VALUES (%(kwd)s, %(exp)s, null)"""
306 else:
307 cmd = u"""
308 INSERT INTO ref.keyword_expansion (keyword, textual_data, fk_staff)
309 VALUES (%(kwd)s, %(exp)s, (SELECT pk FROM dem.staff WHERE db_user = current_user))"""
310
311 rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': {'kwd': keyword, 'exp': expansion}}])
312
313 global __textual_expansion_keywords
314 __textual_expansion_keywords = None
315 global __keyword_expansions
316 __keyword_expansions = None
317
318 return True
319
321 cmd = u"""
322 DELETE FROM ref.keyword_expansion WHERE
323 keyword = %(kwd)s AND (
324 (fk_staff = (SELECT pk FROM dem.staff WHERE db_user = current_user))
325 OR
326 (fk_staff IS NULL AND owner = current_user)
327 )"""
328 rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': {'kwd': keyword}}])
329
330 global __textual_expansion_keywords
331 __textual_expansion_keywords = None
332 global __keyword_expansions
333 __keyword_expansions = None
334
335
336 -def edit_text_expansion(keyword, expansion):
337
338 cmd1 = u"""
339 DELETE FROM ref.keyword_expansion
340 WHERE
341 keyword = %(kwd)s
342 AND
343 fk_staff = (SELECT pk FROM dem.staff WHERE db_user = current_user)"""
344
345 cmd2 = u"""
346 INSERT INTO ref.keyword_expansion (
347 keyword, textual_data, fk_staff
348 ) VALUES (
349 %(kwd)s,
350 %(exp)s,
351 (SELECT pk FROM dem.staff WHERE db_user = current_user)
352 )"""
353 args = {'kwd': keyword, 'exp': expansion}
354 rows, idx = gmPG2.run_rw_queries(queries = [
355 {'cmd': cmd1, 'args': args},
356 {'cmd': cmd2, 'args': args},
357 ])
358
359 global __textual_expansion_keywords
360 __textual_expansion_keywords = None
361 global __keyword_expansions
362 __keyword_expansions = None
363
364
365 if __name__ == "__main__":
366
367 if len(sys.argv) < 2:
368 sys.exit()
369
370 if sys.argv[1] != 'test':
371 sys.exit()
372
373 logging.basicConfig(level=logging.DEBUG)
374
375 from Gnumed.pycommon import gmI18N
376 gmI18N.install_domain('gnumed')
377 gmI18N.activate_locale()
378
379
381 print "keywords, from database:"
382 print get_textual_expansion_keywords()
383 print "keywords, cached:"
384 print get_textual_expansion_keywords()
385 print "'$keyword' expands to:"
386 print expand_keyword(keyword = u'$dvt')
387
388
393
394
395 test_kwd_expansions()
396