diff --git a/lms/job/doctype/job_opportunity/job_opportunity.json b/lms/job/doctype/job_opportunity/job_opportunity.json index b0637b5f..b1684238 100644 --- a/lms/job/doctype/job_opportunity/job_opportunity.json +++ b/lms/job/doctype/job_opportunity/job_opportunity.json @@ -114,7 +114,8 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2022-07-28 13:41:29.224332", + "make_attachments_public": 1, + "modified": "2022-09-14 12:47:20.840223", "modified_by": "Administrator", "module": "Job", "name": "Job Opportunity", @@ -152,4 +153,4 @@ "sort_order": "DESC", "states": [], "title_field": "job_title" -} +} \ No newline at end of file diff --git a/lms/lms/doctype/lms_course/lms_course.json b/lms/lms/doctype/lms_course/lms_course.json index 1a12c77a..f2e4ce4a 100644 --- a/lms/lms/doctype/lms_course/lms_course.json +++ b/lms/lms/doctype/lms_course/lms_course.json @@ -260,7 +260,8 @@ "link_fieldname": "course" } ], - "modified": "2022-05-19 16:59:21.933367", + "make_attachments_public": 1, + "modified": "2022-09-14 13:26:53.153822", "modified_by": "Administrator", "module": "LMS", "name": "LMS Course", diff --git a/lms/lms/doctype/lms_course/lms_course.py b/lms/lms/doctype/lms_course/lms_course.py index f6008f3d..b3bd9987 100644 --- a/lms/lms/doctype/lms_course/lms_course.py +++ b/lms/lms/doctype/lms_course/lms_course.py @@ -9,12 +9,14 @@ from ...utils import generate_slug from frappe.utils import flt, cint from lms.lms.utils import get_chapters + class LMSCourse(Document): def validate(self): self.validate_instructors() self.validate_status() + def validate_instructors(self): if self.is_new() and not self.instructors: frappe.get_doc({ @@ -25,14 +27,17 @@ class LMSCourse(Document): "parenttype": "LMS Course" }).save(ignore_permissions=True) + def validate_status(self): if self.published: self.status = "Approved" + def on_update(self): if not self.upcoming and self.has_value_changed("upcoming"): self.send_email_to_interested_users() + def send_email_to_interested_users(self): interested_users = frappe.get_all("LMS Course Interest", { "course": self.name @@ -67,6 +72,7 @@ class LMSCourse(Document): def __repr__(self): return f"" + def has_mentor(self, email): """Checks if this course has a mentor with given email. """ @@ -76,6 +82,7 @@ class LMSCourse(Document): mapping = frappe.get_all("LMS Course Mentor Mapping", {"course": self.name, "mentor": email}) return mapping != [] + def add_mentor(self, email): """Adds a new mentor to the course. """ @@ -96,7 +103,6 @@ class LMSCourse(Document): doc.insert() - def get_student_batch(self, email): """Returns the batch the given student is part of. @@ -115,6 +121,7 @@ class LMSCourse(Document): fieldname="batch") return batch_name and frappe.get_doc("LMS Batch", batch_name) + def get_batches(self, mentor=None): batches = frappe.get_all("LMS Batch", {"course": self.name}) if mentor: @@ -126,17 +133,21 @@ class LMSCourse(Document): batch_names = {m.batch for m in memberships} return [b for b in batches if b.name in batch_names] + def get_cohorts(self): return frappe.get_all("Cohort", {"course": self.name}, order_by="creation") + def get_cohort(self, cohort_slug): name = frappe.get_value("Cohort", {"course": self.name, "slug": cohort_slug}) return name and frappe.get_doc("Cohort", name) + def reindex_exercises(self): for i, c in enumerate(get_chapters(self.name), start=1): self._reindex_exercises_in_chapter(c, i) + def _reindex_exercises_in_chapter(self, c, index): i = 1 for lesson in self.get_lessons(c): @@ -146,12 +157,14 @@ class LMSCourse(Document): exercise.save() i += 1 + def get_all_memberships(self, member): all_memberships = frappe.get_all("LMS Batch Membership", {"member": member, "course": self.name}, ["batch"]) for membership in all_memberships: membership.batch_title = frappe.db.get_value("LMS Batch", membership.batch, "title") return all_memberships + @frappe.whitelist() def reindex_exercises(doc): course_data = json.loads(doc) @@ -159,6 +172,7 @@ def reindex_exercises(doc): course.reindex_exercises() frappe.msgprint("All exercises in this course have been re-indexed.") + @frappe.whitelist(allow_guest=True) def search_course(text): search_courses = [] @@ -184,6 +198,7 @@ def search_course(text): return courses + @frappe.whitelist() def submit_for_review(course): chapters = frappe.get_all("Chapter Reference", {"parent": course}) @@ -209,8 +224,8 @@ def save_course(tags, title, short_introduction, video_link, description, course "image": image, "description": description, "tags": tags, - "published": published, - "upcoming": upcoming + "published": cint(published), + "upcoming": cint(upcoming) }) doc.save(ignore_permissions=True) return doc.name diff --git a/lms/lms/widgets/Reviews.html b/lms/lms/widgets/Reviews.html index 89904e55..db871e54 100644 --- a/lms/lms/widgets/Reviews.html +++ b/lms/lms/widgets/Reviews.html @@ -9,7 +9,7 @@ {% elif not is_instructor(course.name) and frappe.session.user == "Guest" %} {{ _("Login") }} - {% elif not is_instructor(course.name) and not membership %} + {% elif not is_instructor(course.name) and not membership and course.status == "Approved" %}
{{ _("Start Learning") }}
{% endif %} diff --git a/lms/public/css/style.css b/lms/public/css/style.css index e4b39e55..f42a7e66 100644 --- a/lms/public/css/style.css +++ b/lms/public/css/style.css @@ -1545,7 +1545,7 @@ li { } } -[contenteditable] { +[contenteditable="true"] { outline: none; background-color: var(--bg-light-gray); border-radius: var(--border-radius); @@ -1554,7 +1554,7 @@ li { color: var(--gray-900); } -[contenteditable]:empty:before { +[contenteditable="true"]:empty:before { content: attr(data-placeholder); color: var(--gray-600); } @@ -1592,7 +1592,7 @@ li { padding: 0.5rem 0; } -.course-card-pills[contenteditable] { +.course-card-pills[contenteditable="true"] { box-shadow: none; } diff --git a/lms/templates/certificate.html b/lms/templates/certificate.html index 6851422d..245970cb 100644 --- a/lms/templates/certificate.html +++ b/lms/templates/certificate.html @@ -26,7 +26,7 @@ {{ instructors }}
-
{{ _("Course Instructor") }}
+
{{ _("Course Instructor") }}
{% endif %} @@ -36,7 +36,7 @@ {{ frappe.utils.format_date(certificate.expiry_date, "medium") }}
-
{{ _("Expiry date") }}
+
{{ _("Expiry date") }}
{% endif %} diff --git a/lms/www/courses/course.py b/lms/www/courses/course.py index f56f1ad2..e09aa052 100644 --- a/lms/www/courses/course.py +++ b/lms/www/courses/course.py @@ -73,4 +73,4 @@ def get_user_interest(course): def show_start_learing_cta(course, membership, restriction): - return not course.disable_self_learning and not membership and not course.upcoming and not restriction.get("restrict") and not is_instructor(course.name) + return not course.disable_self_learning and not membership and not course.upcoming and not restriction.get("restrict") and not is_instructor(course.name) and course.status == "Approved" diff --git a/lms/www/profiles/profile.html b/lms/www/profiles/profile.html index 4b636ae8..1854cd86 100644 --- a/lms/www/profiles/profile.html +++ b/lms/www/profiles/profile.html @@ -53,14 +53,16 @@
- {{ About(member) }} - {{ EducationDetails(member) }} - {{ WorkDetails(member) }} - {{ ExternalCertification(member) }} - {{ Contact(member) }} - {{ Skills(member) }} - {{ CareerPreference(member) }} - {{ ProfileTabs(profile_tabs) }} +
+ {{ About(member) }} + {{ EducationDetails(member) }} + {{ WorkDetails(member) }} + {{ ExternalCertification(member) }} + {{ Contact(member) }} + {{ Skills(member) }} + {{ CareerPreference(member) }} + {{ ProfileTabs(profile_tabs) }} +
{% if courses_created | length %} @@ -91,7 +93,7 @@ {% macro ProfileBanner(member) %} {% set cover_image = member.cover_image if member.cover_image else "/assets/lms/images/profile-banner.png" %} -{% set enrollment = get_course_membership(None, member_type="Student") | length %} +{% set enrollment = get_course_membership(member.name, member_type="Student") | length %} {% set enrollment_suffix = _("Courses") if enrollment > 1 else _("Course") %}
@@ -194,236 +196,202 @@ {% macro About(member) %} -
-
-
{{ _("About") }}
-
- {% if member.bio %} - {{ member.bio }} - {% else %} - {{ _("Hey, my name is ") }} {{ member.full_name }} - {% endif %} -
-
+
{{ _("About") }}
+
+ {% if member.bio %} + {{ member.bio }} + {% else %} + {{ _("Hey, my name is ") }} {{ member.full_name }} + {% endif %}
{% endmacro %} {% macro WorkPreference(member) %} -
-
-
{{ _("Work Preference") }}
-
{{ member.attire }}
-
{{ member.collaboration }}
-
{{ member.role }}
-
{{ member.location_preference }}
-
{{ member.time }}
-
{{ member.company_type }}
-
-
+
{{ _("Work Preference") }}
+
{{ member.attire }}
+
{{ member.collaboration }}
+
{{ member.role }}
+
{{ member.location_preference }}
+
{{ member.time }}
+
{{ member.company_type }}
{% endmacro %} {% macro CareerPreference(member) %} -{% if member.preferred_functions or member.preferred_industries or member.preferred_location or member.dream_companies %} -
-
- -
{{ _("Career Preference") }}
-
- - {% if member.preferred_functions | length %} -
- {{ _("Preferred Functions:") }} - {% for function in member.preferred_functions %} -
{{ function.function }}
- {% endfor %} -
- {% endif %} - - {% if member.preferred_industries | length %} -
- {{ _("Preferred Industries:") }} - {% for industry in member.preferred_industries %} -
{{ industry.industry }}
- {% endfor %} -
- {% endif %} - - {% if member.preferred_location %} -
- {{ _("Preferred Locations:") }} -
{{ member.preferred_location }}
-
- {% endif %} - - {% if member.dream_companies %} -
- {{ _("Dream Companies:") }} -
{{ member.dream_companies }}
-
- {% endif %} + {% if member.preferred_functions or member.preferred_industries or member.preferred_location or member.dream_companies %} +
{{ _("Career Preference") }}
+
+ {% if member.preferred_functions | length %} +
+ {{ _("Preferred Functions:") }} + {% for function in member.preferred_functions %} +
{{ function.function }}
+ {% endfor %}
+ {% endif %} + + {% if member.preferred_industries | length %} +
+ {{ _("Preferred Industries:") }} + {% for industry in member.preferred_industries %} +
{{ industry.industry }}
+ {% endfor %} +
+ {% endif %} + + {% if member.preferred_location %} +
+ {{ _("Preferred Locations:") }} +
{{ member.preferred_location }}
+
+ {% endif %} + + {% if member.dream_companies %} +
+ {{ _("Dream Companies:") }} +
{{ member.dream_companies }}
+
+ {% endif %} +
-
-{% endif %} + {% endif %} {% endmacro %} {% macro Contact(member) %} -{% if member.linkedin or member.medium or member.github %} -
-
-
{{ _("Contact") }}
-
- {% if member.linkedin %} - {% set linkedin = member.linkedin[:-1] if member.linkedin[-1] == "/" else member.linkedin %} - - {{ linkedin.split("/")[-1] }} - - {% endif %} + {% if member.linkedin or member.medium or member.github %} +
{{ _("Contact") }}
+
+ {% if member.linkedin %} + {% set linkedin = member.linkedin[:-1] if member.linkedin[-1] == "/" else member.linkedin %} + + {{ linkedin.split("/")[-1] }} + + {% endif %} - {% if member.medium %} - - {{ member.medium.split("/")[-1] }} - - {% endif %} + {% if member.medium %} + + {{ member.medium.split("/")[-1] }} + + {% endif %} - {% if member.github %} - - {{ member.github.split("/")[-1] }} - - {% endif %} + {% if member.github %} + + {{ member.github.split("/")[-1] }} + + {% endif %} -
-
-{% endif %} + {% endif %} {% endmacro %} {% macro Skills(member) %} -{% if member.skill | length %} -
-
-
{{ _("Skills")}}
-
- {% for skill in member.skill %} -
{{ skill.skill_name }}
- {% endfor %} -
+ {% if member.skill | length %} +
{{ _("Skills")}}
+
+ {% for skill in member.skill %} +
{{ skill.skill_name }}
+ {% endfor %}
-
-{% endif %} + {% endif %} {% endmacro %} {% macro EducationDetails(member) %} -{% if member.education %} -
-
-
{{ _("Education") }}
- -
- {% for edu in member.education %} -
-
{{ edu.institution_name }}
-
{{ edu.degree_type }} {{ edu.major }} - {% if not member.hide_private %} - - {% if edu.grade %} {{ edu.grade }} {% endif %} - {% endif %} -
- -
- {% if edu.start_date %} - {{ frappe.utils.format_date(edu.start_date, "MMM YYYY") }} - - {% endif %} - {{ frappe.utils.format_date(edu.end_date, "MMM YYYY") }} -
-
{{ edu.location }}
+ {% if member.education %} +
{{ _("Education") }}
+
+ {% for edu in member.education %} +
+
{{ edu.institution_name }}
+
{{ edu.degree_type }} {{ edu.major }} + {% if not member.hide_private %} + + {% if edu.grade %} {{ edu.grade }} {% endif %} + {% endif %}
- {% endfor %} + +
+ {% if edu.start_date %} + {{ frappe.utils.format_date(edu.start_date, "MMM YYYY") }} - + {% endif %} + {{ frappe.utils.format_date(edu.end_date, "MMM YYYY") }} +
+
{{ edu.location }}
+ {% endfor %}
-
-{% endif %} + {% endif %} {% endmacro %} {% macro WorkDetails(member) %} -{% set work_details = member.work_experience + member.internship %} + {% set work_details = member.work_experience + member.internship %} -{% if work_details | length %} -
-
-
{{ _("Work Experience") }}
-
+ {% if work_details | length %} +
{{ _("Work Experience") }}
+
- {% for work in work_details %} -
-
{{ work.title }}
-
{{ work.company }}
-
- {{ frappe.utils.format_date(work.from_date, "MMM YYYY") }} - - {% if work.to_date %} {{ frappe.utils.format_date(work.to_date, "MMM YYYY") }} - {% else %} Present {% endif %} -
- -
{{ work.location }}
- - {% if work.description %} -
- {{ work.description }} -
- {% endif %} + {% for work in work_details %} +
+
{{ work.title }}
+
{{ work.company }}
+
+ {{ frappe.utils.format_date(work.from_date, "MMM YYYY") }} - + {% if work.to_date %} {{ frappe.utils.format_date(work.to_date, "MMM YYYY") }} + {% else %} Present {% endif %}
- {% endfor %} +
{{ work.location }}
+ + {% if work.description %} +
+ {{ work.description }} +
+ {% endif %}
+ {% endfor %} +
-
-{% endif %} + {% endif %} {% endmacro %} {% macro ExternalCertification(member) %} -{% if member.certification %} -
-
-
{{ _("External Certification") }}
-
- {% for cert in member.certification %} -
+ {% if member.certification %} +
{{ _("External Certification") }}
+
+ {% for cert in member.certification %} +
-
{{ cert.certification_name }}
-
{{ cert.organization }}
+
{{ cert.certification_name }}
+
{{ cert.organization }}
-
- {{ frappe.utils.format_date(cert.issue_date, "MMM YYYY") }} - {% if cert.expiration_date %} - - {{ frappe.utils.format_date(cert.expiration_date, "MMM YYYY") }} - {% endif %} -
- - {% if cert.description %} -
- {{ cert.description }} -
+
+ {{ frappe.utils.format_date(cert.issue_date, "MMM YYYY") }} + {% if cert.expiration_date %} + - {{ frappe.utils.format_date(cert.expiration_date, "MMM YYYY") }} {% endif %} -
- {% endfor %} + + {% if cert.description %} +
+ {{ cert.description }} +
+ {% endif %} +
+ {% endfor %}
-
-{% endif %} + {% endif %} {% endmacro %}