Merge pull request #1015 from pateljannat/course-completion-funnel
chore: analytics for course completion
This commit is contained in:
@@ -117,6 +117,7 @@ import { BookOpen, Users, Star } from 'lucide-vue-next'
|
|||||||
import { computed, inject } from 'vue'
|
import { computed, inject } from 'vue'
|
||||||
import { Button, createResource } from 'frappe-ui'
|
import { Button, createResource } from 'frappe-ui'
|
||||||
import { createToast } from '@/utils/'
|
import { createToast } from '@/utils/'
|
||||||
|
import { capture } from '@/telemetry'
|
||||||
import { useRouter } from 'vue-router'
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -155,6 +156,9 @@ function enrollStudent() {
|
|||||||
course: props.course.data.name,
|
course: props.course.data.name,
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
capture('enrolled_in_course', {
|
||||||
|
course: props.course.data.name,
|
||||||
|
})
|
||||||
createToast({
|
createToast({
|
||||||
title: 'Enrolled Successfully',
|
title: 'Enrolled Successfully',
|
||||||
icon: 'check',
|
icon: 'check',
|
||||||
|
|||||||
@@ -7,5 +7,4 @@ from frappe.utils.telemetry import capture
|
|||||||
|
|
||||||
|
|
||||||
class CourseChapter(Document):
|
class CourseChapter(Document):
|
||||||
def after_insert(self):
|
pass
|
||||||
capture("chapter_created", "lms")
|
|
||||||
|
|||||||
@@ -24,9 +24,6 @@ class CourseLesson(Document):
|
|||||||
for section in dynamic_documents:
|
for section in dynamic_documents:
|
||||||
self.update_lesson_name_in_document(section)
|
self.update_lesson_name_in_document(section)
|
||||||
|
|
||||||
def after_insert(self):
|
|
||||||
capture("lesson_created", "lms")
|
|
||||||
|
|
||||||
def update_lesson_name_in_document(self, section):
|
def update_lesson_name_in_document(self, section):
|
||||||
doctype_map = {"Exercise": "LMS Exercise", "Quiz": "LMS Quiz"}
|
doctype_map = {"Exercise": "LMS Exercise", "Quiz": "LMS Quiz"}
|
||||||
macros = find_macros(self.body)
|
macros = find_macros(self.body)
|
||||||
@@ -116,6 +113,8 @@ def save_progress(lesson, course):
|
|||||||
).save(ignore_permissions=True)
|
).save(ignore_permissions=True)
|
||||||
|
|
||||||
progress = get_course_progress(course)
|
progress = get_course_progress(course)
|
||||||
|
capture_progress_for_analytics(progress, course)
|
||||||
|
|
||||||
# Had to get doc, as on_change doesn't trigger when you use set_value. The trigger is necesary for badge to get assigned.
|
# Had to get doc, as on_change doesn't trigger when you use set_value. The trigger is necesary for badge to get assigned.
|
||||||
enrollment = frappe.get_doc("LMS Enrollment", membership)
|
enrollment = frappe.get_doc("LMS Enrollment", membership)
|
||||||
enrollment.progress = progress
|
enrollment.progress = progress
|
||||||
@@ -125,6 +124,11 @@ def save_progress(lesson, course):
|
|||||||
return progress
|
return progress
|
||||||
|
|
||||||
|
|
||||||
|
def capture_progress_for_analytics(progress, course):
|
||||||
|
if progress in [25, 50, 75, 100]:
|
||||||
|
capture("course_progress", "lms", {"course": course, "progress": progress})
|
||||||
|
|
||||||
|
|
||||||
def get_quiz_progress(lesson):
|
def get_quiz_progress(lesson):
|
||||||
lesson_details = frappe.db.get_value(
|
lesson_details = frappe.db.get_value(
|
||||||
"Course Lesson", lesson, ["body", "content"], as_dict=1
|
"Course Lesson", lesson, ["body", "content"], as_dict=1
|
||||||
|
|||||||
@@ -48,9 +48,6 @@ class LMSCourse(Document):
|
|||||||
if not self.upcoming and self.has_value_changed("upcoming"):
|
if not self.upcoming and self.has_value_changed("upcoming"):
|
||||||
self.send_email_to_interested_users()
|
self.send_email_to_interested_users()
|
||||||
|
|
||||||
def after_insert(self):
|
|
||||||
capture("course_created", "lms")
|
|
||||||
|
|
||||||
def send_email_to_interested_users(self):
|
def send_email_to_interested_users(self):
|
||||||
interested_users = frappe.get_all(
|
interested_users = frappe.get_all(
|
||||||
"LMS Course Interest", {"course": self.name}, ["name", "user"]
|
"LMS Course Interest", {"course": self.name}, ["name", "user"]
|
||||||
|
|||||||
@@ -17,8 +17,7 @@ def get_context():
|
|||||||
csrf_token = frappe.sessions.get_csrf_token()
|
csrf_token = frappe.sessions.get_csrf_token()
|
||||||
frappe.db.commit() # nosemgrep
|
frappe.db.commit() # nosemgrep
|
||||||
context.csrf_token = csrf_token
|
context.csrf_token = csrf_token
|
||||||
if frappe.session.user != "Guest":
|
capture("active_site", "lms")
|
||||||
capture("active_site", "lms")
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user