Skip to content

lms_public.services.change_handler

Add appropriate header and footer to message based on changes

Source code in src/lms_public/services/change_handler.py
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
def add_message_header_footer(
    new_message: PublicMessage, old_message: PublicMessage | None
) -> None:
    """Add appropriate header and footer to message based on changes"""
    has_major_change = False
    if not old_message:
        # The major change is being a new message
        has_major_change = True
        return has_major_change

    changes = is_x_changed(old_message, new_message)
    minor_changes: list[str] = list()

    if changes["is_exercise_changed"]:
        on_is_exercise(new_message, old_message)
        has_major_change = True
        return has_major_change

    if changes["is_exercise_finished_changed"]:
        on_is_exercise_finished(new_message, old_message)
        has_major_change = True

    if (
        changes["is_exercise_deadline_changed"]
        and not changes["is_exercise_finished_changed"]
    ):
        on_exercise_deadline(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_has_attachment_changed"]:
        on_has_attachment(
            new_message, old_message, has_major_change, minor_changes
        )
        has_major_change = True
    elif (
        changes["is_attachment_link_changed"]
        and changes["is_attachment_name_changed"]
    ):
        on_attachment_link_and_text(
            new_message, has_major_change, minor_changes
        )
        has_major_change = True
    elif changes["is_attachment_link_changed"]:
        on_attachment_link(new_message, has_major_change, minor_changes)
        has_major_change = True
    elif changes["is_attachment_name_changed"]:
        on_attachment_name(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_exercise_name_changed"]:
        on_exercise_name(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_exercise_start_changed"]:
        on_exercise_start(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_online_session_changed"]:
        on_is_online_session(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_online_session_name_changed"]:
        on_online_session_name(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_online_session_link_changed"]:
        on_online_session_link(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_online_session_status_changed"]:
        on_online_session_status(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_online_session_start_changed"]:
        on_online_session_start(new_message, has_major_change, minor_changes)
        has_major_change = True

    if changes["is_online_session_end_changed"]:
        on_online_session_end(new_message, has_major_change, minor_changes)
        has_major_change = True

    if minor_changes:
        footer_items = (
            "\n- ".join(minor_changes)
            if isinstance(minor_changes, list)
            else minor_changes
        )
        new_message.footer = footer_items

    return has_major_change

has_message_changed(new_message, old_message)

Determine if message has changed

Source code in src/lms_public/services/change_handler.py
347
348
349
350
351
352
353
354
355
def has_message_changed(
    new_message: PublicMessage, old_message: PublicMessage | None
) -> bool:
    """Determine if message has changed"""
    if not old_message:
        return True

    changes = is_x_changed(old_message, new_message)
    return any(changes.values())

is_x_changed(old_message, new_message)

Check which properties have changed between messages

Source code in src/lms_public/services/change_handler.py
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
def is_x_changed(
    old_message: PublicMessage, new_message: PublicMessage
) -> dict[str, bool]:
    """Check which properties have changed between messages"""
    return {
        "is_exercise_changed": old_message.is_exercise
        != new_message.is_exercise,
        "is_exercise_finished_changed": old_message.is_exercise_finished
        != new_message.is_exercise_finished,
        "is_exercise_deadline_changed": old_message.exercise_deadline
        != new_message.exercise_deadline,
        "is_has_attachment_changed": old_message.has_attachment
        != new_message.has_attachment,
        "is_attachment_link_changed": old_message.attachment_link
        != new_message.attachment_link,
        "is_attachment_name_changed": old_message.attachment_name
        != new_message.attachment_name,
        "is_exercise_name_changed": old_message.exercise_name
        != new_message.exercise_name,
        "is_exercise_start_changed": old_message.exercise_start
        != new_message.exercise_start,
        "is_online_session_changed": old_message.is_online_session
        != new_message.is_online_session,
        "is_online_session_name_changed": old_message.online_session_name
        != new_message.online_session_name,
        "is_online_session_link_changed": old_message.online_session_link
        != new_message.online_session_link,
        "is_online_session_status_changed": old_message.online_session_status
        != new_message.online_session_status,
        "is_online_session_start_changed": old_message.online_session_start
        != new_message.online_session_start,
        "is_online_session_end_changed": old_message.online_session_end
        != new_message.online_session_end,
    }

Handle attachment link change

Source code in src/lms_public/services/change_handler.py
90
91
92
93
94
95
96
97
98
99
def on_attachment_link(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle attachment link change"""
    if has_major_change:
        minor_changes.append("تغییر لینک فایل پیوست")
    else:
        new_message.header = "لینک فایل پیوست تغییر کرد."

Handle attachment link and text change

Source code in src/lms_public/services/change_handler.py
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
def on_attachment_link_and_text(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle attachment link and text change"""
    attachment_name = (
        f"به نام {new_message.attachment_name}"
        if new_message.attachment_name
        else ""
    )
    if has_major_change:
        minor_changes.append("آپلود فایل پیوست جدید")
    else:
        new_message.header = f"فایل پیوست جدیدی {attachment_name} آپلود شد."

on_attachment_name(new_message, has_major_change, minor_changes)

Handle attachment name change

Source code in src/lms_public/services/change_handler.py
102
103
104
105
106
107
108
109
110
111
def on_attachment_name(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle attachment name change"""
    if has_major_change:
        minor_changes.append("تغییر نام فایل پیوست")
    else:
        new_message.header = "نام فایل پیوست تغییر کرد."

on_exercise_deadline(new_message, has_major_change, minor_changes)

Handle exercise deadline change

Source code in src/lms_public/services/change_handler.py
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
def on_exercise_deadline(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle exercise deadline change"""
    exercise_name = (
        new_message.exercise_name if new_message.exercise_name else ""
    )
    alert_if_still_finished = (
        "اما مهلت همچنان تمام شده است."
        if new_message.is_exercise_finished
        else ""
    )
    if has_major_change:
        minor_changes.append("تغییر مهلت ارسال تمدید")
    else:
        new_message.header = (
            f"مهلت ارسال تمرین {exercise_name} تغییر کرد. "
            f"{alert_if_still_finished}"
        )

on_exercise_name(new_message, has_major_change, minor_changes)

Handle exercise name change

Source code in src/lms_public/services/change_handler.py
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
def on_exercise_name(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle exercise name change"""
    name_and_action = (
        f"به {new_message.exercise_name} تغییر کرد."
        if new_message.exercise_name
        else "حذف شد."
    )
    if has_major_change:
        minor_changes.append("تغییر نام تمرین")
    else:
        new_message.header = f"نام تمرین {name_and_action}"

on_exercise_start(new_message, has_major_change, minor_changes)

Handle exercise start time change

Source code in src/lms_public/services/change_handler.py
131
132
133
134
135
136
137
138
139
140
141
142
def on_exercise_start(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle exercise start time change"""
    if has_major_change:
        minor_changes.append("تغییر زمان شروع تمرین")
    else:
        new_message.header = (
            f"زمان شروع تمرین را به {new_message.exercise_start} تغییر کرد."
        )

on_has_attachment(new_message, old_message, has_major_change, minor_changes)

Handle attachment status change

Source code in src/lms_public/services/change_handler.py
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def on_has_attachment(
    new_message: PublicMessage,
    old_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle attachment status change"""
    minor_action = "افزودن" if new_message.has_attachment else "حذف"
    major_action = "اضافه شد." if new_message.has_attachment else "حذف شد."
    message = new_message if new_message.has_attachment else old_message
    attachment_name = (
        message.attachment_name if message.attachment_name else ""
    )

    if has_major_change:
        minor_changes.append(f"{minor_action} فایل پیوست")
    else:
        new_message.header = f"فایل پیوست {attachment_name} {major_action}"

on_is_exercise(new_message, old_message)

Handle exercise status change

Source code in src/lms_public/services/change_handler.py
 7
 8
 9
10
11
12
13
14
def on_is_exercise(
    new_message: PublicMessage, old_message: PublicMessage
) -> None:
    """Handle exercise status change"""
    message = new_message if new_message.is_exercise else old_message
    exercise_name = message.exercise_name if message.exercise_name else ""
    action = "اضافه شد." if new_message.is_exercise else "حذف شد."
    new_message.header = f"تمرین {exercise_name} {action}"

on_is_exercise_finished(new_message, old_message)

Handle exercise completion status change

Source code in src/lms_public/services/change_handler.py
17
18
19
20
21
22
23
24
25
26
27
def on_is_exercise_finished(
    new_message: PublicMessage, old_message: PublicMessage
) -> None:
    """Handle exercise completion status change"""
    exercise_name = (
        new_message.exercise_name if new_message.exercise_name else ""
    )
    action = (
        "به پایان رسید." if new_message.is_exercise_finished else "تغییر کرد."
    )
    new_message.header = f"مهلت ارسال تمرین {exercise_name} {action}"

on_is_online_session(new_message, has_major_change, minor_changes)

Handle online session status change

Source code in src/lms_public/services/change_handler.py
145
146
147
148
149
150
151
152
153
154
def on_is_online_session(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle online session status change"""
    if has_major_change:
        minor_changes.append("ایجاد یک جلسه‌ی آنلاین")
    else:
        new_message.header = "یک جلسه‌ی آنلاین جدید ایجاد شد."

on_online_session_end(new_message, has_major_change, minor_changes)

Handle online session end time change

Source code in src/lms_public/services/change_handler.py
207
208
209
210
211
212
213
214
215
216
def on_online_session_end(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle online session end time change"""
    if has_major_change:
        minor_changes.append("تغییر زمان پایان جلسه آنلاین")
    else:
        new_message.header = f"زمان پایان جلسه آنلاین به {new_message.online_session_end} تغییر کرد."

Handle online session link change

Source code in src/lms_public/services/change_handler.py
171
172
173
174
175
176
177
178
179
180
def on_online_session_link(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle online session link change"""
    if has_major_change:
        minor_changes.append("تغییر لینک جلسه آنلاین")
    else:
        new_message.header = "لینک جلسه آنلاین تغییر کرد."

on_online_session_name(new_message, has_major_change, minor_changes)

Handle online session name change

Source code in src/lms_public/services/change_handler.py
157
158
159
160
161
162
163
164
165
166
167
168
def on_online_session_name(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle online session name change"""
    if has_major_change:
        minor_changes.append("تغییر نام جلسه آنلاین")
    else:
        new_message.header = (
            f"نام جلسه آنلاین به {new_message.online_session_name} تغییر کرد."
        )

on_online_session_start(new_message, has_major_change, minor_changes)

Handle online session start time change

Source code in src/lms_public/services/change_handler.py
195
196
197
198
199
200
201
202
203
204
def on_online_session_start(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle online session start time change"""
    if has_major_change:
        minor_changes.append("تغییر زمان شروع جلسه آنلاین")
    else:
        new_message.header = f"زمان شروع جلسه آنلاین به {new_message.online_session_start} تغییر کرد."

on_online_session_status(new_message, has_major_change, minor_changes)

Handle online session status change

Source code in src/lms_public/services/change_handler.py
183
184
185
186
187
188
189
190
191
192
def on_online_session_status(
    new_message: PublicMessage,
    has_major_change: bool,
    minor_changes: list[str],
) -> None:
    """Handle online session status change"""
    if has_major_change:
        minor_changes.append("تغییر وضعیت جلسه آنلاین")
    else:
        new_message.header = f"وضعیت جلسه آنلاین به {new_message.online_session_status} تغییر کرد."

public_message_to_html(message) async

Converts a PublicMessage object to HTML representation.

Parameters:

Name Type Description Default
message PublicMessage

PublicMessage object to convert

required

Returns:

Name Type Description
str str

HTML representation of the message

Source code in src/lms_public/services/change_handler.py
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
async def public_message_to_html(message: PublicMessage) -> str:
    """
    Converts a PublicMessage object to HTML representation.

    Args:
        message: PublicMessage object to convert

    Returns:
        str: HTML representation of the message
    """
    course_name = await sync_to_async(lambda: message.lms_course.name)()
    course_name = f"📚  {course_name}"

    author = f"\n\n👤  {message.author}"
    header = f"\n\n▫️<b>{message.header}</b>" if message.header else ""

    # Assuming 'text' field exists in PublicMessage but wasn't shown in the provided code
    text = (
        f"\n\n✍🏻  {message.text}"
        if hasattr(message, "text") and message.text
        else ""
    )

    footer = ""
    if hasattr(message, "footer") and message.footer:
        footer = f"\n\nتغییرات جزئی: \n{message.footer}"

    exercise_description = ""
    if message.is_exercise:
        exercise_description = (
            f"\n\nنام تمرین: {message.exercise_name}\n"
            f"زمان شروع: {message.exercise_start}\n"
            f"مهلت ارسال: {message.exercise_deadline}"
        )
        if message.is_exercise_finished:
            exercise_description += "(پایان یافته) "

    attachment_description = ""
    if message.has_attachment:
        attachment_description = f'\n\nفایل: <a href="{constants.BASE_URL + message.attachment_link}">{message.attachment_name}</a>'

    online_session_description = ""
    if message.is_online_session:
        online_session_status_icon = "⏳"
        if "در حال" in message.online_session_status:
            online_session_status_icon = "🟢"
        elif "ضبط" in message.online_session_status:
            online_session_status_icon = "🔴"
        online_session_description = (
            f'\n\n🌐 عنوان جلسه: <a href="{constants.BASE_URL + message.online_session_link}">{message.online_session_name}</a>'
            f"\n{online_session_status_icon} وضعیت: {message.online_session_status}"
            f"\n🚀 زمان شروع: {message.online_session_start}"
            f"\n🏁 زمان پایان: {message.online_session_end}"
        )
    # Assuming 'sentAt' field exists in PublicMessage but wasn't shown in the provided code
    date = (
        f"\n\n🕑  {message.sent_at}"
        if hasattr(message, "sent_at") and message.sent_at
        else ""
    )

    white_space = "‌"  # Zero-width non-joiner character

    message_html = (
        f"{course_name}"
        f"{author}"
        f"{header}"
        f"{text}"
        f"{footer}"
        f"{exercise_description}"
        f"{attachment_description}"
        f"{online_session_description}"
        f"{date}"
        f"{white_space}\n"
    )

    return message_html