def download(): """ 下载小说 """ id = request.args.get('id', int) novel_dao = NovelDAO(g.db, current_app.logger) novel = novel_dao.get_by_id(id) if not novel: abort(404) stream = StringIO() for content in novel_dao.get_contents(novel): stream.write(content.encode('utf-8')) stream.write('\n') content_length = stream.tell() stream.seek(0) resp = Response(stream) resp.headers.set("Content-Disposition", "attachment", filename=quote((novel.name + '.txt').encode('utf-8'))) resp.headers.set("Content-Length", content_length) resp.headers.set("Content-Type", "application/octet-stream") return resp
def search_novel(): keyword = request.args.get('keyword', '') if not keyword: return api_response(code=400, message=u'参数缺失') novel_dao = NovelDAO(g.db, current_app.logger) novels = novel_dao.search_novel(keyword) novels = [novel.to_dict() for novel in novels] return api_response(code=0, data=novels)
def add(): """ 新增Novel """ name, rule = map(request.form.get, ('name', 'rule')) if not all([name, rule]): return api_response(code=400, message=u'参数缺失') novel_dao = NovelDAO(g.db, current_app.logger) result, obj = novel_dao.add(name, rule) if not result: return api_response(code=500, message=obj) return api_response(code=0, data=obj.to_dict())
def sync_chapters_content(id): """ 向所有的chapter添加内容 """ session = app.DBSession() novel_dao = NovelDAO(session, app.logger) try: novel = novel_dao.get_by_id(id) if not novel: return False, u'【错误】此小说不存在' result = novel_dao.add_chapters_content(novel, app.current_task) return result except: app.logger.error('chapter content sync error|%s|' %(id, ), exc_info=1) return False, u'【错误】500' finally: session.close()
def get_chapter_list(): """ 获取章节列表 """ page, pagesize = _get_page_info() id = request.args.get('id', int) novel_dao = NovelDAO(g.db, current_app.logger) count, chapter_list = novel_dao.get_chapter_list(id, page=page, pagesize=pagesize) c_list = [{ 'id': c.id, 'title': c.title, 'publish_time': datetime.strftime(c.publish_time, '%Y-%m-%d %H:%M') } for c in chapter_list] return api_response(code=0, data={'count': count, 'list': c_list})
def sync(id=None): """ 同步小说 """ session = app.DBSession() novel_dao = NovelDAO(session, app.logger) try: if not id: novel = novel_dao.get_novel_need_sync() else: novel = novel_dao.get_by_id(id) if not novel: return False, u'【错误】此小说不存在' result = novel_dao.add_chapters(novel, app.current_task) return result except: app.logger.error('novel sync error|%s|' %(id, ), exc_info=1) return False, u'【错误】500' finally: session.close()
def setUp(self): super(NovelDAOTestCase, self).setUp() self.novel_dao = NovelDAO(self.db, self.app.logger)
class NovelDAOTestCase(BaseTestCase): """ Novel 数据操作测试用例 """ def setUp(self): super(NovelDAOTestCase, self).setUp() self.novel_dao = NovelDAO(self.db, self.app.logger) def test_add(self): """ 测试添加Novel """ result, novel = self.novel_dao.add(u'测试', u'测试rule') self.assertEqual(result, True) novel = self.db_get_novel(novel.id) for k, v in {'name': u'测试', 'rule': u'测试rule'}.items(): self.assertEqual(v, getattr(novel, k)) def test_add_when_exist(self): """ 测试添加Novel,当已存在 """ novel = self.db_add_novel(name=u'测试', rule=u'') result, msg = self.novel_dao.add(u'测试', u'测试rule') self.assertFalse(result) self.assertEqual(msg, u'重复创建无效') @requests_mock.mock() def test_add_chapters(self, mock): """ 测试生成章节列表 """ self._mock_tieba_response(mock, '/f/good', file_path='tests/mock/chapter-list-mock.html') novel = self.db_add_novel(name=u'择天记', rule=u'^【择天记】.+第.+章.+$') result = self.novel_dao.add_chapters(novel) self.assertTrue(result) chapters = self.db_get_chapters_by_novel_id(novel.id) self.assertTrue(chapters) def test_get_by_name(self): """ 测试根据名称查找novel """ novel = self.db_add_novel(name=u'择天记', rule=u'^【择天记】.+第.+章.+$') novel = self.novel_dao.get_by_name(novel.name) self.assertTrue(novel) def test_get_by_id(self): """ 测试根据id查找novel """ novel = self.db_add_novel(name=u'择天记', rule=u'^【择天记】.+第.+章.+$') novel = self.novel_dao.get_by_id(novel.id) self.assertTrue(novel) def test_add_chapters_content(self): """ 测试获取章节内容 """ novel = self.db_add_novel(name=u'择天记', rule=u'^【择天记】.+第.+章.+$') chapter_list = [] for pageid in ['3857497226', '3855582980', '3848313003']: chapter = self.db_add_chapter( novel_id=novel.id, pageid=unicode(pageid), title=u'测试章节%s' %pageid, ) chapter_list.append(chapter) result, msg = self.novel_dao.add_chapters_content(novel) self.assertTrue(result) chapters = self.db_get_chapters_by_novel_id(novel.id) for chapter in chapters: self.assertTrue(chapter.content) def test_get_novel_need_sync(self): """ 测试获取一个需要同步的novel """ novel = self.db_add_novel(name=u'择天记', rule=u'^【择天记】.+第.+章.+$') result = self.novel_dao.get_novel_need_sync() self.assertTrue(result) def test_get_chapter_list(self): """ 测试获取章节列表 """ novel = self.db_add_novel(name=u'择天记', rule=u'^【择天记】.+第.+章.+$') for pageid in range(1, 20): chapter = self.db_add_chapter( novel_id=novel.id, pageid=unicode(pageid), title=u'测试章节%s' %pageid, ) count, chapter_list = self.novel_dao.get_chapter_list(novel.id, page=1, pagesize=10) self.assertEqual(count, 20-1) self.assertTrue(chapter_list)