import frappe import erpnext.education.utils as utils no_cache = 1 def get_context(context): # Load Query Parameters try: program = frappe.form_dict["program"] content = frappe.form_dict["content"] content_type = frappe.form_dict["type"] course = frappe.form_dict["course"] topic = frappe.form_dict["topic"] except KeyError: frappe.local.flags.redirect_location = "/lms" raise frappe.Redirect # Check if user has access to the content has_program_access = utils.allowed_program_access(program) has_content_access = allowed_content_access(program, content, content_type) if frappe.session.user == "Guest" or not has_program_access or not has_content_access: frappe.local.flags.redirect_location = "/lms" raise frappe.Redirect # Set context for content to be displayer context.content = frappe.get_doc(content_type, content).as_dict() context.content_type = content_type context.program = program context.course = course context.topic = topic topic = frappe.get_doc("Topic", topic) content_list = [ {"content_type": item.content_type, "content": item.content} for item in topic.topic_content ] # Set context for progress numbers context.position = content_list.index({"content": content, "content_type": content_type}) context.length = len(content_list) # Set context for navigation context.previous = get_previous_content(content_list, context.position) context.next = get_next_content(content_list, context.position) def get_next_content(content_list, current_index): try: return content_list[current_index + 1] except IndexError: return None def get_previous_content(content_list, current_index): if current_index == 0: return None else: return content_list[current_index - 1] def allowed_content_access(program, content, content_type): contents_of_program = frappe.db.sql( """select `tabTopic Content`.content, `tabTopic Content`.content_type from `tabCourse Topic`, `tabProgram Course`, `tabTopic Content` where `tabCourse Topic`.parent = `tabProgram Course`.course and `tabTopic Content`.parent = `tabCourse Topic`.topic and `tabProgram Course`.parent = %(program)s""", {"program": program}, ) return (content, content_type) in contents_of_program