From b929ddc4b84ff7cdd2ff7f6ae24d2c8e6cde04d1 Mon Sep 17 00:00:00 2001 From: James Curtis Date: Thu, 16 Jan 2020 12:08:54 +0000 Subject: [PATCH 1/3] Fixes AttributeError when context does not exist No associated task. Found this in a specific scenario. --- nh_observations/observations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nh_observations/observations.py b/nh_observations/observations.py index 9f462dea..f9ae0cf4 100644 --- a/nh_observations/observations.py +++ b/nh_observations/observations.py @@ -278,7 +278,7 @@ def write(self, cr, uid, ids, vals, context=None): # TODO Is it right that updating the frequency will # automatically update the date_scheduled to # create_date + frequency? - date = context.get('effective_date_terminated') \ + date = context and context.get('effective_date_terminated') \ or obs.activity_id.creator_id.effective_date_terminated scheduled = (dt.strptime( date, DTF)+td( From 04c8a276439659df08a86d68a3ccc05cc1595b01 Mon Sep 17 00:00:00 2001 From: James Curtis Date: Thu, 16 Jan 2020 12:19:02 +0000 Subject: [PATCH 2/3] Adds current EWS/BG frequency to mobile pages [O2345] Adds additional information of the current associated frequency of EWS & Blood Glucose observations to tasks cards (EWS & BG Obs only), patient cards and escalation forms for the respective observation types. --- nh_eobs/sql_statements.py | 12 ++++---- nh_eobs_mobile/controllers/main.py | 46 +++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/nh_eobs/sql_statements.py b/nh_eobs/sql_statements.py index 7c5bde1a..39c3406d 100644 --- a/nh_eobs/sql_statements.py +++ b/nh_eobs/sql_statements.py @@ -369,7 +369,9 @@ def get_workload(self, settings): when position('notification' in activity.data_model)::bool then true else false - end as notification + end as notification, + coalesce(ews0.frequency, 0) as frequency, + coalesce(bg0.frequency, 0) as bg_frequency from nh_activity activity inner join nh_activity spell_activity on spell_activity.id = activity.parent_id @@ -379,8 +381,10 @@ def get_workload(self, settings): on location.id = spell_activity.location_id inner join nh_clinical_location location_parent on location_parent.id = location.parent_id + left join ews0 on ews0.spell_activity_id = spell_activity.id left join ews1 on ews1.spell_activity_id = spell_activity.id left join ews2 on ews2.spell_activity_id = spell_activity.id + left join bg0 on bg0.spell_activity_id = spell_activity.id where activity.id in ({activity_ids}) and spell_activity.state = 'started' order by deadline asc, activity.id desc @@ -459,10 +463,8 @@ def get_collect_activities_sql(self, activity_ids_sql): when ews1.id is not null and ews2.id is null then 'first' when ews1.id is null and ews2.id is not null then 'no latest' end as ews_trend, - case - when ews0.frequency is not null then ews0.frequency - else 0 - end as frequency, + coalesce(ews0.frequency, 0) as frequency, + coalesce(bg0.frequency, 0) as bg_frequency, spell.custom_frequency, spell.custom_frequency_reason from nh_activity activity diff --git a/nh_eobs_mobile/controllers/main.py b/nh_eobs_mobile/controllers/main.py index b0b08343..0bf3e387 100755 --- a/nh_eobs_mobile/controllers/main.py +++ b/nh_eobs_mobile/controllers/main.py @@ -575,6 +575,16 @@ def get_patients(self, *args, **kw): cr, uid, patient_api.get_followed_patients( cr, uid, []), context=context) + for patient in patients: + if patient.get('frequency'): + patient['frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( + *divmod(patient.get('frequency'), 60) + ) + if patient.get('bg_frequency'): + patient['bg_frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( + *divmod(patient.get('bg_frequency'), 60) + ) + favourites = self.get_user_favourites(uid) return request.render( @@ -620,9 +630,16 @@ def process_escalations(self, creator_id, *args, **kwargs): { "task_name": activity_detail.display_name, "task_model": str(activity_detail.data_model), + "task_parent": str(activity_detail.creator_id.data_model), + "frequency": self._get_ews_frequency( + activity_detail.creator_id + ), + "bg_frequency": self._get_bg_frequency( + activity_detail.creator_id + ), "activity_id": activity_detail.id, "task_id": activity_detail.data_ref.id, - "input_fields": self._get_input_field(cr, uid, str(activity_detail.data_model), context=context) + "input_fields": self._get_input_field(cr, uid, str(activity_detail.data_model), context=context), } ) @@ -634,6 +651,23 @@ def process_escalations(self, creator_id, *args, **kwargs): } ) + @staticmethod + def _get_ews_frequency(creator_activity): + if creator_activity.data_model == 'nh.clinical.patient.observation.ews': + return '{:2d} hour(s) {:02d} min(s)'.format( + *divmod(creator_activity.data_ref.frequency, 60) + ) + return False + + @staticmethod + def _get_bg_frequency(creator_activity): + if creator_activity.data_model == \ + 'nh.clinical.patient.observation.blood_glucose': + return '{:2d} hour(s) {:02d} min(s)'.format( + *divmod(creator_activity.data_ref.frequency, 60) + ) + return False + def _get_input_field(self, cr, uid, obj, context=None): """ Some escalation tasks require additional data when they are confirmed. This checks the type of task and if @@ -868,6 +902,16 @@ def get_tasks(self, *args, **kw): cr, uid, [], context=context), context=context) + for task in tasks: + if task.get('frequency'): + task['frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( + *divmod(task.get('frequency'), 60) + ) + if task.get('bg_frequency'): + task['bg_frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( + *divmod(task.get('bg_frequency'), 60) + ) + favourites = self.get_user_favourites(uid) return request.render( From fc92bcc580865acfb4adf38db226718f9c33f3ff Mon Sep 17 00:00:00 2001 From: James Curtis Date: Thu, 16 Jan 2020 14:02:22 +0000 Subject: [PATCH 3/3] Refactor to remove duplicate code [O2345] Adds additional information of the current associated frequency of EWS & Blood Glucose observations to tasks cards (EWS & BG Obs only), patient cards and escalation forms for the respective observation types. --- nh_eobs_mobile/controllers/main.py | 34 ++++++++++++++++-------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/nh_eobs_mobile/controllers/main.py b/nh_eobs_mobile/controllers/main.py index 0bf3e387..1b80be6c 100755 --- a/nh_eobs_mobile/controllers/main.py +++ b/nh_eobs_mobile/controllers/main.py @@ -577,12 +577,12 @@ def get_patients(self, *args, **kw): for patient in patients: if patient.get('frequency'): - patient['frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( - *divmod(patient.get('frequency'), 60) + patient['frequency_string'] = self._convert_frequency_to_string( + patient.get('frequency') ) if patient.get('bg_frequency'): - patient['bg_frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( - *divmod(patient.get('bg_frequency'), 60) + patient['bg_frequency_string'] = self._convert_frequency_to_string( + patient.get('bg_frequency') ) favourites = self.get_user_favourites(uid) @@ -600,6 +600,10 @@ def get_patients(self, *args, **kw): 'urls': URLS} ) + @staticmethod + def _convert_frequency_to_string(frequency): + return '{:2d} hour(s) {:02d} min(s)'.format(*divmod(frequency, 60)) + @http.route(URLS['escalations'] + '', type='http', auth='user') def process_escalations(self, creator_id, *args, **kwargs): """ @@ -651,20 +655,18 @@ def process_escalations(self, creator_id, *args, **kwargs): } ) - @staticmethod - def _get_ews_frequency(creator_activity): + def _get_ews_frequency(self, creator_activity): if creator_activity.data_model == 'nh.clinical.patient.observation.ews': - return '{:2d} hour(s) {:02d} min(s)'.format( - *divmod(creator_activity.data_ref.frequency, 60) + return self._convert_frequency_to_string( + creator_activity.data_ref.frequency ) return False - @staticmethod - def _get_bg_frequency(creator_activity): + def _get_bg_frequency(self, creator_activity): if creator_activity.data_model == \ 'nh.clinical.patient.observation.blood_glucose': - return '{:2d} hour(s) {:02d} min(s)'.format( - *divmod(creator_activity.data_ref.frequency, 60) + return self._convert_frequency_to_string( + creator_activity.data_ref.frequency ) return False @@ -904,12 +906,12 @@ def get_tasks(self, *args, **kw): for task in tasks: if task.get('frequency'): - task['frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( - *divmod(task.get('frequency'), 60) + task['frequency_string'] = self._convert_frequency_to_string( + task.get('frequency') ) if task.get('bg_frequency'): - task['bg_frequency_string'] = '{:2d} hour(s) {:02d} min(s)'.format( - *divmod(task.get('bg_frequency'), 60) + task['bg_frequency_string'] = self._convert_frequency_to_string( + task.get('bg_frequency') ) favourites = self.get_user_favourites(uid)