perf: course cards get all memberships at once

This commit is contained in:
Jannat Patel
2022-09-29 16:59:08 +05:30
parent 41a9e422d5
commit 246b26079b
9 changed files with 82 additions and 47 deletions

View File

@@ -199,7 +199,9 @@ jinja = {
"lms.lms.utils.has_course_moderator_role", "lms.lms.utils.has_course_moderator_role",
"lms.lms.utils.get_certificates", "lms.lms.utils.get_certificates",
"lms.lms.utils.format_number", "lms.lms.utils.format_number",
"lms.lms.utils.get_lesson_count" "lms.lms.utils.get_lesson_count",
"lms.lms.utils.get_all_memberships",
"lms.lms.utils.get_course_membership"
], ],
"filters": [] "filters": []
} }

View File

@@ -10,12 +10,3 @@ from frappe import _
class LMSSettings(Document): class LMSSettings(Document):
pass pass
@frappe.whitelist()
def check_profile_restriction():
force_profile_completion = frappe.db.get_single_value("LMS Settings", "force_profile_completion")
user = frappe.db.get_value("User", frappe.session.user, ["profile_complete", "username"], as_dict=True)
return {
"restrict": force_profile_completion and not user.profile_complete,
"username": user.username,
"prefix": frappe.get_hooks("profile_url_prefix")[0] or "/users/"
}

View File

@@ -138,8 +138,10 @@ def get_students(course, batch=None):
"course": course, "course": course,
"member_type": "Student" "member_type": "Student"
} }
if batch: if batch:
filters["batch"] = batch filters["batch"] = batch
return frappe.get_all( return frappe.get_all(
"LMS Batch Membership", "LMS Batch Membership",
filters, filters,
@@ -515,3 +517,26 @@ def get_lesson_count(course):
lesson_count += frappe.db.count("Lesson Reference", {"parent": chapter.chapter}) lesson_count += frappe.db.count("Lesson Reference", {"parent": chapter.chapter})
return lesson_count return lesson_count
def check_profile_restriction():
return frappe.db.get_single_value("LMS Settings", "force_profile_completion")
def get_restriction_details():
user = frappe.db.get_value("User", frappe.session.user, ["profile_complete", "username"], as_dict=True)
return {
"restrict": not user.profile_complete,
"username": user.username,
"prefix": frappe.get_hooks("profile_url_prefix")[0] or "/users/"
}
def get_all_memberships(member):
return frappe.get_all("LMS Batch Membership", {
"member": member
}, ["name", "course", "batch", "current_lesson", "member_type", "progress"])
def get_course_membership(course, memberships):
current_membership = list(filter(lambda x: x.course == course, memberships))
return current_membership[0] if len(current_membership) else None

View File

@@ -1,5 +1,8 @@
{% set membership = get_membership(course.name, frappe.session.user) %} {% set memberships = get_all_memberships(frappe.session.user) %}
{% set membership = get_course_membership(course.name, memberships) %}
{% set progress = frappe.utils.cint(membership.progress) %} {% set progress = frappe.utils.cint(membership.progress) %}
<div class="common-card-style course-card" data-course="{{ course.name }}"> <div class="common-card-style course-card" data-course="{{ course.name }}">
<div class="course-image {% if not course.image %} default-image {% endif %}" <div class="course-image {% if not course.image %} default-image {% endif %}"
@@ -14,6 +17,7 @@
{% endif %} {% endif %}
</div> </div>
<div class="course-card-content"> <div class="course-card-content">
<div class="course-card-meta"> <div class="course-card-meta">
{% set lesson_count = get_lesson_count(course.name) %} {% set lesson_count = get_lesson_count(course.name) %}
@@ -112,13 +116,7 @@
{% set query_parameter = "?batch=" + membership.batch if membership and {% set query_parameter = "?batch=" + membership.batch if membership and
membership.batch else "" %} membership.batch else "" %}
{% if progress == 100 %} {% if progress != 100 and membership and not course.upcoming %}
<a class="stretched-link" href="/courses/{{ course.name }}"></a>
{% elif course.upcoming %}
<a class="stretched-link" href="/courses/{{ course.name }}"></a>
{% elif membership %}
<a class="stretched-link" href="{{ get_lesson_url(course.name, lesson_index) }}{{ query_parameter }}"></a> <a class="stretched-link" href="{{ get_lesson_url(course.name, lesson_index) }}{{ query_parameter }}"></a>
{% else %} {% else %}

View File

@@ -368,7 +368,8 @@ input[type=checkbox] {
} }
.course-home-page .course-home-outline { .course-home-page .course-home-outline {
margin: 5rem 0 4rem; margin-top: 5rem;
padding-bottom: 4rem;
} }
.course-home-page { .course-home-page {
@@ -1739,3 +1740,10 @@ li {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
.indicator-pill.green::before {
height: 0;
width: 0;
border-radius: 0;
margin-right: 0;
}

View File

@@ -1,5 +1,4 @@
import frappe import frappe
from lms.lms.doctype.lms_settings.lms_settings import check_profile_restriction
from lms.lms.utils import get_membership, has_course_moderator_role, is_instructor, is_certified, get_evaluation_details, redirect_to_courses_list from lms.lms.utils import get_membership, has_course_moderator_role, is_instructor, is_certified, get_evaluation_details, redirect_to_courses_list
def get_context(context): def get_context(context):
@@ -46,7 +45,6 @@ def set_course_context(context, course_name):
membership = get_membership(course.name, frappe.session.user) membership = get_membership(course.name, frappe.session.user)
context.course.query_parameter = "?batch=" + membership.batch if membership and membership.batch else "" context.course.query_parameter = "?batch=" + membership.batch if membership and membership.batch else ""
context.membership = membership context.membership = membership
context.restriction = check_profile_restriction()
context.show_start_learing_cta = show_start_learing_cta(course, membership, context.restriction) context.show_start_learing_cta = show_start_learing_cta(course, membership, context.restriction)
context.certificate = is_certified(course.name) context.certificate = is_certified(course.name)
eval_details = get_evaluation_details(course.name) eval_details = get_evaluation_details(course.name)

View File

@@ -1,13 +1,20 @@
{% extends "templates/base.html" %} {% extends "templates/base.html" %}
{% block title %}{{ 'Courses' }}{% endblock %}
{% block title %}
{{ 'Courses' }}
{% endblock %}
{% block head_include %} {% block head_include %}
{% include "public/icons/symbol-defs.svg" %} {% include "public/icons/symbol-defs.svg" %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="common-page-style"> <div class="common-page-style">
<div class="container"> <div class="container">
{% if restriction.restrict %} {% if restriction %}
{% set profile_link = "<a href='/edit-profile'> profile </a>" %} {% set profile_link = "<a href='/edit-profile'> profile </a>" %}
<div class="empty-state"> <div class="empty-state">
<div class="course-home-headings text-center mb-0" style="color: inherit;"> <div class="course-home-headings text-center mb-0" style="color: inherit;">

View File

@@ -1,11 +1,16 @@
import frappe import frappe
from frappe import _ from frappe import _
from lms.lms.doctype.lms_settings.lms_settings import check_profile_restriction from lms.lms.utils import check_profile_restriction, get_restriction_details
def get_context(context): def get_context(context):
context.no_cache = 1 context.no_cache = 1
context.live_courses, context.upcoming_courses = get_courses() context.live_courses, context.upcoming_courses = get_courses()
context.restriction = check_profile_restriction() context.restriction = check_profile_restriction()
if context.restriction:
context.restriction_details = get_restriction_details()
context.metatags = { context.metatags = {
"title": _("All Live Courses"), "title": _("All Live Courses"),
"image": frappe.db.get_single_value("Website Settings", "banner_image"), "image": frappe.db.get_single_value("Website Settings", "banner_image"),
@@ -13,6 +18,7 @@ def get_context(context):
"keywords": "All Courses, Courses, Learn" "keywords": "All Courses, Courses, Learn"
} }
def get_courses(): def get_courses():
courses = frappe.get_all("LMS Course", courses = frappe.get_all("LMS Course",
filters={"published": True}, filters={"published": True},