feat: role settings from profile
This commit is contained in:
@@ -435,16 +435,16 @@ def redirect_to_courses_list():
|
|||||||
raise frappe.Redirect
|
raise frappe.Redirect
|
||||||
|
|
||||||
|
|
||||||
def has_course_instructor_role():
|
def has_course_instructor_role(member=None):
|
||||||
return frappe.db.get_value("Has Role", {
|
return frappe.db.get_value("Has Role", {
|
||||||
"parent": frappe.session.user,
|
"parent": member or frappe.session.user,
|
||||||
"role": "Course Instructor"
|
"role": "Course Instructor"
|
||||||
}, "name")
|
}, "name")
|
||||||
|
|
||||||
|
|
||||||
def has_course_moderator_role():
|
def has_course_moderator_role(member=None):
|
||||||
return frappe.db.get_value("Has Role", {
|
return frappe.db.get_value("Has Role", {
|
||||||
"parent": frappe.session.user,
|
"parent": member or frappe.session.user,
|
||||||
"role": "Course Moderator"
|
"role": "Course Moderator"
|
||||||
}, "name")
|
}, "name")
|
||||||
|
|
||||||
@@ -453,5 +453,5 @@ def get_courses_under_review():
|
|||||||
return frappe.get_all("LMS Course", {
|
return frappe.get_all("LMS Course", {
|
||||||
"status": "Under Review"
|
"status": "Under Review"
|
||||||
}, ["name", "upcoming", "title", "image", "enable_certification", "status", "published"]
|
}, ["name", "upcoming", "title", "image", "enable_certification", "status", "published"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -330,3 +330,22 @@ def get_users(or_filters, start, page_length, text):
|
|||||||
""".format(or_filters = or_filters, start=start, page_length=page_length), as_dict=1)
|
""".format(or_filters = or_filters, start=start, page_length=page_length), as_dict=1)
|
||||||
|
|
||||||
return users
|
return users
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def save_role(user, role, value):
|
||||||
|
if cint(value):
|
||||||
|
doc = frappe.get_doc({
|
||||||
|
"doctype": "Has Role",
|
||||||
|
"parent": user,
|
||||||
|
"role": role,
|
||||||
|
"parenttype": "User",
|
||||||
|
"parentfield": "roles"
|
||||||
|
})
|
||||||
|
doc.save(ignore_permissions=True)
|
||||||
|
else:
|
||||||
|
frappe.db.delete("Has Role", {
|
||||||
|
"parent": user,
|
||||||
|
"role": role
|
||||||
|
})
|
||||||
|
return True
|
||||||
|
|||||||
@@ -1686,3 +1686,8 @@ li {
|
|||||||
.review-link {
|
.review-link {
|
||||||
float: right
|
float: right
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.role {
|
||||||
|
margin-bottom: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|||||||
@@ -214,7 +214,7 @@
|
|||||||
<!-- Course Settings -->
|
<!-- Course Settings -->
|
||||||
{% macro CourseSettings(course) %}
|
{% macro CourseSettings(course) %}
|
||||||
|
|
||||||
{% if has_course_moderator_role() %}
|
{% if course.edit_mode and has_course_moderator_role() %}
|
||||||
<div class="mb-4">
|
<div class="mb-4">
|
||||||
<label for="published" class="mb-0">
|
<label for="published" class="mb-0">
|
||||||
<input type="checkbox" id="published" {% if course.published %} checked {% endif %}>
|
<input type="checkbox" id="published" {% if course.published %} checked {% endif %}>
|
||||||
@@ -306,7 +306,7 @@
|
|||||||
{{ _("Checkout Course") }} <img class="ml-2" src="/assets/lms/icons/white-arrow.svg" />
|
{{ _("Checkout Course") }} <img class="ml-2" src="/assets/lms/icons/white-arrow.svg" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
{% elif course.upcoming and not is_user_interested %}
|
{% elif course.upcoming and not is_user_interested and not is_instructor %}
|
||||||
<div class="btn btn-secondary wide-button notify-me" data-course="{{course.name | urlencode}}">
|
<div class="btn btn-secondary wide-button notify-me" data-course="{{course.name | urlencode}}">
|
||||||
{{ _("Notify me when available") }}
|
{{ _("Notify me when available") }}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
<div class="profile-page-body">
|
<div class="profile-page-body">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
{% set read_only = member.name != frappe.session.user %}
|
{% set read_only = member.name != frappe.session.user %}
|
||||||
|
{{ RoleSettings(member) }}
|
||||||
{{ About(member) }}
|
{{ About(member) }}
|
||||||
{{ EducationDetails(member) }}
|
{{ EducationDetails(member) }}
|
||||||
{{ WorkDetails(member) }}
|
{{ WorkDetails(member) }}
|
||||||
@@ -45,7 +46,7 @@
|
|||||||
|
|
||||||
<div class="profile-info">
|
<div class="profile-info">
|
||||||
<div class="profile-name-section">
|
<div class="profile-name-section">
|
||||||
<div class="profile-name"> {{ member.full_name }} </div>
|
<div class="profile-name" data-name="{{ member.name }}"> {{ member.full_name }} </div>
|
||||||
|
|
||||||
{% if get_authored_courses(member.name) | length %}
|
{% if get_authored_courses(member.name) | length %}
|
||||||
<div class="creator-badge"> {{ _("Creator") }} </div>
|
<div class="creator-badge"> {{ _("Creator") }} </div>
|
||||||
@@ -155,10 +156,34 @@
|
|||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Role Settings -->
|
||||||
|
{% macro RoleSettings(member) %}
|
||||||
|
{% if has_course_moderator_role() %}
|
||||||
|
<div class="">
|
||||||
|
<div class="common-card-style profile-card">
|
||||||
|
<div class="course-home-headings"> {{ _("Role Settings") }} </div>
|
||||||
|
<div>
|
||||||
|
<label class="role">
|
||||||
|
<input type="checkbox" id="instructor" data-role="Course Instructor"
|
||||||
|
{% if has_course_instructor_role(member.name) %} checked {% endif %}>
|
||||||
|
{{ _("Course Instructor") }}
|
||||||
|
</label>
|
||||||
|
<label class="role ml-20">
|
||||||
|
<input type="checkbox" id="moderator" data-role="Course Moderator"
|
||||||
|
{% if has_course_moderator_role(member.name) %} checked {% endif %}>
|
||||||
|
{{ _("Course Moderator") }}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
|
|
||||||
<!-- About Section -->
|
<!-- About Section -->
|
||||||
{% macro About(member) %}
|
{% macro About(member) %}
|
||||||
{% if member.bio %}
|
{% if member.bio %}
|
||||||
<div class="">
|
<div class="education-details">
|
||||||
<div class="common-card-style profile-card">
|
<div class="common-card-style profile-card">
|
||||||
<div class="course-home-headings"> {{ _("About") }} </div>
|
<div class="course-home-headings"> {{ _("About") }} </div>
|
||||||
<div class="description">{{ member.bio }}</div>
|
<div class="description">{{ member.bio }}</div>
|
||||||
@@ -386,21 +411,3 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
|
||||||
{% block script %}
|
|
||||||
<script>
|
|
||||||
frappe.ready(() => {
|
|
||||||
if ("{{ member.name }}" == frappe.session.user) {
|
|
||||||
setTimeout(() => {
|
|
||||||
var link_array = $('.nav-link').filter((i, elem) => $(elem).text().trim() === "My Profile");
|
|
||||||
link_array.length && $(link_array[0]).addClass("active");
|
|
||||||
}, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($(".profile-column-one").children().length == 0) {
|
|
||||||
$(".profile-column-one").hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
||||||
|
|||||||
42
lms/www/profiles/profile.js
Normal file
42
lms/www/profiles/profile.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
frappe.ready(() => {
|
||||||
|
|
||||||
|
make_profile_active_in_navbar();
|
||||||
|
|
||||||
|
$(".role").change((e) => {
|
||||||
|
save_role(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
const make_profile_active_in_navbar = () => {
|
||||||
|
let member_name = $(".profile-name").data("name");
|
||||||
|
if (member_name == frappe.session.user) {
|
||||||
|
setTimeout(() => {
|
||||||
|
let link_array = $('.nav-link').filter((i, elem) => $(elem).text().trim() === "My Profile");
|
||||||
|
link_array.length && $(link_array[0]).addClass("active");
|
||||||
|
}, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const save_role = (e) => {
|
||||||
|
let member_name = $(".profile-name").data("name");
|
||||||
|
let role = $(e.currentTarget).children("input");
|
||||||
|
frappe.call({
|
||||||
|
method: "lms.overrides.user.save_role",
|
||||||
|
args: {
|
||||||
|
"user": member_name,
|
||||||
|
"role": role.data("role"),
|
||||||
|
"value": role.prop("checked") ? 1 : 0
|
||||||
|
},
|
||||||
|
callback: (data) => {
|
||||||
|
if (data.message) {
|
||||||
|
frappe.show_alert({
|
||||||
|
message: __("Saved"),
|
||||||
|
indicator: "green",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import frappe
|
import frappe
|
||||||
from lms.page_renderers import get_profile_url_prefix
|
from lms.page_renderers import get_profile_url_prefix
|
||||||
from urllib.parse import urlencode
|
|
||||||
|
|
||||||
def get_context(context):
|
def get_context(context):
|
||||||
context.no_cache = 1
|
context.no_cache = 1
|
||||||
@@ -12,13 +12,16 @@ def get_context(context):
|
|||||||
if username:
|
if username:
|
||||||
frappe.local.flags.redirect_location = get_profile_url_prefix() + username
|
frappe.local.flags.redirect_location = get_profile_url_prefix() + username
|
||||||
raise frappe.Redirect
|
raise frappe.Redirect
|
||||||
|
|
||||||
try:
|
try:
|
||||||
context.member = frappe.get_doc("User", {"username": username})
|
context.member = frappe.get_doc("User", {"username": username})
|
||||||
except:
|
except:
|
||||||
context.template = "www/404.html"
|
context.template = "www/404.html"
|
||||||
return
|
return
|
||||||
|
|
||||||
context.profile_tabs = get_profile_tabs(context.member)
|
context.profile_tabs = get_profile_tabs(context.member)
|
||||||
|
|
||||||
|
|
||||||
def get_profile_tabs(user):
|
def get_profile_tabs(user):
|
||||||
"""Returns the enabled ProfileTab objects.
|
"""Returns the enabled ProfileTab objects.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user