Merge pull request #681 from pateljannat/notify-mentions

feat: misc changes
This commit is contained in:
Jannat Patel
2023-11-22 17:34:44 +05:30
committed by GitHub
9 changed files with 118 additions and 18 deletions

View File

@@ -97,7 +97,7 @@ override_doctype_class = {
# Hook on document methods and events # Hook on document methods and events
doc_events = { doc_events = {
"Discussion Reply": {"after_insert": "lms.lms.utils.create_notification_log"}, "Discussion Reply": {"after_insert": "lms.lms.utils.handle_notifications"},
} }
# Scheduled Tasks # Scheduled Tasks
@@ -118,9 +118,9 @@ fixtures = ["Custom Field", "Function", "Industry"]
# Overriding Methods # Overriding Methods
# ------------------------------ # ------------------------------
# #
# override_whitelisted_methods = { override_whitelisted_methods = {
# "frappe.desk.doctype.event.event.get_events": "lms.event.get_events" # "frappe.desk.search.get_names_for_mentions": "lms.lms.utils.get_names_for_mentions",
# } }
# #
# each overriding function accepts a `data` argument; # each overriding function accepts a `data` argument;
# generated from the base implementation of the doctype dashboard, # generated from the base implementation of the doctype dashboard,

View File

@@ -64,7 +64,6 @@ class LMSBatch(Document):
def send_confirmation_mail(self): def send_confirmation_mail(self):
for student in self.students: for student in self.students:
if not student.confirmation_email_sent: if not student.confirmation_email_sent:
self.send_mail(student) self.send_mail(student)
student.confirmation_email_sent = 1 student.confirmation_email_sent = 1

View File

@@ -1,8 +1,14 @@
// Copyright (c) 2023, Frappe and contributors // Copyright (c) 2023, Frappe and contributors
// For license information, please see license.txt // For license information, please see license.txt
// frappe.ui.form.on("LMS Payment", { frappe.ui.form.on("LMS Payment", {
// refresh(frm) { onload(frm) {
frm.set_query("member", function (doc) {
// }, return {
// }); filters: {
ignore_user_type: 1,
},
};
});
},
});

View File

@@ -110,6 +110,7 @@ def quiz_summary(quiz, results):
"score_out_of": score_out_of, "score_out_of": score_out_of,
"submission": submission.name, "submission": submission.name,
"pass": percentage == quiz_details.passing_percentage, "pass": percentage == quiz_details.passing_percentage,
"percentage": percentage,
} }

View File

@@ -6,7 +6,14 @@ import razorpay
import requests import requests
from frappe import _ from frappe import _
from frappe.desk.doctype.dashboard_chart.dashboard_chart import get_result from frappe.desk.doctype.dashboard_chart.dashboard_chart import get_result
from frappe.desk.doctype.notification_log.notification_log import make_notification_logs from frappe.desk.doctype.notification_log.notification_log import (
make_notification_logs,
enqueue_create_notification,
get_title,
)
from frappe.utils import get_fullname
from frappe.desk.search import get_user_groups
from frappe.desk.notifications import extract_mentions
from frappe.utils import ( from frappe.utils import (
add_months, add_months,
cint, cint,
@@ -606,17 +613,20 @@ def validate_image(path):
return path return path
def create_notification_log(doc, method): def handle_notifications(doc, method):
topic = frappe.db.get_value( topic = frappe.db.get_value(
"Discussion Topic", "Discussion Topic",
doc.topic, doc.topic,
["reference_doctype", "reference_docname", "owner", "title"], ["reference_doctype", "reference_docname", "owner", "title"],
as_dict=1, as_dict=1,
) )
if topic.reference_doctype not in ["Course Lesson", "LMS Batch"]:
if topic.reference_doctype != "Course Lesson":
return return
create_notification_log(doc, topic)
notify_mentions(doc, topic)
def create_notification_log(doc, topic):
course = frappe.db.get_value("Course Lesson", topic.reference_docname, "course") course = frappe.db.get_value("Course Lesson", topic.reference_docname, "course")
instructors = frappe.db.get_all( instructors = frappe.db.get_all(
"Course Instructor", {"parent": course}, pluck="instructor" "Course Instructor", {"parent": course}, pluck="instructor"
@@ -643,6 +653,47 @@ def create_notification_log(doc, method):
make_notification_logs(notification, users) make_notification_logs(notification, users)
def notify_mentions(doc, topic):
mentions = extract_mentions(doc.reply)
if not mentions:
return
sender_fullname = get_fullname(doc.owner)
recipients = [
frappe.db.get_value(
"User",
{"enabled": 1, "name": name},
"email",
)
for name in mentions
]
subject = _("{0} mentioned you in a comment").format(sender_fullname)
template = "mention_template"
if topic.reference_doctype == "LMS Batch":
link = f"/batches/{topic.reference_docname}#discussions"
if topic.reference_doctype == "Course Lesson":
course = frappe.db.get_value("Course Lesson", topic.reference_docname, "course")
lesson_index = get_lesson_index(topic.reference_docname)
link = get_lesson_url(course, lesson_index)
args = {
"sender": sender_fullname,
"content": doc.reply,
"link": link,
}
for recipient in recipients:
frappe.sendmail(
recipients=recipient,
subject=subject,
template=template,
args=args,
header=[subject, "green"],
retry=3,
)
def get_lesson_count(course): def get_lesson_count(course):
lesson_count = 0 lesson_count = 0
chapters = frappe.get_all("Chapter Reference", {"parent": course}, ["chapter"]) chapters = frappe.get_all("Chapter Reference", {"parent": course}, ["chapter"])

View File

@@ -0,0 +1,11 @@
<p>
{{ _("{0} mentioned you in a comment in your batch.").format(sender) }}
</p>
<p>
<blockquote>
{{ content | markdown }}
</blockquote>
</p>
<div class="more-info">
<a href="{{ link }}">{{ _("Check Discussion") }}</a>
</div>

View File

@@ -10,9 +10,6 @@
<li> <li>
{{ _("You will have to get {0}% correct answers in order to pass the quiz.").format(quiz.passing_percentage) }} {{ _("You will have to get {0}% correct answers in order to pass the quiz.").format(quiz.passing_percentage) }}
</li> </li>
<li>
{{ _("Without passing the quiz you won't be able to complete the lesson.") }}
</li>
{% endif %} {% endif %}
{% if quiz.max_attempts %} {% if quiz.max_attempts %}

View File

@@ -134,6 +134,9 @@ const quiz_summary = (e = undefined) => {
$(".quiz-footer span").addClass("hide"); $(".quiz-footer span").addClass("hide");
$("#quiz-form").prepend( $("#quiz-form").prepend(
`<div class="summary bold-heading text-center"> `<div class="summary bold-heading text-center">
${__("You got")} ${data.message.percentage}% ${__("correct answers")}
</div>
<div class="summary bold-heading text-center mt-2">
${__("Your score is")} ${data.message.score} ${__("Your score is")} ${data.message.score}
${__("out of")} ${data.message.score_out_of} ${__("out of")} ${data.message.score_out_of}
</div>` </div>`

View File

@@ -13,7 +13,39 @@ def get_context(context):
submission = frappe.form_dict["submission"] submission = frappe.form_dict["submission"]
quiz_name = frappe.form_dict["quiz"] quiz_name = frappe.form_dict["quiz"]
context.quiz = frappe.get_doc("LMS Quiz", quiz_name) quiz = frappe.db.get_value(
"LMS Quiz",
quiz_name,
[
"name",
"title",
"max_attempts",
"show_answers",
"show_submission_history",
"passing_percentage",
],
as_dict=True,
)
quiz.questions = []
fields = ["name", "question", "type", "multiple"]
for num in range(1, 5):
fields.append(f"option_{num}")
fields.append(f"is_correct_{num}")
fields.append(f"explanation_{num}")
fields.append(f"possibility_{num}")
questions = frappe.get_all(
"LMS Quiz Question",
filters={"parent": quiz.name},
fields=["question", "marks"],
order_by="idx",
)
for question in questions:
details = frappe.db.get_value("LMS Question", question.question, fields, as_dict=1)
details["marks"] = question.marks
quiz.questions.append(details)
context.quiz = quiz
if submission == "new-submission": if submission == "new-submission":
context.submission = frappe._dict() context.submission = frappe._dict()