def send_book_to_kindle(): logging.info("推送订阅书本至kindle任务开始") start = time.time() total = 0 fail = 0 look = 0 book_ids = (SubscribeBook.normal.filter(ready=True).values_list( "book_id", flat=True).distinct()) user_id = 1 for book_id in book_ids: subs = SubscribeBook.normal.filter(ready=True, book_id=book_id) start_chapter, end_chapter = subs[0].chapter, subs[ 0].book.latest_chapter() # 判断需要推送的章节是否都已可用 send_chapters = Chapter.normal.filter( book_id=book_id, number__in=[ x for x in range(start_chapter.number if start_chapter else 0, end_chapter.number + 1) ], ).values("active", flat=True) if not all(send_chapters): fail += 1 look += 1 logging.info("{}部分章节不可用,不予推送至kindle".format(subs[0].book.title)) continue to_email = [sub.user.email for sub in subs] try: # if True: # 开启事务 with transaction.atomic(): task_makebook = Task.create_task_for_make_book( user_id, book_id, start_chapter.id if start_chapter else 0, end_chapter.id, ) task_email = Task.create_task_for_send_email( user_id, book_id, list(set(to_email))) model_task.delay([task_makebook.id, task_email.id]) for sub in subs: sub.chapter_id = subs[0].book.latest_chapter().id sub.ready = False sub.count = sub.count + 1 sub.save() except Exception as e: fail += 1 look += len(to_email) logging.error(f"推送订阅书本至kindle任务book_id: {book_id}, 失败。原因: {e}") continue stop = time.time() logging.info("推送订阅书本至kindle任务创建结束,共推送{}本, 失败{}本, 受影响用户{}位, 共耗时{}秒".format( total - fail if total > fail else 0, fail, look, stop - start))
def make_book(modeladmin, request, queryset): task_ids = [] for book in queryset: task_ids.append( Task.create_task_for_make_book(request.user.id, book.id).id) async_model_task(task_ids)