示例#1
0
    def test_dataview_data_filter_date(self):
        data = {
            'name':
            "Transportation Dataview",
            'xform':
            'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns':
            '["name", "gender", "_submission_time"]',
            'query':
            '[{"column":"_submission_time",'
            '"filter":">=","value":"2015-01-01T00:00:00"}]'
        }

        self._create_dataview(data=data)

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)

        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(response.data), 7)
        self.assertIn("_id", response.data[0])
示例#2
0
    def test_csv_export_dataview(self):
        self._create_dataview()
        count = Export.objects.all().count()

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk, format='csv')
        self.assertEqual(response.status_code, 200)

        self.assertEquals(count + 1, Export.objects.all().count())

        headers = dict(response.items())
        self.assertEqual(headers['Content-Type'], 'application/csv')
        content_disposition = headers['Content-Disposition']
        filename = self.filename_from_disposition(content_disposition)
        basename, ext = os.path.splitext(filename)
        self.assertEqual(ext, '.csv')

        content = self.get_response_content(response)
        test_file_path = os.path.join(settings.PROJECT_ROOT, 'apps', 'viewer',
                                      'tests', 'fixtures', 'dataview.csv')
        with open(test_file_path, 'r') as test_file:
            self.assertEqual(content, test_file.read())
示例#3
0
    def test_dataview_data_filter_condition(self):
        data = {
            'name':
            "Transportation Dataview",
            'xform':
            'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns':
            '["name", "gender", "age"]',
            'query':
            '[{"column":"name","filter":"=","value":"Fred",'
            ' "condition":"or"},'
            '{"column":"name","filter":"=","value":"Kameli",'
            ' "condition":"or"},'
            '{"column":"gender","filter":"=","value":"male"}]'
        }

        self._create_dataview(data=data)

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)

        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(response.data), 2)
        self.assertIn("_id", response.data[0])
示例#4
0
    def test_search_dataview_data(self):
        self._create_dataview()

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        data = {"query": "Fred"}
        request = self.factory.get('/', data=data, **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEquals(response.status_code, 200)

        self.assertEqual(1, len(response.data))
        self.assertEqual("Fred", response.data[0].get('name'))

        data = {"query": '{"age": 22}'}
        request = self.factory.get('/', data=data, **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEquals(response.status_code, 200)

        self.assertEqual(1, len(response.data))
        self.assertEqual(22, response.data[0].get('age'))

        data = {"query": '{"age": {"$gte": 30}}'}
        request = self.factory.get('/', data=data, **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEquals(response.status_code, 200)

        self.assertEqual(1, len(response.data))
        self.assertEqual(45, response.data[0].get('age'))
示例#5
0
    def test_get_charts_data_for_grouped_field(self):
        data = {
            'name': "My DataView",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "age", "gender", "a_group/grouped"]',
            'query': '[{"column":"age","filter":">","value":"20"}]'
        }
        self._create_dataview(data)
        self.view = DataViewViewSet.as_view({
            'get': 'charts',
        })

        request = self.factory.get('/charts', **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)
        data = {'field_name': 'grouped'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotEqual(response.get('Cache-Control'), None)
        self.assertEqual(response.data['field_type'], 'select one')
        self.assertEqual(response.data['field_name'], 'grouped')
        self.assertEqual(response.data['data_type'], 'categorized')
        self.assertEqual(len(response.data['data']), 2)
示例#6
0
    def test_get_charts_data_with_empty_query(self):
        data = {
            'name': "My DataView",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "age", "gender"]',
            'query': '[]'
        }
        self._create_dataview(data)
        self.view = DataViewViewSet.as_view({
            'get': 'charts',
        })
        data_view_data = DataView.query_data(self.data_view)

        request = self.factory.get('/charts', **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)
        data = {'field_name': 'age'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotEqual(response.get('Cache-Control'), None)
        self.assertEqual(response.data['field_type'], 'integer')
        self.assertEqual(response.data['field_name'], 'age')
        self.assertEqual(response.data['data_type'], 'numeric')
        self.assertEqual(len(response.data['data']), len(data_view_data))
示例#7
0
    def test_export_csv_dataview_data_async(self, async_result):
        self._create_dataview()
        self._publish_xls_form_to_project()

        view = DataViewViewSet.as_view({
            'get': 'export_async',
        })

        request = self.factory.get('/', data={"format": "csv"}, **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertIsNotNone(response.data)

        self.assertEqual(response.status_code, 202)
        self.assertTrue('job_uuid' in response.data)
        task_id = response.data.get('job_uuid')

        export_pk = Export.objects.all().order_by('pk').reverse()[0].pk

        # metaclass for mocking results
        job = type('AsyncResultMock', (), {
            'state': 'SUCCESS',
            'result': export_pk
        })
        async_result.return_value = job

        get_data = {'job_uuid': task_id}
        request = self.factory.get('/', data=get_data, **self.extra)
        response = view(request, pk=self.data_view.pk)

        self.assertIn('export_url', response.data)

        self.assertTrue(async_result.called)
        self.assertEqual(response.status_code, 202)
        export = Export.objects.get(task_id=task_id)
        self.assertTrue(export.is_successful)
示例#8
0
    def _test_csv_export_with_hxl_support(self, columns, expected_output):
        data = {
            'name': "Hxl example dataview",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': columns,
            'query': '[]'
        }

        self._create_dataview(data=data)

        dataview_pk = DataView.objects.last().pk

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/',
                                   data={
                                       "format": "csv",
                                       "include_hxl": True
                                   },
                                   **self.extra)
        response = view(request, pk=dataview_pk)

        self.assertIsNotNone(response.streaming_content.next(),
                             expected_output)
示例#9
0
    def test_get_charts_data_for_submission_time_field(self):
        self._create_dataview()
        self.view = DataViewViewSet.as_view({
            'get': 'charts',
        })

        data = {'field_name': '_submission_time'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotEqual(response.get('Cache-Control'), None)
        self.assertEqual(response.data['field_type'], 'datetime')
        self.assertEqual(response.data['field_name'], '_submission_time')
        self.assertEqual(response.data['data_type'], 'time_based')

        data = {'field_name': '_submitted_by'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotEqual(response.get('Cache-Control'), None)
        self.assertEqual(response.data['field_type'], 'text')
        self.assertEqual(response.data['field_name'], '_submitted_by')
        self.assertEqual(response.data['data_type'], 'categorized')

        data = {'field_name': '_duration'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotEqual(response.get('Cache-Control'), None)
        self.assertEqual(response.data['field_type'], 'integer')
        self.assertEqual(response.data['field_name'], '_duration')
        self.assertEqual(response.data['data_type'], 'numeric')
示例#10
0
    def test_list_dataview(self):
        self._create_dataview()

        data = {
            'name': "My DataView2",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "age", "gender"]',
            'query': '[{"column":"age","filter":">","value":"20"}]'
        }

        self._create_dataview(data=data)

        view = DataViewViewSet.as_view({
            'get': 'list',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request)

        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(response.data), 2)

        anon_request = request = self.factory.get('/')
        anon_response = view(anon_request)
        self.assertEquals(anon_response.status_code, 401)
示例#11
0
    def test_get_charts_data(self):
        self._create_dataview()
        self.view = DataViewViewSet.as_view({
            'get': 'charts',
        })
        data_view_data = DataView.query_data(self.data_view)

        request = self.factory.get('/charts', **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)
        data = {'field_name': 'age'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotEqual(response.get('Cache-Control'), None)
        self.assertEqual(response.data['field_type'], 'integer')
        self.assertEqual(response.data['field_name'], 'age')
        self.assertEqual(response.data['data_type'], 'numeric')
        self.assertEqual(len(response.data['data']), len(data_view_data))

        data = {'field_xpath': 'age'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotEqual(response.get('Cache-Control'), None)
        self.assertEqual(response.data['field_type'], 'integer')
        self.assertEqual(response.data['field_name'], 'age')
        self.assertEqual(response.data['data_type'], 'numeric')
        self.assertEqual(len(response.data['data']), len(data_view_data))
示例#12
0
    def test_get_charts_data_field_not_in_dataview_columns(self):

        self._create_dataview()
        self.view = DataViewViewSet.as_view({
            'get': 'charts',
        })

        data = {'field_name': 'grouped'}
        request = self.factory.get('/charts', data, **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 404)
示例#13
0
    def test_sort_dataview_data(self):
        self._create_dataview()

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        data = {"sort": '{"age": -1}'}
        request = self.factory.get('/', data=data, **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEquals(response.status_code, 200)
        self.assertTrue(
            self.is_sorted_desc([r.get("age") for r in response.data]))
示例#14
0
    def test_geopoint_dataview(self):
        # Dataview with geolocation column selected.
        # -> instances_with_geopoints= True
        data = {
            'name': "My DataView1",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "age", "gender", "location"]',
            'query': '[{"column":"age","filter":">","value":"20"}]'
        }
        self._create_dataview(data)

        self.assertTrue(self.data_view.instances_with_geopoints)

        # Dataview with geolocation column NOT selected
        # -> instances_with_geopoints= False
        data = {
            'name': "My DataView2",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "age", "gender"]',
            'query': '[{"column":"age","filter":">","value":"20"}]'
        }
        self._create_dataview(data)

        self.assertFalse(self.data_view.instances_with_geopoints)

        request = self.factory.get('/', **self.extra)
        response = self.view(request, pk=self.data_view.pk)

        self.assertEquals(response.status_code, 200)
        self.assertEquals(response.data['dataviewid'], self.data_view.pk)
        self.assertEquals(response.data['name'], 'My DataView2')
        self.assertEquals(response.data['instances_with_geopoints'], False)

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertNotIn("location", response.data[0])
        self.assertNotIn("_geolocation", response.data[0])
示例#15
0
    def test_csvzip_export_dataview(self):
        self._create_dataview()
        count = Export.objects.all().count()

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk, format='csvzip')
        self.assertEqual(response.status_code, 200)

        self.assertEquals(count + 1, Export.objects.all().count())

        request = self.factory.get('/', **self.extra)
        response = view(request, pk='[invalid pk]', format='csvzip')
        self.assertEqual(response.status_code, 404)
示例#16
0
    def test_zip_export_dataview(self):
        media_file = "test-image.png"
        attachment_file_path = os.path.join(settings.PROJECT_ROOT, 'libs',
                                            'tests', "utils", 'fixtures',
                                            media_file)
        submission_file_path = os.path.join(settings.PROJECT_ROOT, 'libs',
                                            'tests', "utils", 'fixtures',
                                            'tutorial', 'instances', 'uuid10',
                                            'submission.xml')

        # make a submission with an attachment
        with open(attachment_file_path) as f:
            self._make_submission(submission_file_path, media_file=f)

        data = {
            'name': "My DataView",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "age", "photo"]',
            'query': '[{"column":"age","filter":"=","value":"90"}]'
        }
        self._create_dataview(data)
        count = Export.objects.all().count()

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(1, len(response.data))

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk, format='zip')
        self.assertEqual(response.status_code, 200)

        self.assertEquals(count + 1, Export.objects.all().count())

        headers = dict(response.items())
        self.assertEqual(headers['Content-Type'], 'application/zip')
        content_disposition = headers['Content-Disposition']
        filename = self.filename_from_disposition(content_disposition)
        basename, ext = os.path.splitext(filename)
        self.assertEqual(ext, '.zip')
示例#17
0
    def test_get_dataview_form_details(self):
        self._create_dataview()

        self.view = DataViewViewSet.as_view({
            'get': 'form_details',
        })
        request = self.factory.get('/', **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEquals(response.status_code, 200)

        response = self.view(request, pk=self.data_view.pk, format='json')
        self.assertEqual(response.status_code, 200)

        self.assertIn("title", response.data)
        self.assertIn("created_by", response.data)
        self.assertIn("id_string", response.data)
        self.assertIn("metadata", response.data)
示例#18
0
    def setUp(self):
        super(self.__class__, self).setUp()
        xlsform_path = os.path.join(settings.PROJECT_ROOT, 'libs', 'tests',
                                    "utils", "fixtures", "tutorial.xls")

        self._publish_xls_form_to_project(xlsform_path=xlsform_path)
        for x in range(1, 9):
            path = os.path.join(settings.PROJECT_ROOT, 'libs', 'tests',
                                "utils", 'fixtures', 'tutorial', 'instances',
                                'uuid{}'.format(x), 'submission.xml')
            self._make_submission(path)
            x += 1

        self.view = DataViewViewSet.as_view({
            'post': 'create',
            'put': 'update',
            'patch': 'partial_update',
            'delete': 'destroy',
            'get': 'retrieve'
        })
示例#19
0
    def _create_dataview(self, data=None, project=None, xform=None):
        view = DataViewViewSet.as_view({'post': 'create'})

        project = project if project else self.project
        xform = xform if xform else self.xform

        if not data:
            data = {
                'name':
                "My DataView",
                'xform':
                'http://testserver/api/v1/forms/%s' % xform.pk,
                'project':
                'http://testserver/api/v1/projects/%s' % project.pk,
                'columns':
                '["name", "age", "gender"]',
                'query':
                '[{"column":"age","filter":">","value":"20"},'
                '{"column":"age","filter":"<","value":"50"}]'
            }

        request = self.factory.post('/', data=data, **self.extra)

        response = view(request)

        self.assertEquals(response.status_code, 201)

        # load the created dataview
        self.data_view = DataView.objects.filter(xform=xform,
                                                 project=project).last()

        self.assertEquals(response.data['name'], data['name'])
        self.assertEquals(response.data['xform'], data['xform'])
        self.assertEquals(response.data['project'], data['project'])
        self.assertEquals(response.data['columns'],
                          json.loads(data['columns']))
        self.assertEquals(response.data['query'],
                          json.loads(data['query']) if 'query' in data else {})
        self.assertEquals(
            response.data['url'],
            'http://testserver/api/v1/dataviews/%s' % self.data_view.pk)
示例#20
0
    def test_get_dataview_form_definition(self):
        self._create_dataview()

        data = {
            "name": "tutorial",
            "title": "tutorial",
            "default_language": "default",
            "id_string": "tutorial",
            "type": "survey",
        }
        self.view = DataViewViewSet.as_view({
            'get': 'form',
        })
        request = self.factory.get('/', **self.extra)
        response = self.view(request, pk=self.data_view.pk)
        self.assertEquals(response.status_code, 200)

        # JSON format
        response = self.view(request, pk=self.data_view.pk, format='json')
        self.assertEqual(response.status_code, 200)
        self.assertDictContainsSubset(data, response.data)
示例#21
0
    def test_dataview_with_attachment_field(self):
        view = DataViewViewSet.as_view({'get': 'data'})
        media_file = "test-image.png"
        attachment_file_path = os.path.join(settings.PROJECT_ROOT, 'libs',
                                            'tests', "utils", 'fixtures',
                                            media_file)
        submission_file_path = os.path.join(settings.PROJECT_ROOT, 'libs',
                                            'tests', "utils", 'fixtures',
                                            'tutorial', 'instances', 'uuid10',
                                            'submission.xml')

        # make a submission with an attachment
        with open(attachment_file_path) as f:
            self._make_submission(submission_file_path, media_file=f)

        data = {
            'name': "My DataView",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            # ensure there's an attachment column(photo) in you dataview
            'columns': '["name", "age", "gender", "photo"]'
        }

        self._create_dataview(data=data)
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)
        for a in response.data:
            # retrieve the instance with attachment
            if a.get('photo') == media_file:
                instance_with_attachment = a

        self.assertTrue(instance_with_attachment)
        attachment_info = instance_with_attachment.get('_attachments')[0]
        self.assertEquals(u'image/png', attachment_info.get(u'mimetype'))
        self.assertEquals(
            u'%s/attachments/%s' % (self.user.username, media_file),
            attachment_info.get(u'filename'))
        self.assertEquals(response.status_code, 200)
示例#22
0
    def _create_dataview(self, data=None, project=None, xform=None):
        view = DataViewViewSet.as_view({
            'post': 'create'
        })

        project = project if project else self.project
        xform = xform if xform else self.xform

        if not data:
            data = {
                'name': "My DataView",
                'xform': 'http://testserver/api/v1/forms/%s' % xform.pk,
                'project': 'http://testserver/api/v1/projects/%s' % project.pk,
                'columns': '["name", "age", "gender"]',
                'query': '[{"column":"age","filter":">","value":"20"},'
                         '{"column":"age","filter":"<","value":"50"}]'
            }

        request = self.factory.post('/', data=data, **self.extra)

        response = view(request)

        self.assertEquals(response.status_code, 201)

        # load the created dataview
        self.data_view = DataView.objects.filter(xform=xform,
                                                 project=project).last()

        self.assertEquals(response.data['name'], data['name'])
        self.assertEquals(response.data['xform'], data['xform'])
        self.assertEquals(response.data['project'], data['project'])
        self.assertEquals(response.data['columns'],
                          json.loads(data['columns']))
        self.assertEquals(response.data['query'],
                          json.loads(data['query']) if 'query' in data else {})
        self.assertEquals(response.data['url'],
                          'http://testserver/api/v1/dataviews/%s'
                          % self.data_view.pk)
示例#23
0
    def test_dataview_query_not_required(self):
        data = {
            'name': "Transportation Dataview",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["age"]',
        }

        self._create_dataview(data=data)

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)

        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(response.data), 8)

        self.assertIn("_id", response.data[0])
        self.assertIn(EDITED, response.data[0])
示例#24
0
    def test_dataview_create_data_filter_invalid_date(self):
        invalid_query = '[{"column":"_submission_time",' \
                        '"filter":">","value":"30/06/2015"}]'
        data = {
            'name': "Transportation Dataview",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "gender", "_submission_time"]',
            'query': invalid_query
        }

        view = DataViewViewSet.as_view({
            'get': 'data',
            'post': 'create',
            'patch': 'partial_update'
        })

        request = self.factory.post('/', data=data, **self.extra)
        response = view(request)

        # Confirm you cannot create an invalid dataview
        self.assertEquals(response.status_code, 400)
示例#25
0
    def test_geopoint_submission_dataview(self):
        data = {
            'name': "My DataView3",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["name", "age", "gender", "location"]',
            'query': '[{"column":"age","filter":">=","value":"87"}]'
        }
        self._create_dataview(data)

        self.assertTrue(self.data_view.instances_with_geopoints)

        # make submission with geopoint
        path = os.path.join(settings.PROJECT_ROOT, 'libs', 'tests', "utils",
                            'fixtures', 'tutorial', 'instances',
                            'uuid{}'.format(9), 'submission.xml')
        self._make_submission(path)

        request = self.factory.get('/', **self.extra)
        response = self.view(request, pk=self.data_view.pk)

        self.assertEquals(response.status_code, 200)
        self.assertEquals(response.data['dataviewid'], self.data_view.pk)
        self.assertEquals(response.data['name'], 'My DataView3')
        self.assertEquals(response.data['instances_with_geopoints'], True)

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)

        self.assertIn("location", response.data[0])
        self.assertIn("_geolocation", response.data[0])
    def test_filtered_dataset(self):
        """
        Test a filtered datasets created on a merged xform returns data from
        the linked forms.
        """
        merged_dataset = self._create_merged_dataset()
        xform = XForm.objects.get(pk=merged_dataset['id'])
        _make_submissions_merged_datasets(xform.mergedxform)
        self.assertTrue(xform.is_merged_dataset)
        data = {
            'name': "My DataView",
            'xform': 'http://testserver/api/v1/forms/%s' % xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % xform.project.pk,
            # ensure there's an attachment column(photo) in you dataview
            'columns': '["fruit"]'
        }
        view = DataViewViewSet.as_view({'get': 'data'})

        self._create_dataview(data=data, project=xform.project, xform=xform)
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 2)
示例#27
0
    def test_export_dataview_not_affected_by_normal_exports(self):
        count = Export.objects.all().count()

        view = XFormViewSet.as_view({
            'get': 'retrieve',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.xform.pk, format='csv')
        self.assertEqual(response.status_code, 200)

        self.assertEquals(count + 1, Export.objects.all().count())

        self._create_dataview()

        view = DataViewViewSet.as_view({
            'get': 'data',
        })

        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk, format='csv')
        self.assertEqual(response.status_code, 200)

        self.assertEquals(count + 2, Export.objects.all().count())

        headers = dict(response.items())
        self.assertEqual(headers['Content-Type'], 'application/csv')
        content_disposition = headers['Content-Disposition']
        filename = self.filename_from_disposition(content_disposition)
        basename, ext = os.path.splitext(filename)
        self.assertEqual(ext, '.csv')

        content = self.get_response_content(response)

        # count csv headers and ensure they are three
        self.assertEqual(len(content.split('\n')[0].split(',')), 3)
示例#28
0
    def test_filtered_dataset(self):
        """
        Test a filtered datasets created on a merged xform returns data from
        the linked forms.
        """
        merged_dataset = self._create_merged_dataset()
        xform = XForm.objects.get(pk=merged_dataset['id'])
        _make_submissions_merged_datasets(xform.mergedxform)
        self.assertTrue(xform.is_merged_dataset)
        data = {
            'name': "My DataView",
            'xform': 'http://testserver/api/v1/forms/%s' % xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % xform.project.pk,
            # ensure there's an attachment column(photo) in you dataview
            'columns': '["fruit"]'
        }
        view = DataViewViewSet.as_view({'get': 'data'})

        self._create_dataview(data=data, project=xform.project, xform=xform)
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(response.data), 2)
示例#29
0
    def test_dataview_notes_added_to_data(self):
        # Create note
        view = NoteViewSet.as_view({'post': 'create'})
        comment = u"Dataview note"
        note = {'note': comment}
        data_id = self.xform.instances.all().order_by('pk')[0].pk
        note['instance'] = data_id
        request = self.factory.post('/', data=note, **self.extra)
        self.assertTrue(self.xform.instances.count())
        response = view(request)
        self.assertEqual(response.status_code, 201)

        # Get dataview with added notes
        data = {
            'name': "My Dataview",
            'xform': 'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns': '["age"]',
        }
        self._create_dataview(data=data)
        view = DataViewViewSet.as_view({'get': 'data'})
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.data_view.pk)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(len(response.data), 8)
        data_with_notes = \
            (d for d in response.data if d["_id"] == data_id).next()
        self.assertIn("_notes", data_with_notes)
        self.assertEquals([{
            'created_by': self.user.id,
            'id': 1,
            'instance_field': None,
            'note': comment,
            'owner': self.user.username
        }], data_with_notes["_notes"])
示例#30
0
    def test_invalid_date_filter(self):
        view = DataViewViewSet.as_view({
            'get': 'retrieve',
            'post': 'create',
        })
        data = {
            'name':
            "My DataView",
            'xform':
            'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns':
            '["name", "age", "gender"]',
            'query':
            '[{"column":"_submission_time","filter":">",'
            '"value":"26-01-2016"}]'
        }

        request = self.factory.post('/', data=data, **self.extra)

        response = view(request)

        self.assertEquals(response.status_code, 400)
        self.assertEquals(
            response.data, {
                u'non_field_errors': [
                    u'Date value in _submission_time should be'
                    u' yyyy-mm-ddThh:m:s or yyyy-mm-dd'
                ]
            })

        data = {
            'name':
            "My DataView",
            'xform':
            'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns':
            '["name", "age", "gender"]',
            'query':
            '[{"column":"_submission_time","filter":">",'
            '"value":"26/01/2016"}]'
        }

        request = self.factory.post('/', data=data, **self.extra)

        response = view(request)

        self.assertEquals(response.status_code, 400)
        self.assertEquals(
            response.data, {
                u'non_field_errors': [
                    u'Date value in _submission_time should be'
                    u' yyyy-mm-ddThh:m:s or yyyy-mm-dd'
                ]
            })

        data = {
            'name':
            "My DataView",
            'xform':
            'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns':
            '["name", "age", "gender"]',
            'query':
            '[{"column":"_submission_time","filter":">",'
            '"value":"2016-01-16T00:00:00"}]'
        }

        request = self.factory.post('/', data=data, **self.extra)

        response = view(request)

        self.assertEquals(response.status_code, 201)

        data = {
            'name':
            "My DataView2",
            'xform':
            'http://testserver/api/v1/forms/%s' % self.xform.pk,
            'project':
            'http://testserver/api/v1/projects/%s' % self.project.pk,
            'columns':
            '["name", "age", "gender"]',
            'query':
            '[{"column":"_submission_time","filter":">",'
            '"value":"2016-01-16"}]'
        }

        request = self.factory.post('/', data=data, **self.extra)

        response = view(request)

        self.assertEquals(response.status_code, 201)