[Major][Breaking] Server side changes to handle Topic Layer

- Moved `get_course_progress` to CourseEnrollment class.
- Added Topic context to progress functions in lms.py
- Create user on creation of a student
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment.py b/erpnext/education/doctype/course_enrollment/course_enrollment.py
index dd90a5e..a70d40d 100644
--- a/erpnext/education/doctype/course_enrollment/course_enrollment.py
+++ b/erpnext/education/doctype/course_enrollment/course_enrollment.py
@@ -5,27 +5,19 @@
 from __future__ import unicode_literals
 import frappe
 from frappe.model.document import Document
+from functools import reduce
 
 class CourseEnrollment(Document):
-	
-	def get_linked_activity(self):
-		course_activity_list = frappe.get_all("Course Activity", filters={'enrollment':self.name})
-		course_activity = [frappe.get_doc("Course Activity", activity.name) for activity in course_activity_list] 
-		quiz_activity_list = frappe.get_all("Quiz Activity", filters={'enrollment':self.name})
-		quiz_activity = [frappe.get_doc("Quiz Activity", activity.name) for activity in quiz_activity_list] 
-		return course_activity, quiz_activity
+	def get_progress(self, student):
+		"""
+		Returns Progress of given student for a particular course enrollment
 
-	def get_all_activity(self):
-		courses, quizes = self.get_linked_activity()
-		joined = courses + quizes
-		activity = sorted(joined, key = lambda i: i.modified) # Sorting based on modified timestamp
-		return activity
-		
-	def check_course_completion(self):
-		pass
-
-	def get_last_activity(self):
-		if len(self.get_all_activity()) == 0:
-			return None
-		else:
-			return self.get_all_activity()[-1]
\ No newline at end of file
+			:param self: Course Enrollment Object
+			:param student: Student Object
+		"""
+		course = frappe.get_doc('Course', self.course)
+		topics = course.get_topics()
+		progress = []
+		for topic in topics:
+				progress.append(student.get_topic_progress(self.name, topic))
+		return reduce(lambda x,y: x+y, progress) # Flatten out the List
\ No newline at end of file
diff --git a/erpnext/education/doctype/student/student.py b/erpnext/education/doctype/student/student.py
index 64b6d9a..dbd154b 100644
--- a/erpnext/education/doctype/student/student.py
+++ b/erpnext/education/doctype/student/student.py
@@ -40,6 +40,9 @@
 			frappe.throw(_("Student {0} exist against student applicant {1}").format(student[0][0], self.student_applicant))
 
 	def after_insert(self):
+		self.create_student()
+		
+	def create_student(self):	
 		"""Create a website user for student creation if not already exists"""
 		if self.user == None:
 			student_user = frappe.get_doc({
@@ -56,8 +59,6 @@
 			self.user = student_user.name
 			self.save()
 			update_password_link = student_user.reset_password()
-			print(update_password_link)
-
 
 	def update_applicant_status(self):
 		"""Updates Student Applicant status to Admitted"""
@@ -66,7 +67,7 @@
 
 	def get_all_course_enrollments(self):
 		"""Returns a list of course enrollments linked with the current student"""
-		course_enrollments = frappe.get_list("Course Enrollment", filters={"student": self.name}, fields=['course', 'name'])
+		course_enrollments = frappe.get_all("Course Enrollment", filters={"student": self.name}, fields=['course', 'name'])
 		if not course_enrollments:
 			return None
 		else:
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index 01cd5f3..0aa5555 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -65,7 +65,7 @@
 	if email in ('Administrator', 'Guest'):
 		return None
 	try:
-		student_id = frappe.db.get_all("Student", {"student_email_id": email}, ["name"])[0].name
+		student_id = frappe.get_all("Student", {"student_email_id": email}, ["name"])[0].name
 		return student_id
 	except IndexError:
 		return None
@@ -78,7 +78,7 @@
 	if not student:
 		return None
 	else:
-		enrollment = frappe.get_list("Program Enrollment", filters={'student':student, 'program': program_name})
+		enrollment = frappe.get_all("Program Enrollment", filters={'student':student, 'program': program_name})
 		if enrollment:
 			return enrollment[0].name
 		else:
@@ -122,14 +122,14 @@
 	return bool(activity)
 
 def check_content_completion(content_name, content_type, enrollment_name):
-	activity = frappe.get_list("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
+	activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
 	if activity:
 		return True
 	else:
 		return False
 
 def check_quiz_completion(quiz, enrollment_name):
-	attempts = frappe.get_list("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"])
+	attempts = frappe.get_all("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"])
 	status = bool(len(attempts) == quiz.max_attempts)
 	score = None
 	result = None
diff --git a/erpnext/www/lms.py b/erpnext/www/lms.py
index 2af6ca9..def75a4 100644
--- a/erpnext/www/lms.py
+++ b/erpnext/www/lms.py
@@ -70,12 +70,12 @@
 	return courses
 
 @frappe.whitelist()
-def get_next_content(content, content_type, course):
+def get_next_content(current_content, current_content_type, topic):
 	if frappe.session.user == "Guest":
 		return None
-	course_doc = frappe.get_doc("Course", course)
-	content_list = [{'content_type':item.content_type, 'content':item.content} for item in course_doc.get_all_children()]
-	current_index = content_list.index({'content': content, 'content_type': content_type})
+	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': current_content, 'content_type': current_content_type})
 	try:
 		# print(content_list[current_index + 1])
 		return content_list[current_index + 1]
@@ -166,26 +166,22 @@
 		activity.save()
 		frappe.db.commit()
 
-def get_course_progress(course_enrollment):
-	student_id = utils.get_current_student()
-	student = frappe.get_doc("Student", student_id)
-	course = frappe.get_doc('Course', course_enrollment.course)
-	topics = course.get_topics()
-	progress = []
-	for topic in topics:
-			progress.append(student.get_topic_progress(course_enrollment.name, topic))
-	return progress
-
 @frappe.whitelist()
 def get_course_meta(course_name, program_name):
+	"""
+	Return the porgress of a course in a program as well as the content to continue from.
+		:param course_name: 
+		:param program_name: 
+	"""
 	course_enrollment = utils.get_course_enrollment(course_name)
 	program_enrollment = utils.get_program_enrollment(program_name)
+	student = frappe.get_doc("Student", utils.get_current_student())
 	if not program_enrollment:
 		return None
 	if not course_enrollment:
 		utils.enroll_in_course(course_name, program_name)
-	progress = get_course_progress(course_enrollment)
-	count = sum([act['is_complete'] for act in progress])
+	progress = course_enrollment.get_progress(student)
+	count = sum([activity['is_complete'] for activity in progress])
 	if count == 0:
 		return {'flag':'Start Course', 'content_type': progress[0]['content_type'], 'content': progress[0]['content']}
 	elif count == len(progress):
@@ -198,7 +194,7 @@
 def get_program_progress(program_name):
 	import math
 	program = frappe.get_doc("Program", program_name)
-	program_enrollment = frappe.get_list("Program Enrollment", filters={'student': utils.get_current_student(), 'program': program_name })[0].name
+	program_enrollment = utils.get_program_enrollment(program_name)
 	program_meta = {}
 	if not program_enrollment:
 		return None
@@ -224,15 +220,16 @@
 @frappe.whitelist()
 def get_quiz_progress(program_name):
 	program = frappe.get_doc("Program", program_name)
-	program_enrollment = frappe.get_list("Program Enrollment", filters={'student': utils.get_current_student(), 'program': program_name })[0].name
+	program_enrollment = utils.get_program_enrollment(program_name)
 	quiz_meta = frappe._dict()
+	student = frappe.get_doc("Student", utils.get_current_student())
 	if not program_enrollment:
 		return None
 	else:
 		progress_list = []
 		for course in program.get_all_children():
 			course_enrollment = utils.get_course_enrollment(course.course)
-			meta = get_course_progress(course_enrollment)
+			meta = course_enrollment.get_progress(student)
 			for progress_item in meta:
 				# if progress_item['content_type'] == "Quiz" and progress_item['is_complete'] == True:
 				if progress_item['content_type'] == "Quiz":