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] })
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] })
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)
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']
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'])
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]})