feat: content navigation and activity tracking working

This commit is contained in:
Shivam Mishra 2019-05-30 18:05:00 +05:30
parent 3336fb595c
commit e94e9d2b06
4 changed files with 76 additions and 70 deletions

View File

@ -62,8 +62,9 @@ class CourseEnrollment(Document):
}).insert()
def add_activity(self, content_type, content):
if check_activity_exists(self.name, content_type, content):
pass
activity = check_activity_exists(self.name, content_type, content)
if activity:
return activity
else:
activity = frappe.get_doc({
"doctype": "Course Activity",
@ -72,8 +73,13 @@ class CourseEnrollment(Document):
"content": content,
"activity_date": frappe.utils.datetime.datetime.now()
})
activity.insert()
activity.insert(ignore_permissions=True)
return activity.name
def check_activity_exists(enrollment, content_type, content):
activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment, 'content_type': content_type, 'content': content})
return bool(activity)
if activity:
return activity[0].name
else:
return None

View File

@ -77,7 +77,7 @@ def get_portal_programs():
is_published and (student_is_enrolled or student_can_self_enroll)
Returns:
list of objects: List of all programs and to be displayed on the portal along with enrollment status
list of dictionary: List of all programs and to be displayed on the portal along with access rights
"""
published_programs = frappe.get_all("Program", filters={"is_published": True})
if not published_programs:
@ -170,40 +170,34 @@ def enroll_in_program(program_name, student=None):
return program_enrollment.name
def has_super_access():
"""Check if user has a role that allows full access to LMS
Returns:
bool: true if user has access to all lms content
"""
current_user = frappe.get_doc('User', frappe.session.user)
roles = set([role.role for role in current_user.roles])
return bool(roles & {'Administrator', 'Instructor', 'Education Manager', 'System Manager', 'Academic User'})
# def get_program_enrollment(program_name):
# """
# Function to get program enrollments for a particular student for a program
# """
# student get_current_student()
# if not student:
# return None
# else:
# enrollment = frappe.get_all("Program Enrollment", filters={'student':student.name, 'program': program_name})
# if enrollment:
# return enrollment[0].name
# else:
# return None
@frappe.whitelist()
def add_activity(course, content_type, content):
if has_super_access():
return None
# def get_program_and_enrollment_status(program_name):
# program = frappe.get_doc('Program', program_name)
# is_enrolled = bool(get_program_enrollment(program_name)) or check_super_access()
# return {'program': program, 'is_enrolled': is_enrolled}
student = get_current_student()
if not student:
return frappe.throw("Student with email {0} does not exist".format(frappe.session.user), frappe.DoesNotExistError)
# def get_course_enrollment(course_name):
# student = get_current_student()
# if not student:
# return None
# enrollment_name = frappe.get_all("Course Enrollment", filters={'student': student.name, 'course':course_name})
# try:
# name = enrollment_name[0].name
# enrollment = frappe.get_doc("Course Enrollment", name)
# return enrollment
# except:
# return None
course_enrollment = get_enrollment("course", course, student.name)
print(course_enrollment)
if not course_enrollment:
return None
enrollment = frappe.get_doc('Course Enrollment', course_enrollment)
if content_type == 'Quiz':
return
else:
return enrollment.add_activity(content_type, content)
def create_student_from_current_user():
user = frappe.get_doc("User", frappe.session.user)

View File

@ -34,19 +34,19 @@
{% macro navigation() %}
<div class="row">
<div class="col-md-7">
<h1>{{ content.name }}</h1>
<h1>{{ content.name }} <span class="small text-muted">({{ position + 1 }}/{{length}})</span></h1>
</div>
<div class="col-md-5 text-right">
{% if previous %}
<a href="/lms/content?course={{ course }}&topic={{ topic }}&type={{ previous.content_type }}&content={{ previous.content }}" class='btn btn-outline-secondary'>Previous</a>
<a href="/lms/content?program={{ program }}&course={{ course }}&topic={{ topic }}&type={{ previous.content_type }}&content={{ previous.content }}" class='btn btn-outline-secondary'>Previous</a>
{% else %}
<a href="/lms/course?name={{ course }}" class='btn btn-outline-secondary'>Back to Course</a>
<a href="/lms/course?name={{ course }}&program={{ program }}" class='btn btn-outline-secondary'>Back to Course</a>
{% endif %}
{% if next %}
<button id="nextButton" onclick="handle('/lms/content?course={{ course }}&topic={{ topic }}&type={{ next.content_type }}&content={{ next.content }}')" class='btn btn-primary' disabled="true">Next</button>
<button id="nextButton" onclick="handle('/lms/content?program={{ program }}&course={{ course }}&topic={{ topic }}&type={{ next.content_type }}&content={{ next.content }}')" class='btn btn-primary' disabled="true">Next</button>
{% else %}
<button id="nextButton" onclick="handle('/lms/course?name={{ course }}')" class='btn btn-primary' disabled="true">Finish Topic</button>
<button id="nextButton" onclick="handle('/lms/course?name={{ course }}&program={{ program }}')" class='btn btn-primary' disabled="true">Finish Topic</button>
{% endif %}
</div>
</div>
@ -126,13 +126,18 @@
})
function handle(url) {
frappe.call("add_activity",
{
opts = {
method: "erpnext.education.utils.add_activity",
args: {
course: "{{ course }}",
content_type: "{{ content_type }}",
content: "{{ content.name }}",
content: "{{ content.name }}"
}
)
}
frappe.call(opts).then(res => {
window.location.href = url;
})
}
</script>
{% endblock %}

View File

@ -5,10 +5,19 @@ import frappe
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)
@ -16,46 +25,38 @@ def get_context(context):
frappe.local.flags.redirect_location = '/lms'
raise frappe.Redirect
# Set context for content to be displayer
context.content = frappe.get_doc(content_type, content)
context.content_type = content_type
context.program = program
context.course = course
context.topic = topic
context.course = frappe.form_dict['course']
context.topic = frappe.form_dict['topic']
context.previous = get_previous_content(context.topic, context.course, context.content, context.content_type)
context.next = get_next_content(context.topic, context.course, context.content, context.content_type)
def get_next_content(topic, course, content, content_type):
if frappe.session.user == "Guest":
return None
topic = frappe.get_doc("Topic", topic)
content_list = [{'content_type':item.doctype, 'content':item.name} for item in topic.get_contents()]
current_index = content_list.index({'content': content.name, 'content_type': content_type})
# 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(topic, course, content, content_type):
if frappe.session.user == "Guest":
return None
topic = frappe.get_doc("Topic", topic)
content_list = [{'content_type':item.doctype, 'content':item.name} for item in topic.get_contents()]
current_index = content_list.index({'content': content.name, 'content_type': content_type})
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):
# Get all content in program
# Using ORM
# course_in_program = [course.course for course in frappe.get_all('Program Course', fields=['course'], filters={'parent': program})]
# topics_in_course = [topic.topic for topic in frappe.get_all("Course Topic", fields=['topic'], filters=[['parent','in', course_in_program]])]
# contents_of_program = [[c.content, c.content_type] for c in frappe.get_all('Topic Content', fields=['content', 'content_type'], filters=[['parent','in', topics_in_course]])]
contents_of_program = frappe.db.sql("""select `tabtopic content`.content, `tabtopic content`.content_type
from `tabcourse topic`,
`tabprogram course`,