コード例 #1
0
    def test_get_project_forms(self):
        # create a project with a form
        self._publish_xls_form_to_project()

        project = Project.objects.last()
        form = project.xform_set.last()

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

        serializer = ProjectSerializer(project)
        serializer.context['request'] = request

        self.assertEqual(len(serializer.data['forms']), 1)
        self.assertEqual(serializer.data['forms'][0]['encrypted'], False)
        self.assertEqual(serializer.data['num_datasets'], 1)

        # delete form in project
        form.delete()

        # Check that project has no forms
        self.assertIsNone(project.xform_set.last())
        serializer = ProjectSerializer(project, context={'request': request})
        self.assertEqual(len(serializer.data['forms']), 0)
        self.assertEqual(serializer.data['num_datasets'], 0)
コード例 #2
0
    def test_create_duplicate_projects(self):
        validated_data = {
            'name': u'demo',
            'organization': self.user,
            'metadata': {
                'description': 'Some description',
                'location': 'Naivasha, Kenya',
                'category': 'governance'
            },
            'public': False
        }

        # create first project
        request = MagicMock(user=self.user)
        serializer = ProjectSerializer(context={'request': request})
        project = serializer.create(validated_data)
        self.assertEqual(project.name, u'demo')
        self.assertEqual(project.organization, self.user)

        # create another project with same data
        with self.assertRaises(serializers.ValidationError) as e:
            serializer.create(validated_data)
        self.assertEqual(
            e.exception.detail,
            [u'The fields name, organization must make a unique set.'])
コード例 #3
0
    def _project_create(self, project_data={}, merge=True):
        view = ProjectViewSet.as_view({
            'post': 'create'
        })

        if merge:
            data = {
                'name': u'demo',
                'owner':
                'http://testserver/api/v1/users/%s' % self.user.username,
                'metadata': {'description': 'Some description',
                             'location': 'Naivasha, Kenya',
                             'category': 'governance'},
                'public': False
            }
            data.update(project_data)
        else:
            data = project_data

        request = self.factory.post(
            '/', data=json.dumps(data),
            content_type="application/json", **self.extra)
        response = view(request, owner=self.user.username)
        self.assertEqual(response.status_code, 201)
        self.project = Project.objects.filter(
            name=data['name'], created_by=self.user)[0]
        data['url'] = 'http://testserver/api/v1/projects/%s'\
            % self.project.pk
        self.assertDictContainsSubset(data, response.data)

        request.user = self.user
        self.project_data = ProjectSerializer(
            self.project, context={'request': request}).data
コード例 #4
0
class TestProjectSerializer(TestAbstractViewSet):
    def setUp(self):
        self.serializer = ProjectSerializer()
        self.factory = APIRequestFactory()
        self._login_user_and_profile()

    def test_get_users_none(self):
        perms = self.serializer.get_users(None)
        self.assertEqual(perms, None)

    def test_get_project_forms(self):
        # create a project with a form
        self._publish_xls_form_to_project()

        project = Project.objects.last()
        form = project.xform_set.last()

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

        serializer = ProjectSerializer(project)
        serializer.context['request'] = request

        self.assertEqual(len(serializer.data['forms']), 1)
        self.assertEqual(serializer.data['forms'][0]['encrypted'], False)
        self.assertEqual(serializer.data['num_datasets'], 1)

        # delete form in project
        form.delete()

        # Check that project has no forms
        self.assertIsNone(project.xform_set.last())
        serializer = ProjectSerializer(project, context={'request': request})
        self.assertEqual(len(serializer.data['forms']), 0)
        self.assertEqual(serializer.data['num_datasets'], 0)
コード例 #5
0
    def test_new_project_set_to_cache(self):
        """
        Test that newly created project is set to cache
        """
        data = {
                'name': u'demo',
                'owner':
                'http://testserver/api/v1/users/%s'
                % self.user,
                'metadata': {'description': 'Some description',
                             'location': 'Naivasha, Kenya',
                             'category': 'governance'},
                'public': False
            }
        # clear cache
        cache.delete(safe_key(f'{PROJ_OWNER_CACHE}1'))
        self.assertIsNone(cache.get(safe_key(f'{PROJ_OWNER_CACHE}1')))

        # Create the project
        self._project_create(data)
        self.assertIsNotNone(self.project_data)

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

        serializer = ProjectSerializer(
            self.project, context={'request': request}).data
        self.assertEqual(
             cache.get(f'{PROJ_OWNER_CACHE}{self.project.pk}'), serializer)

        # clear cache
        cache.delete(safe_key(f'{PROJ_OWNER_CACHE}{self.project.pk}'))
コード例 #6
0
class TestProjectSerializer(TransactionTestCase):
    def setUp(self):
        self.serializer = ProjectSerializer()

    def test_get_project_permissions_none(self):
        perms = self.serializer.get_project_permissions(None)
        self.assertEqual(perms, [])
コード例 #7
0
 def test_num_datasets(self):
     self._publish_xls_form_to_project()
     request = self.factory.post('/', data={}, **self.extra)
     request.user = self.user
     self.project_data = ProjectSerializer(
         self.project, context={'request': request}).data
     self.assertEqual(self.project_data['num_datasets'], 1)
コード例 #8
0
    def test_get_starred_projects(self):
        self._project_create()

        # add star as bob
        view = ProjectViewSet.as_view({
            'get': 'star',
            'post': 'star'
        })
        request = self.factory.post('/', **self.extra)
        response = view(request, pk=self.project.pk)

        # get starred projects
        view = ConnectViewSet.as_view({
            'get': 'starred',
        })
        request = self.factory.get('/', **self.extra)
        response = view(request, user=self.user)

        self.assertEqual(response.status_code, 200)
        self.project.refresh_from_db()
        request.user = self.user
        self.project_data = ProjectSerializer(
            self.project, context={'request': request}).data
        del self.project_data['date_modified']
        del response.data[0]['date_modified']
        self.assertEqual(len(response.data), 1)
        self.assertDictEqual(dict(response.data[0]), dict(self.project_data))
コード例 #9
0
class TestProjectSerializer(TransactionTestCase):

    def setUp(self):
        self.serializer = ProjectSerializer()

    def test_get_project_permissions_none(self):
        perms = self.serializer.get_project_permissions(None)
        self.assertEqual(perms, [])
コード例 #10
0
ファイル: test_project_viewset.py プロジェクト: okal/onadata
 def test_last_submission_date(self):
     self._publish_xls_form_to_project()
     self._make_submissions()
     request = self.factory.post('/', data={}, **self.extra)
     self.project_data = ProjectSerializer(
         self.project, context={'request': request}).data
     date_created = self.xform.instances.order_by(
         '-date_created').values_list('date_created', flat=True)[0]
     self.assertEqual(str(self.project_data['last_submission_date']),
                      str(date_created))
コード例 #11
0
    def starred(self, request, *args, **kwargs):
        """Return projects starred for this user."""
        user_profile = self.get_object()
        user = user_profile.user
        projects = user.project_stars.all()
        serializer = ProjectSerializer(projects,
                                       context={'request': request},
                                       many=True)

        return Response(data=serializer.data)
コード例 #12
0
 def retrieve(self, request, *args, **kwargs):
     """ Retrieve single project """
     project_id = kwargs.get('pk')
     project = cache.get(f'{PROJ_OWNER_CACHE}{project_id}')
     if project:
         return Response(project)
     self.object = self.get_object()
     serializer = ProjectSerializer(self.object,
                                    context={'request': request})
     return Response(serializer.data)
コード例 #13
0
ファイル: connect_viewset.py プロジェクト: larryweya/onadata
    def starred(self, request, *args, **kwargs):
        """Return projects starred for this user."""
        user_profile = self.get_object()
        self.headers = merge_dicts(
            self.headers,
            last_modified_header(get_date(user_profile, 'joined')))
        user = user_profile.user
        projects = user.project_set.all()
        serializer = ProjectSerializer(projects,
                                       context={'request': request},
                                       many=True)

        return Response(data=serializer.data)
コード例 #14
0
ファイル: cache_tools.py プロジェクト: babacar/onadata
def reset_project_cache(project, request):
    """
    Clears and sets project cache
    """
    from onadata.libs.serializers.project_serializer import ProjectSerializer

    # Clear all project cache entries
    for prefix in project_cache_prefixes:
        safe_delete(f'{prefix}{project.pk}')

    # Reserialize project and cache value
    # Note: The ProjectSerializer sets all the other cache entries
    project_cache_data = ProjectSerializer(
        project, context={'request': request}).data
    cache.set(f'{PROJ_OWNER_CACHE}{project.pk}', project_cache_data)
コード例 #15
0
    def test_projects_tags(self):
        self._project_create()
        view = ProjectViewSet.as_view({
            'get': 'labels',
            'post': 'labels',
            'delete': 'labels'
        })
        list_view = ProjectViewSet.as_view({
            'get': 'list',
        })
        project_id = self.project.pk
        # no tags
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=project_id)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.data, [])
        # add tag "hello"
        request = self.factory.post('/', data={"tags": "hello"}, **self.extra)
        response = view(request, pk=project_id)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(response.data, [u'hello'])

        # check filter by tag
        request = self.factory.get('/', data={"tags": "hello"}, **self.extra)

        request.user = self.user
        self.project_data = ProjectSerializer(self.project,
                                              context={
                                                  'request': request
                                              }).data
        response = list_view(request, pk=project_id)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [self.project_data])

        request = self.factory.get('/', data={"tags": "goodbye"}, **self.extra)
        response = list_view(request, pk=project_id)
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [])

        # remove tag "hello"
        request = self.factory.delete('/', **self.extra)
        response = view(request, pk=project_id, label='hello')
        self.assertNotEqual(response.get('Last-Modified'), None)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [])
コード例 #16
0
    def test_get_starred_projects(self):
        self._project_create()

        # add star as bob
        view = ProjectViewSet.as_view({'get': 'star', 'post': 'star'})
        request = self.factory.post('/', **self.extra)
        response = view(request, pk=self.project.pk)

        # get starred projects
        view = ConnectViewSet.as_view({
            'get': 'starred',
        })
        request = self.factory.get('/', **self.extra)
        response = view(request, user=self.user)

        self.assertEqual(response.status_code, 200)

        request.user = self.user
        self.project_data = ProjectSerializer(self.project,
                                              context={
                                                  'request': request
                                              }).data
        self.assertEqual(response.data, [self.project_data])
コード例 #17
0
 def setUp(self):
     self.serializer = ProjectSerializer()
     self.factory = APIRequestFactory()
     self._login_user_and_profile()
コード例 #18
0
class TestProjectSerializer(TestAbstractViewSet):

    def setUp(self):
        self.serializer = ProjectSerializer()
        self.factory = APIRequestFactory()
        self._login_user_and_profile()

    def test_get_users_none(self):
        perms = self.serializer.get_users(None)
        self.assertEqual(perms, None)

    def test_get_project_forms(self):
        # create a project with a form
        self._publish_xls_form_to_project()

        project = Project.objects.last()
        form = project.xform_set.last()

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

        serializer = ProjectSerializer(project)
        serializer.context['request'] = request

        self.assertEqual(len(serializer.data['forms']), 1)
        self.assertEqual(serializer.data['forms'][0]['encrypted'], False)
        self.assertEqual(serializer.data['num_datasets'], 1)

        # delete form in project
        form.delete()

        # Check that project has no forms
        self.assertIsNone(project.xform_set.last())
        serializer = ProjectSerializer(project, context={'request': request})
        self.assertEqual(len(serializer.data['forms']), 0)
        self.assertEqual(serializer.data['num_datasets'], 0)

    def test_create_duplicate_projects(self):
        validated_data = {
                'name': u'demo',
                'organization': self.user,
                'metadata': {'description': 'Some description',
                             'location': 'Naivasha, Kenya',
                             'category': 'governance'},
                'public': False
            }

        # create first project
        request = MagicMock(user=self.user)
        serializer = ProjectSerializer(context={'request': request})
        project = serializer.create(validated_data)
        self.assertEqual(project.name, u'demo')
        self.assertEqual(project.organization, self.user)

        # create another project with same data
        with self.assertRaises(serializers.ValidationError) as e:
            serializer.create(validated_data)
        self.assertEqual(
            e.exception.detail,
            [u'The fields name, organization must make a unique set.'])

    def test_new_project_set_to_cache(self):
        """
        Test that newly created project is set to cache
        """
        data = {
                'name': u'demo',
                'owner':
                'http://testserver/api/v1/users/%s'
                % self.user,
                'metadata': {'description': 'Some description',
                             'location': 'Naivasha, Kenya',
                             'category': 'governance'},
                'public': False
            }
        # clear cache
        cache.delete(safe_key(f'{PROJ_OWNER_CACHE}1'))
        self.assertIsNone(cache.get(safe_key(f'{PROJ_OWNER_CACHE}1')))

        # Create the project
        self._project_create(data)
        self.assertIsNotNone(self.project_data)

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

        serializer = ProjectSerializer(
            self.project, context={'request': request}).data
        self.assertEqual(
             cache.get(f'{PROJ_OWNER_CACHE}{self.project.pk}'), serializer)

        # clear cache
        cache.delete(safe_key(f'{PROJ_OWNER_CACHE}{self.project.pk}'))
コード例 #19
0
 def setUp(self):
     self.serializer = ProjectSerializer()
コード例 #20
0
    def test_project_filter_by_owner(self):
        self._project_create()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(alice_data)

        ReadOnlyRole.add(self.user, self.project)

        view = ProjectViewSet.as_view({
            'get': 'retrieve'
        })
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=self.project.pk)
        updated_project_data = response.data

        self._project_create({'name': 'another project'})

        # both bob's and alice's projects
        request = self.factory.get('/', **self.extra)
        response = self.view(request)
        self.assertEqual(response.status_code, 200)
        self.assertIn(updated_project_data, response.data)
        self.assertIn(self.project_data, response.data)

        # only bob's project
        request = self.factory.get('/', {'owner': 'bob'}, **self.extra)
        response = self.view(request)
        self.assertEqual(response.status_code, 200)
        self.assertIn(updated_project_data, response.data)
        self.assertNotIn(self.project_data, response.data)

        # only alice's project
        request = self.factory.get('/', {'owner': 'alice'}, **self.extra)
        response = self.view(request)
        self.assertEqual(response.status_code, 200)
        self.assertNotIn(updated_project_data, response.data)
        self.assertIn(self.project_data, response.data)

        # none existent user
        request = self.factory.get('/', {'owner': 'noone'}, **self.extra)
        response = self.view(request)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, [])

        # authenticated user can view public project
        joe_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(joe_data)

        # should not show private projects when filtered by owner
        request = self.factory.get('/', {'owner': 'alice'}, **self.extra)
        response = self.view(request)
        self.assertEqual(response.status_code, 200)
        self.assertNotIn(updated_project_data, response.data)
        self.assertNotIn(self.project_data, response.data)

        # should show public project when filtered by owner
        self.project.shared = True
        self.project.save()
        request.user = self.user
        self.project_data = ProjectSerializer(
            self.project, context={'request': request}).data

        request = self.factory.get('/', {'owner': 'alice'}, **self.extra)
        response = self.view(request)
        self.assertEqual(response.status_code, 200)
        self.assertIn(self.project_data, response.data)
コード例 #21
0
 def setUp(self):
     self.serializer = ProjectSerializer()