fix: custom signup form

This commit is contained in:
Jannat Patel
2021-12-17 11:24:28 +05:30
parent 38087f0b02
commit 0b83307f7d
6 changed files with 287 additions and 34 deletions

View File

@@ -1,4 +1,112 @@
[
{
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"collapsible_depends_on": null,
"columns": 0,
"default": null,
"depends_on": null,
"description": null,
"docstatus": 0,
"doctype": "Custom Field",
"dt": "User",
"fetch_from": null,
"fetch_if_empty": 0,
"fieldname": "country",
"fieldtype": "Link",
"hidden": 0,
"hide_border": 0,
"hide_days": 0,
"hide_seconds": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_preview": 0,
"in_standard_filter": 0,
"insert_after": "username",
"label": "Country",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-18 19:14:11.571754",
"module": null,
"name": "User-country",
"no_copy": 0,
"non_negative": 0,
"options": "Country",
"parent": null,
"parentfield": null,
"parenttype": null,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"print_width": null,
"read_only": 0,
"read_only_depends_on": null,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"translatable": 0,
"unique": 0,
"width": null
},
{
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"collapsible_depends_on": null,
"columns": 0,
"default": null,
"depends_on": null,
"description": null,
"docstatus": 0,
"doctype": "Custom Field",
"dt": "User",
"fetch_from": null,
"fetch_if_empty": 0,
"fieldname": "verify_age",
"fieldtype": "Check",
"hidden": 0,
"hide_border": 0,
"hide_days": 0,
"hide_seconds": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_preview": 0,
"in_standard_filter": 0,
"insert_after": "country",
"label": "Age is 18 years or over",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-18 19:15:34.932908",
"module": null,
"name": "User-verify_age",
"no_copy": 0,
"non_negative": 0,
"options": null,
"parent": null,
"parentfield": null,
"parenttype": null,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"print_width": null,
"read_only": 0,
"read_only_depends_on": null,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"translatable": 0,
"unique": 0,
"width": null
},
{
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
@@ -30,7 +138,7 @@
"label": "City",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 14:46:55.834145",
"modified": "2021-12-18 14:46:55.834145",
"module": null,
"name": "User-city",
"no_copy": 0,
@@ -84,7 +192,7 @@
"label": "College Name",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 14:46:55.834145",
"modified": "2021-12-18 14:46:55.834145",
"module": null,
"name": "User-college",
"no_copy": 0,
@@ -138,7 +246,7 @@
"label": "Branch",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 14:46:55.834145",
"modified": "2021-12-18 14:46:55.834145",
"module": null,
"name": "User-branch",
"no_copy": 0,
@@ -192,7 +300,7 @@
"label": "LinkedIn ID",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 14:46:55.834145",
"modified": "2021-12-18 14:46:55.834145",
"module": null,
"name": "User-linkedin",
"no_copy": 0,
@@ -246,7 +354,7 @@
"label": "Github ID",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 14:46:55.834145",
"modified": "2021-12-18 14:46:55.834145",
"module": null,
"name": "User-github",
"no_copy": 0,
@@ -300,7 +408,7 @@
"label": "Medium ID",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 14:46:55.834145",
"modified": "2021-12-18 14:46:55.834145",
"module": null,
"name": "User-medium",
"no_copy": 0,
@@ -354,7 +462,7 @@
"label": "Profession",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 14:46:55.834145",
"modified": "2021-12-18 14:46:55.834145",
"module": null,
"name": "User-profession",
"no_copy": 0,
@@ -408,7 +516,7 @@
"label": "Education Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:57:55.170625",
"modified": "2021-12-18 11:57:55.170625",
"module": null,
"name": "User-education_details",
"no_copy": 0,
@@ -462,7 +570,7 @@
"label": "Hide my Private Information from others",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:57:47.942967",
"modified": "2021-12-18 11:57:47.942967",
"module": null,
"name": "User-hide_my_private_information_from_others",
"no_copy": 0,
@@ -516,7 +624,7 @@
"label": "Profile Complete",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:00:13.792809",
"modified": "2021-12-18 11:00:13.792809",
"module": null,
"name": "User-profile_complete",
"no_copy": 0,
@@ -570,7 +678,7 @@
"label": "Cover Image",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 10:59:52.682112",
"modified": "2021-12-18 10:59:52.682112",
"module": null,
"name": "User-cover_image",
"no_copy": 0,
@@ -624,7 +732,7 @@
"label": "Education",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:58:56.052663",
"modified": "2021-12-18 11:58:56.052663",
"module": null,
"name": "User-education",
"no_copy": 0,
@@ -678,7 +786,7 @@
"label": "Work Experience Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:56:29.466560",
"modified": "2021-12-18 11:56:29.466560",
"module": null,
"name": "User-work_experience_details",
"no_copy": 0,
@@ -732,7 +840,7 @@
"label": "Work Experience",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:58:43.329371",
"modified": "2021-12-18 11:58:43.329371",
"module": null,
"name": "User-work_experience",
"no_copy": 0,
@@ -786,7 +894,7 @@
"label": "Certification Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:59:36.478416",
"modified": "2021-12-18 11:59:36.478416",
"module": null,
"name": "User-certification_details",
"no_copy": 0,
@@ -840,7 +948,7 @@
"label": "Certification",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:59:54.850517",
"modified": "2021-12-18 11:59:54.850517",
"module": null,
"name": "User-certification",
"no_copy": 0,
@@ -894,7 +1002,7 @@
"label": "Skill Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:01:29.335323",
"modified": "2021-12-18 12:01:29.335323",
"module": null,
"name": "User-skill_details",
"no_copy": 0,
@@ -948,7 +1056,7 @@
"label": "Skill",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 15:32:13.944672",
"modified": "2021-12-18 15:32:13.944672",
"module": null,
"name": "User-skill",
"no_copy": 0,
@@ -1002,7 +1110,7 @@
"label": "Career Preference Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 15:35:50.764368",
"modified": "2021-12-18 15:35:50.764368",
"module": null,
"name": "User-carrer_preference_details",
"no_copy": 0,
@@ -1056,7 +1164,7 @@
"label": "Preferred Functions",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 17:12:36.454519",
"modified": "2021-12-18 17:12:36.454519",
"module": null,
"name": "User-preferred_functions",
"no_copy": 0,
@@ -1110,7 +1218,7 @@
"label": "Preferred Location",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 17:12:40.105066",
"modified": "2021-12-18 17:12:40.105066",
"module": null,
"name": "User-preferred_location",
"no_copy": 0,
@@ -1164,7 +1272,7 @@
"label": "",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:47:32.673594",
"modified": "2021-12-18 12:47:32.673594",
"module": null,
"name": "User-career_preference_column",
"no_copy": 0,
@@ -1218,7 +1326,7 @@
"label": "Preferred Industries",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 17:12:31.604282",
"modified": "2021-12-18 17:12:31.604282",
"module": null,
"name": "User-preferred_industries",
"no_copy": 0,
@@ -1272,7 +1380,7 @@
"label": "Dream Companies",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:49:19.295124",
"modified": "2021-12-18 12:49:19.295124",
"module": null,
"name": "User-dream_companies",
"no_copy": 0,
@@ -1326,7 +1434,7 @@
"label": "Work Environment",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:49:46.685634",
"modified": "2021-12-18 12:49:46.685634",
"module": null,
"name": "User-work_environment",
"no_copy": 0,
@@ -1380,7 +1488,7 @@
"label": "Attire Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:03:02.296214",
"modified": "2021-12-18 12:03:02.296214",
"module": null,
"name": "User-attire",
"no_copy": 0,
@@ -1434,7 +1542,7 @@
"label": "Collaboration Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:02:49.680208",
"modified": "2021-12-18 12:02:49.680208",
"module": null,
"name": "User-collaboration",
"no_copy": 0,
@@ -1488,7 +1596,7 @@
"label": "Role Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 16:10:37.349479",
"modified": "2021-12-18 16:10:37.349479",
"module": null,
"name": "User-role",
"no_copy": 0,
@@ -1542,7 +1650,7 @@
"label": "",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 16:45:46.776903",
"modified": "2021-12-18 16:45:46.776903",
"module": null,
"name": "User-work_environment_column",
"no_copy": 0,
@@ -1596,7 +1704,7 @@
"label": "Location Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:02:04.328536",
"modified": "2021-12-18 12:02:04.328536",
"module": null,
"name": "User-location_preference",
"no_copy": 0,
@@ -1650,7 +1758,7 @@
"label": "Time Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 16:16:37.885306",
"modified": "2021-12-18 16:16:37.885306",
"module": null,
"name": "User-time",
"no_copy": 0,
@@ -1704,7 +1812,7 @@
"label": "Company Type",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:01:41.342622",
"modified": "2021-12-18 12:01:41.342622",
"module": null,
"name": "User-company_type",
"no_copy": 0,

View File

@@ -187,3 +187,7 @@ page_renderer = [
# set this to "/" to have profiles on the top-level
profile_url_prefix = "/users/"
custom_signup_form = "school.plugins.show_custom_signup"
on_login = "school.overrides.user.set_country_from_ip"

View File

@@ -8,6 +8,7 @@
"livecode_url",
"column_break_2",
"email_sender",
"verify_age",
"mentor_request_section",
"mentor_request_creation",
"mentor_request_status_update",
@@ -65,12 +66,18 @@
"fieldname": "search_placeholder",
"fieldtype": "Data",
"label": "Search Field Placeholder"
},
{
"default": "0",
"fieldname": "verify_age",
"fieldtype": "Check",
"label": "Verify Age during Signup"
}
],
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2021-11-25 14:12:21.514922",
"modified": "2021-12-16 17:13:42.423197",
"modified_by": "Administrator",
"module": "LMS",
"name": "LMS Settings",

View File

@@ -1,10 +1,13 @@
import frappe
from frappe.core.doctype.user.user import User
from frappe.utils import cint
from frappe.utils import cint, escape_html, random_string
import hashlib
import random
import re
from frappe import _
from frappe.website.utils import is_signup_disabled
import requests
from frappe.geo.country_info import get_all
class CustomUser(User):
@@ -156,3 +159,69 @@ class CustomUser(User):
"in_progress": in_progress,
"completed": completed
}
@frappe.whitelist(allow_guest=True)
def sign_up(email, full_name, verify_age):
if is_signup_disabled():
frappe.throw(_('Sign Up is disabled'), title='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_age": verify_age,
"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_country_from_ip(user.name)
# set default signup role as per Portal Settings
default_role = frappe.db.get_value("Portal Settings", None, "default_role")
if default_role:
user.add_roles(default_role)
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(user=None):
if not user:
user = frappe.session.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 get_country_code():
res = requests.get("http://ip-api.com/json/?fields=61439")
try:
data = res.json()
if data.get("status") != "fail":
return data.get("country")
except Exception:
pass
return {}

View File

@@ -109,3 +109,8 @@ def youtube_video_renderer(video_id):
def video_renderer(src):
return "<video controls width='100%'><source src={0} type='video/mp4'></video>".format(src)
def show_custom_signup():
if frappe.db.get_single_value("LMS Settings", "verify_age"):
return "school/templates/signup-form.html"
return None

View File

@@ -0,0 +1,60 @@
<form class="signup-form" role="form">
<div class="page-card-body">
<div class="form-group">
<label class="form-label sr-only" for="signup_fullname">Full Name</label>
<input type="text" id="signup_fullname" class="form-control" placeholder="{{ _('Jane Doe') }}"
required autofocus>
</div>
<div class="form-group">
<label class="form-label sr-only" for="signup_email">Email</label>
<input type="email" id="signup_email" class="form-control"
placeholder="{{ _('jane@example.com') }}" required>
</div>
<div class="form-group">
<div class="checkbox">
<label>
<span class="input-area">
<input type="checkbox" autocomplete="off" class="input-with-feedback"
data-fieldtype="Check" data-fieldname="age" id="signup-age" required>
</span>
<span class="label-area">I confirm that I am 18 years old or above</span>
</label>
<p class="help-box small text-muted"></p>
</div>
</div>
</div>
<div class="page-card-actions">
<button class="btn btn-sm btn-primary btn-block btn-signup"
type="submit">{{ _("Sign up") }}</button>
<p class="text-center sign-up-message">
<a href="#login" class="blue">{{ _("Have an account? Login") }}</a>
</p>
</div>
</form>
<script>
frappe.ready(function () {
$(".signup-form").on("submit", function (e) {
e.preventDefault();
const email = ($("#signup_email").val() || "").trim();
const full_name = frappe.utils.xss_sanitise(($("#signup_fullname").val() || "").trim());
if (!email || !validate_email(email) || !full_name) {
login.set_status('{{ _("Valid email and name required") }}', 'red');
return false;
}
frappe.call({
method: "school.overrides.user.sign_up",
args: {
"email": ($("#signup_email").val() || "").trim(),
"full_name": frappe.utils.xss_sanitise(($("#signup_fullname").val() || "").trim()),
"verify_age": $("#signup-age").prop("checked") ? 1 : 0
},
statusCode: login.login_handlers
})
return false;
});
});
</script>