feat: added student profile page
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py
index 22cca86..d232e47 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.py
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py
@@ -96,29 +96,6 @@
 		quiz_progress.program = self.program
 		return quiz_progress
 
-	def get_program_progress(self):
-		import math
-		program = frappe.get_doc("Program", self.program)
-		program_progress = {}
-		progress = []
-		for course in program.get_all_children():
-			course_progress = lms.get_student_course_details(course.course, self.program)
-			is_complete = False
-			if course_progress['flag'] == "Completed":
-				is_complete = True
-			progress.append({'course_name': course.course_name, 'name': course.course, 'is_complete': is_complete})
-
-		program_progress['progress'] = progress
-		program_progress['name'] = self.program
-		program_progress['program'] = frappe.get_value("Program", self.program, 'program_name')
-
-		try:
-			program_progress['percentage'] = math.ceil((sum([item['is_complete'] for item in progress] * 100)/len(progress)))
-		except ZeroDivisionError:
-			program_progress['percentage'] = 0
-
-		return program_progress
-
 @frappe.whitelist()
 def get_program_courses(doctype, txt, searchfield, start, page_len, filters):
 	if filters.get('program'):
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index 3352b51..ac7294b 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -239,7 +239,7 @@
 	status, score, result = check_quiz_completion(quiz, course_enrollment)
 	return {'questions': questions, 'activity': {'is_complete': status, 'score': score, 'result': result}}
 
-def get_student_topic_details(topic, course_name, program):
+def get_topic_progress(topic, course_name, program):
 	"""
 	Return the porgress of a course in a program as well as the content to continue from.
 		:param topic_name:
@@ -260,7 +260,7 @@
 	elif count < len(progress):
 		return {'completed': False, 'started': True}
 
-def get_student_course_details(course, program):
+def get_course_progress(course, program):
 	"""
 	Return the porgress of a course in a program as well as the content to continue from.
 		:param topic_name:
@@ -269,16 +269,14 @@
 	course_progress = []
 	for course_topic in course.topics:
 		topic = frappe.get_doc("Topic", course_topic.topic)
-		progress = get_student_topic_details(topic, course.name, program)
+		progress = get_topic_progress(topic, course.name, program)
 		if progress:
 			course_progress.append(progress)
-
 	if course_progress:
 		number_of_completed_topics = sum([activity['completed'] for activity in course_progress])
 		total_topics = len(course_progress)
-		print("course_progress", course_progress)
-		print("number_of_completed_topics", number_of_completed_topics)
-		print("total_topics", total_topics)
+		if total_topics == 1:
+			return course_progress[0]
 		if number_of_completed_topics == 0:
 			return {'completed': False, 'started': False}
 		if number_of_completed_topics == total_topics:
@@ -288,6 +286,47 @@
 
 	return None
 
+def get_program_progress(program):
+	program_progress = []
+	if not program.courses:
+		return None
+	for program_course in program.courses:
+		course = frappe.get_doc("Course", program_course.course)
+		progress = get_course_progress(course, program.name)
+		if progress:
+			progress['name'] = course.name
+			progress['course'] = course.course_name
+			program_progress.append(progress)
+
+	if program_progress:
+		return program_progress
+
+	return None
+
+def get_program_completion(program):
+	topics = frappe.db.sql("""select `tabcourse topic`.topic, `tabcourse topic`.parent
+	from `tabcourse topic`,
+		 `tabprogram course`
+	where `tabcourse topic`.parent = `tabprogram course`.course
+			and `tabprogram course`.parent = '{0}'""".format(program.name))
+
+	progress = []
+	for topic in topics:
+		topic_doc = frappe.get_doc('Topic', topic[0])
+		topic_progress = get_topic_progress(topic_doc, topic[1], program.name)
+		if topic_progress:
+			progress.append(topic_progress)
+
+	if progress:
+		number_of_completed_topics = sum([activity['completed'] for activity in progress if activity])
+		total_topics = len(progress)
+		try:
+			return int((float(number_of_completed_topics)/total_topics)*100)
+		except ZeroDivisionError:
+			return 0
+
+	return 0
+
 def create_student_from_current_user():
 	user = frappe.get_doc("User", frappe.session.user)
 
diff --git a/erpnext/www/lms/course.py b/erpnext/www/lms/course.py
index f59c28c..e7ed2e3 100644
--- a/erpnext/www/lms/course.py
+++ b/erpnext/www/lms/course.py
@@ -15,5 +15,5 @@
 	context.progress = get_topic_progress(context.topics, course, context.program)
 
 def get_topic_progress(topics, course, program):
-	progress = {topic.name: utils.get_student_topic_details(topic, course.name, program) for topic in topics}
+	progress = {topic.name: utils.get_topic_progress(topic, course.name, program) for topic in topics}
 	return progress
diff --git a/erpnext/www/lms/profile.html b/erpnext/www/lms/profile.html
new file mode 100644
index 0000000..c642265
--- /dev/null
+++ b/erpnext/www/lms/profile.html
@@ -0,0 +1,56 @@
+{% extends "templates/base.html" %}
+{% block title %}Profile{% endblock %}
+{% from "www/lms/macros/hero.html" import hero %}
+
+{% macro card(program) %}
+<div class="col-sm-4 mb-4 text-left">
+	<a href="/lms/program?program={{ program.name }}" class="no-decoration no-underline">
+	<div class="card h-100">
+		<div class='card-body'>
+			<h5 class='card-title'>{{ program.program }}</h5>
+			<ul class="list-unstyled text-muted">
+				{% for course in program.progress %}
+				<li>
+					{% if course.completed %} <span class="indicator green">
+					{% elif course.started %} <span class="indicator orange">
+					{% else %} <span class="indicator blue">{{ course }}</span>
+					{% endif %}
+						<a class="text-muted" href="/lms/course?program={{ program.name }}&name={{ course.course }}">{{ course.course }}</a>
+					</span>
+				</li>
+				{% endfor %}
+			</ul>
+		</div>
+		<div class='card-footer'>
+			<span class="small">{{ program.completion }}% Complete</span>
+		</div>
+	</div>
+	</a>
+</div>
+{% endmacro %}
+
+{% block content %}
+<section class="section">
+	<div class='container pb-5'>
+		<div class="mb-3 row">
+			<div class="col-md-7">
+				<a href="/lms" class="text-muted">
+					<i class="fa fa-chevron-left"></i> Back to Home
+				</a>
+			</div>
+			<div class="col-md-5 text-right">
+				<a href="/update-profile?name={{ frappe.session.user }}" target="blank" class="mt-0 text-muted">Edit Profile</a>
+			</div>
+		</div>
+		<h1>{{ student.first_name }} {{ student.last_name or '' }}</h1>
+		<p class="lead" style="max-width: 100%;">{{ student.name }}</p>
+	</div>
+	<div class='container'>
+		<div class="row mt-5">
+			{% for program in progress %}
+				{{ card(program) }}
+			{% endfor %}
+		</div>
+	</div>
+</section>
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/www/lms/profile.py b/erpnext/www/lms/profile.py
new file mode 100644
index 0000000..1a0decc
--- /dev/null
+++ b/erpnext/www/lms/profile.py
@@ -0,0 +1,24 @@
+from __future__ import unicode_literals
+import erpnext.education.utils as utils
+import frappe
+
+no_cache = 1
+
+def get_context(context):
+	context.student = utils.get_current_student()
+	context.progress = get_program_progress(context.student.name)
+
+def get_program_progress(student):
+	enrolled_programs = frappe.get_all("Program Enrollment", filters={'student':student}, fields=['program'])
+	student_progress = []
+	for list_item in enrolled_programs:
+		program = frappe.get_doc("Program", list_item.program)
+		progress = utils.get_program_progress(program)
+		completion = utils.get_program_completion(program)
+		student_progress.append({'program': program.program_name, 'name': program.name, 'progress':progress, 'completion': completion})
+
+	return student_progress
+
+
+
+
diff --git a/erpnext/www/lms/program.py b/erpnext/www/lms/program.py
index 1242336..a92ec31 100644
--- a/erpnext/www/lms/program.py
+++ b/erpnext/www/lms/program.py
@@ -18,5 +18,5 @@
 		frappe.throw(_("Program {0} does not exist.".format(program_name)))
 
 def get_course_progress(courses, program):
-	progress = {course.name: utils.get_student_course_details(course, program) for course in courses}
+	progress = {course.name: utils.get_course_progress(course, program) for course in courses}
 	return progress
\ No newline at end of file