Package Gnumed :: Package business :: Module gmKeywordExpansion
[frames] | no frames]

Source Code for Module Gnumed.business.gmKeywordExpansion

  1  # -*- coding: utf8 -*- 
  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   
28 -class cKeywordExpansion(gmBusinessDBObject.cBusinessDBObject):
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 #--------------------------------------------------------
95 - def update_data_from_file(self, fname=None):
96 if not (os.access(fname, os.R_OK) and os.path.isfile(fname)): 97 _log.error('[%s] is not a readable file' % fname) 98 return False 99 100 gmPG2.file2bytea ( 101 query = u"UPDATE ref.keyword_expansion SET binary_data = %(data)s::bytea, textual_data = NULL WHERE pk = %(pk)s", 102 filename = fname, 103 args = {'pk': self.pk_obj} 104 ) 105 106 # must update XMIN now ... 107 self.refetch_payload() 108 109 global __textual_expansion_keywords 110 __textual_expansion_keywords = None 111 global __keyword_expansions 112 __keyword_expansions = None 113 114 return True
115 #--------------------------------------------------------
116 - def format(self):
117 txt = u'%s #%s\n' % ( 118 gmTools.bool2subst ( 119 self._payload[self._idx['is_textual']], 120 _('Textual keyword expansion'), 121 _('Binary keyword expansion') 122 ), 123 self._payload[self._idx['pk_expansion']] 124 ) 125 txt += u' %s%s\n' % ( 126 gmTools.bool2subst ( 127 self._payload[self._idx['private_expansion']], 128 _('private'), 129 _('public') 130 ), 131 gmTools.bool2subst ( 132 (self._payload[self._idx['key_id']] is None), 133 u'', 134 u', %s' % _('encrypted') 135 ) 136 ) 137 txt += _(' Keyword: %s\n') % self._payload[self._idx['keyword']] 138 txt += _(' Owner: %s\n') % self._payload[self._idx['owner']] 139 txt += gmTools.bool2subst ( 140 (self._payload[self._idx['key_id']] is None), 141 u'', 142 _(' Key ID: %s\n') % self._payload[self._idx['key_id']] 143 ) 144 if self._payload[self._idx['is_textual']]: 145 txt += u'\n%s' % self._payload[self._idx['expansion']] 146 else: 147 txt += u' Data: %s (%s Bytes)' % (gmTools.size2str(self._payload[self._idx['data_size']]), self._payload[self._idx['data_size']]) 148 149 return txt
150 151 #------------------------------------------------------------ 152 __keyword_expansions = None 153
154 -def get_keyword_expansions(order_by=None):
155 global __keyword_expansions 156 if __keyword_expansions is not None: 157 return __keyword_expansions 158 159 if order_by is None: 160 order_by = u'true' 161 else: 162 order_by = u'true ORDER BY %s' % order_by 163 164 cmd = _SQL_get_keyword_expansions % order_by 165 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd}], get_col_idx = True) 166 167 __keyword_expansions = [ cKeywordExpansion(row = {'data': r, 'idx': idx, 'pk_field': 'pk_expansion'}) for r in rows ] 168 return __keyword_expansions
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 #------------------------------------------------------------
191 -def create_keyword_expansion(keyword=None, text=None, data_file=None, public=True):
192 193 if None not in [text, data_file]: 194 raise ValueError('either <text> or <data> must be non-NULL') 195 196 # already exists ? 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 # can't create duplicate 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 #------------------------------------------------------------
238 -def delete_keyword_expansion(pk=None):
239 args = {'pk': pk} 240 cmd = u"DELETE FROM ref.keyword_expansion WHERE pk = %(pk)s" 241 gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}]) 242 243 global __textual_expansion_keywords 244 __textual_expansion_keywords = None 245 global __keyword_expansions 246 __keyword_expansions = None 247 248 return True
249 250 #------------------------------------------------------------------------ 251 #------------------------------------------------------------------------ 252 #------------------------------------------------------------------------ 253 #------------------------------------------------------------------------ 254 __textual_expansion_keywords = None 255
256 -def get_textual_expansion_keywords():
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 #------------------------------------------------------------------------
269 -def get_matching_textual_keywords(fragment=None):
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 #------------------------------------------------------------------------
277 -def expand_keyword(keyword = None):
278 279 # Easter Egg ;-) 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 #------------------------------------------------------------------------
320 -def delete_text_expansion(keyword):
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 #--------------------------------------------------------------------
380 - def test_textual_expansion():
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 #--------------------------------------------------------------------
389 - def test_kwd_expansions():
390 for k in get_keyword_expansions(): 391 print k.format() 392 print ""
393 #-------------------------------------------------------------------- 394 #test_textual_expansion() 395 test_kwd_expansions() 396