예제 #1
0
    def restore_object(self, attrs, instance=None):
        if instance:
            metadata = JsonField.to_json(attrs.get('metadata'))
            owner = attrs.get('organization')

            if self.partial and metadata:
                if not isinstance(instance.metadata, dict):
                    instance.metadata = {}

                instance.metadata.update(metadata)
                attrs['metadata'] = instance.metadata

            if self.partial and owner:
                # give the new owner permissions
                set_owners_permission(owner, instance)

                # clear cache
                safe_delete('{}{}'.format(PROJ_PERM_CACHE, self.object.pk))

            return super(ProjectSerializer,
                         self).restore_object(attrs, instance)

        if 'request' in self.context:
            created_by = self.context['request'].user

            return Project(
                name=attrs.get('name'),
                organization=attrs.get('organization'),
                created_by=created_by,
                metadata=attrs.get('metadata'),
            )

        return attrs
예제 #2
0
    def test_publish_to_public_project_public_form(self):
        public_project = Project(name='demo',
                                 shared=True,
                                 metadata=json.dumps({'description': ''}),
                                 created_by=self.user,
                                 organization=self.user)
        public_project.save()

        self.project = public_project

        data = {
            'owner': 'http://testserver/api/v1/users/%s'
            % self.project.organization.username,
            'public': True,
            'public_data': True,
            'description': u'transportation_2011_07_25',
            'downloadable': True,
            'allows_sms': False,
            'encrypted': False,
            'sms_id_string': u'transportation_2011_07_25',
            'id_string': u'transportation_2011_07_25',
            'title': u'transportation_2011_07_25',
            'bamboo_dataset': u''
        }
        self._publish_xls_form_to_project(publish_data=data, merge=False)

        self.assertEquals(self.xform.shared, True)
        self.assertEquals(self.xform.shared_data, True)
예제 #3
0
    def test_set_project_perms_to_xform(self):
        """
        Test set_project_perms_to_xform(xform, project)
        """
        self._publish_transportation_form()
        # Alice has data entry role to default project
        alice = self._create_user('alice', 'alice', create_profile=True)
        DataEntryRole.add(alice, self.project)
        set_project_perms_to_xform(self.xform, self.project)
        self.assertTrue(DataEntryRole.user_has_role(alice, self.xform))
        self.assertTrue(self.project.pk, self.xform.project_id)

        # Create other project and transfer xform to new project
        project_b = Project(name='Project B',
                            created_by=self.user,
                            organization=self.user)
        project_b.save()
        self.xform.project = project_b
        self.xform.save()
        self.xform.refresh_from_db()
        self.assertTrue(self.project.pk, self.xform.project_id)

        # set permissions for new project
        set_project_perms_to_xform(self.xform, project_b)

        # Alice should have no data entry role to transfered form
        self.assertFalse(DataEntryRole.user_has_role(alice, self.xform))
예제 #4
0
    def restore_object(self, attrs, instance=None):
        if instance:
            metadata = JsonField.to_json(attrs.get('metadata'))

            if self.partial and metadata:
                if not isinstance(instance.metadata, dict):
                    instance.metadata = {}

                instance.metadata.update(metadata)
                attrs['metadata'] = instance.metadata

            return super(ProjectSerializer,
                         self).restore_object(attrs, instance)

        if 'request' in self.context:
            created_by = self.context['request'].user

            return Project(
                name=attrs.get('name'),
                organization=attrs.get('organization'),
                created_by=created_by,
                metadata=attrs.get('metadata'),
            )

        return attrs
예제 #5
0
    def test_publish_to_public_project(self):
        public_project = Project(name='demo',
                                 shared=True,
                                 metadata=json.dumps({'description': ''}),
                                 created_by=self.user,
                                 organization=self.user)
        public_project.save()

        self.project = public_project
        self._publish_xls_form_to_project(public=True)

        self.assertEquals(self.xform.shared, True)
        self.assertEquals(self.xform.shared_data, True)
예제 #6
0
    def test_user_can_view_public_projects(self):
        public_project = Project(name='demo',
                                 shared=True,
                                 metadata=json.dumps({'description': ''}),
                                 created_by=self.user,
                                 organization=self.user)
        public_project.save()
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        self._login_user_and_profile(alice_data)

        view = ProjectViewSet.as_view({'get': 'retrieve'})
        request = self.factory.get('/', **self.extra)
        response = view(request, pk=public_project.pk)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data['public'], True)
        self.assertEqual(response.data['projectid'], public_project.pk)
        self.assertEqual(response.data['name'], 'demo')
예제 #7
0
    def test_public_form_private_project(self):
        self.project = Project(name='demo', shared=False,
                               metadata=json.dumps({'description': ''}),
                               created_by=self.user, organization=self.user)
        self.project.save()
        self._publish_xls_form_to_project()

        self.assertFalse(self.xform.shared)
        self.assertFalse(self.xform.shared_data)
        self.assertFalse(self.project.shared)

        # when xform.shared is true, project settings does not override
        self.xform.shared = True
        self.xform.save()
        self.project.save()
        self.xform.reload()
        self.project.reload()
        self.assertTrue(self.xform.shared)
        self.assertFalse(self.xform.shared_data)
        self.assertFalse(self.project.shared)

        # when xform.shared_data is true, project settings does not override
        self.xform.shared = False
        self.xform.shared_data = True
        self.xform.save()
        self.project.save()
        self.xform.reload()
        self.project.reload()
        self.assertFalse(self.xform.shared)
        self.assertTrue(self.xform.shared_data)
        self.assertFalse(self.project.shared)

        # when xform.shared is true, submissions are made,
        # project settings does not override
        self.xform.shared = True
        self.xform.shared_data = False
        self.xform.save()
        self.project.save()
        self._make_submissions()
        self.xform.reload()
        self.project.reload()
        self.assertTrue(self.xform.shared)
        self.assertFalse(self.xform.shared_data)
        self.assertFalse(self.project.shared)
예제 #8
0
    def test_upload_to_with_project_and_xform_instance(self):
        model_instance = Project(created_by=self.user)
        metadata = MetaData(data_type="media")
        metadata.content_object = model_instance

        filename = "filename"

        self.assertEquals(upload_to(metadata, filename),
                          "{}/{}/{}".format(self.user.username,
                                            'formid-media',
                                            filename))
        model_instance = XForm(user=self.user, created_by=self.user)
        metadata = MetaData(data_type="media")
        metadata.content_object = model_instance

        filename = "filename"

        self.assertEquals(upload_to(metadata, filename),
                          "{}/{}/{}".format(self.user.username,
                                            'formid-media',
                                            filename))