Esempio n. 1
0
 def get_payload(self, repeat_record, form):
     cases = cases_referenced_by_xform(form)
     return json.dumps({
         'form_id': form.form_id,
         'received_on': json_format_datetime(form.received_on),
         'case_ids': [case.case_id for case in cases]
     })
Esempio n. 2
0
 def test_payload(self):
     form = self.post_xml(self.xform_xml, self.domain_name).xform
     payload = self.repeat_records(self.domain_name).all()[0].get_payload()
     cases = cases_referenced_by_xform(form)
     self.assertEqual(json.loads(payload), {
         'received_on': json_format_datetime(form.received_on),
         'form_id': form.form_id,
         'case_ids': [case.case_id for case in cases]
     })
Esempio n. 3
0
 def test_payload(self):
     form = self.post_xml(self.xform_xml, self.domain_name).xform
     payload = self.repeat_records(self.domain_name).all()[0].get_payload()
     cases = cases_referenced_by_xform(form)
     self.assertEqual(json.loads(payload), {
         'received_on': json_format_datetime(form.received_on),
         'form_id': form.form_id,
         'case_ids': [case.case_id for case in cases]
     })
Esempio n. 4
0
    def get_payload(self, repeat_record, form):
        from casexml.apps.case.xform import cases_referenced_by_xform

        logger.debug('DHIS2: Form domain "%s" XMLNS "%s"', form['domain'], form['xmlns'])
        if form['xmlns'] not in (REGISTER_CHILD_XMLNS, GROWTH_MONITORING_XMLNS, RISK_ASSESSMENT_XMLNS):
            # This is not a form we care about
            raise IgnoreDocument


        settings = Dhis2Settings.for_domain(form['domain'])
        dhis2_api = Dhis2Api(settings.dhis2['host'], settings.dhis2['username'], settings.dhis2['password'],
                             settings.dhis2['top_org_unit_name'])
        cases = cases_referenced_by_xform(form)
        case = next(c for c in cases if c.type == CASE_TYPE)
        event = None

        if form['xmlns'] == REGISTER_CHILD_XMLNS:
            # Create a DHIS2 tracked entity instance from the form's case and
            # enroll in the nutrition assessment programme.
            logger.debug('DHIS2: Processing Register Child form')
            push_case(case, dhis2_api)
            #  We just need to enroll. No event to create
            raise IgnoreDocument

        elif form['xmlns'] == GROWTH_MONITORING_XMLNS:
            logger.debug('DHIS2: Processing Growth Monitoring form')
            if not getattr(case, 'external_id', None):
                logger.info('Register Child form must be processed before Growth Monitoring form')
                return  # Try again later
            self._update_instance(dhis2_api, case)
            # Create a paediatric nutrition assessment event.
            program_id = dhis2_api.get_program_id('Paediatric Nutrition Assessment')
            program_stage_id = dhis2_api.get_program_stage_id('Nutrition Assessment')
            event = dhis2_api.form_to_event(program_id, form, NUTRITION_ASSESSMENT_EVENT_FIELDS, program_stage_id,
                                            case['external_id'])

        elif form['xmlns'] == RISK_ASSESSMENT_XMLNS:
            logger.debug('DHIS2: Processing Risk Assessment form')
            if not getattr(case, 'external_id', None):
                logger.info('Register Child form must be processed before Risk Assessment form')
                return  # Try again later
            self._update_instance(dhis2_api, case)
            # Check whether the case needs to be enrolled in the Risk Assessment Program
            program_id = dhis2_api.get_program_id('Underlying Risk Assessment')
            if not dhis2_api.enrolled_in(case['external_id'], 'Underlying Risk Assessment'):
                today = json_format_date(date.today())
                program_data = {dhis2_attr: case[cchq_attr]
                                for cchq_attr, dhis2_attr in RISK_ASSESSMENT_PROGRAM_FIELDS.iteritems()}
                dhis2_api.enroll_in_id(case['external_id'], program_id, today, program_data)
            # Create a risk assessment event.
            program_stage_id = dhis2_api.get_program_stage_id('Underlying Risk Assessment')
            event = dhis2_api.form_to_event(program_id, form, RISK_ASSESSMENT_EVENT_FIELDS, program_stage_id,
                                            case['external_id'])

        return json.dumps(event, default=json_serializer)
Esempio n. 5
0
class XFormInstanceResource(SimpleSortableResourceMixin,
                            v0_3.XFormInstanceResource,
                            DomainSpecificResourceMixin):

    # Some fields that were present when just fetching individual docs are
    # not present for e.g. devicelogs and must be allowed blank
    uiversion = fields.CharField(attribute='uiversion', blank=True, null=True)
    metadata = fields.DictField(attribute='metadata', blank=True, null=True)
    domain = fields.CharField(attribute='domain')
    app_id = fields.CharField(attribute='app_id', null=True)
    build_id = fields.CharField(attribute='build_id', null=True)

    cases = UseIfRequested(
        ToManyDocumentsField(
            'corehq.apps.api.resources.v0_4.CommCareCaseResource',
            attribute=lambda xform: casexml_xform.cases_referenced_by_xform(
                xform)))

    is_phone_submission = fields.BooleanField(readonly=True)

    def dehydrate_is_phone_submission(self, bundle):
        return (getattr(bundle.obj, 'openrosa_headers', None)
                and bundle.obj.openrosa_headers.get('HTTP_X_OPENROSA_VERSION'))

    # Prevent hitting Couch to md5 the attachment. However, there is no way to
    # eliminate a tastypie field defined in a parent class.
    md5 = fields.CharField(attribute='uiversion', blank=True, null=True)

    def dehydrate_md5(self, bundle):
        return 'OBSOLETED'

    def xform_es(self, domain):
        return MOCK_XFORM_ES or XFormES(domain)

    def obj_get_list(self, bundle, domain, **kwargs):
        try:
            es_query = es_search(bundle.request, domain)
        except Http400 as e:
            raise BadRequest(e.message)
        es_query['filter']['and'].append(
            {'term': {
                'doc_type': 'xforminstance'
            }})

        # Note that XFormES is used only as an ES client, for `run_query` against the proper index
        return ESQuerySet(
            payload=es_query,
            model=XFormInstance,
            es_client=self.xform_es(domain)).order_by('-received_on')

    class Meta(v0_3.XFormInstanceResource.Meta):
        ordering = ['received_on']
        list_allowed_methods = ['get']
Esempio n. 6
0
    def get_payload(self, repeat_record, form):
        from casexml.apps.case.xform import cases_referenced_by_xform

        logger.debug('DHIS2: Form domain "%s" XMLNS "%s"', form['domain'],
                     form['xmlns'])
        if form['xmlns'] not in (REGISTER_CHILD_XMLNS, GROWTH_MONITORING_XMLNS,
                                 RISK_ASSESSMENT_XMLNS):
            # This is not a form we care about
            raise IgnoreDocument

        settings = Dhis2Settings.for_domain(form['domain'])
        dhis2_api = Dhis2Api(settings.dhis2['host'],
                             settings.dhis2['username'],
                             settings.dhis2['password'],
                             settings.dhis2['top_org_unit_name'])
        cases = cases_referenced_by_xform(form)
        case = next(c for c in cases if c.type == CASE_TYPE)
        event = None

        if form['xmlns'] == REGISTER_CHILD_XMLNS:
            # Create a DHIS2 tracked entity instance from the form's case and
            # enroll in the nutrition assessment programme.
            logger.debug('DHIS2: Processing Register Child form')
            push_case(case, dhis2_api)
            #  We just need to enroll. No event to create
            raise IgnoreDocument

        elif form['xmlns'] == GROWTH_MONITORING_XMLNS:
            logger.debug('DHIS2: Processing Growth Monitoring form')
            if not getattr(case, 'external_id', None):
                logger.info(
                    'Register Child form must be processed before Growth Monitoring form'
                )
                return  # Try again later
            self._update_instance(dhis2_api, case)
            # Create a paediatric nutrition assessment event.
            program_id = dhis2_api.get_program_id(
                'Paediatric Nutrition Assessment')
            program_stage_id = dhis2_api.get_program_stage_id(
                'Nutrition Assessment')
            event = dhis2_api.form_to_event(program_id, form,
                                            NUTRITION_ASSESSMENT_EVENT_FIELDS,
                                            program_stage_id,
                                            case['external_id'])
Esempio n. 7
0
class XFormInstanceResource(SimpleSortableResourceMixin, HqBaseResource,
                            DomainSpecificResourceMixin):
    """This version of the form resource is built of Elasticsearch data
    which gets wrapped by ``ESXFormInstance``.
    No type conversion is done e.g. dates and some fields are named differently than in the
    Python models.
    """

    id = fields.CharField(attribute='_id', readonly=True, unique=True)

    domain = fields.CharField(attribute='domain')
    form = fields.DictField(attribute='form_data')
    type = fields.CharField(attribute='type')
    version = fields.CharField(attribute='version')
    uiversion = fields.CharField(attribute='uiversion', blank=True, null=True)
    metadata = fields.DictField(attribute='metadata', blank=True, null=True)
    received_on = fields.CharField(attribute="received_on")

    app_id = fields.CharField(attribute='app_id', null=True)
    build_id = fields.CharField(attribute='build_id', null=True)
    initial_processing_complete = fields.BooleanField(
        attribute='initial_processing_complete', null=True)
    problem = fields.CharField(attribute='problem', null=True)

    archived = fields.CharField(readonly=True)

    def dehydrate_archived(self, bundle):
        return bundle.obj.is_archived

    cases = UseIfRequested(
        ToManyDocumentsField(
            'corehq.apps.api.resources.v0_4.CommCareCaseResource',
            attribute=lambda xform: casexml_xform.cases_referenced_by_xform(
                xform)))

    attachments = fields.DictField(readonly=True, null=True)

    def dehydrate_attachments(self, bundle):
        attachments_dict = getattr(bundle.obj, 'blobs', None)
        if not attachments_dict:
            return {}

        def _normalize_meta(meta):
            return {
                'content_type': meta.content_type,
                'length': meta.content_length,
            }

        return {
            name: _normalize_meta(meta)
            for name, meta in attachments_dict.items()
        }

    is_phone_submission = fields.BooleanField(readonly=True)

    def dehydrate_is_phone_submission(self, bundle):
        return (getattr(bundle.obj, 'openrosa_headers', None)
                and bundle.obj.openrosa_headers.get('HTTP_X_OPENROSA_VERSION'))

    def obj_get(self, bundle, **kwargs):
        instance_id = kwargs['pk']
        try:
            form = FormAccessors(kwargs['domain']).get_form(instance_id)
            es_form = form_to_es_form(form)
            if es_form:
                return es_form
            else:
                raise XFormNotFound
        except XFormNotFound:
            raise object_does_not_exist("XFormInstance", instance_id)

    def xform_es(self, domain):
        return MOCK_XFORM_ES or XFormES(domain)

    def obj_get_list(self, bundle, domain, **kwargs):
        include_archived = 'include_archived' in bundle.request.GET
        try:
            es_query = es_search(bundle.request, domain, ['include_archived'])
        except Http400 as e:
            raise BadRequest(e.message)
        if include_archived:
            es_query['filter']['and'].append({
                'or': [
                    {
                        'term': {
                            'doc_type': 'xforminstance'
                        }
                    },
                    {
                        'term': {
                            'doc_type': 'xformarchived'
                        }
                    },
                ]
            })
        else:
            es_query['filter']['and'].append(
                {'term': {
                    'doc_type': 'xforminstance'
                }})

        # Note that XFormES is used only as an ES client, for `run_query` against the proper index
        return ElasticAPIQuerySet(
            payload=es_query,
            model=ESXFormInstance,
            es_client=self.xform_es(domain)).order_by('-received_on')

    def detail_uri_kwargs(self, bundle_or_obj):
        return {'pk': get_obj(bundle_or_obj).form_id}

    class Meta(CustomResourceMeta):
        authentication = RequirePermissionAuthentication(Permissions.edit_data)
        object_class = ESXFormInstance
        list_allowed_methods = ['get']
        detail_allowed_methods = ['get']
        resource_name = 'form'
        ordering = ['received_on']
        serializer = XFormInstanceSerializer(formats=['json'])
 def get_payload(self, repeat_record, form):
     cases = cases_referenced_by_xform(form)
     return json.dumps({'form_id': form._id,
                        'received_on': json_format_datetime(form.received_on),
                        'case_ids': [case._id for case in cases]})