Files
enlight-lms/lms/lms/user.py
2026-02-06 17:08:49 +05:30

92 lines
2.6 KiB
Python

import frappe
from frappe import _
from frappe.model.naming import append_number_if_name_exists
from frappe.utils import escape_html, random_string
from frappe.website.utils import cleanup_page_name, is_signup_disabled
from lms.lms.utils import get_country_code, get_lms_route
def validate_username_duplicates(doc, method):
while not doc.username or doc.username_exists():
doc.username = append_number_if_name_exists(
doc.doctype, cleanup_page_name(doc.full_name), fieldname="username"
)
if " " in doc.username:
doc.username = doc.username.replace(" ", "")
if len(doc.username) < 4:
doc.username = doc.email.replace("@", "").replace(".", "")
def after_insert(doc, method):
doc.add_roles("LMS Student")
@frappe.whitelist(allow_guest=True)
def sign_up(email: str, full_name: str, verify_terms: bool, user_category: str):
if is_signup_disabled():
frappe.throw(_("Sign Up is disabled"), _("Not Allowed"))
user = frappe.db.get("User", {"email": email})
if user:
if user.enabled:
return 0, _("Already Registered")
else:
return 0, _("Registered but disabled")
else:
if frappe.db.get_creation_count("User", 60) > 300:
frappe.respond_as_web_page(
_("Temporarily Disabled"),
_(
"Too many users signed up recently, so the registration is disabled. Please try back in an hour"
),
http_status_code=429,
)
user = frappe.get_doc(
{
"doctype": "User",
"email": email,
"first_name": escape_html(full_name),
"verify_terms": verify_terms,
"user_category": user_category,
"country": "",
"enabled": 1,
"new_password": random_string(10),
"user_type": "Website User",
}
)
user.flags.ignore_permissions = True
user.flags.ignore_password_policy = True
user.insert()
# set default signup role as per Portal Settings
default_role = frappe.db.get_single_value("Portal Settings", "default_role")
if default_role:
user.add_roles(default_role)
user.add_roles("LMS Student")
set_country_from_ip(None, user.name)
if user.flags.email_sent:
return 1, _("Please check your email for verification")
else:
return 2, _("Please ask your administrator to verify your sign-up")
def set_country_from_ip(login_manager: object = None, user: str = None):
if not user and login_manager:
user = login_manager.user
user_country = frappe.db.get_value("User", user, "country")
if user_country:
return
frappe.db.set_value("User", user, "country", get_country_code())
return
def on_login(login_manager):
default_app = frappe.db.get_single_value("System Settings", "default_app")
if default_app == "lms":
frappe.local.response["home_page"] = get_lms_route()