def test_build_chart_data_for_non_numeric_field_group_by_two_fields(self): field = find_field_by_name(self.xform, 'name') group_by_field = ['pizza_fan', 'date'] with self.assertRaises(ParseError): build_chart_data_for_field(self.xform, field, group_by=group_by_field)
def test_build_chart_data_cannot_group_by_field(self): field = find_field_by_name(self.xform, 'gender') group_by_field = find_field_by_xpath(self.xform, 'name') with self.assertRaises(ParseError) as e: build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(str(e.exception), "Cannot group by name")
def test_build_chart_data_for_field_on_grouped_field(self): field = find_field_by_xpath(self.xform, 'a_group/a_text') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'a_text') self.assertEqual(data['field_xpath'], 'a_group/a_text') self.assertEqual(data['field_type'], 'text') self.assertEqual(data['data_type'], 'categorized')
def to_representation(self, obj): data = {} request = self.context.get('request') if obj is not None: fields = obj.survey_elements if request: selected_fields = request.query_params.get('fields') if isinstance(selected_fields, basestring) \ and selected_fields != 'all': fields = selected_fields.split(',') fields = [e for e in obj.survey_elements if e.name in fields] if len(fields) == 0: raise Http404( "Field %s does not not exist on the form" % fields) for field in fields: if field.name == INSTANCE_ID: continue field_data = build_chart_data_for_field(obj, field) data[field.name] = field_data return data
def to_representation(self, obj): data = {} request = self.context.get('request') if obj is not None: dd = obj.data_dictionary() fields = dd.survey_elements if request: selected_fields = request.query_params.get('fields') if isinstance(selected_fields, basestring) \ and selected_fields != 'all': fields = selected_fields.split(',') fields = [ e for e in dd.survey_elements if e.name in fields ] if len(fields) == 0: raise Http404( "Field %s does not not exist on the form" % fields) for field in fields: if field.name == INSTANCE_ID: continue field_data = build_chart_data_for_field(obj, field) data[field.name] = field_data return data
def get(self, request, formid, field_name, format=None): # TODO: seems like model is taking care of object-level perms, # should we just rely on that xform = get_xform(formid, request) # check if its the special _submission_time META if field_name == common_tags.SUBMISSION_TIME: field = common_tags.SUBMISSION_TIME else: # use specified field to get summary dd = xform.data_dictionary() fields = filter( lambda f: f.name == field_name, [e for e in dd.survey_elements]) if len(fields) == 0: raise Http404( "Field %s does not not exist on the form" % field_name) field = fields[0] data = build_chart_data_for_field(xform, field) data.update({ 'xform': xform }) return Response(data, template_name='chart_detail.html')
def test_build_chart_category_field_group_by_category_field_in_group(self): field = find_field_by_name(self.xform, 'gender') group_by_field = find_field_by_xpath(self.xform, 'a_group/grouped') data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'gender') self.assertEqual(data['field_xpath'], 'gender') self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['grouped_by'], 'a_group/grouped') self.assertEqual(data['data_type'], 'categorized') self.assertEqual(sorted(data['data'], key=lambda k: k['gender']), [ { 'gender': ['Female'], 'items': [{ 'a_group/grouped': ['Yes'], 'count': 1}] }, { 'gender': ['Male'], 'items': [{ 'a_group/grouped': ['Yes'], 'count': 1}] } ])
def test_build_chart_data_for_category_field_group_by_category_field(self): field = find_field_by_name(self.xform, 'gender') group_by_field = find_field_by_name(self.xform, 'pizza_fan') data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'gender') self.assertEqual(data['field_xpath'], 'gender') self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['grouped_by'], 'pizza_fan') self.assertEqual(data['data_type'], 'categorized') self.assertEqual(sorted(data['data'], key=lambda k: k['gender']), [ { 'gender': ['Female'], 'items': [{ 'count': 1, 'pizza_fan': ['No']}] }, { 'gender': ['Male'], 'items': [{ 'count': 1, 'pizza_fan': ['No']}] } ])
def retrieve(self, request, *args, **kwargs): xform = self.get_object() serializer = self.get_serializer(xform) dd = xform.data_dictionary() field_name = request.QUERY_PARAMS.get('field_name') fields = request.QUERY_PARAMS.get('fields') fmt = kwargs.get('format') self.headers = merge_dicts( self.headers, last_modified_header(get_date(xform, 'modified'))) if fields: if fmt is not None and fmt != 'json': raise ParseError("Error: only JSON format supported.") xform = self.get_object() self.headers['Last-Modified'] = get_date(xform, 'modified') context = self.get_serializer_context() serializer = FieldsChartSerializer(instance=xform, context=context) return Response(serializer.data) if field_name: # check if its the special _submission_time META if field_name == common_tags.SUBMISSION_TIME: field = common_tags.SUBMISSION_TIME else: # use specified field to get summary fields = filter(lambda f: f.name == field_name, [e for e in dd.survey_elements]) if len(fields) == 0: raise Http404("Field %s does not not exist on the form" % field_name) field = fields[0] data = build_chart_data_for_field(xform, field) if request.accepted_renderer.format == 'json': xform = xform.pk elif request.accepted_renderer.format == 'html' and 'data' in data: for item in data['data']: if isinstance(item[field_name], list): item[field_name] = u', '.join(item[field_name]) data.update({'xform': xform}) return Response(data, template_name='chart_detail.html') if fmt != 'json' and field_name is None: raise ParseError("Not supported") data = serializer.data data["fields"] = {} for field in dd.survey_elements: field_url = get_form_field_chart_url(data["url"], field.name) data["fields"][field.name] = field_url return Response(data)
def test_build_chart_data_for_numeric_field_group_by_two_fields(self): field = find_field_by_name(self.xform, 'net_worth') group_by_field = ['pizza_fan', 'date'] data = build_chart_data_for_field(self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'net_worth') self.assertEqual(data['field_xpath'], 'net_worth') self.assertEqual(data['field_type'], 'decimal') self.assertEqual(data['grouped_by'], group_by_field) self.assertEqual(data['data_type'], 'numeric') self.assertEqual(data['data'], [{ 'count': 1, 'date': u'2014-01-09', 'mean': 100000.0, 'pizza_fan': u'no', 'sum': 100000.0 }, { 'count': 1, 'date': u'2014-01-10', 'mean': 50000.0, 'pizza_fan': u'no', 'sum': 50000.0 }])
def retrieve(self, request, *args, **kwargs): xform = self.get_object() serializer = self.get_serializer(xform) dd = xform.data_dictionary() field_name = request.QUERY_PARAMS.get('field_name') fields = request.QUERY_PARAMS.get('fields') fmt = kwargs.get('format') if fields: if fmt is not None and fmt != 'json': raise ParseError("Error: only JSON format supported.") xform = self.get_object() context = self.get_serializer_context() serializer = FieldsChartSerializer(instance=xform, context=context) return Response(serializer.data) if field_name: # check if its the special _submission_time META if field_name == common_tags.SUBMISSION_TIME: field = common_tags.SUBMISSION_TIME else: # use specified field to get summary fields = filter( lambda f: f.name == field_name, [e for e in dd.survey_elements]) if len(fields) == 0: raise Http404( "Field %s does not not exist on the form" % field_name) field = fields[0] data = build_chart_data_for_field(xform, field) if request.accepted_renderer.format == 'json': xform = xform.pk elif request.accepted_renderer.format == 'html' and 'data' in data: for item in data['data']: if isinstance(item[field_name], list): item[field_name] = u', '.join(item[field_name]) data.update({ 'xform': xform }) return Response(data, template_name='chart_detail.html') if fmt != 'json' and field_name is None: raise ParseError("Not supported") data = serializer.data data["fields"] = {} for field in dd.survey_elements: field_url = get_form_field_chart_url(data["url"], field.name) data["fields"][field.name] = field_url return Response(data)
def test_build_chart_category_field_group_by_category_field_in_group(self): field = find_field_by_name(self.xform, 'gender') group_by_field = find_field_by_xpath(self.xform, 'a_group/grouped') data = build_chart_data_for_field(self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'gender') self.assertEqual(data['field_xpath'], 'gender') self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['grouped_by'], 'a_group/grouped') self.assertEqual(data['data_type'], 'categorized') self.assertEqual(data['data'], [{ u'gender': [u'Male'], 'items': [{ u'a_group/grouped': [u'Yes'], 'count': 1L }] }, { u'gender': [u'Female'], 'items': [{ u'a_group/grouped': [u'Yes'], 'count': 1L }] }])
def test_select_one_choices(self): path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "select_one_choices_test.xlsx") self._publish_xls_file_and_set_xform(path) path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "select_one_choices_instance.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'name_I') choices = get_field_choices(field, self.xform) data = build_chart_data_for_field(self.xform, field, choices=choices) expected_data = { 'field_type': 'select one', 'data_type': 'categorized', 'field_xpath': 'name_I', 'data': [{ 'count': 1, 'name_I': ['Aynalem Tenaw'] }], 'grouped_by': None, 'field_label': 'Name of interviewer', 'field_name': 'name_I' } self.assertEqual(data, expected_data)
def test_build_chart_data_for_field_on_duration(self): group_by_field = find_field_by_name(self.xform, 'pizza_fan') data = build_chart_data_for_field( self.xform, '_duration', group_by=group_by_field) self.assertEqual(data['field_name'], '_duration') self.assertEqual(data['field_type'], 'integer') self.assertEqual(data['data_type'], 'numeric')
def test_select_one_choices(self): path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "select_one_choices_test.xlsx") self._publish_xls_file_and_set_xform(path) path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "select_one_choices_instance.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'name_I') choices = get_field_choices(field, self.xform) data = build_chart_data_for_field(self.xform, field, choices=choices) expected_data = { 'field_type': u'select one', 'data_type': 'categorized', 'field_xpath': u'name_I', 'data': [{ 'count': 1L, 'name_I': [u'Aynalem Tenaw'] }], 'grouped_by': None, 'field_label': u'Name of interviewer', 'field_name': u'name_I' } self.assertEqual(data, expected_data)
def test_build_chart_data_for_field_with_language_on_non_lang_field(self): path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "main", "tests", "fixtures", "good_eats_multilang", "good_eats_multilang.xls", ) self._publish_xls_file_and_set_xform(path) path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "main", "tests", "fixtures", "good_eats_multilang", "1.xml", ) self._make_submission(path) dd = self.xform.data_dictionary() field = find_field_by_name(dd, "submit_date") data = build_chart_data_for_field(self.xform, field, language_index=1) self.assertEqual(data["field_label"], "submit_date")
def test_build_chart_data_for_field_on_grouped_field(self): dd = self.xform.data_dictionary() field = find_field_by_name(dd, "a_text") data = build_chart_data_for_field(self.xform, field) self.assertEqual(data["field_name"], "a_group-a_text") self.assertEqual(data["field_xpath"], "a_group/a_text") self.assertEqual(data["field_type"], "text") self.assertEqual(data["data_type"], "categorized")
def test_build_chart_data_for_field_on_grouped_field(self): dd = self.xform.data_dictionary() field = find_field_by_name(dd, 'a_text') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'a_group-a_text') self.assertEqual(data['field_xpath'], 'a_text') self.assertEqual(data['field_type'], 'text') self.assertEqual(data['data_type'], 'categorized')
def test_build_chart_data_for_field_on_grouped_field(self): dd = self.xform.data_dictionary() field = find_field_by_name(dd, 'a_text') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'a_group-a_text') self.assertEqual(data['field_xpath'], 'a_group/a_text') self.assertEqual(data['field_type'], 'text') self.assertEqual(data['data_type'], 'categorized')
def test_build_chart_data_for_field_on_select_one(self): dd = self.xform.data_dictionary() field = find_field_by_name(dd, "gender") data = build_chart_data_for_field(self.xform, field) self.assertEqual(data["field_name"], "gender") self.assertEqual(data["field_type"], "select one") self.assertEqual(data["data_type"], "categorized") # map the list to a dict values = dict([(d["gender"], d["count"]) for d in data["data"]]) self.assertEqual(values, {"male": 1, "female": 1})
def test_build_chart_data_with_field_name_with_lengh_65(self): # make the 3rd submission that doesnt have a date path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "tutorial", "instances", "3.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'date') field.name = 'a' * 65 data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], field.name)
def test_build_chart_data_with_field_name_with_lengh_65(self): # make the 3rd submission that doesnt have a date path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "tutorial", "instances", "3.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'date') field.name = 'a' * 65 data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], field.name)
def test_build_chart_data_strips_none_from_dates(self): # make the 3rd submission that doesnt have a date path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "tutorial", "instances", "3.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'date') data = build_chart_data_for_field(self.xform, field) # create a list with comparisons to the dict values values = [d['date'] is not None for d in data['data']] self.assertTrue(all(values))
def test_build_chart_data_strips_none_from_dates(self): # make the 3rd submission that doesnt have a date path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "tutorial", "instances", "3.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'date') data = build_chart_data_for_field(self.xform, field) # create a list with comparisons to the dict values values = [d['date'] is not None for d in data['data']] self.assertTrue(all(values))
def test_build_chart_data_for_field_with_language_on_non_lang_field(self): path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "main", "tests", "fixtures", "good_eats_multilang", "good_eats_multilang.xls") self._publish_xls_file_and_set_xform(path) path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "main", "tests", "fixtures", "good_eats_multilang", "1.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'submit_date') data = build_chart_data_for_field(self.xform, field, language_index=1) self.assertEqual(data['field_label'], 'submit_date')
def test_build_chart_data_for_fields_with_accents(self): xls_path = os.path.join(self.this_directory, "fixtures", "sample_accent.xlsx") count = XForm.objects.count() self._publish_xls_file(xls_path) self.assertEquals(XForm.objects.count(), count + 1) xform = XForm.objects.get(id_string='sample_accent') self.assertEqual(xform.title, "sample_accent") field = find_field_by_name(xform, 'tête') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'tête') field = find_field_by_name(xform, 'té') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'té') field = find_field_by_name(xform, 'père') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'père')
def test_build_chart_data_with_nonexisting_field_xpath(self): # make the 3rd submission that doesnt have a date path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "tutorial", "instances", "3.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'date') field.name = 'informed_consent/pas_denfants_elig/q7b' data = build_chart_data_for_field(self.xform, field) # create a list with comparisons to the dict values values = [d['date'] is not None for d in data['data']] self.assertTrue(all(values))
def test_build_chart_data_for_fields_with_accents(self): xls_path = os.path.join(self.this_directory, "fixtures", "sample_accent.xlsx") response = self._publish_xls_file(xls_path) self.assertEquals(response.status_code, 200) xform = XForm.objects.all()[0] self.assertEqual(xform.title, "sample_accent") dd = xform.data_dictionary() field = find_field_by_name(dd, u'tête') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'words_with_accents-tête') field = find_field_by_name(dd, u'té') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'words_with_accents-té') field = find_field_by_name(dd, u'père') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'words_with_accents-père')
def test_build_chart_data_for_field_on_select_one(self): field_name = 'gender' field = find_field_by_name(self.xform, field_name) data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], field_name) self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['data_type'], 'categorized') # map the list to a dict for d in data['data']: genders = d[field_name] count = d['count'] self.assertEqual(type(genders), list) self.assertEqual(count, 1)
def test_build_chart_data_for_field_on_select_one(self): dd = self.xform.data_dictionary() field = find_field_by_name(dd, 'gender') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'gender') self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['data_type'], 'categorized') # map the list to a dict values = dict([(d['gender'], d['count'], ) for d in data['data']]) self.assertEqual(values, { 'Male': 1, 'Female': 1 })
def test_build_chart_data_for_fields_with_accents(self): xls_path = os.path.join(self.this_directory, "fixtures", "sample_accent.xlsx") count = XForm.objects.count() self._publish_xls_file(xls_path) self.assertEquals(XForm.objects.count(), count + 1) xform = XForm.objects.all()[0] self.assertEqual(xform.title, "sample_accent") field = find_field_by_name(xform, u'tête') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'tête') field = find_field_by_name(xform, u'té') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'té') field = find_field_by_name(xform, u'père') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'père')
def test_build_chart_data_for_field_on_select_one(self): dd = self.xform.data_dictionary() field = find_field_by_name(dd, 'gender') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], 'gender') self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['data_type'], 'categorized') # map the list to a dict values = dict([( d['gender'], d['count'], ) for d in data['data']]) self.assertEqual(values, {'male': 1, 'female': 1})
def test_build_chart_data_with_nonexisting_field_xpath(self): # make the 3rd submission that doesnt have a date path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "tutorial", "instances", "3.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'date') field.name = 'informed_consent/pas_denfants_elig/q7b' data = build_chart_data_for_field(self.xform, field) # create a list with comparisons to the dict values values = [d['date'] is not None for d in data['data']] self.assertTrue(all(values))
def test_build_chart_data_for_fields_with_accents(self): xls_path = os.path.join( self.this_directory, "fixtures", "sample_accent.xlsx") response = self._publish_xls_file(xls_path) self.assertEquals(response.status_code, 200) xform = XForm.objects.all()[0] self.assertEqual(xform.title, "sample_accent") dd = xform.data_dictionary() field = find_field_by_name(dd, u'tête') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'words_with_accents-tête') field = find_field_by_name(dd, u'té') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'words_with_accents-té') field = find_field_by_name(dd, u'père') data = build_chart_data_for_field(self.xform, field) self.assertEqual(data['field_name'], u'words_with_accents-père')
def test_build_chart_data_for_field_with_language(self): path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "main", "tests", "fixtures", "good_eats_multilang", "good_eats_multilang.xls") self._publish_xls_file_and_set_xform(path) path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "main", "tests", "fixtures", "good_eats_multilang", "1.xml") self._make_submission(path) field = find_field_by_name(self.xform, 'food_type') language_index = list(OrderedDict(field.label)).index('English') data = build_chart_data_for_field(self.xform, field, language_index=language_index) self.assertEqual(data['field_label'], "Type of Eat")
def test_build_chart_data_calculate_field_group_by_category_field(self): field = find_field_by_name(self.xform, 'networth_calc') group_by_field = find_field_by_name(self.xform, 'pizza_fan') data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'networth_calc') self.assertEqual(data['field_xpath'], 'networth_calc') self.assertEqual(data['field_type'], 'calculate') self.assertEqual(data['grouped_by'], 'pizza_fan') self.assertEqual(data['data_type'], 'numeric') self.assertEqual(data['data'], [{ 'sum': 150000.0, 'pizza_fan': [u'No'], 'mean': 75000.0 }])
def test_build_chart_data_for_field_on_submitted_by_group_by(self): group_by_field = find_field_by_name(self.xform, 'pizza_fan') data = build_chart_data_for_field( self.xform, '_submitted_by', group_by=group_by_field) self.assertEqual(data['field_name'], '_submitted_by') self.assertEqual(data['field_type'], 'text') self.assertEqual(data['data_type'], 'categorized') self.assertEqual(data['grouped_by'], u'pizza_fan') self.assertEqual(data['data'], [{ '_submitted_by': u'bob', 'items': [{ 'count': 2L, u'pizza_fan': [u'No'] }] }])
def test_build_chart_data_for_field_on_submitted_by_group_by(self): group_by_field = find_field_by_name(self.xform, 'pizza_fan') data = build_chart_data_for_field( self.xform, '_submitted_by', group_by=group_by_field) self.assertEqual(data['field_name'], '_submitted_by') self.assertEqual(data['field_type'], 'text') self.assertEqual(data['data_type'], 'categorized') self.assertEqual(data['grouped_by'], 'pizza_fan') self.assertEqual(data['data'], [{ '_submitted_by': 'bob', 'items': [{ 'count': 2, 'pizza_fan': ['No'] }] }])
def test_build_chart_data_calculate_field_group_by_category_field(self): field = find_field_by_name(self.xform, 'networth_calc') group_by_field = find_field_by_name(self.xform, 'pizza_fan') data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'networth_calc') self.assertEqual(data['field_xpath'], 'networth_calc') self.assertEqual(data['field_type'], 'calculate') self.assertEqual(data['grouped_by'], 'pizza_fan') self.assertEqual(data['data_type'], 'numeric') self.assertEqual(data['data'], [{ 'count': 2, 'sum': 150000.0, 'pizza_fan': ['No'], 'mean': 75000.0 }])
def test_build_chart_data_for_numeric_field_group_by_category_field(self): field = find_field_by_name(self.xform, 'net_worth') group_by_field = find_field_by_xpath(self.xform, 'pizza_type') data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'net_worth') self.assertEqual(data['field_xpath'], 'net_worth') self.assertEqual(data['field_type'], 'decimal') self.assertEqual(data['grouped_by'], 'pizza_type') self.assertEqual(data['data_type'], 'numeric') self.assertEqual(data['data'], [{ 'count': 2, 'sum': 150000.0, 'pizza_type': [], 'mean': 75000.0 }])
def test_select_one_choices_group_by(self): path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "select_one_choices_test.xlsx") self._publish_xls_file_and_set_xform(path) path = os.path.join(os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "select_one_choices_instance.xml") self._make_submission(path) group_by = find_field_by_name(self.xform, 'name_I') field = find_field_by_name(self.xform, 'toexppc') choices = get_field_choices(field, self.xform) data = build_chart_data_for_field(self.xform, field, choices=choices, group_by=group_by) expected_data = { 'field_type': u'calculate', 'data_type': 'numeric', 'field_xpath': u'toexppc', 'data': [{ 'count': 1, 'sum': Decimal('3.357142857142857'), 'name_I': [u'Aynalem Tenaw'], 'mean': Decimal('3.3571428571428570') }], 'grouped_by': u'name_I', 'field_label': u'Total expenditure per capita', 'field_name': u'toexppc' } self.assertEqual(data, expected_data)
def test_build_chart_data_for_group_by_submitted_by(self): field = find_field_by_name(self.xform, 'gender') group_by_field = '_submitted_by' data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'gender') self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['data_type'], 'categorized') self.assertEqual(data['grouped_by'], u'_submitted_by') self.assertEqual(data['data'], [{ '_submitted_by': u'bob', 'count': 1, u'gender': [u'Female'] }, { '_submitted_by': u'bob', 'count': 1, u'gender': [u'Male'] }])
def test_build_chart_data_for_group_by_submitted_by(self): field = find_field_by_name(self.xform, 'gender') group_by_field = '_submitted_by' data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'gender') self.assertEqual(data['field_type'], 'select one') self.assertEqual(data['data_type'], 'categorized') self.assertEqual(data['grouped_by'], u'_submitted_by') self.assertEqual(data['data'], [{ '_submitted_by': u'bob', 'count': 1L, u'gender': [u'Male'] }, { '_submitted_by': u'bob', 'count': 1L, u'gender': [u'Female'] }])
def test_select_one_choices_group_by(self): path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "forms", "select_one_choices_test.xlsx") self._publish_xls_file_and_set_xform(path) path = os.path.join( os.path.dirname(__file__), "..", "..", "..", "apps", "api", "tests", "fixtures", "select_one_choices_instance.xml") self._make_submission(path) group_by = find_field_by_name(self.xform, 'name_I') field = find_field_by_name(self.xform, 'toexppc') choices = get_field_choices(field, self.xform) data = build_chart_data_for_field( self.xform, field, choices=choices, group_by=group_by) expected_data = { 'field_type': 'calculate', 'data_type': 'numeric', 'field_xpath': 'toexppc', 'data': [{ 'count': 1, 'sum': Decimal('3.357142857142857'), 'name_I': ['Aynalem Tenaw'], 'mean': Decimal('3.3571428571428570') }], 'grouped_by': 'name_I', 'field_label': 'Total expenditure per capita', 'field_name': 'toexppc' } self.assertEqual(data, expected_data)
def test_build_chart_data_for_fields_with_apostrophies(self): """ Test that apostrophes are escaped before they are sent to the database. If the not escaped a django.db.utils.ProgrammingError would be raised. """ xls_path = os.path.join(self.this_directory, "fixtures", "sample_accent.xlsx") count = XForm.objects.count() self._publish_xls_file(xls_path) self.assertEquals(XForm.objects.count(), count + 1) xform = XForm.objects.get(id_string='sample_accent') self.assertEqual(xform.title, "sample_accent") field = find_field_by_name(xform, "ChưR'căm") data = build_chart_data_for_field(xform, field) self.assertEqual(data['field_name'], "ChưR'căm")
def retrieve(self, request, *args, **kwargs): xform = self.get_object() serializer = self.get_serializer(xform) dd = xform.data_dictionary() field_name = request.QUERY_PARAMS.get('field_name') if field_name: # check if its the special _submission_time META if field_name == common_tags.SUBMISSION_TIME: field = common_tags.SUBMISSION_TIME else: # use specified field to get summary fields = filter( lambda f: f.name == field_name, [e for e in dd.survey_elements]) if len(fields) == 0: raise Http404( "Field %s does not not exist on the form" % field_name) field = fields[0] data = build_chart_data_for_field(xform, field) if request.accepted_renderer.format == 'json': xform = xform.pk data.update({ 'xform': xform }) return Response(data, template_name='chart_detail.html') data = serializer.data data["fields"] = {} for field in dd.survey_elements: field_url = get_form_field_chart_url(data["url"], field.name) data["fields"][field.name] = field_url return Response(data)
def test_build_chart_data_for_non_numeric_field_group_by_two_fields(self): field = find_field_by_name(self.xform, 'name') group_by_field = ['pizza_fan', 'date'] data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'name') self.assertEqual(data['field_xpath'], 'name') self.assertEqual(data['field_type'], 'text') self.assertEqual(data['grouped_by'], group_by_field) self.assertEqual(data['data_type'], 'categorized') self.assertEqual(data['data'], [{ 'date': u'2014-01-09', 'pizza_fan': u'no', 'count': 1, 'name': ['Efgh'] }, { 'date': u'2014-01-10', 'pizza_fan': u'no', 'count': 1, 'name': ['Ghi'] }])
def test_build_chart_data_for_numeric_field_group_by_two_fields(self): field = find_field_by_name(self.xform, 'net_worth') group_by_field = ['pizza_fan', 'date'] data = build_chart_data_for_field( self.xform, field, group_by=group_by_field) self.assertEqual(data['field_name'], 'net_worth') self.assertEqual(data['field_xpath'], 'net_worth') self.assertEqual(data['field_type'], 'decimal') self.assertEqual(data['grouped_by'], group_by_field) self.assertEqual(data['data_type'], 'numeric') self.assertEqual(data['data'], [{ 'count': 1, 'date': u'2014-01-09', 'mean': 100000.0, 'pizza_fan': u'no', 'sum': 100000.0 }, { 'count': 1, 'date': u'2014-01-10', 'mean': 50000.0, 'pizza_fan': u'no', 'sum': 50000.0 }])
def test_build_chart_data_for_field_on_submission_time(self): data = build_chart_data_for_field(self.xform, '_submission_time') self.assertEqual(data['field_name'], '_submission_time') self.assertEqual(data['field_type'], 'datetime') self.assertEqual(data['data_type'], 'time_based')
def test_build_chart_data_for_field_on_submitted_by(self): data = build_chart_data_for_field(self.xform, '_submitted_by') self.assertEqual(data['field_name'], '_submitted_by') self.assertEqual(data['field_type'], 'text') self.assertEqual(data['data_type'], 'categorized')
def test_build_chart_data_for_field_on_submission_time(self): data = build_chart_data_for_field(self.xform, "_submission_time") self.assertEqual(data["field_name"], "_submission_time") self.assertEqual(data["field_type"], "datetime") self.assertEqual(data["data_type"], "time_based")