示例#1
0
def set_object_permissions(sender, instance=None, created=False, **kwargs):
    # seems the super is not called, have to get xform from here
    xform = XForm.objects.get(pk=instance.pk)

    if created:
        from onadata.libs.permissions import OwnerRole

        OwnerRole.add(instance.user, xform)

        if instance.created_by and instance.user != instance.created_by:
            OwnerRole.add(instance.created_by, xform)

        from onadata.libs.utils.project_utils import set_project_perms_to_xform
        set_project_perms_to_xform(xform, instance.project)

    if hasattr(instance, 'has_external_choices') \
            and instance.has_external_choices:
        instance.xls.seek(0)
        f = sheet_to_csv(instance.xls.read(), 'external_choices')
        f.seek(0, os.SEEK_END)
        size = f.tell()
        f.seek(0)

        from onadata.apps.main.models.meta_data import MetaData
        data_file = InMemoryUploadedFile(
            file=f,
            field_name='data_file',
            name='itemsets.csv',
            content_type='text/csv',
            size=size,
            charset=None
        )

        MetaData.media_upload(xform, data_file)
示例#2
0
    def save(self):
        """
        Creates and updates RestService and MetaData objects with textit or
        rapidpro service properties.
        """
        service = RestService() if not self.pk else \
            RestService.objects.get(pk=self.pk)

        service.name = self.name
        service.service_url = self.service_url
        service.xform = self.xform
        try:
            service.save()
        except IntegrityError as e:
            if str(e).startswith("duplicate key value violates unique "
                                 "constraint"):
                msg = _(u"The service already created for this form.")
            else:
                msg = _(str(e))
            raise serializers.ValidationError(msg)

        self.pk = service.pk
        self.date_created = service.date_created
        self.date_modified = service.date_modified

        data_value = '{}|{}|{}'.format(self.auth_token, self.flow_uuid,
                                       self.contacts)

        MetaData.textit(self.xform, data_value=data_value)

        if self.xform.is_merged_dataset:
            for xform in self.xform.mergedxform.xforms.all():
                MetaData.textit(xform, data_value=data_value)
示例#3
0
    def get_enketo_url(self, obj):
        if obj:
            _enketo_url = cache.get('{}{}'.format(ENKETO_URL_CACHE, obj.pk))
            if _enketo_url:
                return _enketo_url

            try:
                metadata = MetaData.objects.get(xform=obj,
                                                data_type="enketo_url")
            except MetaData.DoesNotExist:
                request = self.context.get('request')
                form_url = _get_form_url(request, obj.user.username)
                url = ""

                try:
                    url = enketo_url(form_url, obj.id_string)
                    MetaData.enketo_url(obj, url)
                except (EnketoError, ConnectionError):
                    pass

                cache.set('{}{}'.format(ENKETO_URL_CACHE, obj.pk), url)
                return url

            _enketo_url = metadata.data_value
            cache.set('{}{}'.format(ENKETO_URL_CACHE, obj.pk), _enketo_url)
            return _enketo_url

        return None
示例#4
0
def set_object_permissions(sender, instance=None, created=False, **kwargs):
    # seems the super is not called, have to get xform from here
    xform = XForm.objects.get(pk=instance.pk)

    if created:
        from onadata.libs.permissions import OwnerRole

        OwnerRole.add(instance.user, xform)

        if instance.created_by and instance.user != instance.created_by:
            OwnerRole.add(instance.created_by, xform)

        from onadata.libs.utils.project_utils import set_project_perms_to_xform
        set_project_perms_to_xform(xform, instance.project)

    if hasattr(instance, 'has_external_choices') \
            and instance.has_external_choices:
        instance.xls.seek(0)
        f = sheet_to_csv(instance.xls.read(), 'external_choices')
        f.seek(0, os.SEEK_END)
        size = f.tell()
        f.seek(0)

        from onadata.apps.main.models.meta_data import MetaData
        data_file = InMemoryUploadedFile(file=f,
                                         field_name='data_file',
                                         name='itemsets.csv',
                                         content_type='text/csv',
                                         size=size,
                                         charset=None)

        MetaData.media_upload(xform, data_file)
    def get_enketo_url(self, obj):
        if obj:
            _enketo_url = cache.get(
                '{}{}'.format(ENKETO_URL_CACHE, obj.pk))
            if _enketo_url:
                return _enketo_url

            try:
                metadata = MetaData.objects.get(
                    xform=obj, data_type="enketo_url")
            except MetaData.DoesNotExist:
                request = self.context.get('request')
                form_url = _get_form_url(request, obj.user.username)
                url = ""

                try:
                    url = enketo_url(form_url, obj.id_string)
                    MetaData.enketo_url(obj, url)
                except (EnketoError, ConnectionError):
                    pass

                cache.set('{}{}'.format(ENKETO_URL_CACHE, obj.pk), url)
                return url

            _enketo_url = metadata.data_value
            cache.set('{}{}'.format(ENKETO_URL_CACHE, obj.pk), _enketo_url)
            return _enketo_url

        return None
示例#6
0
    def save(self, **kwargs):

        rs = RestService() if not self.pk else \
            RestService.objects.get(pk=self.pk)

        rs.name = self.name
        rs.service_url = self.service_url
        rs.xform = self.xform
        try:
            rs.save()
        except IntegrityError as e:
            if str(e).startswith("duplicate key value violates unique "
                                 "constraint"):
                msg = _(u"The service already created for this form.")
            else:
                msg = _(str(e))
            raise serializers.ValidationError(msg)

        self.date_created = rs.date_created
        self.date_modified = rs.date_modified

        data_value = '{}|{}|{}'.format(self.auth_token, self.flow_uuid,
                                       self.contacts)

        MetaData.textit(self.xform, data_value=data_value)
        self.pk = rs.pk
示例#7
0
    def handle(self, *args, **options):
        request = HttpRequest()
        server_name = options.get('server_name')
        server_port = options.get('server_port')
        protocol = options.get('protocol')
        generate_consistent_urls = options.get('generate_consistent_urls')

        if not server_name or not server_port or not protocol:
            raise CommandError(
                'please provide a server_name, a server_port and a protocol')

        if server_name not in ['ona.io', 'stage.ona.io', 'localhost']:
            raise CommandError('server name provided is not valid')

        if protocol not in ['http', 'https']:
            raise CommandError('protocol provided is not valid')

        # required for generation of enketo url
        request.META['HTTP_HOST'] = '%s:%s' % (server_name, server_port)\
            if server_port != '80' else server_name

        # required for generation of enketo preview url
        request.META['SERVER_NAME'] = server_name
        request.META['SERVER_PORT'] = server_port

        resultset = MetaData.objects.filter(
            Q(data_type='enketo_url') | Q(data_type='enketo_preview_url'))

        for meta_data in resultset:
            username = meta_data.content_object.user.username
            id_string = meta_data.content_object.id_string

            data_type = meta_data.data_type
            data_value = meta_data.data_value
            xform = meta_data.content_object
            xform_pk = xform.pk

            with open('/tmp/enketo_url', 'a') as f:
                if data_type == 'enketo_url':
                    form_url = get_form_url(
                        request,
                        username=username,
                        id_string=id_string,
                        xform_pk=xform_pk,
                        generate_consistent_urls=generate_consistent_urls)
                    _enketo_url = enketo_url(form_url, id_string)
                    MetaData.enketo_url(xform, _enketo_url)
                elif data_type == 'enketo_preview_url':
                    _enketo_preview_url = get_enketo_preview_url(
                        request,
                        id_string,
                        username=username,
                        xform_pk=xform_pk,
                        generate_consistent_urls=generate_consistent_urls)
                    MetaData.enketo_preview_url(xform, _enketo_preview_url)

                f.write('%s : %s \n' % (id_string, data_value))
            self.stdout.write('%s: %s' % (data_type, meta_data.data_value))

        self.stdout.write("enketo urls update complete!!")
示例#8
0
    def get_enketo_preview_url(self, obj):
        if obj:
            _enketo_preview_url = cache.get('{}{}'.format(
                ENKETO_PREVIEW_URL_CACHE, obj.pk))
            if _enketo_preview_url:
                return _enketo_preview_url

            try:
                metadata = MetaData.objects.get(xform=obj,
                                                data_type="enketo_preview_url")
            except MetaData.DoesNotExist:
                request = self.context.get('request')
                preview_url = ""

                try:
                    preview_url = get_enketo_preview_url(
                        request, obj.user.username, obj.id_string)
                    MetaData.enketo_preview_url(obj, preview_url)
                except EnketoError:
                    pass

                cache.set('{}{}'.format(ENKETO_PREVIEW_URL_CACHE, obj.pk),
                          preview_url)
                return preview_url

            _enketo_preview_url = metadata.data_value
            cache.set('{}{}'.format(ENKETO_URL_CACHE, obj.pk),
                      _enketo_preview_url)
            return _enketo_preview_url

        return None
    def test_update_with_errors(self):
        rest = self._create_textit_service()

        data_value = "{}|{}".format("test", "test2")
        MetaData.textit(self.xform, data_value)

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

        self.assertEquals(response.status_code, 400)
        self.assertEquals(response.data,
                          [u"Error occurred when loading textit service."
                           u"Resolve by updating auth_token, flow_uuid and "
                           u"contacts fields"])

        post_data = {
            "name": "textit",
            "service_url": "https://textit.io",
            "xform": self.xform.pk,
            "auth_token": "sadsdfhsdf",
            "flow_uuid": "sdfskhfskdjhfs",
            "contacts": "ksadaskjdajsda"
        }

        request = self.factory.put('/', data=post_data, **self.extra)
        response = self.view(request, pk=rest.get('id'))

        self.assertEquals(response.status_code, 200)
示例#10
0
    def forms(self, request, **kwargs):
        """Add a form to a project or list forms for the project.

        The request key `xls_file` holds the XLSForm file object.
        """
        project = self.object = self.get_object()
        if request.method.upper() == 'POST':
            survey = utils.publish_project_xform(request, project)

            if isinstance(survey, XForm):
                if 'formid' in request.data:
                    serializer_cls = XFormSerializer
                else:
                    serializer_cls = XFormCreateSerializer

                serializer = serializer_cls(survey,
                                            context={'request': request})

                published_by_formbuilder = request.data.get(
                    'published_by_formbuilder'
                )
                if str_to_bool(published_by_formbuilder):
                    MetaData.published_by_formbuilder(survey, 'True')

                return Response(serializer.data,
                                status=status.HTTP_201_CREATED)

            return Response(survey, status=status.HTTP_400_BAD_REQUEST)

        xforms = XForm.objects.filter(project=project)
        serializer = XFormSerializer(xforms, context={'request': request},
                                     many=True)

        return Response(serializer.data)
示例#11
0
 def test_create_metadata(self):
     count = len(MetaData.objects.filter(xform=self.xform,
                 data_type='enketo_url'))
     enketo_url = "https://dmfrm.enketo.org/webform"
     MetaData.enketo_url(self.xform, enketo_url)
     self.assertEquals(count + 1, len(MetaData.objects.filter(
         xform=self.xform, data_type='enketo_url')))
示例#12
0
    def forms(self, request, **kwargs):
        """Add a form to a project or list forms for the project.

        The request key `xls_file` holds the XLSForm file object.
        """
        project = self.object = self.get_object()
        if request.method.upper() == 'POST':
            survey = utils.publish_project_xform(request, project)

            if isinstance(survey, XForm):
                if 'formid' in request.data:
                    serializer_cls = XFormSerializer
                else:
                    serializer_cls = XFormCreateSerializer

                serializer = serializer_cls(survey,
                                            context={'request': request})

                published_by_formbuilder = request.data.get(
                    'published_by_formbuilder'
                )
                if str_to_bool(published_by_formbuilder):
                    MetaData.published_by_formbuilder(survey, 'True')

                return Response(serializer.data,
                                status=status.HTTP_201_CREATED)

            return Response(survey, status=status.HTTP_400_BAD_REQUEST)

        xforms = XForm.objects.filter(project=project)
        serializer = XFormSerializer(xforms, context={'request': request},
                                     many=True)

        return Response(serializer.data)
示例#13
0
 def test_create_metadata(self):
     count = len(MetaData.objects.filter(object_id=self.xform.id,
                 data_type='enketo_url'))
     enketo_url = "https://dmfrm.enketo.org/webform"
     MetaData.enketo_url(self.xform, enketo_url)
     self.assertEquals(count + 1, len(MetaData.objects.filter(
         object_id=self.xform.id, data_type='enketo_url')))
示例#14
0
    def get_enketo_preview_url(self, obj):
        if obj:
            _enketo_preview_url = cache.get(
                '{}{}'.format(ENKETO_PREVIEW_URL_CACHE, obj.pk))
            if _enketo_preview_url:
                return _enketo_preview_url

            try:
                metadata = MetaData.objects.get(
                    xform=obj, data_type="enketo_preview_url")
            except MetaData.DoesNotExist:
                request = self.context.get('request')
                preview_url = ""

                try:
                    preview_url = get_enketo_preview_url(request,
                                                         obj.user.username,
                                                         obj.id_string)
                    MetaData.enketo_preview_url(obj, preview_url)
                except EnketoError:
                    pass

                cache.set('{}{}'.format(ENKETO_PREVIEW_URL_CACHE, obj.pk),
                          preview_url)
                return preview_url

            _enketo_preview_url = metadata.data_value
            cache.set(
                '{}{}'.format(ENKETO_URL_CACHE, obj.pk), _enketo_preview_url)
            return _enketo_preview_url

        return None
示例#15
0
def _get_server_from_metadata(xform, meta, token):
    # Fetch metadata details from master directly
    try:
        report_templates = MetaData.external_export(xform)
    except MetaData.DoesNotExist:
        from multidb.pinning import use_master
        with use_master:
            report_templates = MetaData.external_export(xform)

    if meta:
        try:
            int(meta)
        except ValueError:
            raise Exception(u"Invalid metadata pk {0}".format(meta))

        # Get the external server from the metadata
        result = report_templates.get(pk=meta)
        server = result.external_export_url
        name = result.external_export_name
    elif token:
        server = token
        name = None
    else:
        # Take the latest value in the metadata
        if not report_templates:
            raise Exception(
                u"Could not find the template token: Please upload template.")

        server = report_templates[0].external_export_url
        name = report_templates[0].external_export_name

    return server, name
示例#16
0
    def test_saving_same_metadata_object_doesnt_trigger_integrity_error(self):
        count = len(MetaData.objects.filter(object_id=self.xform.id,
                    data_type='enketo_url'))
        enketo_url = "https://dmfrm.enketo.org/webform"
        MetaData.enketo_url(self.xform, enketo_url)
        count += 1
        self.assertEquals(count, len(MetaData.objects.filter(
            object_id=self.xform.id, data_type='enketo_url')))

        MetaData.enketo_url(self.xform, enketo_url)
        self.assertEquals(count, len(MetaData.objects.filter(
            object_id=self.xform.id, data_type='enketo_url')))
示例#17
0
    def test_saving_same_metadata_object_doesnt_trigger_integrity_error(self):
        count = len(MetaData.objects.filter(xform=self.xform,
                    data_type='enketo_url'))
        enketo_url = "https://dmfrm.enketo.org/webform"
        MetaData.enketo_url(self.xform, enketo_url)
        count += 1
        self.assertEquals(count, len(MetaData.objects.filter(
            xform=self.xform, data_type='enketo_url')))

        MetaData.enketo_url(self.xform, enketo_url)
        self.assertEquals(count, len(MetaData.objects.filter(
            xform=self.xform, data_type='enketo_url')))
    def test_textit_flow_without_parsed_instances(self, mock_http):
        rest = RestService(name="textit",
                           service_url="https://server.io",
                           xform=self.xform)
        rest.save()

        MetaData.textit(self.xform,
                        data_value='{}|{}|{}'.format("sadsdfhsdf",
                                                     "sdfskhfskdjhfs",
                                                     "ksadaskjdajsda"))
        self.assertFalse(mock_http.called)
        self._make_submissions()
示例#19
0
    def test_upload_to_with_project_and_xform_instance(self):
        models = [Project, XForm]

        for model in models:
            model_instance = model(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))
示例#20
0
    def handle(self, *args, **options):
        request = HttpRequest()
        server_name = options.get('server_name')
        server_port = options.get('server_port')
        protocol = options.get('protocol')

        if not server_name or not server_port or not protocol:
            raise CommandError(
                'please provide a server_name, a server_port and a protocol')

        if server_name not in ['ona.io', 'stage.ona.io', 'localhost']:
            raise CommandError('server name provided is not valid')

        if protocol not in ['http', 'https']:
            raise CommandError('protocol provided is not valid')

        # required for generation of enketo url
        request.META['HTTP_HOST'] = '%s:%s' % (server_name, server_port)\
            if server_port != '80' else server_name

        # required for generation of enketo preview url
        request.META['SERVER_NAME'] = server_name
        request.META['SERVER_PORT'] = server_port

        resultset = MetaData.objects.filter(
            Q(data_type='enketo_url') | Q(data_type='enketo_preview_url'))
        for meta_data in resultset:
            username = meta_data.content_object.user.username
            id_string = meta_data.content_object.id_string
            data_type = meta_data.data_type
            data_value = meta_data.data_value
            xform = meta_data.content_object
            with open('/tmp/enketo_url', 'a') as f:

                if data_type == 'enketo_url':
                    form_url = get_form_url(
                        request, username, protocol=protocol,
                        xform_pk=xform.pk)
                    _enketo_url = enketo_url(form_url, id_string)
                    MetaData.enketo_url(xform, _enketo_url)
                elif data_type == 'enketo_preview_url':
                    _enketo_preview_url = get_enketo_preview_url(
                        request, username, id_string, xform_pk=xform.pk)
                    MetaData.enketo_preview_url(xform, _enketo_preview_url)
                f.write('%s : %s \n' % (id_string, data_value))

            self.stdout.write('%s: %s' % (data_type, meta_data.data_value))

        self.stdout.write("enketo urls update complete!!")
示例#21
0
    def save(self, **kwargs):

        rs = RestService() if not self.pk else \
            RestService.objects.get(pk=self.pk)

        rs.name = self.name
        rs.service_url = self.service_url
        rs.xform = self.xform
        rs.save()

        data_value = '{}|{}|{}'.format(self.auth_token, self.flow_uuid,
                                       self.contacts)

        MetaData.textit(self.xform, data_value=data_value)
        self.pk = rs.pk
示例#22
0
def set_object_permissions(sender, instance=None, created=False, **kwargs):
    """
    Apply the relevant object permissions for the form to all users who should
    have access to it.
    """
    if instance.project:
        # clear cache
        safe_delete('{}{}'.format(PROJ_FORMS_CACHE, instance.project.pk))
        safe_delete('{}{}'.format(PROJ_BASE_FORMS_CACHE, instance.project.pk))

    # seems the super is not called, have to get xform from here
    xform = XForm.objects.get(pk=instance.pk)

    if created:
        from onadata.libs.permissions import OwnerRole

        OwnerRole.add(instance.user, xform)

        if instance.created_by and instance.user != instance.created_by:
            OwnerRole.add(instance.created_by, xform)

        from onadata.libs.utils.project_utils import set_project_perms_to_xform_async  # noqa
        try:
            set_project_perms_to_xform_async.delay(xform.pk,
                                                   instance.project.pk)
        except OperationalError:
            from onadata.libs.utils.project_utils import set_project_perms_to_xform  # noqa
            set_project_perms_to_xform(xform, instance.project)

    if hasattr(instance, 'has_external_choices') \
            and instance.has_external_choices:
        instance.xls.seek(0)
        f = sheet_to_csv(instance.xls.read(), 'external_choices')
        f.seek(0, os.SEEK_END)
        size = f.tell()
        f.seek(0)

        from onadata.apps.main.models.meta_data import MetaData
        data_file = InMemoryUploadedFile(
            file=f,
            field_name='data_file',
            name='itemsets.csv',
            content_type='text/csv',
            size=size,
            charset=None
        )

        MetaData.media_upload(xform, data_file)
示例#23
0
def set_object_permissions(sender, instance=None, created=False, **kwargs):
    """
    Apply the relevant object permissions for the form to all users who should
    have access to it.
    """
    if instance.project:
        # clear cache
        safe_delete('{}{}'.format(PROJ_FORMS_CACHE, instance.project.pk))
        safe_delete('{}{}'.format(PROJ_BASE_FORMS_CACHE, instance.project.pk))

    # seems the super is not called, have to get xform from here
    xform = XForm.objects.get(pk=instance.pk)

    if created:
        from onadata.libs.permissions import OwnerRole

        OwnerRole.add(instance.user, xform)

        if instance.created_by and instance.user != instance.created_by:
            OwnerRole.add(instance.created_by, xform)

        from onadata.libs.utils.project_utils import set_project_perms_to_xform_async  # noqa
        try:
            set_project_perms_to_xform_async.delay(xform.pk,
                                                   instance.project.pk)
        except OperationalError:
            from onadata.libs.utils.project_utils import set_project_perms_to_xform  # noqa
            set_project_perms_to_xform(xform, instance.project)

    if hasattr(instance, 'has_external_choices') \
            and instance.has_external_choices:
        instance.xls.seek(0)
        f = sheet_to_csv(instance.xls.read(), 'external_choices')
        f.seek(0, os.SEEK_END)
        size = f.tell()
        f.seek(0)

        from onadata.apps.main.models.meta_data import MetaData
        data_file = InMemoryUploadedFile(
            file=f,
            field_name='data_file',
            name='itemsets.csv',
            content_type='text/csv',
            size=size,
            charset=None
        )

        MetaData.media_upload(xform, data_file)
示例#24
0
文件: tools.py 项目: onaio/onadata
def update_role_by_meta_xform_perms(xform):
    """
    Updates users role in a xform based on meta permissions set on the form.
    """
    # load meta xform perms
    metadata = MetaData.xform_meta_permission(xform)
    editor_role_list = [EditorRole, EditorMinorRole]
    editor_role = {role.name: role for role in editor_role_list}

    dataentry_role_list = [
        DataEntryMinorRole, DataEntryOnlyRole, DataEntryRole
    ]
    dataentry_role = {role.name: role for role in dataentry_role_list}

    if metadata:
        meta_perms = metadata.data_value.split('|')

        # update roles
        users = get_xform_users(xform)

        for user in users:

            role = users.get(user).get('role')
            if role in editor_role:
                role = ROLES.get(meta_perms[0])
                role.add(user, xform)

            if role in dataentry_role:
                role = ROLES.get(meta_perms[1])
                role.add(user, xform)
示例#25
0
    def test_xform_meta_permission(self):
        view = MetaDataViewSet.as_view({'post': 'create'})

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minor|dataentry',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 201)

        meta = MetaData.xform_meta_permission(self.xform)
        self.assertEqual(meta.data_value, response.data.get('data_value'))

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minors|invalid_role',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 400)
        error = u"Format 'role'|'role' or Invalid role"
        self.assertEqual(response.data, {'non_field_errors': [error]})
示例#26
0
    def save(self, **kwargs):

        rs = RestService() if not self.pk else \
            RestService.objects.get(pk=self.pk)

        rs.name = self.name
        rs.service_url = self.service_url
        rs.xform = self.xform
        rs.save()

        data_value = '{}|{}|{}'.format(self.auth_token,
                                       self.flow_uuid,
                                       self.contacts)

        MetaData.textit(self.xform, data_value=data_value)
        self.pk = rs.pk
示例#27
0
def _get_server_from_metadata(xform, meta, token):
    report_templates = MetaData.external_export(xform)

    if meta:
        try:
            int(meta)
        except ValueError:
            raise Exception(u"Invalid metadata pk {0}".format(meta))

        # Get the external server from the metadata
        result = report_templates.get(pk=meta)
        server = result.external_export_url
        name = result.external_export_name
    elif token:
        server = token
        name = None
    else:
        # Take the latest value in the metadata
        if not report_templates:
            raise Exception(
                u"Could not find the template token: Please upload template.")

        server = report_templates[0].external_export_url
        name = report_templates[0].external_export_name

    return server, name
示例#28
0
    def test_xform_meta_permission(self):
        view = MetaDataViewSet.as_view({'post': 'create'})

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minor|dataentry',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 201)

        meta = MetaData.xform_meta_permission(self.xform)
        self.assertEqual(meta.data_value, response.data.get('data_value'))

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minors|invalid_role',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 400)
        error = u"Format 'role'|'role' or Invalid role"
        self.assertEqual(response.data, {'non_field_errors': [error]})
    def test_textit_flow(self, mock_http):
        rest = RestService(name="textit",
                           service_url="https://server.io",
                           xform=self.xform)
        rest.save()

        MetaData.textit(self.xform,
                        data_value='{}|{}|{}'.format("sadsdfhsdf",
                                                     "sdfskhfskdjhfs",
                                                     "ksadaskjdajsda"))

        self.assertFalse(mock_http.called)
        self._make_submissions()

        self.assertTrue(mock_http.called)
        self.assertEquals(mock_http.call_count, 4)
示例#30
0
def _get_server_from_metadata(xform, meta, token):
    report_templates = MetaData.external_export(xform)

    if meta:
        try:
            int(meta)
        except ValueError:
            raise Exception(u"Invalid metadata pk {0}".format(meta))

        # Get the external server from the metadata
        result = report_templates.get(pk=meta)
        server = result.external_export_url
        name = result.external_export_name
    elif token:
        server = token
        name = None
    else:
        # Take the latest value in the metadata
        if not report_templates:
            raise Exception(
                u"Could not find the template token: Please upload template.")

        server = report_templates[0].external_export_url
        name = report_templates[0].external_export_name

    return server, name
示例#31
0
文件: tools.py 项目: kenhorn/onadata
def update_role_by_meta_xform_perms(xform):
    """
    Updates users role in a xform based on meta permissions set on the form.
    """
    # load meta xform perms
    metadata = MetaData.xform_meta_permission(xform)
    editor_role_list = [EditorRole, EditorMinorRole]
    editor_role = {role.name: role for role in editor_role_list}

    dataentry_role_list = [
        DataEntryMinorRole, DataEntryOnlyRole, DataEntryRole
    ]
    dataentry_role = {role.name: role for role in dataentry_role_list}

    if metadata:
        meta_perms = metadata.data_value.split('|')

        # update roles
        users = get_xform_users(xform)

        for user in users:

            role = users.get(user).get('role')
            if role in editor_role:
                role = ROLES.get(meta_perms[0])
                role.add(user, xform)

            if role in dataentry_role:
                role = ROLES.get(meta_perms[1])
                role.add(user, xform)
示例#32
0
def _create_enketo_url(request, xform):
    """
    Generate enketo url for a form

    :param request:
    :param xform:
    :return: enketo url
    """
    form_url = get_form_url(request, xform.user.username,
                            settings.ENKETO_PROTOCOL)
    url = ""

    try:
        url = enketo_url(form_url, xform.id_string)
        MetaData.enketo_url(xform, url)
    except ConnectionError, e:
        logging.exception("Connection Error: %s" % e.message)
示例#33
0
    def test_upload_to_with_anonymous_user(self):
        instance = Instance(user=self.user, xform=self.xform)
        metadata = MetaData(data_type="media")
        metadata.content_object = instance
        filename = "filename"
        self.assertEquals(upload_to(metadata, filename),
                          "{}/{}/{}".format(self.user.username,
                                            'formid-media',
                                            filename))
        # test instance with anonymous user

        instance_without_user = Instance(xform=self.xform)
        metadata.content_object = instance_without_user
        self.assertEquals(upload_to(metadata, filename),
                          "{}/{}/{}".format(self.xform.user.username,
                                            'formid-media',
                                            filename))
示例#34
0
    def test_upload_to_with_anonymous_user(self):
        instance = Instance(user=self.user, xform=self.xform)
        metadata = MetaData(data_type="media")
        metadata.content_object = instance
        filename = "filename"
        self.assertEquals(upload_to(metadata, filename),
                          "{}/{}/{}".format(self.user.username,
                                            'formid-media',
                                            filename))
        # test instance with anonymous user

        instance_without_user = Instance(xform=self.xform)
        metadata.content_object = instance_without_user
        self.assertEquals(upload_to(metadata, filename),
                          "{}/{}/{}".format(self.xform.user.username,
                                            'formid-media',
                                            filename))
示例#35
0
    def test_create_google_sheet_metadata_object(self):
        count = len(MetaData.objects.filter(object_id=self.xform.id,
                    data_type=GOOGLE_SHEET_DATA_TYPE))
        google_sheets_actions = (
            '{} ABC100| '
            '{} True | '
            '{} 123'
        ).format(GOOGLE_SHEET_ID, UPDATE_OR_DELETE_GOOGLE_SHEET_DATA, USER_ID)
        MetaData.set_google_sheet_details(self.xform, google_sheets_actions)
        # change
        self.assertEquals(count + 1, MetaData.objects.filter(
            object_id=self.xform.id, data_type=GOOGLE_SHEET_DATA_TYPE).count())

        gsheet_details = MetaData.get_google_sheet_details(self.xform.pk)
        self.assertEqual({
            GOOGLE_SHEET_ID: 'ABC100',
            UPDATE_OR_DELETE_GOOGLE_SHEET_DATA: 'True',
            USER_ID: '123'}, gsheet_details)
示例#36
0
    def test_create_google_sheet_metadata_object(self):
        count = len(MetaData.objects.filter(object_id=self.xform.id,
                    data_type=GOOGLE_SHEET_DATA_TYPE))
        google_sheets_actions = (
            '{} ABC100| '
            '{} True | '
            '{} 123'
        ).format(GOOGLE_SHEET_ID, UPDATE_OR_DELETE_GOOGLE_SHEET_DATA, USER_ID)
        MetaData.set_google_sheet_details(self.xform, google_sheets_actions)
        # change
        self.assertEquals(count + 1, MetaData.objects.filter(
            object_id=self.xform.id, data_type=GOOGLE_SHEET_DATA_TYPE).count())

        gsheet_details = MetaData.get_google_sheet_details(self.xform.pk)
        self.assertEqual({
            GOOGLE_SHEET_ID: 'ABC100',
            UPDATE_OR_DELETE_GOOGLE_SHEET_DATA: 'True',
            USER_ID: '123'}, gsheet_details)
示例#37
0
    def retrieve(self):
        meta = MetaData.textit(self.xform)

        try:
            self.auth_token, self.flow_uuid, self.contacts = \
                meta.data_value.split(METADATA_SEPARATOR)
        except ValueError:
            raise serializers.ValidationError(
                _("Error occurred when loading textit service."
                  "Resolve by updating auth_token, flow_uuid and contacts"
                  " fields"))
示例#38
0
    def get_enketo_preview_url(self, obj):
        if obj:
            _enketo_preview_url = cache.get(
                '{}{}'.format(ENKETO_PREVIEW_URL_CACHE, obj.pk))
            if _enketo_preview_url:
                return _enketo_preview_url

            url = self._get_metadata(obj, 'enketo_preview_url')
            if url is None:
                try:
                    url = get_enketo_preview_url(
                        self.context.get('request'), obj.user.username,
                        obj.id_string)
                except:
                    return url
                else:
                    MetaData.enketo_preview_url(obj, url)

            return _set_cache(ENKETO_PREVIEW_URL_CACHE, url, obj)

        return None
示例#39
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))
示例#40
0
    def get_enketo_preview_url(self, obj):
        if obj:
            _enketo_preview_url = cache.get(
                '{}{}'.format(ENKETO_PREVIEW_URL_CACHE, obj.pk))
            if _enketo_preview_url:
                return _enketo_preview_url

            url = self._get_metadata(obj, 'enketo_preview_url')
            if url is None:
                try:
                    url = get_enketo_preview_url(
                        self.context.get('request'), obj.user.username,
                        obj.id_string, xform_pk=obj.pk)
                except Exception:
                    return url
                else:
                    MetaData.enketo_preview_url(obj, url)

            return _set_cache(ENKETO_PREVIEW_URL_CACHE, url, obj)

        return None
示例#41
0
def _create_enketo_url(request, xform):
    """
    Generate enketo url for a form

    :param request:
    :param xform:
    :return: enketo url
    """
    form_url = get_form_url(request, xform.user.username,
                            settings.ENKETO_PROTOCOL, xform_pk=xform.pk)
    url = ""

    try:
        url = enketo_url(form_url, xform.id_string)
        MetaData.enketo_url(xform, url)
    except ConnectionError as e:
        logging.exception("Connection Error: %s" % e)
    except EnketoError as e:
        logging.exception("Enketo Error: %s" % e.message)

    return url
示例#42
0
def _create_enketo_urls(request, xform):
    """
    Generate enketo urls for a form

    :param request:
    :param xform:
    :return: enketo urls
    """
    form_url = get_form_url(request,
                            xform.user.username,
                            settings.ENKETO_PROTOCOL,
                            xform_pk=xform.pk,
                            generate_consistent_urls=True)
    data = {}
    try:
        enketo_urls = get_enketo_urls(form_url, xform.id_string)
        offline_url = enketo_urls.get("offline_url")
        MetaData.enketo_url(xform, offline_url)
        data['offline_url'] = offline_url
        if 'preview_url' in enketo_urls:
            preview_url = enketo_urls.get("preview_url")
            MetaData.enketo_preview_url(xform, preview_url)
            data['preview_url'] = preview_url
        if 'single_url' in enketo_urls:
            single_url = enketo_urls.get("single_url")
            MetaData.enketo_single_submit_url(xform, single_url)
            data['single_url'] = single_url
    except ConnectionError as e:
        logging.exception("Connection Error: %s" % e)
    except EnketoError as e:
        logging.exception("Enketo Error: %s" % e.message)

    return data
示例#43
0
    def save(self):
        """
        Creates and updates RestService and MetaData objects with textit or
        rapidpro service properties.
        """
        service = RestService() if not self.pk else \
            RestService.objects.get(pk=self.pk)

        service.name = self.name
        service.service_url = self.service_url
        service.xform = self.xform
        try:
            service.save()
        except IntegrityError as e:
            if str(e).startswith("duplicate key value violates unique "
                                 "constraint"):
                msg = _(u"The service already created for this form.")
            else:
                msg = _(str(e))
            raise serializers.ValidationError(msg)

        self.pk = service.pk
        self.date_created = service.date_created
        self.date_modified = service.date_modified
        self.active = service.active
        self.inactive_reason = service.inactive_reason

        data_value = '{}|{}|{}'.format(self.auth_token,
                                       self.flow_uuid,
                                       self.contacts)

        MetaData.textit(self.xform, data_value=data_value)

        if self.xform.is_merged_dataset:
            for xform in self.xform.mergedxform.xforms.all():
                MetaData.textit(xform, data_value=data_value)
    def restore_object(self, attrs, instance=None):
        data_type = attrs.get('data_type')
        data_file = attrs.get('data_file')
        xform = attrs.get('xform')
        data_value = data_file.name if data_file else attrs.get('data_value')
        data_file_type = data_file.content_type if data_file else None

        if instance:
            return super(MetaDataSerializer,
                         self).restore_object(attrs, instance)

        return MetaData(data_type=data_type,
                        xform=xform,
                        data_value=data_value,
                        data_file=data_file,
                        data_file_type=data_file_type)
示例#45
0
    def update(self, instance, validated_data):
        data_value = MetaData.textit(instance.xform) or ''
        values = data_value.split(settings.METADATA_SEPARATOR)
        if len(values) < 3:
            values = ['', '', '']
        xform = validated_data.get('xform', instance.xform)
        auth_token = validated_data.get('auth_token', values[0])
        flow_uuid = validated_data.get('flow_uuid', values[1])
        contacts = validated_data.get('contacts', values[2])
        name = validated_data.get('name', instance.name)
        service_url = validated_data.get('service_url', instance.service_url)

        instance = TextItService(xform, service_url, name, auth_token,
                                 flow_uuid, contacts, instance.pk)
        instance.save()

        return instance
示例#46
0
    def update(self, instance, validated_data):
        data_value = MetaData.textit(instance.xform) or ''
        values = data_value.split(settings.METADATA_SEPARATOR)
        if len(values) < 3:
            values = ['', '', '']
        xform = validated_data.get('xform', instance.xform)
        auth_token = validated_data.get('auth_token', values[0])
        flow_uuid = validated_data.get('flow_uuid', values[1])
        contacts = validated_data.get('contacts', values[2])
        name = validated_data.get('name', instance.name)
        service_url = validated_data.get('service_url', instance.service_url)

        instance = TextItService(xform, service_url, name, auth_token,
                                 flow_uuid, contacts, instance.pk)
        instance.save()

        return instance
示例#47
0
    def test_role_update_xform_meta_perms(self):
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        alice_profile = self._create_user_profile(alice_data)

        EditorRole.add(alice_profile.user, self.xform)

        view = MetaDataViewSet.as_view({
            'post': 'create',
            'put': 'update'
        })

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minor|dataentry',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 201)

        self.assertFalse(
            EditorRole.user_has_role(alice_profile.user, self.xform))

        self.assertTrue(
            EditorMinorRole.user_has_role(alice_profile.user, self.xform))

        meta = MetaData.xform_meta_permission(self.xform)

        DataEntryRole.add(alice_profile.user, self.xform)

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor|dataentry-only',
            'xform': self.xform.pk
        }
        request = self.factory.put('/', data, **self.extra)
        response = view(request, pk=meta.pk)

        self.assertEqual(response.status_code, 200)

        self.assertFalse(
            DataEntryRole.user_has_role(alice_profile.user, self.xform))

        self.assertTrue(
            DataEntryOnlyRole.user_has_role(alice_profile.user, self.xform))
    def test_role_update_xform_meta_perms(self):
        alice_data = {'username': '******', 'email': '*****@*****.**'}
        alice_profile = self._create_user_profile(alice_data)

        EditorRole.add(alice_profile.user, self.xform)

        view = MetaDataViewSet.as_view({
            'post': 'create',
            'put': 'update'
        })

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minor|dataentry',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 201)

        self.assertFalse(
            EditorRole.user_has_role(alice_profile.user, self.xform))

        self.assertTrue(
            EditorMinorRole.user_has_role(alice_profile.user, self.xform))

        meta = MetaData.xform_meta_permission(self.xform)

        DataEntryRole.add(alice_profile.user, self.xform)

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor|dataentry-only',
            'xform': self.xform.pk
        }
        request = self.factory.put('/', data, **self.extra)
        response = view(request, pk=meta.pk)

        self.assertEqual(response.status_code, 200)

        self.assertFalse(
            DataEntryRole.user_has_role(alice_profile.user, self.xform))

        self.assertTrue(
            DataEntryOnlyRole.user_has_role(alice_profile.user, self.xform))
示例#49
0
    def test_external_export_list(self):
        kwargs = {'username': self.user.username,
                  'id_string': self.xform.id_string,
                  'export_type': Export.EXTERNAL_EXPORT}
        server = 'http://localhost:8080/xls/23fa4c38c0054748a984ffd89021a295'
        data_value = 'template 1 |{0}'.format(server)
        meta = MetaData.external_export(self.xform, data_value)

        custom_params = {
            'meta': meta.id,
        }
        url = reverse(export_list, kwargs=kwargs)
        count = len(Export.objects.all())
        response = self.client.get(url, custom_params)
        self.assertEqual(response.status_code, 200)
        count1 = len(Export.objects.all())
        self.assertEquals(count + 1, count1)
示例#50
0
    def test_external_export_list(self):
        kwargs = {'username': self.user.username,
                  'id_string': self.xform.id_string,
                  'export_type': Export.EXTERNAL_EXPORT}
        server = 'http://localhost:8080/xls/23fa4c38c0054748a984ffd89021a295'
        data_value = 'template 1 |{0}'.format(server)
        meta = MetaData.external_export(self.xform, data_value)

        custom_params = {
            'meta': meta.id,
        }
        url = reverse(export_list, kwargs=kwargs)
        count = len(Export.objects.all())
        response = self.client.get(url, custom_params)
        self.assertEqual(response.status_code, 200)
        count1 = len(Export.objects.all())
        self.assertEquals(count + 1, count1)
示例#51
0
    def retrieve(self):
        """
        Sets the textit or rapidpro properties from the MetaData object.
        The properties are:
            - auth_token
            - flow_uuid
            - contacts
        """
        data_value = MetaData.textit(self.xform)

        try:
            self.auth_token, self.flow_uuid, self.contacts = \
                data_value.split(METADATA_SEPARATOR)
        except ValueError:
            raise serializers.ValidationError(
                _("Error occurred when loading textit service."
                  "Resolve by updating auth_token, flow_uuid and contacts"
                  " fields"))
示例#52
0
    def restore_object(self, attrs, instance=None):

        if instance:
            meta = MetaData.textit(instance.xform)
            values = meta.data_value.split(settings.METADATA_SEPARATOR)
            if len(values) < 3:
                values = ['', '', '']
            xform = attrs.get('xform', instance.xform)
            auth_token = attrs.get('auth_token', values[0])
            flow_uuid = attrs.get('flow_uuid', values[1])
            contacts = attrs.get('contacts', values[2])
            name = attrs.get('name', instance.name)
            service_url = attrs.get('service_url', instance.service_url)

            return TextItService(xform, service_url, name, auth_token,
                                 flow_uuid, contacts, instance.pk)

        return TextItService(**attrs)
示例#53
0
    def test_xform_meta_perms_duplicates(self):
        view = MetaDataViewSet.as_view({
            'post': 'create',
            'put': 'update'
        })

        ct = ContentType.objects.get_for_model(self.xform)

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minor|dataentry',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 201)

        count = MetaData.objects.filter(data_type=XFORM_META_PERMS,
                                        object_id=self.xform.pk,
                                        content_type=ct.pk).count()

        self.assertEqual(1, count)

        data = {
            'data_type': XFORM_META_PERMS,
            'data_value': 'editor-minor|dataentry-only',
            'xform': self.xform.pk
        }
        request = self.factory.post('/', data, **self.extra)
        response = view(request)

        self.assertEqual(response.status_code, 201)

        count = MetaData.objects.filter(data_type=XFORM_META_PERMS,
                                        object_id=self.xform.pk,
                                        content_type=ct.pk).count()

        self.assertEqual(1, count)

        metadata = MetaData.xform_meta_permission(self.xform)
        self.assertEqual(metadata.data_value, "editor-minor|dataentry-only")
示例#54
0
    def test_create_external_export_url(self):
        self._publish_transportation_form()
        self._submit_transport_instance()
        num_exports = Export.objects.count()

        server = 'http://localhost:8080/xls/23fa4c38c0054748a984ffd89021a295'
        data_value = 'template 1 |{0}'.format(server)
        meta = MetaData.external_export(self.xform, data_value)

        custom_params = {
            'meta': meta.id,
        }
        # create export
        create_export_url = reverse(create_export, kwargs={
            'username': self.user.username,
            'id_string': self.xform.id_string,
            'export_type': Export.EXTERNAL_EXPORT
        })

        response = self.client.post(create_export_url, custom_params)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(Export.objects.count(), num_exports + 1)
示例#55
0
    def retrieve(self):
        meta = MetaData.textit(self.xform)

        self.auth_token, self.flow_uuid, self.contacts = \
            meta.data_value.split(METADATA_SEPARATOR)
 def _add_external_export_metadata(self, content_object):
     MetaData.external_export(content_object,
                              "https://test/external/export")