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)') 154 else: 155 where_parts.append(u'pk_staff = %(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 if __name__ == '__main__': 275 276 if len(sys.argv) < 2: 277 sys.exit() 278 279 if sys.argv[1] != 'test': 280 sys.exit() 281 282 from Gnumed.pycommon import gmI18N 283 284 gmI18N.activate_locale() 285 gmI18N.install_domain() 286 287 #---------------------------------------
288 - def test_inbox():
289 gmStaff.gmCurrentProvider(provider = gmStaff.cStaff()) 290 inbox = cProviderInbox() 291 for msg in inbox.messages: 292 print msg
293 #---------------------------------------
294 - def test_msg():
295 msg = cInboxMessage(aPK_obj = 1) 296 print msg
297 #---------------------------------------
298 - def test_create_type():
299 print create_inbox_item_type(message_type = 'test')
300 #---------------------------------------
301 - def test_due():
302 for msg in get_due_messages(pk_patient = 12): 303 print msg.format()
304 #--------------------------------------- 305 #test_inbox() 306 #test_msg() 307 #test_create_type() 308 test_due() 309 310 #============================================================ 311