Fixed course and content page
diff --git a/erpnext/education/doctype/course_enrollment/course_enrollment.json b/erpnext/education/doctype/course_enrollment/course_enrollment.json
index 5de7f21..a5b4289 100644
--- a/erpnext/education/doctype/course_enrollment/course_enrollment.json
+++ b/erpnext/education/doctype/course_enrollment/course_enrollment.json
@@ -62,7 +62,7 @@
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
- "in_standard_filter": 0,
+ "in_standard_filter": 1,
"label": "Student",
"length": 0,
"no_copy": 0,
@@ -190,7 +190,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2018-11-07 21:16:34.764628",
+ "modified": "2018-11-09 19:23:07.967967",
"modified_by": "Administrator",
"module": "Education",
"name": "Course Enrollment",
diff --git a/erpnext/public/js/education/academy/components/AcademyCourseCard.vue b/erpnext/public/js/education/academy/components/AcademyCourseCard.vue
index eda382f..16ffc55 100644
--- a/erpnext/public/js/education/academy/components/AcademyCourseCard.vue
+++ b/erpnext/public/js/education/academy/components/AcademyCourseCard.vue
@@ -11,29 +11,13 @@
</ul>
</span>
</div>
- <div v-if="$root.$data.isLogin" class='course-buttons text-center col-xs-4 col-sm-3 col-md-2'>
- <!-- <AcademyCourseCardButton
- v-if="this.$root.$data.checkProgramEnrollment(this.$route.params.code)"
- :course="course.name"
- :nextContent="nextContent"
- :nextContentType="nextContentType"
- /> -->
-
+ <div class='course-buttons text-center col-xs-4 col-sm-3 col-md-2'>
<a-button
- v-if="showCompleted"
- type="success"
- size="sm"
+ :type="buttonType"
+ size="sm btn-block"
:route="firstContentRoute"
>
- Completed
- </a-button>
- <a-button
- v-if="showStart"
- type="primary"
- size="sm"
- :route="firstContentRoute"
- >
- Start
+ {{ courseMeta.flag }}
</a-button>
</div>
</div>
@@ -42,44 +26,36 @@
</template>
<script>
-import AButton from './Button';
+import AButton from './Button.vue';
import AcademyCourseCardButton from './AcademyCourseCardButton.vue'
export default {
- props: ['course'],
+ props: ['course', 'courseMeta', 'program_name'],
name: "AcademyCourseCard",
- data() {
- return {
- nextContent: '',
- nextContentType: ''
- }
- },
- mounted() {
- if(this.$root.$data.checkLogin()) {
- frappe.call({
- method: "erpnext.www.academy.get_starting_content",
- args: {
- course_name: this.course.name
- }
- }).then(r => {
- this.nextContent = r.message.content,
- this.nextContentType = r.message.content_type
- });
- }
- },
components: {
AcademyCourseCardButton,
AButton
},
computed: {
showStart() {
- return academy.loggedIn && !this.course.completed;
+ return academy.loggedIn && !this.courseMeta.flag == "Completed";
},
showCompleted() {
- return academy.loggedIn && this.course.completed;
+ return academy.loggedIn && this.courseMeta.flag == "Completed";
},
firstContentRoute() {
- return `${course.name}/${course.content_type}/${data.content}`
+ return `${this.program_name}/${this.course.name}/${this.courseMeta.content_type}/${this.courseMeta.content}`
+ },
+ buttonType() {
+ if (this.courseMeta.flag == "Start" ){
+ return "primary"
+ }
+ else if (this.courseMeta.flag == "Complete" ) {
+ return "success"
+ }
+ else {
+ return "info"
+ }
}
}
};
diff --git a/erpnext/public/js/education/academy/components/AcademyCourseCardButton.vue b/erpnext/public/js/education/academy/components/AcademyCourseCardButton.vue
index b0d8859..698eca0 100644
--- a/erpnext/public/js/education/academy/components/AcademyCourseCardButton.vue
+++ b/erpnext/public/js/education/academy/components/AcademyCourseCardButton.vue
@@ -13,7 +13,7 @@
},
computed: {
getButtonName: function() {
- if(this.$root.$data.checkCourseCompletion(this.course)){
+ if(academy.store.checkCourseCompletion(this.course)){
return 'Completed'
}
else{
@@ -21,7 +21,7 @@
}
},
getClassName: function() {
- if(this.$root.$data.checkCourseCompletion(this.course)){
+ if(academy.store.checkCourseCompletion(this.course)){
return 'btn-success'
}
}
diff --git a/erpnext/public/js/education/academy/components/AcademyTopSectionButton.vue b/erpnext/public/js/education/academy/components/AcademyTopSectionButton.vue
index 8cc3a7b..2bab29d 100644
--- a/erpnext/public/js/education/academy/components/AcademyTopSectionButton.vue
+++ b/erpnext/public/js/education/academy/components/AcademyTopSectionButton.vue
@@ -8,7 +8,7 @@
data() {
return {
buttonName: '',
- isLoggedIn: this.$root.$data.checkLogin(),
+ isLoggedIn: academy.store.checkLogin(),
nextContent: '',
nextContentType: '',
nextCourse: '',
@@ -20,7 +20,7 @@
frappe.call({
method: "erpnext.www.academy.get_continue_data",
args: {
- program_name: this.$route.params.code
+ program_name: this.$route.params.program_name
}
}).then( r => {
this.nextContent = r.message.content,
@@ -30,7 +30,7 @@
}
if(this.isLoggedIn){
- if(this.$root.$data.checkProgramEnrollment(this.$route.params.code)){
+ if(academy.store.checkProgramEnrollment(this.$route.params.program_name)){
if(this.$route.name == 'home'){
this.buttonName = 'Explore Courses'
}
@@ -51,18 +51,18 @@
if(this.$route.name == 'home'){
return
}
- else if(this.$route.name == 'program' && this.$root.$data.checkProgramEnrollment(this.$route.params.code)){
- this.$router.push({ name: 'content', params: { code: this.$route.params.code, course: this.nextCourse, type: this.nextContentType, content: this.nextContent}})
+ else if(this.$route.name == 'program' && academy.store.checkProgramEnrollment(this.$route.params.program_name)){
+ this.$router.push({ name: 'content', params: { program_name: this.$route.params.program_name, course: this.nextCourse, type: this.nextContentType, content: this.nextContent}})
}
else {
frappe.call({
method: "erpnext.www.academy.enroll_in_program",
args:{
- program_name: this.$route.params.code,
+ program_name: this.$route.params.program_name,
student_email_id: frappe.session.user
}
})
- this.$root.$data.updateEnrolledPrograms()
+ academy.store.updateEnrolledPrograms()
}
},
}
diff --git a/erpnext/public/js/education/academy/components/ContentNavigation.vue b/erpnext/public/js/education/academy/components/ContentNavigation.vue
index 7fa20a5..8c8280c 100644
--- a/erpnext/public/js/education/academy/components/ContentNavigation.vue
+++ b/erpnext/public/js/education/academy/components/ContentNavigation.vue
@@ -16,7 +16,7 @@
frappe.call({
method: "erpnext.www.academy.add_activity",
args: {
- enrollment: this.$root.$data.enrolledCourses[this.$route.params.course],
+ enrollment: academy.store.enrolledCourses[this.$route.params.course],
content_type: this.$route.params.type,
content: this.$route.params.content
}
@@ -29,7 +29,7 @@
frappe.call({
method: "erpnext.www.academy.add_activity",
args: {
- enrollment: this.$root.$data.enrolledCourses[this.$route.params.course],
+ enrollment: academy.store.enrolledCourses[this.$route.params.course],
content_type: this.$route.params.type,
content: this.$route.params.content
}
@@ -38,12 +38,12 @@
frappe.call({
method: "erpnext.www.academy.mark_course_complete",
args: {
- enrollment: this.$root.$data.enrolledCourses[this.$route.params.course]
+ enrollment: academy.store.enrolledCourses[this.$route.params.course]
}
})
- // this.$root.$data.addCompletedCourses(this.$route.params.course)
- this.$root.$data.updateCompletedCourses()
- this.$router.push({ name: 'program', params: { code: this.$route.params.code}})
+ // academy.store.addCompletedCourses(this.$route.params.course)
+ academy.store.updateCompletedCourses()
+ this.$router.push({ name: 'program', params: { program_name: this.$route.params.program_name}})
//
academy.trigger('course-completed', course_name);
diff --git a/erpnext/public/js/education/academy/components/ContentQuiz.vue b/erpnext/public/js/education/academy/components/ContentQuiz.vue
index 7044d76..b13b5e6 100644
--- a/erpnext/public/js/education/academy/components/ContentQuiz.vue
+++ b/erpnext/public/js/education/academy/components/ContentQuiz.vue
@@ -72,7 +72,7 @@
frappe.call({
method: "erpnext.www.academy.evaluate_quiz",
args: {
- enrollment: this.$root.$data.enrolledCourses[this.$route.params.course],
+ enrollment: academy.store.enrolledCourses[this.$route.params.course],
quiz_response: this.quizResponse,
quiz_name: this.content
}
diff --git a/erpnext/public/js/education/academy/pages/AcademyCoursePage.vue b/erpnext/public/js/education/academy/pages/AcademyCoursePage.vue
index ca5434b..81cf4ff 100644
--- a/erpnext/public/js/education/academy/pages/AcademyCoursePage.vue
+++ b/erpnext/public/js/education/academy/pages/AcademyCoursePage.vue
@@ -12,7 +12,7 @@
import ContentNavigation from "../components/ContentNavigation.vue"
export default {
- props:['code', 'course', 'type', 'content'],
+ props:['program_name', 'course', 'type', 'content'],
name: "AcademyCoursePage",
data() {
return{
diff --git a/erpnext/public/js/education/academy/pages/AcademyProgramPage.vue b/erpnext/public/js/education/academy/pages/AcademyProgramPage.vue
index 7bea1ed..607524a 100644
--- a/erpnext/public/js/education/academy/pages/AcademyProgramPage.vue
+++ b/erpnext/public/js/education/academy/pages/AcademyProgramPage.vue
@@ -1,12 +1,11 @@
<template>
<div>
<AcademyTopSection v-bind:title="program.program_name" v-bind:description="program.description">
- <!-- <AcademyTopSectionButton/> -->
- <a-button @click="startCourse">Start Course</a-button>
- <a-button @click="continueCourse">Continue Course</a-button>
+ <!-- <a-button @click="startCourse">Start Course</a-button>
+ <a-button @click="continueCourse">Continue Course</a-button> -->
</AcademyTopSection>
<AcademyList :title="'Courses'" :description="''">
- <AcademyCourseCard v-for="course in course_list" :course="course" :key="course.name"/>
+ <AcademyCourseCard v-for="course in course_data" :course="course.course" :program_name="program_name" :courseMeta="course.meta" :key="course.meta.flag"/>
</AcademyList>
</div>
</template>
@@ -15,7 +14,6 @@
import AcademyTopSection from "../components/AcademyTopSection.vue"
import AcademyList from "../components/AcademyList.vue"
import AcademyCourseCard from "../components/AcademyCourseCard.vue"
-import AcademyTopSectionButton from "../components/AcademyTopSectionButton.vue";
export default {
@@ -25,26 +23,25 @@
AButton: Button,
AcademyTopSection,
AcademyList,
- AcademyCourseCard,
- AcademyTopSectionButton
+ AcademyCourseCard
},
data() {
return {
program: {},
- course_list: []
+ course_data: []
}
},
beforeMount() {
- if(this.$root.$data.isLogin) this.$root.$data.updateCompletedCourses()
+ if(academy.store.isLogin) academy.store.updateCompletedCourses()
},
mounted() {
this.getProgramDetails().then(data => this.program = data);
- this.getCourses().then(data => this.course_list = data);
+ this.getCourses().then(data => this.course_data = data);
- academy.on(`course-completed`, (course_name) => {
- const course = this.course_list.findIndex(c => c.name === course_name);
- this.course_list[course].completed = true;
- });
+ // academy.on(`course-completed`, (course_name) => {
+ // const course = this.course_data.findIndex(c => c.name === course_name);
+ // this.course_data[course].completed = true;
+ // });
},
methods: {
startCourse() {
diff --git a/erpnext/public/js/education/academy/routes.js b/erpnext/public/js/education/academy/routes.js
index 7896b1d..8e4e865 100644
--- a/erpnext/public/js/education/academy/routes.js
+++ b/erpnext/public/js/education/academy/routes.js
@@ -5,7 +5,7 @@
const routes = [
{name: 'home', path: '', component: AcademyHome},
{name: 'program', path: '/Program/:program_name', component: AcademyProgramPage, props: true},
- {name: 'content', path: '/Program/:code/:course/:type/:content', component: AcademyCoursePage, props: true},
+ {name: 'content', path: '/Program/:program_name/:course/:type/:content', component: AcademyCoursePage, props: true},
];
export default routes;
\ No newline at end of file
diff --git a/erpnext/www/academy.py b/erpnext/www/academy.py
index 87eabcb..48cbbc4 100644
--- a/erpnext/www/academy.py
+++ b/erpnext/www/academy.py
@@ -33,6 +33,14 @@
is_enrolled = check_program_enrollment(program_name)
return {'program': program, 'is_enrolled': is_enrolled}
+@frappe.whitelist(allow_guest=True)
+def get_program_details(program_name):
+ try:
+ program = frappe.get_doc('Program', program_name)
+ return program
+ except:
+ return None
+
def get_enrollment(course_name):
student = get_student_id(frappe.session.user)
@@ -68,14 +76,6 @@
# Functions to get program & course details
@frappe.whitelist(allow_guest=True)
-def get_program_details(program_name):
- try:
- program = frappe.get_doc('Program', program_name)
- return program
- except:
- return None
-
-@frappe.whitelist(allow_guest=True)
def get_courses(program_name):
program = frappe.get_doc('Program', program_name)
courses = program.get_course_list()
@@ -84,6 +84,8 @@
@frappe.whitelist()
def get_continue_content(course_name):
+ if(frappe.session.user == "Guest"):
+ return None
enrollment = get_enrollment(course_name)
course = frappe.get_doc("Course", enrollment.course)
last_activity = enrollment.get_last_activity()
@@ -203,15 +205,16 @@
@frappe.whitelist()
def enroll_all_courses_in_program(program_enrollment, student):
- course_list = [course.name for course in get_courses(program_enrollment.program)]
+ program = frappe.get_doc("Program", program_enrollment.program)
+ course_list = [course.course for course in program.get_all_children()]
for course_name in course_list:
student.enroll_in_course(course_name=course_name, program_enrollment=program_enrollment.name)
@frappe.whitelist()
-def enroll_in_program(program_name, student_email_id):
- if(not get_student_id(student_email_id)):
- create_student(student_email_id)
- student = frappe.get_doc("Student", get_student_id(student_email_id))
+def enroll_in_program(program_name):
+ if(not get_student_id(frappe.session.user)):
+ create_student(frappe.session.user)
+ student = frappe.get_doc("Student", get_student_id(frappe.session.user))
program_enrollment = student.enroll_in_program(program_name)
enroll_all_courses_in_program(program_enrollment, student)