diff --git a/erpnext/education/doctype/lms_activity/__init__.py b/erpnext/education/doctype/lms_activity/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/education/doctype/lms_activity/lms_activity.json b/erpnext/education/doctype/lms_activity/lms_activity.json new file mode 100644 index 0000000000..f7bc30b10a --- /dev/null +++ b/erpnext/education/doctype/lms_activity/lms_activity.json @@ -0,0 +1,208 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2018-10-08 10:59:58.325210", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "course_name", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Course Name", + "length": 0, + "no_copy": 0, + "options": "Course", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_from": "", + "fieldname": "lesson_name", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Lesson Name", + "length": 0, + "no_copy": 0, + "options": "Content", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "quiz_score", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Quiz Score", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Unattempted", + "fieldname": "quiz_status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Quiz Status", + "length": 0, + "no_copy": 0, + "options": "\nUnattempted\nPassed\nFailed", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "lesson_status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Lesson Status", + "length": 0, + "no_copy": 0, + "options": "\nOngoing\nCompleted", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2018-10-08 12:48:34.394511", + "modified_by": "Administrator", + "module": "Education", + "name": "LMS Activity", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0, + "track_views": 0 +} \ No newline at end of file diff --git a/erpnext/education/doctype/lms_activity/lms_activity.py b/erpnext/education/doctype/lms_activity/lms_activity.py new file mode 100644 index 0000000000..cff70cbd8b --- /dev/null +++ b/erpnext/education/doctype/lms_activity/lms_activity.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class LMSActivity(Document): + pass diff --git a/erpnext/www/lms/__init__.py b/erpnext/www/lms/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/www/lms/course.html b/erpnext/www/lms/course.html new file mode 100644 index 0000000000..4538b9f573 --- /dev/null +++ b/erpnext/www/lms/course.html @@ -0,0 +1,63 @@ +{% extends "frappe_theme/templates/base.html" %} +{% block title %}ERPNext Academy{% endblock %} + +{% from "templates/includes/media.html" import media %} + +{% block head_include %} + + +{% endblock %} + +{% macro video(id) %} +
+ +
+{% endmacro %} + +{% block content %} +
+
+ {% if lesson.video_url is defined %} + {{ video("lesson,video") }} + {% endif %} +
+
+

{{ lesson.name }}

+ + 49 Mins + — Published on 28th October 2018. + +
+
+ Previous + Next +
+
+
+
+
+{% for lesson in lesson_list %} + {{ lesson }} +{% endfor %} +
+
+
+ {{ lesson.content }} +
+ + +
+ +
+ + +{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/course.py b/erpnext/www/lms/course.py new file mode 100644 index 0000000000..453c9c7905 --- /dev/null +++ b/erpnext/www/lms/course.py @@ -0,0 +1,2 @@ +# current_module = frappe.get_doc("Course", frappe.form_dict["lesson"]) +# current_lesson = frappe.get_doc("Lesson", frappe.form_dict["lesson"]) \ No newline at end of file diff --git a/erpnext/www/lms/index.css b/erpnext/www/lms/index.css new file mode 100644 index 0000000000..22be3be59e --- /dev/null +++ b/erpnext/www/lms/index.css @@ -0,0 +1,101 @@ +.page-content { + padding-bottom: 0px !important; +} + +.dashboard-section { + margin: auto; + max-width: 90%; +} + +.dashboard-section h1 { + font-size: 1.5em; +} + +@media(min-width: 768px) { + .dashboard-section { + max-width: 80%; + } +} + +@media(min-width: 992px) { + .dashboard-section { + max-width: 65%; + } +} + +.hero-content h1 { + font-size: 1.85em; + font-weight: 300; +} + +.hero { + border-bottom: 0px; +} + +.erp-hero { + border-bottom: 1px solid #e1e9f0; +} + +.hero-content p { + margin-bottom: 100px; +} + +.navbar { + border-bottom: 0px; +} + +.main-illustration { + margin: -90px 0 -60px -32px; + min-height: 420px; +} + +.hero-title { + font-size: 32px; +} + +@media screen and (max-width: 750px) { + .main-illustration { + min-height: inherit; + } +} + +@media screen and (max-width: 480px) { + .main-illustration { + margin: -60px 0 -20px -16px; + } + + .hero-title { + font-size: 26px; + } + + .hero-title+p { + font-size: 16px; + } +} + + +.modal-dialog { + max-width: 800px; + margin: 30px auto; +} + +.modal-body { + position: relative; + padding: 0px; + background-color: black; +} + +.close { + position: absolute; + right: -30px; + top: 0; + z-index: 999; + font-size: 2rem; + font-weight: normal; + color: #fff; + opacity: 1; +} + +.video-btn { + color: white !important; +} \ No newline at end of file diff --git a/erpnext/www/lms/index.html b/erpnext/www/lms/index.html new file mode 100644 index 0000000000..1974d4f569 --- /dev/null +++ b/erpnext/www/lms/index.html @@ -0,0 +1,87 @@ +{% extends "frappe_theme/templates/base.html" %} +{% block title %}ERPNext Academy{% endblock %} + +{% from "templates/includes/media.html" import media %} + +{% block head_include %} + + +{% endblock %} + +{% macro featured_card(program_name, description, hero_image, code) %} +
+
+ +
+ +
{{ program_name }}
+
+
{{ description }}
+
+ +
+
+{% endmacro %} + +{% block content %} +
+
+
+ +
+

Become an ERPNext Expert

+ +

+ A platform for enterpreneurs, developers and implementors to learn the world's leading 100% Open + Source ERP

+

+ + Enroll Now +

+
+ +
+
+

Featured Programs

+

Master ERPNext with our Expert Learning Paths

+ {% for program in featured %} + {{ featured_card(program.program_name, program.description, program.hero_image, program.program_code) }} + {% endfor %} +
+ View All +
+
+
+ +{% include "www/lms/templates/includes/highlights.html" %} +
+ + +
+ + +{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/index.js b/erpnext/www/lms/index.js new file mode 100644 index 0000000000..8fcda6e1e0 --- /dev/null +++ b/erpnext/www/lms/index.js @@ -0,0 +1,30 @@ +$(function () { + setTimeout(function () { + $(".later").fadeIn(); + }, 1000); +}); + +$(document).ready(function () { + + var $videoSrc; + // Gets the video src from the data-src on each button + $('.video-btn').click(function () { + $videoSrc = $(this).attr("data-src"); + console.log($videoSrc); + }); + console.log($videoSrc); + + + // when the modal is opened autoplay it + $('#myModal').on('shown.bs.modal', function (e) { + + // set the video src to autoplay and not to show related video. Youtube related video is like a box of chocolates... you never know what you're gonna get + $("#ytplayer").attr('src', "https://www.youtube.com/embed/" + $videoSrc + "?autoplay=0"); + }) + // stop playing the youtube video when I close the modal + $('#myModal').on('hide.bs.modal', function (e) { + // a poor man's stop video + $("#ytplayer").attr('src', $videoSrc); + }) + // document ready +}); \ No newline at end of file diff --git a/erpnext/www/lms/index.py b/erpnext/www/lms/index.py new file mode 100644 index 0000000000..16772a4f5d --- /dev/null +++ b/erpnext/www/lms/index.py @@ -0,0 +1,5 @@ +from __future__ import unicode_literals +import frappe + +def get_context(context): + context.featured = frappe.get_all('Program', filters={'is_featured': 1}, fields=['program_name', 'program_code', 'description', 'hero_image']) \ No newline at end of file diff --git a/erpnext/www/lms/program.html b/erpnext/www/lms/program.html new file mode 100644 index 0000000000..e079b4155a --- /dev/null +++ b/erpnext/www/lms/program.html @@ -0,0 +1,70 @@ +{% extends "frappe_theme/templates/base.html" %} +{% block title %}ERPNext Academy{% endblock %} + +{% block head_include %} + + +{% endblock %} + +{% macro course_card(name) %} +
+
+
+
+
{{ name }}
+ + Course Content +
    + {% for content in course_data[name] %} +
  • {{ content }}
  • + {% endfor %} +
+
+
+ +
+
+
+{% endmacro %} + +{% block content %} +
+
+
+ +
+

{{ program.program_name }}

+

{{ program.description }}

+

+ + Continue with Course 2 +

+
+ +
+
+

Courses

+

Master ERPNext with our Expert Learning Paths

+ {% for course_item in course_list %} + {{ course_card(course_item) }} + {% endfor %} +
+
+ +{% include "www/lms/templates/includes/highlights.html" %} + + + +{% endblock %} \ No newline at end of file diff --git a/erpnext/www/lms/program.py b/erpnext/www/lms/program.py new file mode 100644 index 0000000000..809e6cdd2d --- /dev/null +++ b/erpnext/www/lms/program.py @@ -0,0 +1,20 @@ +from __future__ import unicode_literals +import frappe + + +# Get the classroom's route parameter from the url +url_param = frappe.form_dict["code"] +# Get classroom from classroom_name +current_program = frappe.get_doc("Program", url_param) + +def get_context(context): + context.program = current_program + context.course_list, context.course_data = get_courses() + +def get_courses(): + course_data = {} + course_names = [program.course_name for program in current_program.courses] + program_courses = [frappe.get_doc('Course', name) for name in course_names] + for course_item in program_courses: + course_data[course_item.name] = [content_item.content for content_item in course_item.course_content if content_item.content_type in ('Video', 'Article')] + return course_names, course_data diff --git a/erpnext/www/lms/templates/includes/footer/footer.html b/erpnext/www/lms/templates/includes/footer/footer.html new file mode 100644 index 0000000000..62aabea234 --- /dev/null +++ b/erpnext/www/lms/templates/includes/footer/footer.html @@ -0,0 +1,60 @@ + + \ No newline at end of file diff --git a/erpnext/www/lms/templates/includes/highlights.html b/erpnext/www/lms/templates/includes/highlights.html new file mode 100644 index 0000000000..a97d699537 --- /dev/null +++ b/erpnext/www/lms/templates/includes/highlights.html @@ -0,0 +1,41 @@ +
+
+

Highlights

+
+
+
+
Curated Courses
+
Learning paths specifically designed for the your use cases, whether you are a user, developer + or an + implementer
+
+ +
+ +
+
+
Comprehensive Content
+
Content designed to cover all the fundamentals as well as expert tips and techniques to make + the most out of ERPNext.
+
+ +
+ +
+
+
Certification
+
ERPNext is open source and infinitely extensible. Customize it, build upon it, add your own + apps built with + Frappe Framework.
+
+ +
+
+
+
\ No newline at end of file