def test_deserializer(self):
        """ """
        body = {
            '@type': 'TestToken',
            'title': 'Test Organization xxx',
        }
        with open(os.path.join(FHIR_FIXTURE_PATH, 'Organization.json'), 'r') as f:
            body['resource'] = json.load(f)

        request = TestRequest(BODY=json.dumps(body))
        obj = create(self.portal, body['@type'], id_=None, title=body['title'])

        deserializer = queryMultiAdapter((obj, request), IDeserializeFromJson)
        assert deserializer is not None

        deserializer(validate_all=True)
        rename(obj)

        self.assertTrue(IJSONValue.providedBy(obj.resource))

        # Test error handling
        body['resource'] = 'hello error'
        request = TestRequest(BODY=json.dumps(body))
        obj = create(self.portal, body['@type'], id_=None, title=body['title'])

        deserializer = queryMultiAdapter((obj, request), IDeserializeFromJson)
        try:
            deserializer(validate_all=True)
            raise AssertionError('Code should not come here! Because invalid fhir json data is provided!')
        except Invalid:
            pass
Ejemplo n.º 2
0
    def reply(self):
        data = json_body(self.request)

        type_ = data.get('@type', None)
        id_ = data.get('id', None)
        title = data.get('title', None)

        if not type_:
            raise BadRequest("Property '@type' is required")

        # Disable CSRF protection
        if 'IDisableCSRFProtection' in dir(plone.protect.interfaces):
            alsoProvides(self.request,
                         plone.protect.interfaces.IDisableCSRFProtection)

        obj = create(self.context, type_, id_=id_, title=title)
        if isinstance(obj, dict) and 'error' in obj:
            self.request.response.setStatus(400)
            return obj

        # Update fields
        deserializer = queryMultiAdapter((obj, self.request),
                                         IDeserializeFromJson)
        if deserializer is None:
            self.request.response.setStatus(501)
            return dict(error=dict(
                message='Cannot deserialize type {}'.format(obj.portal_type)))

        try:
            deserializer(validate_all=True)
        except DeserializationError as e:
            self.request.response.setStatus(400)
            return dict(
                error=dict(type='DeserializationError', message=str(e)))

        # Rename if generated id
        if not id_:
            rename(obj)

        self.request.response.setStatus(201)
        self.request.response.setHeader('Location', obj.absolute_url())

        serializer = queryMultiAdapter((obj, self.request), ISerializeToJson)

        serialized_obj = serializer()

        # HypermediaBatch can't determine the correct canonical URL for
        # objects that have just been created via POST - so we make sure
        # to set it here
        serialized_obj['@id'] = obj.absolute_url()

        return serialized_obj
Ejemplo n.º 3
0
    def destination(self):
        """Return the destination for scanned documents."""
        portal = api.portal.get()
        destination = self.request.form.get('destination', 'inbox')
        org_unit = self.request.form.get('org_unit')

        if destination == 'inbox':
            # Find inbox for the given org_unit
            inbox_container = portal.listFolderContents(
                contentFilter={'portal_type': 'opengever.inbox.container'})
            if inbox_container:
                inboxes = inbox_container[0].listFolderContents(
                    contentFilter={'portal_type': 'opengever.inbox.inbox'})
                for inbox in inboxes:
                    inbox_ou = inbox.get_responsible_org_unit()
                    if (inbox_ou.unit_id == org_unit
                            or inbox_ou.title == org_unit):
                        return inbox
            else:
                inboxes = portal.listFolderContents(
                    contentFilter={'portal_type': 'opengever.inbox.inbox'})
                if inboxes:
                    return inboxes[0]

        elif destination == 'private':
            # Try to find a dossier with title 'Scaneingang'
            mtool = api.portal.get_tool(name='portal_membership')
            private_folder = mtool.getHomeFolder()
            if private_folder is None:
                return
            catalog = api.portal.get_tool(name='portal_catalog')
            dossiers = catalog(
                portal_type='opengever.private.dossier',
                path={
                    'query': '/'.join(private_folder.getPhysicalPath()),
                    'depth': -1
                },
                sortable_title='scaneingang',  # Exact match
            )
            if dossiers:
                return dossiers[0].getObject()

            # No dossier found, create a new one
            obj = create(private_folder,
                         'opengever.private.dossier',
                         title='Scaneingang')
            rename(obj)
            return obj
Ejemplo n.º 4
0
    def add_item(self):
        """ """
        body = {
            '@type': 'TestToken',
            'title': 'Test Organization xxx',
        }
        with open(os.path.join(FHIR_FIXTURE_PATH, 'Organization.json'), 'r') as f:
            body['resource'] = json.load(f)

        request = TestRequest(BODY=json.dumps(body))
        obj = create(self.portal, body['@type'], id_=None, title=body['title'])

        deserializer = queryMultiAdapter((obj, request), IDeserializeFromJson)
        assert deserializer is not None
        deserializer(validate_all=True)
        rename(obj)

        return obj
Ejemplo n.º 5
0
    def destination(self):
        """Return the destination for scanned documents."""
        destination = self.request.form.get('destination', 'inbox')

        if destination == 'inbox':
            inbox = self.find_inbox()
            if api.user.has_permission('opengever.inbox: Scan In', obj=inbox):
                return inbox
            return self.error(
                status=403,
                type_='Forbidden',
                message='The user does not have the required permissions to perform a scan-in via the API.',
                )

        elif destination == 'private':
            # Try to find a dossier with title 'Scaneingang'
            mtool = api.portal.get_tool(name='portal_membership')
            private_folder = mtool.getHomeFolder()
            if private_folder:
                catalog = api.portal.get_tool(name='portal_catalog')
                dossiers = catalog(
                    portal_type='opengever.private.dossier',
                    path={'query': '/'.join(private_folder.getPhysicalPath()),
                          'depth': -1},
                    sortable_title='scaneingang',  # Exact match
                )
                if dossiers:
                    return dossiers[0].getObject()

                # No dossier found, create a new one
                obj = create(
                    private_folder,
                    'opengever.private.dossier',
                    title='Scaneingang')
                rename(obj)
                return obj

        return self.error(
            status=404,
            type_='NotFound',
            message='The scan-in destination does not exist.',
            )
Ejemplo n.º 6
0
    def reply(self):

        tus_upload = self.tus_upload()
        if tus_upload is None:
            return self.error('Not Found', '', 404)

        metadata = tus_upload.metadata()
        self.check_add_modify_permission(metadata.get('mode', 'create'))

        if not self.check_tus_version():
            return self.unsupported_version()

        content_type = self.request.getHeader('Content-Type')
        if content_type != 'application/offset+octet-stream':
            return self.error('Bad Request',
                              'Missing or invalid Content-Type header')

        offset = self.request.getHeader('Upload-Offset', '')
        try:
            offset = int(offset)
        except ValueError:
            return self.error('Bad Request',
                              'Missing or invalid Upload-Offset header')

        tus_upload.write(self.request._file, offset)

        if tus_upload.finished:
            offset = tus_upload.offset()
            filename = metadata.get('filename', '')
            content_type = metadata.get('content-type',
                                        'application/octet-stream')
            mode = metadata.get('mode', 'create')
            fieldname = metadata.get('fieldname')

            if mode == 'create':
                type_ = metadata.get('@type')
                if type_ is None:
                    ctr = getToolByName(self.context, 'content_type_registry')
                    type_ = ctr.findTypeName(filename.lower(), content_type,
                                             '') or 'File'

                obj = create(self.context, type_)
                notify(ObjectCreatedEvent(obj))
                obj = add(self.context, obj)
            else:
                obj = self.context

            if not fieldname:
                info = IPrimaryFieldInfo(obj, None)
                if info is not None:
                    fieldname = info.fieldname
                elif base_hasattr(obj, 'getPrimaryField'):
                    field = obj.getPrimaryField()
                    fieldname = field.getName()

            if not fieldname:
                return self.error('Bad Request', 'Fieldname required', 400)

            # Update field with file data
            deserializer = queryMultiAdapter((obj, self.request),
                                             IDeserializeFromJson)
            if deserializer is None:
                return self.error(
                    'Not Implemented',
                    'Cannot deserialize type {}'.format(obj.portal_type), 501)
            try:
                deserializer(data={fieldname: tus_upload})
            except DeserializationError as e:
                return self.error('Deserialization Error', str(e), 400)

            if mode == 'create':
                rename(obj)

            tus_upload.close()
            tus_upload.cleanup()
            self.request.response.setHeader('Location', obj.absolute_url())
        else:
            offset = tus_upload.offset()
            self.request.response.setHeader('Upload-Expires',
                                            tus_upload.expires())

        self.request.response.setHeader('Tus-Resumable', '1.0.0')
        self.request.response.setHeader('Upload-Offset', '{}'.format(offset))
        self.request.response.setStatus(204, lock=1)
        return super(UploadPatch, self).reply()
Ejemplo n.º 7
0
 def test_rename_content(self):
     rename(self.obj)
     self.assertEqual(self.obj.getId(), 'my-document')
Ejemplo n.º 8
0
    def reply(self):
        data = json_body(self.request)

        type_ = data.get('@type', None)
        id_ = data.get('id', None)
        title = data.get('title', None)

        if not type_:
            raise BadRequest("Property '@type' is required")

        # Disable CSRF protection
        if 'IDisableCSRFProtection' in dir(plone.protect.interfaces):
            alsoProvides(self.request,
                         plone.protect.interfaces.IDisableCSRFProtection)

        try:
            obj = create(self.context, type_, id_=id_, title=title)
        except Unauthorized as exc:
            self.request.response.setStatus(403)
            return dict(error=dict(
                type='Forbidden',
                message=exc.message))
        except BadRequest as exc:
            self.request.response.setStatus(400)
            return dict(error=dict(
                type='Bad Request',
                message=exc.message))

        # Acquisition wrap temporarily to satisfy things like vocabularies
        # depending on tools
        temporarily_wrapped = False
        if IAcquirer.providedBy(obj) and not safe_hasattr(obj, 'aq_base'):
            obj = obj.__of__(self.context)
            temporarily_wrapped = True

        # Update fields
        deserializer = queryMultiAdapter((obj, self.request),
                                         IDeserializeFromJson)
        if deserializer is None:
            self.request.response.setStatus(501)
            return dict(error=dict(
                message='Cannot deserialize type {}'.format(obj.portal_type)))

        try:
            deserializer(validate_all=True, create=True)
        except DeserializationError as e:
            self.request.response.setStatus(400)
            return dict(error=dict(
                type='DeserializationError',
                message=str(e)))

        if temporarily_wrapped:
            obj = aq_base(obj)

        if not IBaseObject.providedBy(obj):
            notify(ObjectCreatedEvent(obj))

        obj = add(self.context, obj)

        # Rename if generated id
        if not id_:
            rename(obj)

        self.request.response.setStatus(201)
        self.request.response.setHeader('Location', obj.absolute_url())

        serializer = queryMultiAdapter(
            (obj, self.request),
            ISerializeToJson
        )

        serialized_obj = serializer()

        # HypermediaBatch can't determine the correct canonical URL for
        # objects that have just been created via POST - so we make sure
        # to set it here
        serialized_obj['@id'] = obj.absolute_url()

        return serialized_obj
Ejemplo n.º 9
0
    def reply(self):
        data = json_body(self.request)

        type_ = data.get('@type', 'SchemaFormData')
        id_ = data.get('id', None)
        title = data.get(
            'title',
            'Data at %s' % datetime.datetime.now().strftime('%Y-%m-%d %H%M%S'))
        # import pdb;pdb.set_trace()
        schema_form_data = data.get('schema_form_data', {})

        if not type_:
            raise BadRequest("Property '@type' is required")

        # Disable CSRF protection
        if 'IDisableCSRFProtection' in dir(plone.protect.interfaces):
            alsoProvides(self.request,
                         plone.protect.interfaces.IDisableCSRFProtection)

        obj = create(self.context, type_, id_=id_, title=title)

        if isinstance(obj, dict) and 'error' in obj:
            self.request.response.setStatus(400)
            return obj
        obj.schema_form_data = schema_form_data
        # Update fields
        # deserializer = queryMultiAdapter((obj, self.request),
        #                                 IDeserializeFromJson)
        # if deserializer is None:
        #    self.request.response.setStatus(501)
        #    return dict(error=dict(
        #        message='Cannot deserialize type {}'.format(obj.portal_type)))

        # try:
        #    deserializer(validate_all=True)
        # except DeserializationError as e:
        #    self.request.response.setStatus(400)
        #    return dict(error=dict(
        #        type='DeserializationError',
        #        message=str(e)))

        # Rename if generated id
        if not id_:
            rename(obj)

        self.request.response.setStatus(201)
        self.request.response.setHeader('Location', obj.absolute_url())

        # serializer = queryMultiAdapter(
        #    (obj, self.request),
        #    ISerializeToJson
        # )

        # serialized_obj = serializer()

        # HypermediaBatch can't determine the correct canonical URL for
        # objects that have just been created via POST - so we make sure
        # to set it here
        # serialized_obj['@id'] = obj.absolute_url()
        success = {'message': 'successfully added data'}
        return success