1 """GNUmed allergy related business object.
2 """
3
4 __version__ = "$Revision: 1.34 $"
5 __author__ = "Carlos Moro <cfmoro1976@yahoo.es>"
6 __license__ = "GPL"
7
8 import types, sys, logging, datetime as pyDT
9
10
11 if __name__ == '__main__':
12 sys.path.insert(0, '../../')
13 from Gnumed.pycommon import gmPG2, gmI18N, gmBusinessDBObject, gmDateTime
14
15
16 _log = logging.getLogger('gm.domain')
17 _log.info(__version__)
18
19
20
21 allergy_states = [
22 None,
23 0,
24 1
25 ]
26
28
29 args = {'enc': encounter}
30
31 cmd_create = u"""
32 INSERT INTO clin.allergy_state (
33 fk_encounter,
34 has_allergy
35 ) SELECT
36 %(enc)s,
37 NULL
38 WHERE NOT EXISTS (
39 SELECT 1 FROM clin.v_pat_allergy_state
40 WHERE pk_patient = (
41 SELECT fk_patient FROM clin.encounter WHERE pk = %(enc)s
42 )
43 )
44 """
45 cmd_search = u"""
46 select pk_allergy_state from clin.v_pat_allergy_state
47 where pk_patient = (
48 select fk_patient from clin.encounter where pk = %(enc)s
49 )"""
50
51 rows, idx = gmPG2.run_rw_queries (
52 queries = [
53 {'cmd': cmd_create, 'args': args},
54 {'cmd': cmd_search, 'args': args}
55 ],
56 return_data = True
57 )
58
59 return cAllergyState(aPK_obj = rows[0][0])
60
62 """Represents the allergy state of one patient."""
63
64 _cmd_fetch_payload = u"select * from clin.v_pat_allergy_state where pk_allergy_state = %s"
65 _cmds_store_payload = [
66 u"""update clin.allergy_state set
67 last_confirmed = %(last_confirmed)s,
68 has_allergy = %(has_allergy)s,
69 comment = %(comment)s
70 where
71 pk = %(pk_allergy_state)s and
72 xmin = %(xmin_allergy_state)s""",
73 u"""select xmin_allergy_state from clin.v_pat_allergy_state where pk_allergy_state = %(pk_allergy_state)s"""
74 ]
75 _updatable_fields = [
76 'last_confirmed',
77 'has_allergy',
78 'comment'
79 ]
80
81
82
84 if self._payload[self._idx['has_allergy']] is None:
85 return _('unknown allergy state')
86 if self._payload[self._idx['has_allergy']] == 0:
87 return _('no known allergies')
88 if self._payload[self._idx['has_allergy']] == 1:
89 return _('*does* have allergies')
90 _log.error('unknown allergy state [%s]', self._payload[self._idx['has_allergy']])
91 return _('ERROR: unknown allergy state [%s]') % self._payload[self._idx['has_allergy']]
92
94 raise AttributeError('invalid to set allergy state string')
95
96 state_string = property(_get_as_string, _set_string)
97
99 if self._payload[self._idx['has_allergy']] is None:
100 if self._payload[self._idx['comment']] is None:
101 return u'?'
102 else:
103 return u'?!'
104 if self._payload[self._idx['has_allergy']] == 0:
105 if self._payload[self._idx['comment']] is None:
106 return u'\u2300'
107 else:
108 return u'\u2300!'
109 if self._payload[self._idx['has_allergy']] == 1:
110 return '!'
111 _log.error('unknown allergy state [%s]', self._payload[self._idx['has_allergy']])
112 return _('ERROR: unknown allergy state [%s]') % self._payload[self._idx['has_allergy']]
113
114 state_symbol = property(_get_as_symbol, lambda x:x)
115
131
132 -class cAllergy(gmBusinessDBObject.cBusinessDBObject):
133 """Represents one allergy item.
134
135 Actually, those things are really things to *avoid*.
136 Allergy is just one of several reasons for that.
137 See Adrian's post on gm-dev.
138
139 Another word might be Therapeutic Precautions.
140 """
141 _cmd_fetch_payload = u"SELECT * FROM clin.v_pat_allergies WHERE pk_allergy = %s"
142 _cmds_store_payload = [
143 u"""UPDATE clin.allergy SET
144 clin_when = %(date)s,
145 substance = %(substance)s,
146 substance_code = %(substance_code)s,
147 generics = %(generics)s,
148 allergene = %(allergene)s,
149 atc_code = %(atc_code)s,
150 fk_type = %(pk_type)s,
151 generic_specific = %(generic_specific)s::boolean,
152 definite = %(definite)s::boolean,
153 narrative = %(reaction)s
154 WHERE
155 pk = %(pk_allergy)s AND
156 xmin = %(xmin_allergy)s""",
157 u"""SELECT xmin_allergy FROM clin.v_pat_allergies WHERE pk_allergy=%(pk_allergy)s"""
158 ]
159 _updatable_fields = [
160 'date',
161 'substance',
162 'substance_code',
163 'generics',
164 'allergene',
165 'atc_code',
166 'pk_type',
167 'generic_specific',
168 'definite',
169 'reaction'
170 ]
171
180
181
182
183 -def create_allergy(allergene=None, allg_type=None, episode_id=None, encounter_id=None):
184 """Creates a new allergy clinical item.
185
186 allergene - allergic substance
187 allg_type - allergy or sensitivity, pk or string
188 encounter_id - encounter's primary key
189 episode_id - episode's primary key
190 """
191 cmd = u"""
192 SELECT pk_allergy
193 FROM clin.v_pat_allergies
194 WHERE
195 pk_patient = (SELECT fk_patient FROM clin.encounter WHERE pk = %(enc)s)
196 AND
197 allergene = %(allergene)s
198 """
199
200 args = {'enc': encounter_id, 'allergene': allergene}
201 rows, idx = gmPG2.run_ro_queries(queries = [{'cmd': cmd, 'args': args}])
202 if len(rows) > 0:
203
204 return cAllergy(aPK_obj = rows[0][0])
205
206
207 queries = []
208
209 if type(allg_type) == types.IntType:
210 cmd = u"""
211 insert into clin.allergy (fk_type, fk_encounter, fk_episode, allergene, substance)
212 values (%s, %s, %s, %s, %s)"""
213 else:
214 cmd = u"""
215 insert into clin.allergy (fk_type, fk_encounter, fk_episode, allergene, substance)
216 values ((select pk from clin._enum_allergy_type where value = %s), %s, %s, %s, %s)"""
217 queries.append({'cmd': cmd, 'args': [allg_type, encounter_id, episode_id, allergene, allergene]})
218
219 cmd = u"select currval('clin.allergy_id_seq')"
220 queries.append({'cmd': cmd})
221
222 rows, idx = gmPG2.run_rw_queries(queries=queries, return_data=True)
223 allergy = cAllergy(aPK_obj = rows[0][0])
224
225 return allergy
226
227
228
229 if __name__ == '__main__':
230
231 allg = cAllergy(aPK_obj=1)
232 print allg
233 fields = allg.get_fields()
234 for field in fields:
235 print field, ':', allg[field]
236 print "updatable:", allg.get_updatable_fields()
237 enc_id = allg['pk_encounter']
238 epi_id = allg['pk_episode']
239 status, allg = create_allergy (
240 allergene = 'test substance',
241 allg_type = 1,
242 episode_id = epi_id,
243 encounter_id = enc_id
244 )
245 print allg
246 allg['reaction'] = 'hehehe'
247 status, data = allg.save_payload()
248 print 'status:', status
249 print 'data:', data
250 print allg
251
252
253