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

Source Code for Module Gnumed.business.gmProviderInbox

  1  # -*- coding: latin-1 -*- 
  2  """GNUmed provider inbox middleware. 
  3   
  4  This should eventually end up in a class cPractice. 
  5  """ 
  6  #============================================================ 
  7  __license__ = "GPL" 
  8  __version__ = "$Revision: 1.14 $" 
  9  __author__ = "K.Hilbert <Karsten.Hilbert@gmx.net>" 
 10   
 11   
 12  import sys 
 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 gmDateTime 
 21   
 22  from Gnumed.business import gmStaff 
 23   
 24  #============================================================ 
 25  # description 
 26  #------------------------------------------------------------ 
 27  _SQL_get_inbox_messages = u"SELECT * FROM dem.v_message_inbox WHERE %s" 
 28   
29 -class cInboxMessage(gmBusinessDBObject.cBusinessDBObject):
30 31 _cmd_fetch_payload = _SQL_get_inbox_messages % u"pk_inbox_message = %s" 32 _cmds_store_payload = [ 33 u""" 34 UPDATE dem.message_inbox SET 35 fk_staff = %(pk_staff)s, 36 fk_inbox_item_type = %(pk_type)s, 37 comment = gm.nullify_empty_string(%(comment)s), 38 data = gm.nullify_empty_string(%(data)s), 39 importance = %(importance)s, 40 fk_patient = %(pk_patient)s, 41 ufk_context = %(pk_context)s, 42 due_date = %(due_date)s, 43 expiry_date = %(expiry_date)s 44 WHERE 45 pk = %(pk_inbox_message)s 46 AND 47 xmin = %(xmin_message_inbox)s 48 RETURNING 49 pk as pk_inbox_message, 50 xmin as xmin_message_inbox 51 """ 52 ] 53 _updatable_fields = [ 54 u'pk_staff', 55 u'pk_type', 56 u'comment', 57 u'data', 58 u'importance', 59 u'pk_patient', 60 u'ufk_context', 61 u'due_date', 62 u'expiry_date' 63 ] 64 #------------------------------------------------------------
65 - def format(self):
66 tt = u'%s: %s%s\n' % ( 67 gmDateTime.pydt_strftime ( 68 self._payload[self._idx['received_when']], 69 format = '%A, %Y %B %d, %H:%M', 70 accuracy = gmDateTime.acc_minutes 71 ), 72 gmTools.bool2subst(self._payload[self._idx['is_virtual']], _('virtual message'), _('message')), 73 gmTools.coalesce(self._payload[self._idx['pk_inbox_message']], u'', u' #%s ') 74 ) 75 76 tt += u'%s: %s\n' % ( 77 self._payload[self._idx['l10n_category']], 78 self._payload[self._idx['l10n_type']] 79 ) 80 81 tt += u'%s %s %s\n' % ( 82 self._payload[self._idx['modified_by']], 83 gmTools.u_right_arrow, 84 gmTools.coalesce(self._payload[self._idx['provider']], _('everyone')) 85 ) 86 87 tt += u'\n%s%s%s\n\n' % ( 88 gmTools.u_left_double_angle_quote, 89 self._payload[self._idx['comment']], 90 gmTools.u_right_double_angle_quote 91 ) 92 93 tt += gmTools.coalesce ( 94 self._payload[self._idx['pk_patient']], 95 u'', 96 u'%s\n\n' % _('Patient #%s') 97 ) 98 99 tt += gmTools.coalesce ( 100 self._payload[self._idx['due_date']], 101 u'', 102 _('Due: %s\n'), 103 function_initial = ('strftime', '%Y-%m-%d') 104 ) 105 106 tt += gmTools.coalesce ( 107 self._payload[self._idx['expiry_date']], 108 u'', 109 _('Expiry: %s\n'), 110 function_initial = ('strftime', '%Y-%m-%d') 111 ) 112 113 if self._payload[self._idx['data']] is not None: 114 tt += self._payload[self._idx['data']][:150] 115 if len(self._payload[self._idx['data']]) > 150: 116 tt += gmTools.u_ellipsis 117 118 return tt
119 #------------------------------------------------------------
120 -def get_due_messages(pk_patient=None, order_by=None):
121 122 if order_by is None: 123 order_by = u'%s ORDER BY due_date, importance DESC, received_when DESC' 124 else: 125 order_by = u'%%s ORDER BY %s' % order_by 126 127 args = {'pat': pk_patient} 128 where_parts = [ 129 u'pk_patient = %(pat)s', 130 u'is_due IS TRUE' 131 ] 132 133 cmd = u"SELECT *, now() - due_date AS interval_due FROM dem.v_message_inbox WHERE %s" % ( 134 order_by % u' AND '.join(where_parts) 135 ) 136 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True) 137 138 return [ cInboxMessage(row = {'data': r, 'idx': idx, 'pk_field': 'pk_inbox_message'}) for r in rows ]
139 140 #------------------------------------------------------------
141 -def get_inbox_messages(pk_staff=None, pk_patient=None, include_without_provider=False, order_by=None):
142 143 if order_by is None: 144 order_by = u'%s ORDER BY importance desc, received_when desc' 145 else: 146 order_by = u'%%s ORDER BY %s' % order_by 147 148 args = {} 149 where_parts = [] 150 151 if pk_staff is not None: 152 if include_without_provider: 153 where_parts.append(u'pk_staff IN (%(staff)s, NULL) OR modified_by = (SELECT short_alias FROM dem.staff WHERE pk = %(staff)s)') 154 else: 155 where_parts.append(u'pk_staff = %(staff)s OR modified_by = (SELECT short_alias FROM dem.staff WHERE pk = %(staff)s)') 156 args['staff'] = pk_staff 157 158 if pk_patient is not None: 159 where_parts.append(u'pk_patient = %(pat)s') 160 args['pat'] = pk_patient 161 162 cmd = _SQL_get_inbox_messages % ( 163 order_by % u' AND '.join(where_parts) 164 ) 165 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}], get_col_idx = True) 166 167 return [ cInboxMessage(row = {'data': r, 'idx': idx, 'pk_field': 'pk_inbox_message'}) for r in rows ]
168 #------------------------------------------------------------
169 -def create_inbox_message(message_type=None, subject=None, patient=None, staff=None):
170 171 success, pk_type = gmTools.input2int(initial = message_type) 172 if not success: 173 pk_type = create_inbox_item_type(message_type = message_type) 174 175 cmd = u""" 176 INSERT INTO dem.message_inbox ( 177 fk_staff, 178 fk_patient, 179 fk_inbox_item_type, 180 comment 181 ) VALUES ( 182 %(staff)s, 183 %(pat)s, 184 %(type)s, 185 gm.nullify_empty_string(%(subject)s) 186 ) 187 RETURNING pk 188 """ 189 args = { 190 u'staff': staff, 191 u'pat': patient, 192 u'type': pk_type, 193 u'subject': subject 194 } 195 rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False) 196 197 return cInboxMessage(aPK_obj = rows[0]['pk'])
198 #------------------------------------------------------------
199 -def delete_inbox_message(inbox_message=None):
200 args = {'pk': inbox_message} 201 cmd = u"DELETE FROM dem.message_inbox WHERE pk = %(pk)s" 202 gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}]) 203 return True
204 #------------------------------------------------------------
205 -def create_inbox_item_type(message_type=None, category=u'clinical'):
206 207 # determine category PK 208 success, pk_cat = gmTools.input2int(initial = category) 209 if not success: 210 args = {u'cat': category} 211 cmd = u"""SELECT COALESCE ( 212 (SELECT pk FROM dem.inbox_item_category WHERE _(description) = %(cat)s), 213 (SELECT pk FROM dem.inbox_item_category WHERE description = %(cat)s) 214 ) AS pk""" 215 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}]) 216 if rows[0]['pk'] is None: 217 cmd = u"INSERT INTO dem.inbox_item_category (description) VALUES (%(cat)s) RETURNING pk" 218 rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True) 219 pk_cat = rows[0]['pk'] 220 else: 221 pk_cat = rows[0]['pk'] 222 223 # find type PK or create type 224 args = {u'cat': pk_cat, u'type': message_type} 225 cmd = u"""SELECT COALESCE ( 226 (SELECT pk FROM dem.inbox_item_type where fk_inbox_item_category = %(cat)s and _(description) = %(type)s), 227 (SELECT pk FROM dem.inbox_item_type where fk_inbox_item_category = %(cat)s and description = %(type)s) 228 ) AS pk""" 229 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}]) 230 if rows[0]['pk'] is None: 231 cmd = u""" 232 INSERT INTO dem.inbox_item_type ( 233 fk_inbox_item_category, 234 description, 235 is_user 236 ) VALUES ( 237 %(cat)s, 238 %(type)s, 239 TRUE 240 ) RETURNING pk""" 241 rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True) 242 243 return rows[0]['pk']
244 245 #============================================================
246 -class cProviderInbox:
247 - def __init__(self, provider_id=None):
248 if provider_id is None: 249 self.__provider_id = gmStaff.gmCurrentProvider()['pk_staff'] 250 else: 251 self.__provider_id = provider_id
252 #--------------------------------------------------------
253 - def delete_message(self, pk=None):
254 return delete_inbox_message(inbox_message = pk)
255 #--------------------------------------------------------
256 - def add_message(message_type=None, subject=None, patient=None):
257 return create_inbox_message ( 258 message_type = message_type, 259 subject = subject, 260 patient = patient, 261 staff = self.__provider_id 262 )
263 #-------------------------------------------------------- 264 # properties 265 #--------------------------------------------------------
266 - def _get_messages(self):
267 return get_inbox_messages(pk_staff = self.__provider_id)
268
269 - def _set_messages(self, messages):
270 return
271 272 messages = property(_get_messages, _set_messages)
273 274 #============================================================ 275 # dynamic hints API 276 #------------------------------------------------------------ 277 _SQL_get_dynamic_hints = u"SELECT *, xmin AS xmin_auto_hint FROM ref.auto_hint WHERE %s" 278
279 -class cDynamicHint(gmBusinessDBObject.cBusinessDBObject):
280 """Represents dynamic hints to be run against the database.""" 281 282 _cmd_fetch_payload = _SQL_get_dynamic_hints % u"pk = %s" 283 _cmds_store_payload = [ 284 u"""UPDATE ref.auto_hint SET 285 is_active = %(is_active)s 286 WHERE 287 pk = %(pk)s 288 AND 289 xmin = %(xmin_auto_hint)s 290 RETURNING 291 pk, 292 xmin AS xmin_auto_hint 293 """ 294 ] 295 _updatable_fields = [ 296 u'is_active' 297 ] 298 #--------------------------------------------------------
299 - def format(self):
300 txt = u'%s [#%s]\n' % ( 301 gmTools.bool2subst(self._payload[self._idx['is_active']], _('Active clinical hint'), _('Inactive clinical hint')), 302 self._payload[self._idx['pk']] 303 ) 304 txt += u'\n' 305 txt += u'%s\n\n' % self._payload[self._idx['title']] 306 txt += _('Source: %s\n') % self._payload[self._idx['source']] 307 txt += _('Language: %s\n') % self._payload[self._idx['lang']] 308 txt += u'\n' 309 txt += u'%s\n' % gmTools.wrap(self._payload[self._idx['hint']], width = 50, initial_indent = u' ', subsequent_indent = u' ') 310 txt += u'\n' 311 txt += u'%s\n' % gmTools.wrap ( 312 gmTools.coalesce(self._payload[self._idx['url']], u''), 313 width = 50, 314 initial_indent = u' ', 315 subsequent_indent = u' ' 316 ) 317 txt += u'\n' 318 txt += u'%s\n' % gmTools.wrap(self._payload[self._idx['query']], width = 50, initial_indent = u' ', subsequent_indent = u' ') 319 return txt
320 321 #------------------------------------------------------------
322 -def get_dynamic_hints(order_by=None):
323 if order_by is None: 324 order_by = u'true' 325 else: 326 order_by = u'true ORDER BY %s' % order_by 327 328 cmd = _SQL_get_dynamic_hints % order_by 329 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd}], get_col_idx = True) 330 return [ cDynamicHint(row = {'data': r, 'idx': idx, 'pk_field': 'pk'}) for r in rows ]
331 #------------------------------------------------------------ 332 #def create_xxx(xxx=None, xxx=None): 333 # 334 # args = { 335 # u'xxx': xxx, 336 # u'xxx': xxx 337 # } 338 # cmd = u""" 339 # INSERT INTO xxx.xxx ( 340 # xxx, 341 # xxx, 342 # xxx 343 # ) VALUES ( 344 # %(xxx)s, 345 # %(xxx)s, 346 # gm.nullify_empty_string(%(xxx)s) 347 # ) 348 # RETURNING pk 349 # """ 350 # rows, idx = gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}], return_data = True, get_col_idx = False) 351 # 352 # return cDynamicHint(aPK_obj = rows[0]['pk']) 353 #------------------------------------------------------------ 354 #def delete_xxx(xxx=None): 355 # args = {'pk': xxx} 356 # cmd = u"DELETE FROM xxx.xxx WHERE pk = %(pk)s" 357 # gmPG2.run_rw_queries(queries = [{'cmd': cmd, 'args': args}]) 358 # return True 359 #------------------------------------------------------------ 360 361 #------------------------------------------------------------
362 -def get_hints_for_patient(pk_identity=None):
363 conn = gmPG2.get_connection() 364 curs = conn.cursor() 365 curs.callproc('clin.get_hints_for_patient', [pk_identity]) 366 rows = curs.fetchall() 367 idx = gmPG2.get_col_indices(curs) 368 return [ cDynamicHint(row = {'data': r, 'idx': idx, 'pk_field': 'pk'}) for r in rows ]
369 370 #============================================================ 371 if __name__ == '__main__': 372 373 if len(sys.argv) < 2: 374 sys.exit() 375 376 if sys.argv[1] != 'test': 377 sys.exit() 378 379 from Gnumed.pycommon import gmI18N 380 381 gmI18N.activate_locale() 382 gmI18N.install_domain() 383 384 #---------------------------------------
385 - def test_inbox():
386 gmStaff.gmCurrentProvider(provider = gmStaff.cStaff()) 387 inbox = cProviderInbox() 388 for msg in inbox.messages: 389 print msg
390 #---------------------------------------
391 - def test_msg():
392 msg = cInboxMessage(aPK_obj = 1) 393 print msg
394 #---------------------------------------
395 - def test_create_type():
396 print create_inbox_item_type(message_type = 'test')
397 #---------------------------------------
398 - def test_due():
399 for msg in get_due_messages(pk_patient = 12): 400 print msg.format()
401 #---------------------------------------
402 - def test_auto_hints():
403 for row in get_dynamic_hints(pk_identity = 13): 404 print row
405 #--------------------------------------- 406 #test_inbox() 407 #test_msg() 408 #test_create_type() 409 #test_due() 410 test_auto_hints() 411 412 #============================================================ 413