Example #1
0
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))
Example #2
0
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)