def submit_xform_rf(self, action, submission_xml_string): # received_on = request.META.get('HTTP_X_SUBMIT_TIME') # date_header = request.META.get('HTTP_DATE') # if received_on: # doc.received_on = string_to_datetime(received_on) # if date_header: # comes in as: # Mon, 11 Apr 2011 18:24:43 GMT # goes out as: # 2011-04-11T18:24:43Z # try: # date = datetime.strptime(date_header, "%a, %d %b %Y %H:%M:%S GMT") # date = datetime.strftime(date, "%Y-%m-%dT%H:%M:%SZ") server_date = action.get('server_date', None) phone_date = action.get('date', None) extra_meta = {} if phone_date: date = iso_string_to_datetime(phone_date) date = datetime.strftime(date, "%a, %d %b %Y %H:%M:%S GMT") extra_meta['HTTP_DATE'] = date if server_date: extra_meta['HTTP_X_SUBMIT_TIME'] = server_date else: if phone_date is not None: extra_meta['HTTP_X_SUBMIT_TIME'] = phone_date submit_xform('/a/pact/receiver', PACT_DOMAIN, submission_xml_string, extra_meta=extra_meta)
def submit_xform_rf(self, action, submission_xml_string): # received_on = request.META.get('HTTP_X_SUBMIT_TIME') # date_header = request.META.get('HTTP_DATE') # if received_on: # doc.received_on = string_to_datetime(received_on) # if date_header: # comes in as: # Mon, 11 Apr 2011 18:24:43 GMT # goes out as: # 2011-04-11T18:24:43Z # try: # date = datetime.strptime(date_header, "%a, %d %b %Y %H:%M:%S GMT") # date = datetime.strftime(date, "%Y-%m-%dT%H:%M:%SZ") server_date = action.get("server_date", None) phone_date = action.get("date", None) extra_meta = {} if phone_date: date = iso_string_to_datetime(phone_date) date = datetime.strftime(date, "%a, %d %b %Y %H:%M:%S GMT") extra_meta["HTTP_DATE"] = date if server_date: extra_meta["HTTP_X_SUBMIT_TIME"] = server_date else: if phone_date is not None: extra_meta["HTTP_X_SUBMIT_TIME"] = phone_date submit_xform("/a/pact/receiver", PACT_DOMAIN, submission_xml_string, extra_meta=extra_meta)
def testSignal(self): """ Test to ensure that with a DOT submission the signal works """ start_dot = len( XFormInstance.view('reports_forms/all_forms', startkey=[ 'submission xmlns', self.domain.name, XMLNS_DOTS_FORM ], endkey=[ 'submission xmlns', self.domain.name, XMLNS_DOTS_FORM, {} ], reduce=False).all()) start_update = len( XFormInstance.view('reports_forms/all_forms', startkey=[ 'submission xmlns', self.domain.name, XMLNS_PATIENT_UPDATE_DOT ], endkey=[ 'submission xmlns', self.domain.name, XMLNS_PATIENT_UPDATE_DOT, {} ], reduce=False).all()) submit_xform(self.submit_url, self.domain.name, self.pillbox_form) submitted = XFormInstance.get(PILLBOX_ID) self.assertTrue(hasattr(submitted, PACT_DOTS_DATA_PROPERTY)) dot_count = XFormInstance.view( 'reports_forms/all_forms', startkey=['submission xmlns', self.domain.name, XMLNS_DOTS_FORM], endkey=['submission xmlns', self.domain.name, XMLNS_DOTS_FORM, {}], ).all()[0]['value'] update_count = XFormInstance.view( 'reports_forms/all_forms', startkey=[ 'submission xmlns', self.domain.name, XMLNS_PATIENT_UPDATE_DOT ], endkey=[ 'submission xmlns', self.domain.name, XMLNS_PATIENT_UPDATE_DOT, {} ], ).all()[0]['value'] self.assertEquals(dot_count, update_count) self.assertEquals(start_dot + start_update + 2, dot_count + update_count) casedoc = CommCareCase.get(CASE_ID) self.assertEqual(casedoc.xform_ids[-2], PILLBOX_ID) computed_submit = XFormInstance.get(casedoc.xform_ids[-1]) self.assertEqual(computed_submit.xmlns, XMLNS_PATIENT_UPDATE_DOT)
def _doTestNoPillbox(self, bundle): submit_xform(self.submit_url, self.domain.name, bundle['xml']) submitted = XFormInstance.get(bundle['xform_id']) self.assertTrue(hasattr(submitted, PACT_DOTS_DATA_PROPERTY)) observations = query_observations(CASE_ID, bundle['start_date'], bundle['end_date']) observed_dates = set() #assume to be five - 3,2 same as the regimen count, we are refilling empties self.assertEqual( 5, len(observations), msg="Observations do not match regimen count: %d != %d" % (5, len(observations))) art_nonart = set() for obs in observations: observed_dates.add(obs.observed_date) self.assertEquals( obs.day_note, "No check, from form" ) #magic string from the view to indicate a generated DOT observation from form data. art_nonart.add(obs.is_art) self.assertEquals(obs.doc_id, bundle['xform_id']) art = filter(lambda x: x.is_art, observations) self.assertEquals(2, len(art)) art_answered = filter(lambda x: x.adherence != "unchecked", art) self.assertEquals(1, len(art_answered)) nonart = filter(lambda x: not x.is_art, observations) self.assertEquals(3, len(nonart)) nonart_answered = filter(lambda x: x.adherence != "unchecked", nonart) self.assertEquals(1, len(nonart_answered)) #this only does SINGLE observations for art and non art self.assertEquals(len(observed_dates), 1) self.assertEquals(len(art_nonart), 2) # inspect the regenerated submission and ensure the built xml block is correctly filled. case_json = get_dots_case_json(PactPatientCase.get(CASE_ID), anchor_date=bundle['anchor_date']) enddate = bundle['anchor_date'] # anchor date of this submission #encounter_date = datetime.strptime(submitted.form['encounter_date'], '%Y-%m-%d') encounter_date = submitted.form['encounter_date'] for day_delta in range(DOT_DAYS_INTERVAL): obs_date = enddate - timedelta(days=day_delta) ret_index = DOT_DAYS_INTERVAL - day_delta - 1 day_arr = case_json['days'][ret_index] nonart_day_data = day_arr[0] art_day_data = day_arr[1] self.assertEquals(len(nonart_day_data), 3) self.assertEquals(len(art_day_data), 2)
def submit_case_update_form(casedoc, update_dict, couch_user, submit_date=None, xmlns=XMLNS_PATIENT_UPDATE, sync_token=None): """ Main entry point for submitting an update for a pact patient Args: casedoc: the patient case update_dict: the kv of the fields being changed couch_user: user committing the change submit_date: now if None """ if submit_date is None: submit_date = datetime.utcnow() form = etree.Element("data", nsmap={None: xmlns, 'jrm': "http://dev.commcarehq.org/jr/xforms"}) meta_block = generate_meta_block(couch_user, timestart=submit_date, timeend=submit_date) form.append(meta_block) update_block = prepare_case_update_xml_block(casedoc, couch_user, update_dict, submit_date) form.append(update_block) # todo: this date is based off midnight UTC not local time... encounter_date = etree.XML('<encounter_date>%s</encounter_date>' % json_format_date(datetime.utcnow())) form.append(encounter_date) submission_xml_string = etree.tostring(form).decode('utf-8') if sync_token: extra_meta = {LAST_SYNCTOKEN_HEADER: sync_token} else: extra_meta = None return submit_xform('/a/pact/receiver', PACT_DOMAIN, submission_xml_string, extra_meta=extra_meta)
def submit_case_update_form(casedoc, update_dict, couch_user, submit_date=None, xmlns=XMLNS_PATIENT_UPDATE, sync_token=None): """ Main entry point for submitting an update for a pact patient Args: casedoc: the patient case update_dict: the kv of the fields being changed couch_user: user committing the change submit_date: now if None """ if submit_date is None: submit_date = datetime.utcnow() form = etree.Element("data", nsmap={None: xmlns, 'jrm': "http://dev.commcarehq.org/jr/xforms"}) meta_block = generate_meta_block(couch_user, timestart=submit_date, timeend=submit_date) form.append(meta_block) update_block = prepare_case_update_xml_block(casedoc, couch_user, update_dict, submit_date) form.append(update_block) # todo: this date is based off midnight UTC not local time... encounter_date = etree.XML('<encounter_date>%s</encounter_date>' % json_format_date(datetime.utcnow())) form.append(encounter_date) submission_xml_string = etree.tostring(form) if sync_token: extra_meta = {LAST_SYNCTOKEN_HEADER: sync_token} else: extra_meta = None return submit_xform('/a/pact/receiver', PACT_DOMAIN, submission_xml_string, extra_meta=extra_meta)
def _doTestNoPillbox(self, bundle): submit_xform(self.submit_url, self.domain.name, bundle['xml']) submitted = XFormInstance.get(bundle['xform_id']) self.assertTrue(hasattr(submitted, PACT_DOTS_DATA_PROPERTY)) observations = query_observations(CASE_ID, bundle['start_date'], bundle['end_date']) observed_dates = set() #assume to be five - 3,2 same as the regimen count, we are refilling empties self.assertEqual(5, len(observations), msg="Observations do not match regimen count: %d != %d" % ( 5, len(observations))) art_nonart = set() for obs in observations: observed_dates.add(obs.observed_date) self.assertEquals(obs.day_note, "No check, from form") #magic string from the view to indicate a generated DOT observation from form data. art_nonart.add(obs.is_art) self.assertEquals(obs.doc_id, bundle['xform_id']) art = filter(lambda x: x.is_art, observations) self.assertEquals(2, len(art)) art_answered = filter(lambda x: x.adherence != "unchecked", art) self.assertEquals(1, len(art_answered)) nonart = filter(lambda x: not x.is_art, observations) self.assertEquals(3, len(nonart)) nonart_answered = filter(lambda x: x.adherence != "unchecked", nonart) self.assertEquals(1, len(nonart_answered)) #this only does SINGLE observations for art and non art self.assertEquals(len(observed_dates), 1) self.assertEquals(len(art_nonart), 2) # inspect the regenerated submission and ensure the built xml block is correctly filled. case_json = get_dots_case_json(PactPatientCase.get(CASE_ID), anchor_date=bundle['anchor_date']) enddate = bundle['anchor_date'] # anchor date of this submission #encounter_date = datetime.strptime(submitted.form['encounter_date'], '%Y-%m-%d') encounter_date = submitted.form['encounter_date'] for day_delta in range(DOT_DAYS_INTERVAL): obs_date = enddate - timedelta(days=day_delta) ret_index = DOT_DAYS_INTERVAL - day_delta -1 day_arr = case_json['days'][ret_index] nonart_day_data = day_arr[0] art_day_data = day_arr[1] self.assertEquals(len(nonart_day_data), 3) self.assertEquals(len(art_day_data), 2)
def _submitAndVerifyBundle(self, bundle, verify=True): start_nums = len(self.case.xform_ids) submit_xform(self.submit_url, self.domain.name, bundle['xml']) time.sleep(1) submitted = XFormInstance.get(bundle['xform_id']) self.assertTrue(hasattr(submitted, PACT_DOTS_DATA_PROPERTY)) submitted_dots = getattr(submitted, PACT_DOTS_DATA_PROPERTY) updated_case = PactPatientCase.get(CASE_ID) case_dots = get_dots_case_json(updated_case) days = case_dots['days'] if verify: nonart_submissions = bundle['nonart'] art_submissions = bundle['art'] examine_day = days[bundle['check_idx']] self._verify_dot_cells(nonart_submissions, art_submissions, examine_day)
def testSignal(self): """ Test to ensure that with a DOT submission the signal works """ start_dot = len(XFormInstance.view('couchforms/by_xmlns', key=XMLNS_DOTS_FORM, reduce=False).all()) start_update = len(XFormInstance.view('couchforms/by_xmlns', key=XMLNS_PATIENT_UPDATE_DOT, reduce=False).all()) submit_xform(self.submit_url, self.domain.name, self.pillbox_form) submitted = XFormInstance.get(PILLBOX_ID) self.assertTrue(hasattr(submitted, PACT_DOTS_DATA_PROPERTY)) dot_count = XFormInstance.view('couchforms/by_xmlns', key=XMLNS_DOTS_FORM).all()[0]['value'] update_count = XFormInstance.view('couchforms/by_xmlns', key=XMLNS_PATIENT_UPDATE_DOT).all()[0]['value'] self.assertEquals(dot_count, update_count) self.assertEquals(start_dot+start_update + 2, dot_count + update_count) casedoc = CommCareCase.get(CASE_ID) self.assertEqual(casedoc.xform_ids[-2], PILLBOX_ID) computed_submit = XFormInstance.get(casedoc.xform_ids[-1]) self.assertEqual(computed_submit.xmlns, XMLNS_PATIENT_UPDATE_DOT)