def test_document_detail_delete(self): idx = Index.create(name='idx') alt_idx = Index.create(name='alt-idx') d1 = idx.index('doc 1', k1='v1', k2='v2') d2 = idx.index('doc 2', k3='v3') d2.attach('foo.jpg', 'bar') alt_idx.add_to_index(d1) alt_idx.add_to_index(d2) self.assertEqual(Metadata.select().count(), 3) self.assertEqual(Attachment.select().count(), 1) response = self.app.delete('/documents/%s/' % d2.get_id()) data = json_load(response.data) self.assertEqual(data, {'success': True}) self.assertEqual(Metadata.select().count(), 2) self.assertEqual(Attachment.select().count(), 0) response = self.app.delete('/documents/%s/' % d2.get_id()) self.assertEqual(response.status_code, 404) self.assertEqual(Document.select().count(), 1) self.assertEqual(IndexDocument.select().count(), 2) self.assertEqual([d.get_id() for d in idx.documents], [d1.get_id()]) self.assertEqual([d.get_id() for d in alt_idx.documents], [d1.get_id()])
def test_attachment_views(self): idx = Index.create(name='idx') doc = idx.index('doc 1') doc.attach('foo.jpg', 'x') doc.attach('bar.png', 'x') Attachment.update(timestamp='2016-01-02 03:04:05').execute() resp = self.app.get('/documents/1/attachments/') resp_data = json_load(resp.data) self.assertEqual(resp_data['attachments'], [ { 'mimetype': 'image/png', 'timestamp': '2016-01-02 03:04:05', 'data_length': 1, 'filename': 'bar.png', 'document': '/documents/1/', 'data': '/documents/1/attachments/bar.png/download/', }, { 'mimetype': 'image/jpeg', 'timestamp': '2016-01-02 03:04:05', 'data_length': 1, 'filename': 'foo.jpg', 'document': '/documents/1/', 'data': '/documents/1/attachments/foo.jpg/download/', }, ]) resp = self.app.get('/documents/1/attachments/foo.jpg/') resp_data = json_load(resp.data) self.assertEqual( resp_data, { 'mimetype': 'image/jpeg', 'timestamp': '2016-01-02 03:04:05', 'data_length': 1, 'filename': 'foo.jpg', 'document': '/documents/1/', 'data': '/documents/1/attachments/foo.jpg/download/', }) resp = self.app.delete('/documents/1/attachments/foo.jpg/') self.assertEqual(Attachment.select().count(), 1) resp = self.app.post('/documents/1/attachments/bar.png/', data={ 'data': '', 'file_0': (BytesIO(b'zz'), 'bar.png') }) resp_data = json_load(resp.data) self.assertEqual(resp_data['data_length'], 2) resp = self.app.get('/documents/1/attachments/bar.png/download/') self.assertEqual(resp.data, b'zz')
def test_document_detail_update_attachments(self): idx = Index.create(name='idx') doc = idx.index('test doc', foo='bar', nug='baze') doc.attach('foo.jpg', 'empty') url = '/documents/%s/' % doc.docid json_data = json.dumps({'content': 'test doc-edited'}) response = self.app.post(url, data={ 'data': json_data, 'file_0': (BytesIO(b'xx'), 'foo.jpg'), 'file_1': (BytesIO(b'yy'), 'foo2.jpg') }) resp_data = json_load(response.data) a1 = Attachment.get(Attachment.filename == 'foo.jpg') a2 = Attachment.get(Attachment.filename == 'foo2.jpg') a1_data = { 'mimetype': 'image/jpeg', 'data_length': 2, 'data': '/documents/%s/attachments/foo.jpg/download/' % doc.docid, 'timestamp': str(a1.timestamp), 'filename': 'foo.jpg' } a2_data = { 'mimetype': 'image/jpeg', 'data_length': 2, 'data': '/documents/%s/attachments/foo2.jpg/download/' % doc.docid, 'timestamp': str(a2.timestamp), 'filename': 'foo2.jpg' } self.assertEqual( resp_data, { 'attachments': [a1_data, a2_data], 'content': 'test doc-edited', 'id': 1, 'identifier': None, 'indexes': ['idx'], 'metadata': { 'foo': 'bar', 'nug': 'baze' } }) self.assertEqual(Attachment.select().count(), 2) self.assertEqual(BlobData.select().count(), 3) # Existing file updated, new file added. foo, foo2 = Attachment.select().order_by(Attachment.filename) self.assertEqual(foo.blob.data, b'xx') self.assertEqual(foo2.blob.data, b'yy')
def list_view(self, document_id): document = self._get_document(document_id) query = (Attachment.select(Attachment, BlobData).join( BlobData, on=(Attachment.hash == BlobData.hash).alias('_blob')).where( Attachment.document == document)) ordering = request.args.getlist('ordering') query = engine.apply_rank_and_sort( query, None, ordering, { 'document': Attachment.document, 'hash': Attachment.hash, 'filename': Attachment.filename, 'mimetype': Attachment.mimetype, 'timestamp': Attachment.timestamp, 'id': Attachment.id, }, 'filename') pq = self.paginated_query(query) return jsonify({ 'attachments': [ attachment_serializer.serialize(attachment) for attachment in pq.get_object_list() ], 'ordering': ordering, 'page': pq.get_page(), 'pages': pq.get_page_count() })
def delete(self, pk): document = self._get_document(pk) with database.atomic(): (IndexDocument.delete().where( IndexDocument.document == document).execute()) (Attachment.delete().where( Attachment.document == document).execute()) Metadata.delete().where(Metadata.document == document).execute() document.delete_instance() logger.info('Deleted document with id = %s', document.get_id()) return jsonify({'success': True})
def test_index_document_attachments(self): idx_a = Index.create(name='idx-a') json_data = json.dumps({ 'content': 'doc a', 'index': 'idx-a', 'metadata': { 'k1': 'v1-a', 'k2': 'v2-a' }, }) response = self.app.post('/documents/', data={ 'data': json_data, 'file_0': (BytesIO(b'testfile1'), 'test1.txt'), 'file_1': (BytesIO(b'testfile2'), 'test2.jpg') }) a1 = Attachment.get(Attachment.filename == 'test1.txt') a2 = Attachment.get(Attachment.filename == 'test2.jpg') a1_data = { 'data': '/documents/1/attachments/test1.txt/download/', 'data_length': 9, 'mimetype': 'text/plain', 'timestamp': str(a1.timestamp), 'filename': 'test1.txt' } a2_data = { 'data': '/documents/1/attachments/test2.jpg/download/', 'data_length': 9, 'mimetype': 'image/jpeg', 'timestamp': str(a2.timestamp), 'filename': 'test2.jpg' } resp_data = json_load(response.data) self.assertEqual( resp_data, { 'attachments': [a1_data, a2_data], 'content': 'doc a', 'id': 1, 'identifier': None, 'indexes': ['idx-a'], 'metadata': { 'k1': 'v1-a', 'k2': 'v2-a' } }) Attachment.update(timestamp='2016-02-01 01:02:03').execute() with assert_query_count(3): resp = self.app.get('/documents/1/attachments/') self.assertEqual( json_load(resp.data), { 'ordering': [], 'pages': 1, 'page': 1, 'attachments': [ { 'mimetype': 'text/plain', 'timestamp': '2016-02-01 01:02:03', 'data_length': 9, 'filename': 'test1.txt', 'document': '/documents/1/', 'data': '/documents/1/attachments/test1.txt/download/', }, { 'mimetype': 'image/jpeg', 'timestamp': '2016-02-01 01:02:03', 'data_length': 9, 'filename': 'test2.jpg', 'document': '/documents/1/', 'data': '/documents/1/attachments/test2.jpg/download/', }, ], })