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 = "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 % "pk_expansion = %s"
31 _cmds_store_payload = [
32 """
33 UPDATE ref.keyword_expansion SET
34 keyword = gm.nullify_empty_string(%(keyword)s),
35 textual_data = CASE
36 WHEN gm.nullify_empty_string(%(expansion)s) IS NULL
37 THEN CASE
38 WHEN binary_data IS NULL THEN '---fake_data---'
39 ELSE NULL
40 END
41 ELSE gm.nullify_empty_string(%(expansion)s)
42 END,
43 binary_data = CASE
44 WHEN gm.nullify_empty_string(%(expansion)s) IS NULL THEN binary_data
45 ELSE NULL
46 END,
47 encrypted = %(is_encrypted)s
48 WHERE
49 pk = %(pk_expansion)s
50 AND
51 xmin = %(xmin_expansion)s
52 RETURNING
53 xmin as xmin_expansion
54 """
55 ]
56 _updatable_fields = [
57 'keyword',
58 'expansion',
59 'is_encrypted'
60 ]
61
62
63 - def save_to_file(self, aChunkSize=0, target_mime=None, target_extension=None, ignore_conversion_problems=False):
64
65 if self._payload[self._idx['is_textual']]:
66 return None
67
68 if self._payload[self._idx['data_size']] == 0:
69 return None
70
71 filename = gmTools.get_unique_filename(prefix = 'gm-data_snippet-')
72 success = gmPG2.bytea2file (
73 data_query = {
74 'cmd': 'SELECT substring(binary_data from %(start)s for %(size)s) FROM ref.keyword_expansion WHERE pk = %(pk)s',
75 'args': {'pk': self.pk_obj}
76 },
77 filename = filename,
78 chunk_size = aChunkSize,
79 data_size = self._payload[self._idx['data_size']]
80 )
81
82 if not success:
83 return None
84
85 if target_mime is None:
86 return filename
87
88 if target_extension is None:
89 target_extension = gmMimeLib.guess_ext_by_mimetype(mimetype = target_mime)
90
91 target_fname = gmTools.get_unique_filename (
92 prefix = 'gm-data_snippet-converted-',
93 suffix = target_extension
94 )
95 _log.debug('attempting conversion: [%s] -> [<%s>:%s]', filename, target_mime, target_fname)
96 if gmMimeLib.convert_file (
97 filename = filename,
98 target_mime = target_mime,
99 target_filename = target_fname
100 ):
101 return target_fname
102
103 _log.warning('conversion failed')
104 if not ignore_conversion_problems:
105 return None
106
107 _log.warning('programmed to ignore conversion problems, hoping receiver can handle [%s]', filename)
108 return filename
109
110
131
132
162
163
164 __keyword_expansions = None
165
183
184
185 -def get_expansion(keyword=None, textual_only=True, binary_only=False):
186
187 if False not in [textual_only, binary_only]:
188 raise ValueError('one of <textual_only> and <binary_only> must be False')
189
190 where_parts = ['keyword = %(kwd)s']
191 args = {'kwd': keyword}
192
193 if textual_only:
194 where_parts.append('is_textual IS TRUE')
195
196 cmd = _SQL_get_keyword_expansions % ' AND '.join(where_parts)
197 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True)
198
199 if len(rows) == 0:
200 return None
201
202 return cKeywordExpansion(row = {'data': rows[0], 'idx': idx, 'pk_field': 'pk_expansion'})
203
204
206
207 if text is not None:
208 if text.strip() == '':
209 text = None
210
211 if None not in [text, data_file]:
212 raise ValueError('either <text> or <data_file> must be non-NULL')
213
214
215 cmd = "SELECT 1 FROM ref.v_your_keyword_expansions WHERE public_expansion IS %(public)s AND keyword = %(kwd)s"
216 args = {'kwd': keyword, 'public': public}
217 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}])
218 if len(rows) != 0:
219
220 return False
221
222 if data_file is not None:
223 text = 'fake data'
224 args = {'kwd': keyword, 'txt': text}
225 if public:
226 cmd = """
227 INSERT INTO ref.keyword_expansion (keyword, textual_data, fk_staff)
228 VALUES (
229 gm.nullify_empty_string(%(kwd)s),
230 gm.nullify_empty_string(%(txt)s),
231 null
232 )
233 RETURNING pk
234 """
235 else:
236 cmd = """
237 INSERT INTO ref.keyword_expansion (keyword, textual_data, fk_staff)
238 VALUES (
239 gm.nullify_empty_string(%(kwd)s),
240 gm.nullify_empty_string(%(txt)s),
241 (SELECT pk FROM dem.staff WHERE db_user = current_user)
242 )
243 RETURNING pk
244 """
245 rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False)
246 expansion = cKeywordExpansion(aPK_obj = rows[0]['pk'])
247 if data_file is not None:
248 expansion.update_data_from_file(filename = data_file)
249
250 global __textual_expansion_keywords
251 __textual_expansion_keywords = None
252 global __keyword_expansions
253 __keyword_expansions = None
254
255 return expansion
256
268
269
270
271
272
273 __textual_expansion_keywords = None
274
276 global __textual_expansion_keywords
277 if __textual_expansion_keywords is not None:
278 return __textual_expansion_keywords
279
280 cmd = """SELECT keyword, public_expansion, private_expansion, owner FROM ref.v_keyword_expansions WHERE is_textual IS TRUE"""
281 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd}])
282 __textual_expansion_keywords = rows
283
284 _log.info('retrieved %s textual expansion keywords', len(__textual_expansion_keywords))
285
286 return __textual_expansion_keywords
287
289
290 if fragment is None:
291 return []
292
293 return [ kwd['keyword'] for kwd in get_textual_expansion_keywords() if kwd['keyword'].startswith(fragment) ]
294
295
297
298
299 if keyword == '$$steffi':
300 return 'Hai, play ! Versucht das ! (Keks dazu ?) :-)'
301
302 cmd = """SELECT expansion FROM ref.v_your_keyword_expansions WHERE keyword = %(kwd)s"""
303 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': {'kwd': keyword}}])
304
305 if len(rows) == 0:
306 return None
307
308 return rows[0]['expansion']
309
310 if __name__ == "__main__":
311
312 if len(sys.argv) < 2:
313 sys.exit()
314
315 if sys.argv[1] != 'test':
316 sys.exit()
317
318 logging.basicConfig(level=logging.DEBUG)
319
320 from Gnumed.pycommon import gmI18N
321 gmI18N.install_domain('gnumed')
322 gmI18N.activate_locale()
323
324
326 print("keywords, from database:")
327 print(get_textual_expansion_keywords())
328 print("keywords, cached:")
329 print(get_textual_expansion_keywords())
330 print("'$keyword' expands to:")
331 print(expand_keyword(keyword = '$dvt'))
332
333
338
339
340 test_kwd_expansions()
341