Skip to content

lms_public.services.scheduled_tasks

check_new_messages_service(user_id, is_first_time=False) async

Fetch new messages, compare them with the old ones, send notification for the new ones

Parameters:

Name Type Description Default
user_id int

The id of the LMSUser instance

required
is_first_time bool

If true, sends notification for every new message. If false, does not send any message. The return value then can be used to send a welcome message, containing the number of scraped messages. Defaults to False.

False

Returns:

Name Type Description
int int

The number of scraped messages

Source code in src/lms_public/services/scheduled_tasks.py
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
async def check_new_messages_service(
    user_id: int, is_first_time: bool = False
) -> int:
    """Fetch new messages, compare them with the old ones, send notification
    for the new ones

    Args:
        user_id (int): The id of the LMSUser instance
        is_first_time (bool, optional): If true, sends notification for every
            new message. If false, does not send any message. The return value
            then can be used to send a welcome message, containing the number of
            scraped messages. Defaults to False.

    Returns:
        int: The number of scraped messages
    """

    lms_user = await LMSUser.objects.aget(id=user_id)
    cookie = await get_cookie(user=lms_user)
    chat_id = await sync_to_async(lambda: lms_user.chat_id.chat_id)()
    active_courses = await sync_to_async(list)(
        LMSCourse.objects.filter(user=lms_user, is_active=True)
    )
    tasks = [
        asyncio.create_task(get_course_messages(course=course, cookie=cookie))
        for course in active_courses
    ]
    courses_messages = await asyncio.gather(*tasks)

    msg_count = 0
    for crs_messages in courses_messages:
        for lms_msg in crs_messages:
            db_msg = await PublicMessage.objects.filter(
                user=lms_user,
                item_id=lms_msg.item_id,
                lms_course__suffix_url=lms_msg.lms_course.suffix_url,
                author=lms_msg.author,
                sent_at=lms_msg.sent_at,
            ).alast()

            if add_message_header_footer(
                new_message=lms_msg, old_message=db_msg
            ):
                lms_msg.user = lms_user
                await lms_msg.asave()
                msg_count += 1
                if is_first_time:
                    continue
                send_notifications_task.delay(
                    chat_id=chat_id, lms_msg_id=lms_msg.pk
                )
    return msg_count

update_user_courses_service(user_id) async

Fetch new LMS courses and mark them as active, deactivating older ones

Parameters:

Name Type Description Default
user_id int

The id of the LMS User

required
Source code in src/lms_public/services/scheduled_tasks.py
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
async def update_user_courses_service(user_id: int) -> None:
    """Fetch new LMS courses and mark them as active,
    deactivating older ones

    Args:
        user_id (int): The id of the LMS User
    """

    lms_user = await LMSUser.objects.aget(id=user_id)
    cookie = await get_cookie(user=lms_user)
    courses_info = await get_courses_suffix_urls(cookie=cookie)
    all_suffix_urls = [info[0] for info in courses_info]

    for crs_info in courses_info:
        await LMSCourse.objects.aget_or_create(
            user=lms_user,
            suffix_url=crs_info[0],
            defaults={"name": crs_info[1]},
        )
    # Deactivate old courses
    await (
        LMSCourse.objects.exclude(
            suffix_url__in=all_suffix_urls,
        )
        .filter(user=lms_user)
        .aupdate(is_active=False)
    )