def create_annotation(request, data): """ Create an annotation from passed data. :param request: the request object :type request: pyramid.request.Request :param data: a dictionary of annotation properties :type data: dict :returns: the created annotation :rtype: dict """ document_uri_dicts = data['document']['document_uri_dicts'] document_meta_dicts = data['document']['document_meta_dicts'] del data['document'] # Replies must have the same group as their parent. if data['references']: top_level_annotation_id = data['references'][0] top_level_annotation = fetch_annotation(request.db, top_level_annotation_id) if top_level_annotation: data['groupid'] = top_level_annotation.groupid else: raise schemas.ValidationError( 'references.0: ' + _('Annotation {id} does not exist').format( id=top_level_annotation_id)) # The user must have permission to create an annotation in the group # they've asked to create one in. if data['groupid'] != '__world__': group_principal = 'group:{}'.format(data['groupid']) if group_principal not in request.effective_principals: raise schemas.ValidationError('group: ' + _('You may not create annotations ' 'in groups you are not a member ' 'of!')) annotation = models.Annotation(**data) request.db.add(annotation) # We need to flush the db here so that annotation.created and # annotation.updated get created. request.db.flush() models.update_document_metadata(request.db, annotation, document_meta_dicts, document_uri_dicts) return annotation
def test_it_raises_if_AnnotationSchema_validate_raises( self, AnnotationSchema): AnnotationSchema.return_value.validate.side_effect = ( schemas.ValidationError('asplode')) schema = schemas.CreateAnnotationSchema(testing.DummyRequest()) with pytest.raises(schemas.ValidationError): schema.validate({'foo': 'bar'})
def test_createannotationschema_raises_if_structure_validator_raises(): request = testing.DummyRequest() schema = schemas.CreateAnnotationSchema(request) schema.structure = mock.Mock() schema.structure.validate.side_effect = schemas.ValidationError('asplode') with pytest.raises(schemas.ValidationError): schema.validate({'foo': 'bar'})
def test_it_raises_if_structure_validator_raises(self): request = testing.DummyRequest() schema = schemas.LegacyUpdateAnnotationSchema(request, {}) schema.structure = mock.Mock() schema.structure.validate.side_effect = ( schemas.ValidationError('asplode')) with pytest.raises(schemas.ValidationError): schema.validate({'foo': 'bar'})
def create_annotation(request, data): """ Create an annotation from passed data. :param request: the request object :type request: pyramid.request.Request :param data: a dictionary of annotation properties :type data: dict :returns: the created annotation :rtype: dict """ document_uri_dicts = data['document']['document_uri_dicts'] document_meta_dicts = data['document']['document_meta_dicts'] del data['document'] # Replies must have the same group as their parent. if data['references']: top_level_annotation_id = data['references'][0] top_level_annotation = fetch_annotation(request, top_level_annotation_id, _postgres=True) if top_level_annotation: data['groupid'] = top_level_annotation.groupid else: raise schemas.ValidationError( 'references.0: ' + _('Annotation {annotation_id} does not exist').format( annotation_id=top_level_annotation_id)) # The user must have permission to create an annotation in the group # they've asked to create one in. if data['groupid'] != '__world__': group_principal = 'group:{}'.format(data['groupid']) if group_principal not in request.effective_principals: raise schemas.ValidationError('group: ' + _('You may not create annotations ' 'in groups you are not a member ' 'of!')) annotation = models.Annotation(**data) request.db.add(annotation) # We need to flush the db here so that annotation.created and # annotation.updated get created. request.db.flush() documents = models.Document.find_or_create_by_uris( request.db, annotation.target_uri, [u['uri'] for u in document_uri_dicts], created=annotation.created, updated=annotation.updated) if documents.count() > 1: document = models.merge_documents(request.db, documents, updated=annotation.updated) else: document = documents.first() document.updated = annotation.updated for document_uri_dict in document_uri_dicts: models.create_or_update_document_uri(session=request.db, document=document, created=annotation.created, updated=annotation.updated, **document_uri_dict) for document_meta_dict in document_meta_dicts: models.create_or_update_document_meta(session=request.db, document=document, created=annotation.created, updated=annotation.updated, **document_meta_dict) return annotation