Merge pull request #277 from pateljannat/custom-signup

This commit is contained in:
Jannat Patel
2021-12-21 16:13:15 +05:30
committed by GitHub
12 changed files with 413 additions and 88 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-22 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_terms",
"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": "Acceptance for Terms of Use",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-22 19:15:34.932908",
"module": null,
"name": "User-verify_terms",
"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-22 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-22 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-22 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-22 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-22 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-22 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-22 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-22 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-22 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-22 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-22 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-22 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-22 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-22 11:58:43.329371",
"module": null,
"name": "User-work_experience",
"no_copy": 0,
@@ -755,6 +863,60 @@
"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": "internship",
"fieldtype": "Table",
"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": "work_experience",
"label": "Volunteering or Internship",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-22 14:58:04.285835",
"module": null,
"name": "User-internship",
"no_copy": 0,
"non_negative": 0,
"options": "Work Experience",
"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,
@@ -782,11 +944,11 @@
"in_list_view": 0,
"in_preview": 0,
"in_standard_filter": 0,
"insert_after": "work_experience",
"insert_after": "volunteering_or_internship",
"label": "Certification Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:59:36.478416",
"modified": "2021-12-22 14:58:29.975380",
"module": null,
"name": "User-certification_details",
"no_copy": 0,
@@ -840,7 +1002,7 @@
"label": "Certification",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 11:59:54.850517",
"modified": "2021-12-22 11:59:54.850517",
"module": null,
"name": "User-certification",
"no_copy": 0,
@@ -894,7 +1056,7 @@
"label": "Skill Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:01:29.335323",
"modified": "2021-12-22 12:01:29.335323",
"module": null,
"name": "User-skill_details",
"no_copy": 0,
@@ -948,7 +1110,7 @@
"label": "Skill",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 15:32:13.944672",
"modified": "2021-12-22 15:32:13.944672",
"module": null,
"name": "User-skill",
"no_copy": 0,
@@ -1002,7 +1164,7 @@
"label": "Career Preference Details",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 15:35:50.764368",
"modified": "2021-12-22 15:35:50.764368",
"module": null,
"name": "User-carrer_preference_details",
"no_copy": 0,
@@ -1056,7 +1218,7 @@
"label": "Preferred Functions",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 17:12:36.454519",
"modified": "2021-12-22 17:12:36.454519",
"module": null,
"name": "User-preferred_functions",
"no_copy": 0,
@@ -1110,7 +1272,7 @@
"label": "Preferred Location",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 17:12:40.105066",
"modified": "2021-12-22 17:12:40.105066",
"module": null,
"name": "User-preferred_location",
"no_copy": 0,
@@ -1164,7 +1326,7 @@
"label": "",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:47:32.673594",
"modified": "2021-12-22 12:47:32.673594",
"module": null,
"name": "User-career_preference_column",
"no_copy": 0,
@@ -1218,7 +1380,7 @@
"label": "Preferred Industries",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 17:12:31.604282",
"modified": "2021-12-22 17:12:31.604282",
"module": null,
"name": "User-preferred_industries",
"no_copy": 0,
@@ -1272,7 +1434,7 @@
"label": "Dream Companies",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:49:19.295124",
"modified": "2021-12-22 12:49:19.295124",
"module": null,
"name": "User-dream_companies",
"no_copy": 0,
@@ -1326,7 +1488,7 @@
"label": "Work Environment",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:49:46.685634",
"modified": "2021-12-22 12:49:46.685634",
"module": null,
"name": "User-work_environment",
"no_copy": 0,
@@ -1380,7 +1542,7 @@
"label": "Attire Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:03:02.296214",
"modified": "2021-12-22 12:03:02.296214",
"module": null,
"name": "User-attire",
"no_copy": 0,
@@ -1434,7 +1596,7 @@
"label": "Collaboration Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:02:49.680208",
"modified": "2021-12-22 12:02:49.680208",
"module": null,
"name": "User-collaboration",
"no_copy": 0,
@@ -1488,7 +1650,7 @@
"label": "Role Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 16:10:37.349479",
"modified": "2021-12-22 16:10:37.349479",
"module": null,
"name": "User-role",
"no_copy": 0,
@@ -1542,7 +1704,7 @@
"label": "",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 16:45:46.776903",
"modified": "2021-12-22 16:45:46.776903",
"module": null,
"name": "User-work_environment_column",
"no_copy": 0,
@@ -1596,7 +1758,7 @@
"label": "Location Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:02:04.328536",
"modified": "2021-12-22 12:02:04.328536",
"module": null,
"name": "User-location_preference",
"no_copy": 0,
@@ -1650,7 +1812,7 @@
"label": "Time Preference",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 16:16:37.885306",
"modified": "2021-12-22 16:16:37.885306",
"module": null,
"name": "User-time",
"no_copy": 0,
@@ -1704,7 +1866,7 @@
"label": "Company Type",
"length": 0,
"mandatory_depends_on": null,
"modified": "2021-12-17 12:01:41.342622",
"modified": "2021-12-22 12:01:41.342622",
"module": null,
"name": "User-company_type",
"no_copy": 0,

View File

@@ -39,16 +39,6 @@
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Function",
"function": "Engineering (Software & IT)",
"modified": "2021-12-14 15:16:26.348864",
"name": "Engineering (Software & IT)",
"parent": null,
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Function",
@@ -158,5 +148,15 @@
"parent": null,
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Function",
"function": "Engineering (Software & IT)",
"modified": "2021-12-14 15:16:26.348864",
"name": "Engineering (Software & IT)",
"parent": null,
"parentfield": null,
"parenttype": null
}
]

View File

@@ -89,16 +89,6 @@
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Industry",
"industry": "Education & Training",
"modified": "2021-12-14 15:21:18.105864",
"name": "Education & Training",
"parent": null,
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Industry",
@@ -109,16 +99,6 @@
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Industry",
"industry": "Engineering",
"modified": "2021-12-14 15:21:18.119149",
"name": "Engineering",
"parent": null,
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Industry",
@@ -238,5 +218,25 @@
"parent": null,
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Industry",
"industry": "Education & Training",
"modified": "2021-12-14 15:21:18.105864",
"name": "Education & Training",
"parent": null,
"parentfield": null,
"parenttype": null
},
{
"docstatus": 0,
"doctype": "Industry",
"industry": "Engineering",
"modified": "2021-12-14 15:21:18.119149",
"name": "Engineering",
"parent": null,
"parentfield": null,
"parenttype": null
}
]

View File

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

View File

@@ -6,16 +6,16 @@
"engine": "InnoDB",
"field_order": [
"livecode_url",
"column_break_2",
"email_sender",
"mentor_request_section",
"mentor_request_creation",
"mentor_request_status_update",
"search_settings_section",
"column_break_2",
"force_profile_completion",
"show_search",
"search_placeholder",
"profile_restrictions_section",
"force_profile_completion"
"terms_of_use",
"terms_page",
"mentor_request_section",
"mentor_request_creation",
"mentor_request_status_update"
],
"fields": [
{
@@ -51,11 +51,6 @@
"fieldname": "column_break_2",
"fieldtype": "Column Break"
},
{
"fieldname": "search_settings_section",
"fieldtype": "Section Break",
"label": "Search Settings"
},
{
"default": "0",
"fieldname": "show_search",
@@ -68,22 +63,31 @@
"fieldtype": "Data",
"label": "Search Field Placeholder"
},
{
"fieldname": "profile_restrictions_section",
"fieldtype": "Section Break",
"label": "Profile"
},
{
"default": "0",
"fieldname": "force_profile_completion",
"fieldtype": "Check",
"label": "Force users to complete their Profile"
},
{
"default": "0",
"fieldname": "terms_of_use",
"fieldtype": "Check",
"label": "Show Terms of Use on Signup"
},
{
"depends_on": "terms_of_use",
"fieldname": "terms_page",
"fieldtype": "Link",
"label": "Terms of Use Page",
"mandatory_depends_on": "terms_of_use",
"options": "Web Page"
}
],
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2021-12-20 12:11:26.628925",
"modified": "2021-12-21 16:01:48.260411",
"modified_by": "Administrator",
"module": "LMS",
"name": "LMS Settings",

View File

@@ -21,7 +21,7 @@
"is_standard": 1,
"login_required": 1,
"max_attachment_size": 0,
"modified": "2021-12-21 11:05:56.505121",
"modified": "2021-12-21 15:50:31.707751",
"modified_by": "Administrator",
"module": "LMS",
"name": "profile",
@@ -231,6 +231,19 @@
"max_value": 0,
"options": "Work Experience",
"read_only": 0,
"reqd": 1,
"show_in_filter": 0
},
{
"allow_read_on_all_link_options": 0,
"fieldname": "internship",
"fieldtype": "Table",
"hidden": 0,
"label": "Volunteering or Internship",
"max_length": 0,
"max_value": 0,
"options": "Work Experience",
"read_only": 0,
"reqd": 0,
"show_in_filter": 0
},
@@ -456,4 +469,4 @@
"show_in_filter": 0
}
]
}
}

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):
@@ -169,3 +172,68 @@ class CustomUser(User):
"in_progress": in_progress,
"completed": completed
}
@frappe.whitelist(allow_guest=True)
def sign_up(email, full_name, verify_terms):
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_terms": verify_terms,
"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_country_from_ip(None, 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(login_manager=None, user=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 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

@@ -20,3 +20,4 @@ execute:frappe.delete_doc("DocType", "Lesson") #06-10-2021
execute:frappe.delete_doc("DocType", "LMS Topic") #06-10-2021
school.patches.v0_0.add_progress_to_membership #20-10-2021
execute:frappe.delete_doc("Workspace", "LMS", ignore_missing=True, force=True) #24-10-2021
execute:frappe.delete_doc("Custom Field", "User-verify_age", ignore_missing=True, force=True)

View File

@@ -120,3 +120,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", "terms_of_use"):
return "school/templates/signup-form.html"
return "frappe/templates/signup.html"

View File

@@ -0,0 +1,67 @@
<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>
{% if frappe.db.get_single_value("LMS Settings", "terms_of_use") %}
<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="terms" id="signup-terms" required>
</span>
<span class="label-area">
{% set terms_page = frappe.db.get_single_value("LMS Settings", "terms_page") %}
{% set terms_page_route = frappe.db.get_value("Web Page", terms_page, "route") %}
{% set terms_link = "<a href='/" + terms_page_route +"'> Terms of Use </a>" %}
{{ _("I have read and I agree to your {0}").format(terms_link) }}
</span>
</label>
<p class="help-box small text-muted"></p>
</div>
</div>
{% endif %}
</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_terms": $("#signup-terms").prop("checked") ? 1 : 0
},
statusCode: login.login_handlers
})
return false;
});
});
</script>

View File

@@ -10,10 +10,10 @@
<div class="common-page-style">
<div class="container">
{% if restriction.restrict %}
{% set site_link = "<a href='/edit-profile'> profile </a>" %}
{% set profile_link = "<a href='/edit-profile'> profile </a>" %}
<div class="empty-state">
<div class="course-home-headings text-center mb-0" style="color: inherit;">{{ _("You haven't completed your profile.") }}</div>
<p class="small text-center">{{ _("Complete your {0} to access the courses.").format(site_link) }}</p>
<p class="small text-center">{{ _("Complete your {0} to access the courses.").format(profile_link) }}</p>
</div>
{% else %}

View File

@@ -309,11 +309,12 @@
{% endmacro %}
{% macro WorkDetails(member) %}
{% if member.work_experience %}
{% set work_details = member.work_experience + member.internship %}
{% if work_details | length %}
<div class="education-details">
<div class="course-home-headings"> Work Experience </div>
<div class="common-card-style profile-card">
{% for work in member.work_experience %}
{% for work in work_details %}
<div class="">
<div class="institute-name"> {{ work.title }} </div>
<div class="profile-item"> {{ work.company }} </div>