Пример #1
0
 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)
Пример #2
0
    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")
Пример #3
0
    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")
Пример #4
0
 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')
Пример #5
0
    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
Пример #6
0
    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
Пример #7
0
    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')
Пример #8
0
    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}]
            }
        ])
Пример #9
0
    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']}]
            }
        ])
Пример #10
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')

        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)
Пример #11
0
    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
        }])
Пример #12
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)
Пример #13
0
 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')
Пример #14
0
    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
            }]
        }])
Пример #15
0
    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)
Пример #16
0
 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')
Пример #17
0
    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)
Пример #18
0
 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")
Пример #19
0
 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')
Пример #20
0
 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")
Пример #21
0
 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')
Пример #22
0
 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')
Пример #23
0
 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})
Пример #24
0
    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)
Пример #25
0
    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)
Пример #26
0
 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))
Пример #27
0
 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))
Пример #28
0
 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')
Пример #29
0
    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')
Пример #30
0
    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')
Пример #32
0
 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)
Пример #33
0
 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
     })
Пример #34
0
    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')
Пример #35
0
 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})
Пример #36
0
 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)
Пример #37
0
    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))
Пример #38
0
    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')
Пример #39
0
 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")
Пример #40
0
    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
        }])
Пример #41
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']
         }]
     }])
Пример #42
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'], 'pizza_fan')
     self.assertEqual(data['data'], [{
         '_submitted_by':
         'bob',
         'items': [{
             'count': 2,
             'pizza_fan': ['No']
         }]
     }])
Пример #43
0
    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
        }])
Пример #44
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
        }])
Пример #45
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)
Пример #46
0
 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']
     }])
Пример #47
0
 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']
     }])
Пример #48
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':
            '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)
Пример #49
0
    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")
Пример #50
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')

        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)
Пример #51
0
    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']
        }])
Пример #52
0
    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
        }])
Пример #53
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')
Пример #54
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')
Пример #55
0
 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')
Пример #56
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")