chore: resolved conflicts
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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()
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user