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
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
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
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
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.', )
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()
def test_rename_content(self): rename(self.obj) self.assertEqual(self.obj.getId(), 'my-document')
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
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