chore: resolved conflicts

This commit is contained in:
Jannat Patel
2026-02-17 15:04:31 +05:30
33 changed files with 484 additions and 494 deletions
+1
View File
@@ -47,6 +47,7 @@ ALLOWED_PATHS = [
"/api/method/frappe.core.doctype.user.user.reset_password",
"/api/method/frappe.desk.doctype.notification_log.notification_log.mark_as_read",
"/api/method/frappe.desk.doctype.notification_log.notification_log.mark_all_as_read",
"/api/method/frappe.sessions.clear",
]
+34 -7
View File
@@ -7,6 +7,7 @@ from lms.lms.api import give_discussions_permission
def after_install():
create_batch_source()
give_discussions_permission()
give_user_list_permission()
def after_sync():
@@ -27,13 +28,6 @@ def create_lms_roles():
create_lms_student_role()
def delete_lms_roles():
roles = ["Course Creator", "Moderator"]
for role in roles:
if frappe.db.exists("Role", role):
frappe.db.delete("Role", role)
def create_course_creator_role():
if frappe.db.exists("Role", "Course Creator"):
frappe.db.set_value("Role", "Course Creator", "desk_access", 0)
@@ -185,3 +179,36 @@ def give_lms_roles_to_admin():
doc.parentfield = "roles"
doc.role = role
doc.save()
def give_user_list_permission():
doctype = "User"
roles = ["Course Creator", "Moderator", "Batch Evaluator"]
for role in roles:
permlevel = 0
create_role(doctype, role, permlevel)
create_role(doctype, "System Manager", 1)
def create_role(doctype, role, permlevel):
if not frappe.db.exists("Custom DocPerm", {"parent": doctype, "role": role, "permlevel": permlevel}):
doc = frappe.new_doc("Custom DocPerm")
doc.update(
{
"doctype": "Custom DocPerm",
"parent": doctype,
"role": role,
"read": 1,
"write": 1 if role in ["Moderator", "System Manager"] else 0,
"create": 1 if role == "Moderator" else 0,
"permlevel": permlevel,
}
)
doc.save()
def delete_lms_roles():
roles = ["Course Creator", "Moderator", "Batch Evaluator", "LMS Student"]
for role in roles:
if frappe.db.exists("Role", role):
frappe.db.delete("Role", role)
+3 -1
View File
@@ -1308,6 +1308,7 @@ def get_lms_settings():
@frappe.whitelist()
def cancel_evaluation(evaluation: dict):
evaluation = frappe._dict(evaluation)
print(evaluation.member, frappe.session.user)
if evaluation.member != frappe.session.user:
frappe.throw(_("You do not have permission to cancel this evaluation."), frappe.PermissionError)
@@ -1511,6 +1512,7 @@ def validate_meta_data_permissions(meta_type: str):
@frappe.whitelist()
def create_programming_exercise_submission(exercise: str, submission: str, code: str, test_cases: list):
frappe.only_for(["Moderator", "Course Creator", "Batch Evaluator"])
if submission == "new":
return make_new_exercise_submission(exercise, code, test_cases)
else:
@@ -2037,7 +2039,7 @@ def get_upcoming_batches():
@frappe.whitelist()
def delete_programming_exercise(exercise: str):
frappe.only_for(["Moderator", "Course Creator"])
frappe.only_for(["Moderator", "Course Creator", "Batch Evaluator"])
frappe.db.delete("LMS Programming Exercise Submission", {"exercise": exercise})
frappe.db.delete("LMS Programming Exercise", exercise)
@@ -8,9 +8,15 @@ from frappe.utils import ceil
class LMSEnrollment(Document):
def before_insert(self):
def validate(self):
self.validate_duplicate_enrollment()
self.validate_course_enrollment_eligibility()
self.validate_owner()
def validate_owner(self):
"""Makes the member as the owner of the document so that users can update their progress"""
if self.owner != self.member:
self.owner = self.member
def on_update(self):
update_program_progress(self.member)
@@ -45,7 +51,7 @@ class LMSEnrollment(Document):
if self.enrollment_from_batch:
return
if not course_details.published:
if not course_details.published and not is_admin():
frappe.throw(_("You cannot enroll in an unpublished course."))
if course_details.paid_course:
+8 -6
View File
@@ -1010,12 +1010,7 @@ def get_lesson(course: str, chapter: int, lesson: int) -> dict:
as_dict=1,
)
if (
not lesson_details.include_in_preview
and not membership
and not has_moderator_role()
and not is_instructor(course)
):
if not lesson_details.include_in_preview and not membership and not can_modify_course(course):
return {
"no_preview": 1,
"title": lesson_details.title,
@@ -2047,6 +2042,13 @@ def get_program_details(program_name: str) -> dict:
if not guest_access_allowed():
frappe.throw(_("Please login to view program details."))
is_published = frappe.db.get_value("LMS Program", program_name, "published")
is_member = frappe.db.exists(
"LMS Program Member", {"parent": program_name, "member": frappe.session.user}
)
if not is_published and not is_member:
frappe.throw(_("You are not authorized to view the details of this program."))
program = frappe.db.get_value(
"LMS Program",
program_name,
+11 -11
View File
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: jannat@frappe.io\n"
"POT-Creation-Date: 2026-01-23 16:05+0000\n"
"PO-Revision-Date: 2026-02-05 06:43\n"
"PO-Revision-Date: 2026-02-12 13:58\n"
"Last-Translator: jannat@frappe.io\n"
"Language-Team: Spanish\n"
"MIME-Version: 1.0\n"
@@ -2291,7 +2291,7 @@ msgstr "Detalles de la educación"
#: lms/lms/doctype/lms_settings/lms_settings.json
#: lms/templates/signup-form.html:10
msgid "Email"
msgstr ""
msgstr "Correo electrónico"
#: frontend/src/components/Modals/Event.vue:16
msgid "Email ID"
@@ -2850,7 +2850,7 @@ msgstr "Francés (por ejemplo, Distinción)"
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
msgid "Friday"
msgstr ""
msgstr "Viernes"
#. Label of the unavailable_from (Date) field in DocType 'Course Evaluator'
#: frontend/src/pages/ProfileEvaluator.vue:106
@@ -4380,7 +4380,7 @@ msgstr "Módulo incorrecto."
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
msgid "Monday"
msgstr ""
msgstr "Lunes"
#: frontend/src/components/Sidebar/AppSidebar.vue:561
msgid "Monetization"
@@ -5914,7 +5914,7 @@ msgstr ""
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
msgid "Saturday"
msgstr ""
msgstr "Sábado"
#. Button label of the job-opportunity Web Form
#: frontend/src/components/AssessmentPlugin.vue:12
@@ -5983,7 +5983,7 @@ msgstr "Puntuación fuera de"
#: frontend/src/pages/Jobs.vue:57 frontend/src/pages/Search/Search.vue:5
#: frontend/src/pages/Search/Search.vue:250
msgid "Search"
msgstr ""
msgstr "Buscar"
#: frontend/src/components/Modals/CourseProgressSummary.vue:17
#: frontend/src/components/Modals/VideoStatistics.vue:20
@@ -6480,7 +6480,7 @@ msgstr "Resumen"
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
msgid "Sunday"
msgstr ""
msgstr "Domingo"
#: lms/lms/api.py:995
msgid "Suspicious pattern found in {0}: {1}"
@@ -6536,7 +6536,7 @@ msgstr ""
#: lms/lms/doctype/user_skill/user_skill.json
#: lms/lms/doctype/zoom_settings/zoom_settings.json
msgid "System Manager"
msgstr ""
msgstr "Administrador del sistema"
#. Label of the tags (Data) field in DocType 'LMS Course'
#: frontend/src/pages/CourseForm.vue:51
@@ -6791,7 +6791,7 @@ msgstr ""
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
msgid "Thursday"
msgstr ""
msgstr "Jueves"
#. Label of the time (Time) field in DocType 'LMS Live Class'
#: frontend/src/components/Modals/Event.vue:54
@@ -6974,7 +6974,7 @@ msgstr "Inténtelo de nuevo"
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
msgid "Tuesday"
msgstr ""
msgstr "Martes"
#: frontend/src/pages/ProfileAbout.vue:105
msgid "Twitter"
@@ -7287,7 +7287,7 @@ msgstr ""
#: lms/lms/doctype/evaluator_schedule/evaluator_schedule.json
#: lms/lms/doctype/lms_certificate_request/lms_certificate_request.json
msgid "Wednesday"
msgstr ""
msgstr "Miércoles"
#: lms/templates/emails/lms_invite_request_approved.html:4
msgid "Welcome to {0}!"
+2 -2
View File
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: jannat@frappe.io\n"
"POT-Creation-Date: 2026-01-23 16:05+0000\n"
"PO-Revision-Date: 2026-02-05 06:43\n"
"PO-Revision-Date: 2026-02-15 14:24\n"
"Last-Translator: jannat@frappe.io\n"
"Language-Team: Persian\n"
"MIME-Version: 1.0\n"
@@ -985,7 +985,7 @@ msgstr ""
#: lms/lms/doctype/lms_category/lms_category.json
#: lms/lms/doctype/lms_course/lms_course.json lms/templates/signup-form.html:22
msgid "Category"
msgstr "دسته بندی"
msgstr "دستهبندی"
#: frontend/src/components/Settings/Categories.vue:39
msgid "Category Name"
+2 -2
View File
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: jannat@frappe.io\n"
"POT-Creation-Date: 2026-01-23 16:05+0000\n"
"PO-Revision-Date: 2026-02-05 06:43\n"
"PO-Revision-Date: 2026-02-15 14:24\n"
"Last-Translator: jannat@frappe.io\n"
"Language-Team: Portuguese\n"
"MIME-Version: 1.0\n"
@@ -190,7 +190,7 @@ msgstr ""
#: frontend/src/components/Controls/ChildTable.vue:77
#: frontend/src/components/Settings/Coupons/CouponItems.vue:55
msgid "Add Row"
msgstr ""
msgstr "Adicionar Linha"
#: frontend/src/pages/ProfileEvaluator.vue:96
msgid "Add Slot"
+2 -2
View File
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: jannat@frappe.io\n"
"POT-Creation-Date: 2026-01-23 16:05+0000\n"
"PO-Revision-Date: 2026-02-05 06:43\n"
"PO-Revision-Date: 2026-02-14 14:28\n"
"Last-Translator: jannat@frappe.io\n"
"Language-Team: Portuguese, Brazilian\n"
"MIME-Version: 1.0\n"
@@ -7831,7 +7831,7 @@ msgstr ""
#: frontend/src/components/StudentHeatmap.vue:10
msgid "weeks"
msgstr ""
msgstr "semanas"
#: lms/templates/emails/mentor_request_creation_email.html:5
msgid "you can"
+3 -1
View File
@@ -115,4 +115,6 @@ lms.patches.v2_0.fix_scorm_lesson_reference_idx #02-09-2025
lms.patches.v2_0.certified_members_to_certifications #05-10-2025
lms.patches.v2_0.fix_job_application_resume_urls
lms.patches.v2_0.open_to_opportunities
lms.patches.v2_0.open_to_work
lms.patches.v2_0.open_to_work
lms.patches.v2_0.share_enrollment
lms.patches.v2_0.give_user_list_permission #11-02-2026
@@ -0,0 +1,5 @@
from lms.install import give_user_list_permission
def execute():
give_user_list_permission()
+20
View File
@@ -0,0 +1,20 @@
import frappe
def execute():
enrollments = frappe.get_all("LMS Enrollment", ["name", "member", "owner"])
for enrollment in enrollments:
if enrollment.owner == enrollment.member:
continue
filters = {
"user": enrollment.member,
"share_doctype": "LMS Enrollment",
"share_name": enrollment.name,
}
is_shared = frappe.db.exists("DocShare", filters)
if not is_shared:
share = frappe.new_doc("DocShare")
filters.update({"read": 1, "write": 1, "notify_by_email": 0})
share.update(filters)
share.save()