예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
파일: api.py 프로젝트: tstalka/commcare-hq
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)
예제 #6
0
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)
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
    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)
예제 #10
0
    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)