diff --git a/school/fixtures/custom_field.json b/school/fixtures/custom_field.json index 51bae85e..cee6ac83 100644 --- a/school/fixtures/custom_field.json +++ b/school/fixtures/custom_field.json @@ -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, diff --git a/school/hooks.py b/school/hooks.py index e3b2b351..ab211455 100644 --- a/school/hooks.py +++ b/school/hooks.py @@ -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" diff --git a/school/lms/doctype/lms_settings/lms_settings.json b/school/lms/doctype/lms_settings/lms_settings.json index 4f539a26..21b97e57 100644 --- a/school/lms/doctype/lms_settings/lms_settings.json +++ b/school/lms/doctype/lms_settings/lms_settings.json @@ -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", diff --git a/school/overrides/user.py b/school/overrides/user.py index 26d60024..d2ef2fb7 100644 --- a/school/overrides/user.py +++ b/school/overrides/user.py @@ -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 {} diff --git a/school/plugins.py b/school/plugins.py index 5643f57c..490a07ca 100644 --- a/school/plugins.py +++ b/school/plugins.py @@ -109,3 +109,8 @@ def youtube_video_renderer(video_id): def video_renderer(src): return "".format(src) + +def show_custom_signup(): + if frappe.db.get_single_value("LMS Settings", "verify_age"): + return "school/templates/signup-form.html" + return None diff --git a/school/templates/signup-form.html b/school/templates/signup-form.html new file mode 100644 index 00000000..bf0fa2a9 --- /dev/null +++ b/school/templates/signup-form.html @@ -0,0 +1,60 @@ +
+
+
+ + +
+
+ + +
+
+
+ +

+
+
+
+
+ + + +
+
+ +