class ShallowCombinedSchema(BaseSchema): collection_id = String() # Joint entity/document attributes collection = Nested(CollectionSchema()) schema = SchemaName() schemata = List(SchemaName()) names = List(String()) addresses = List(String()) phones = List(String()) emails = List(String()) identifiers = List(String()) countries = List(Country()) dates = List(PartialDate()) bulk = Boolean() # Entity attributes foreign_id = String() name = String() entities = List(String()) properties = Dict() # Document attributes status = String() content_hash = String() uploader_id = String() uploader = Nested(RoleReferenceSchema()) error_message = String() title = String() summary = String() languages = List(Language()) keywords = List(String()) date = PartialDate() authored_at = PartialDate() modified_at = PartialDate() published_at = PartialDate() retrieved_at = PartialDate() file_name = String() file_size = Integer() author = String() generator = String() mime_type = String() extension = String() encoding = String() source_url = String() pdf_version = String() columns = List(String()) headers = Dict() children = Integer() # TODO: is this a separate endpoint? text = String() html = String() def document_links(self, data, pk, schemata): links = { 'self': url_for('documents_api.view', document_id=pk), 'tags': url_for('entities_api.tags', id=pk), 'ui': document_url(pk) } if data.get('content_hash'): links['file'] = url_for('documents_api.file', document_id=pk, _authorize=True) if schemata.intersection([Document.SCHEMA_PDF]): links['pdf'] = url_for('documents_api.pdf', document_id=pk, _authorize=True) if schemata.intersection([Document.SCHEMA_PDF, Document.SCHEMA_TABLE]): links['records'] = url_for('documents_api.records', document_id=pk) if schemata.intersection([Document.SCHEMA_FOLDER]): query = (('filter:parent.id', pk),) links['children'] = url_for('documents_api.index', _query=query) return links def entity_links(self, data, pk, schemata): return { 'self': url_for('entities_api.view', id=pk), # 'similar': url_for('entities_api.similar', id=pk), # 'documents': url_for('entities_api.documents', id=pk), 'references': url_for('entities_api.references', id=pk), 'tags': url_for('entities_api.tags', id=pk), 'ui': entity_url(pk) } @post_dump() def hypermedia(self, data): pk = str(data.get('id')) collection = data.get('collection', {}) collection_id = collection.get('id') collection_id = collection_id or data.get('collection_id') schemata = set(data.get('schemata', [])) if Document.SCHEMA in schemata: data['links'] = self.document_links(data, pk, schemata) else: data['links'] = self.entity_links(data, pk, schemata) if data.get('bulk'): data['writeable'] = False else: data['writeable'] = request.authz.can_write(collection_id) return data
class EntityUpdateSchema(Schema): name = String(allow_none=True) schema = SchemaName(required=True) properties = Dict()