From 7c1c061681f12b5fa3443c1c2fd96c0b38b43d9c Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Fri, 16 Sep 2022 19:06:53 +0530 Subject: [PATCH 1/5] fix: change private files to public for company logo, user image and course image --- lms/job/doctype/job_opportunity/job_opportunity.py | 10 +++------- lms/lms/doctype/lms_course/lms_course.py | 6 +++--- lms/lms/utils.py | 9 +++++++++ lms/overrides/user.py | 7 ++++++- lms/www/profiles/profile.html | 2 +- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/lms/job/doctype/job_opportunity/job_opportunity.py b/lms/job/doctype/job_opportunity/job_opportunity.py index fbb648e6..6bff10fd 100644 --- a/lms/job/doctype/job_opportunity/job_opportunity.py +++ b/lms/job/doctype/job_opportunity/job_opportunity.py @@ -6,13 +6,15 @@ from frappe.model.document import Document from frappe.utils.user import get_system_managers from frappe import _ from frappe.utils import get_link_to_form +from lms.lms.utils import validate_image +from lms.lms.utils import validate_image class JobOpportunity(Document): def validate(self): self.validate_urls() - self.validate_logo() + self.company_logo = validate_image(self.company_logo) def validate_urls(self): @@ -20,12 +22,6 @@ class JobOpportunity(Document): frappe.utils.validate_url(self.application_link, True) - def validate_logo(self): - if "/private" in self.company_logo: - frappe.db.set_value("File", {"file_url": self.company_logo}, "is_private", 0) - frappe.db.set_value("File", {"file_url": self.company_logo}, "file_url", self.company_logo.replace("/private", "")) - self.company_logo = self.company_logo.replace("/private", "") - @frappe.whitelist() def report(job, reason): system_managers = get_system_managers(only_name=True) diff --git a/lms/lms/doctype/lms_course/lms_course.py b/lms/lms/doctype/lms_course/lms_course.py index b3bd9987..4de53314 100644 --- a/lms/lms/doctype/lms_course/lms_course.py +++ b/lms/lms/doctype/lms_course/lms_course.py @@ -5,8 +5,8 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document import json -from ...utils import generate_slug -from frappe.utils import flt, cint +from ...utils import generate_slug, validate_image +from frappe.utils import cint from lms.lms.utils import get_chapters @@ -15,7 +15,7 @@ class LMSCourse(Document): def validate(self): self.validate_instructors() self.validate_status() - + self.image = validate_image(self.image) def validate_instructors(self): if self.is_new() and not self.instructors: diff --git a/lms/lms/utils.py b/lms/lms/utils.py index 3e1da754..b5aae2c6 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -460,3 +460,12 @@ def get_certificates(member=None): return frappe.get_all("LMS Certificate", { "member": member or frappe.session.user }, ["course", "member", "issue_date", "expiry_date", "name"]) + + +def validate_image(path): + if "/private" in path: + file = frappe.get_doc("File", {"file_url": path}) + file.is_private = 0 + file.save(ignore_permissions=True) + return file.file_url + return path diff --git a/lms/overrides/user.py b/lms/overrides/user.py index 820a4be5..7273077d 100644 --- a/lms/overrides/user.py +++ b/lms/overrides/user.py @@ -6,17 +6,22 @@ import random import re from frappe import _ from frappe.website.utils import is_signup_disabled +from lms.lms.utils import validate_image import requests -from frappe.geo.country_info import get_all from lms.widgets import Widgets + class CustomUser(User): + def validate(self): super(CustomUser, self).validate() self.validate_username_characters() self.validate_skills() self.validate_completion() + self.user_image = validate_image(self.user_image) + self.cover_image = validate_image(self.cover_image) + def validate_username_characters(self): if len(self.username): diff --git a/lms/www/profiles/profile.html b/lms/www/profiles/profile.html index 1854cd86..9c083e14 100644 --- a/lms/www/profiles/profile.html +++ b/lms/www/profiles/profile.html @@ -97,7 +97,7 @@ {% set enrollment_suffix = _("Courses") if enrollment > 1 else _("Course") %}
-
+
{{ widgets.Avatar(member=member, avatar_class="avatar-square") }}
From 4ba6ea9190c79bdec02a77778d69a9f9a03d00c1 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Mon, 19 Sep 2022 10:34:49 +0530 Subject: [PATCH 2/5] fix: removed unnecessary import --- lms/job/doctype/job_opportunity/job_opportunity.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lms/job/doctype/job_opportunity/job_opportunity.py b/lms/job/doctype/job_opportunity/job_opportunity.py index 6bff10fd..643638ba 100644 --- a/lms/job/doctype/job_opportunity/job_opportunity.py +++ b/lms/job/doctype/job_opportunity/job_opportunity.py @@ -7,7 +7,6 @@ from frappe.utils.user import get_system_managers from frappe import _ from frappe.utils import get_link_to_form from lms.lms.utils import validate_image -from lms.lms.utils import validate_image class JobOpportunity(Document): From 37f2e7eeda2a1e265ea67fc09e50697129300b33 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Mon, 19 Sep 2022 17:56:49 +0530 Subject: [PATCH 3/5] fix: check if path is present --- lms/lms/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/lms/utils.py b/lms/lms/utils.py index b5aae2c6..a36f8438 100644 --- a/lms/lms/utils.py +++ b/lms/lms/utils.py @@ -463,7 +463,7 @@ def get_certificates(member=None): def validate_image(path): - if "/private" in path: + if path and "/private" in path: file = frappe.get_doc("File", {"file_url": path}) file.is_private = 0 file.save(ignore_permissions=True) From b9fe05c27f5effbff1793ff705241db471c1a089 Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Wed, 21 Sep 2022 17:37:56 +0530 Subject: [PATCH 4/5] feat: subscription add ons --- lms/subscription_utils.py | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 lms/subscription_utils.py diff --git a/lms/subscription_utils.py b/lms/subscription_utils.py new file mode 100644 index 00000000..5da134e7 --- /dev/null +++ b/lms/subscription_utils.py @@ -0,0 +1,45 @@ +import frappe + + +@frappe.whitelist(allow_guest=True) +def get_add_on_details(plan: str) -> dict[str, int]: + """ + Returns the number of courses and course members to be billed under add-ons for SAAS subscription + """ + + return { + "courses": get_add_on_courses(plan), + "members": get_add_on_members(plan) + } + + +def get_published_courses() -> int: + return frappe.db.count("LMS Course", {"published": 1}) + + +def get_add_on_courses(plan: str) -> int: + COURSE_LIMITS = {"Lite": 5, "Essential": 20} + add_on_courses = 0 + courses_included_in_plans = COURSE_LIMITS.get(plan) + + if courses_included_in_plans: + published_courses = get_published_courses() + add_on_courses = published_courses - courses_included_in_plans if published_courses > courses_included_in_plans else 0 + + return add_on_courses + + +def get_add_on_members(plan: str) -> int: + MEMBER_LIMITS = {"Lite": 100, "Essential": 500} + add_on_members = 0 + members_included_in_plans = MEMBER_LIMITS.get(plan) + + if members_included_in_plans: + active_members = get_members() + add_on_members = active_members - members_included_in_plans if active_members > members_included_in_plans else 0 + + return add_on_members + + +def get_members() -> int: + return frappe.db.count("LMS Batch Membership") From 247017d19aab7f28f0fbbc8f2495a2104ebc70ae Mon Sep 17 00:00:00 2001 From: Jannat Patel Date: Wed, 21 Sep 2022 20:38:56 +0530 Subject: [PATCH 5/5] fix: changed essential plan to pro --- lms/subscription_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lms/subscription_utils.py b/lms/subscription_utils.py index 5da134e7..b4d5e766 100644 --- a/lms/subscription_utils.py +++ b/lms/subscription_utils.py @@ -18,7 +18,7 @@ def get_published_courses() -> int: def get_add_on_courses(plan: str) -> int: - COURSE_LIMITS = {"Lite": 5, "Essential": 20} + COURSE_LIMITS = {"Lite": 5, "Pro": 20} add_on_courses = 0 courses_included_in_plans = COURSE_LIMITS.get(plan) @@ -30,7 +30,7 @@ def get_add_on_courses(plan: str) -> int: def get_add_on_members(plan: str) -> int: - MEMBER_LIMITS = {"Lite": 100, "Essential": 500} + MEMBER_LIMITS = {"Lite": 100, "Pro": 500} add_on_members = 0 members_included_in_plans = MEMBER_LIMITS.get(plan)