Merge pull request #8404 from hrwX/con-fix
fix(Contact): Mobile No. comeback
This commit is contained in:
commit
4d8fa6a2b8
12 changed files with 207 additions and 64 deletions
|
|
@ -21,6 +21,7 @@
|
|||
"designation",
|
||||
"gender",
|
||||
"phone",
|
||||
"mobile_no",
|
||||
"company_name",
|
||||
"image",
|
||||
"sb_00",
|
||||
|
|
@ -192,9 +193,15 @@
|
|||
{
|
||||
"fieldname": "phone_nos",
|
||||
"fieldtype": "Table",
|
||||
"label": "Phone Nos",
|
||||
"label": "Numbers",
|
||||
"options": "Contact Phone"
|
||||
},
|
||||
{
|
||||
"fieldname": "mobile_no",
|
||||
"fieldtype": "Data",
|
||||
"label": "Mobile No",
|
||||
"read_only": 1
|
||||
},
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "pulled_from_google_contacts",
|
||||
|
|
@ -238,8 +245,8 @@
|
|||
"icon": "fa fa-user",
|
||||
"idx": 1,
|
||||
"image_field": "image",
|
||||
"modified": "2019-09-13 15:50:38.999884",
|
||||
"modified_by": "himanshu@erpnext.com",
|
||||
"modified": "2019-09-24 17:48:26.790985",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Contacts",
|
||||
"name": "Contact",
|
||||
"name_case": "Title Case",
|
||||
|
|
|
|||
|
|
@ -29,11 +29,10 @@ class Contact(Document):
|
|||
break
|
||||
|
||||
def validate(self):
|
||||
self.set_primary("email_id", "email_ids")
|
||||
self.set_primary("phone", "phone_nos")
|
||||
|
||||
if self.email_id:
|
||||
self.email_id = self.email_id.strip()
|
||||
self.set_primary_email()
|
||||
self.set_primary("phone")
|
||||
self.set_primary("mobile_no")
|
||||
self.check_if_primary_phone_and_mobile_no_same()
|
||||
|
||||
self.set_user()
|
||||
|
||||
|
|
@ -79,24 +78,51 @@ class Contact(Document):
|
|||
if autosave:
|
||||
self.save(ignore_permissions=True)
|
||||
|
||||
def add_phone(self, phone, is_primary=0, autosave=False):
|
||||
def add_phone(self, phone, is_primary_phone=0, is_primary_mobile_no=0, autosave=False):
|
||||
self.append("phone_nos", {
|
||||
"phone": phone,
|
||||
"is_primary": is_primary
|
||||
"is_primary_phone": is_primary_phone,
|
||||
"is_primary_mobile_no": is_primary_mobile_no
|
||||
})
|
||||
|
||||
if autosave:
|
||||
self.save(ignore_permissions=True)
|
||||
|
||||
def set_primary(self, fieldname, child_table):
|
||||
if len(self.get(child_table)) == 1:
|
||||
self.get(child_table)[0].is_primary = 1
|
||||
setattr(self, fieldname, self.get(child_table)[0].get(fieldname))
|
||||
else:
|
||||
for d in self.get(child_table):
|
||||
if d.is_primary == 1:
|
||||
setattr(self, fieldname, d.get(fieldname))
|
||||
break
|
||||
def set_primary_email(self):
|
||||
if not self.email_ids:
|
||||
self.email_id = ""
|
||||
return
|
||||
|
||||
if len([email.email_id for email in self.email_ids if email.is_primary]) > 1:
|
||||
frappe.throw(_("Only one {0} can be set as primary.").format(frappe.bold("Email ID")))
|
||||
|
||||
for d in self.email_ids:
|
||||
if d.is_primary == 1:
|
||||
self.email_id = d.email_id.strip()
|
||||
break
|
||||
|
||||
def set_primary(self, fieldname):
|
||||
# Used to set primary mobile and phone no.
|
||||
if len(self.phone_nos) == 0:
|
||||
setattr(self, fieldname, "")
|
||||
return
|
||||
|
||||
field_name = "is_primary_" + fieldname
|
||||
|
||||
is_primary = [phone.phone for phone in self.phone_nos if phone.get(field_name)]
|
||||
|
||||
if len(is_primary) > 1:
|
||||
frappe.throw(_("Only one {0} can be set as primary.").format(frappe.bold(frappe.unscrub(fieldname))))
|
||||
|
||||
for d in self.phone_nos:
|
||||
if d.get(field_name) == 1:
|
||||
setattr(self, fieldname, d.phone)
|
||||
break
|
||||
|
||||
def check_if_primary_phone_and_mobile_no_same(self):
|
||||
if self.phone and self.mobile_no and self.phone == self.mobile_no:
|
||||
number = frappe.bold(self.phone)
|
||||
frappe.throw(_("Number {0} cannot be set as primary for Phone as well as Mobile No.").format(number))
|
||||
|
||||
def get_default_contact(doctype, name):
|
||||
'''Returns default contact for the given doctype, name'''
|
||||
|
|
|
|||
|
|
@ -5,8 +5,82 @@ from __future__ import unicode_literals
|
|||
|
||||
import frappe
|
||||
import unittest
|
||||
|
||||
test_records = frappe.get_test_records('Contact')
|
||||
from frappe.exceptions import ValidationError
|
||||
|
||||
class TestContact(unittest.TestCase):
|
||||
pass
|
||||
|
||||
def test_check_default_email(self):
|
||||
emails = [
|
||||
{"email": "test1@example.com", "is_primary": 0},
|
||||
{"email": "test2@example.com", "is_primary": 0},
|
||||
{"email": "test3@example.com", "is_primary": 0},
|
||||
{"email": "test4@example.com", "is_primary": 1},
|
||||
{"email": "test5@example.com", "is_primary": 0},
|
||||
]
|
||||
contact = create_contact("Email", "Mr", emails=emails)
|
||||
|
||||
self.assertEqual(contact.email_id, "test4@example.com")
|
||||
|
||||
def test_check_default_phone_and_mobile(self):
|
||||
phones = [
|
||||
{"phone": "+91 0000000000", "is_primary_phone": 0, "is_primary_mobile_no": 0},
|
||||
{"phone": "+91 0000000001", "is_primary_phone": 0, "is_primary_mobile_no": 0},
|
||||
{"phone": "+91 0000000002", "is_primary_phone": 1, "is_primary_mobile_no": 0},
|
||||
{"phone": "+91 0000000003", "is_primary_phone": 0, "is_primary_mobile_no": 1},
|
||||
]
|
||||
contact = create_contact("Phone", "Mr", phones=phones)
|
||||
|
||||
self.assertEqual(contact.phone, "+91 0000000002")
|
||||
self.assertEqual(contact.mobile_no, "+91 0000000003")
|
||||
|
||||
def test_same_phone_and_mobile(self):
|
||||
phones = [
|
||||
{"phone": "+91 0000000000", "is_primary_phone": 1, "is_primary_mobile_no": 1},
|
||||
]
|
||||
contact = create_contact("Phone", "Mr", phones=phones, save=False)
|
||||
self.assertRaises(ValidationError, contact.save)
|
||||
|
||||
def test_no_primary_set(self):
|
||||
emails = [
|
||||
{"email": "test1@example.com", "is_primary": 0},
|
||||
{"email": "test2@example.com", "is_primary": 0},
|
||||
{"email": "test3@example.com", "is_primary": 0},
|
||||
{"email": "test4@example.com", "is_primary": 0},
|
||||
{"email": "test5@example.com", "is_primary": 0},
|
||||
]
|
||||
phones = [
|
||||
{"phone": "+91 0000000000", "is_primary_phone": 0, "is_primary_mobile_no": 0},
|
||||
{"phone": "+91 0000000001", "is_primary_phone": 0, "is_primary_mobile_no": 0},
|
||||
{"phone": "+91 0000000002", "is_primary_phone": 1, "is_primary_mobile_no": 1},
|
||||
{"phone": "+91 0000000003", "is_primary_phone": 0, "is_primary_mobile_no": 0},
|
||||
]
|
||||
|
||||
contact_email = create_contact("Default", "Mr", emails=emails, phones=phones, save=False)
|
||||
contact_phone = create_contact("Default", "Mr", emails=emails, phones=phones, save=False)
|
||||
|
||||
# No default set for emails if many emails are passed as params
|
||||
self.assertRaises(ValidationError, contact_email.save)
|
||||
|
||||
# No default set for phones if many phones are passed as params
|
||||
self.assertRaises(ValidationError, contact_phone.save)
|
||||
|
||||
def create_contact(name, salutation, emails=None, phones=None, save=True):
|
||||
doc = frappe.get_doc({
|
||||
"doctype": "Contact",
|
||||
"first_name": name,
|
||||
"status": "Open",
|
||||
"salutation": salutation
|
||||
})
|
||||
|
||||
if emails:
|
||||
for d in emails:
|
||||
doc.add_email(d.get("email"), d.get("is_primary"))
|
||||
|
||||
if phones:
|
||||
for d in phones:
|
||||
doc.add_phone(d.get("phone"), d.get("is_primary_phone"), d.get("is_primary_mobile_no"))
|
||||
|
||||
if save:
|
||||
doc.insert()
|
||||
|
||||
return doc
|
||||
|
|
@ -1,19 +1,39 @@
|
|||
[
|
||||
{
|
||||
"doctype": "Contact",
|
||||
"salutation": "Mr",
|
||||
"email_id": "test_contact@example.com",
|
||||
"first_name": "_Test Contact For _Test Customer",
|
||||
"is_primary_contact": 1,
|
||||
"phone": "+91 0000000000",
|
||||
"status": "Open"
|
||||
},
|
||||
{
|
||||
"doctype": "Contact",
|
||||
"email_id": "test_contact@example.com",
|
||||
"first_name": "_Test Contact For _Test Supplier",
|
||||
"is_primary_contact": 1,
|
||||
"phone": "+91 0000000000",
|
||||
"status": "Open"
|
||||
}
|
||||
{
|
||||
"doctype": "Contact",
|
||||
"salutation": "Mr",
|
||||
"first_name": "_Test Contact For _Test Customer",
|
||||
"is_primary_contact": 1,
|
||||
"status": "Open",
|
||||
"email_ids": [
|
||||
{
|
||||
"email_id": "test_contact@example.com",
|
||||
"is_primary": 1
|
||||
}
|
||||
],
|
||||
"phone_nos": [
|
||||
{
|
||||
"phone": "+91 0000000000",
|
||||
"is_primary_phone": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"doctype": "Contact",
|
||||
"first_name": "_Test Contact For _Test Supplier",
|
||||
"is_primary_contact": 1,
|
||||
"status": "Open",
|
||||
"email_ids": [
|
||||
{
|
||||
"email_id": "test_contact@example.com",
|
||||
"is_primary": 1
|
||||
}
|
||||
],
|
||||
"phone_nos": [
|
||||
{
|
||||
"phone": "+91 0000000000",
|
||||
"is_primary_phone": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -13,9 +13,11 @@
|
|||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"label": "Email ID",
|
||||
"options": "Email"
|
||||
"options": "Email",
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"columns": 2,
|
||||
"default": "0",
|
||||
"fieldname": "is_primary",
|
||||
"fieldtype": "Check",
|
||||
|
|
@ -24,7 +26,7 @@
|
|||
}
|
||||
],
|
||||
"istable": 1,
|
||||
"modified": "2019-08-02 13:14:22.193463",
|
||||
"modified": "2019-09-24 17:47:30.565805",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Contacts",
|
||||
"name": "Contact Email",
|
||||
|
|
|
|||
|
|
@ -5,25 +5,36 @@
|
|||
"engine": "InnoDB",
|
||||
"field_order": [
|
||||
"phone",
|
||||
"is_primary"
|
||||
"is_primary_phone",
|
||||
"is_primary_mobile_no"
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"default": "0",
|
||||
"fieldname": "is_primary",
|
||||
"fieldtype": "Check",
|
||||
"in_list_view": 1,
|
||||
"label": "Is Primary"
|
||||
},
|
||||
{
|
||||
"fieldname": "phone",
|
||||
"fieldtype": "Data",
|
||||
"in_list_view": 1,
|
||||
"label": "Phone"
|
||||
"label": "Number",
|
||||
"reqd": 1
|
||||
},
|
||||
{
|
||||
"columns": 2,
|
||||
"default": "0",
|
||||
"fieldname": "is_primary_phone",
|
||||
"fieldtype": "Check",
|
||||
"in_list_view": 1,
|
||||
"label": "Is Primary Phone"
|
||||
},
|
||||
{
|
||||
"columns": 2,
|
||||
"default": "0",
|
||||
"fieldname": "is_primary_mobile_no",
|
||||
"fieldtype": "Check",
|
||||
"in_list_view": 1,
|
||||
"label": "Is Primary Mobile"
|
||||
}
|
||||
],
|
||||
"istable": 1,
|
||||
"modified": "2019-08-05 11:40:59.104224",
|
||||
"modified": "2019-09-24 17:47:50.375326",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Contacts",
|
||||
"name": "Contact Phone",
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import frappe
|
|||
from frappe import _
|
||||
|
||||
field_map = {
|
||||
"Contact": ["first_name", "last_name", "address", "phone", "email_id", "is_primary_contact"],
|
||||
"Contact": ["first_name", "last_name", "address", "phone", "mobile_no", "email_id", "is_primary_contact"],
|
||||
"Address": ["address_line1", "address_line2", "city", "state", "pincode", "country", "is_primary_address"]
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -82,8 +82,8 @@ def create_linked_contact(link_list, address):
|
|||
"address": address,
|
||||
"status": "Open"
|
||||
})
|
||||
contact.add_email("test_contact@example.com")
|
||||
contact.add_phone("+91 0000000000")
|
||||
contact.add_email("test_contact@example.com", is_primary=True)
|
||||
contact.add_phone("+91 0000000000", is_primary_phone=True)
|
||||
|
||||
for name in link_list:
|
||||
contact.append("links",{
|
||||
|
|
@ -103,7 +103,7 @@ class TestAddressesAndContacts(unittest.TestCase):
|
|||
create_linked_contact(links_list, d)
|
||||
report_data = get_data({"reference_doctype": "Test Custom Doctype"})
|
||||
for idx, link in enumerate(links_list):
|
||||
test_item = [link, 'test address line 1', 'test address line 2', 'Milan', None, None, 'Italy', 0, '_Test First Name', '_Test Last Name', '_Test Address-Billing', '+91 0000000000', 'test_contact@example.com', 1]
|
||||
test_item = [link, 'test address line 1', 'test address line 2', 'Milan', None, None, 'Italy', 0, '_Test First Name', '_Test Last Name', '_Test Address-Billing', '+91 0000000000', None, 'test_contact@example.com', 1]
|
||||
self.assertListEqual(test_item, report_data[idx])
|
||||
|
||||
def tearDown(self):
|
||||
|
|
|
|||
|
|
@ -1027,9 +1027,10 @@ def update_roles(role_profile):
|
|||
user.add_roles(*roles)
|
||||
|
||||
def create_contact(user, ignore_links=False, ignore_mandatory=False):
|
||||
from frappe.contacts.doctype.contact.contact import get_contact_name
|
||||
if user.name in ["Administrator", "Guest"]: return
|
||||
|
||||
if not frappe.db.get_value("Contact", {"email_id": user.email}):
|
||||
if not get_contact_name(user.email):
|
||||
contact = frappe.get_doc({
|
||||
"doctype": "Contact",
|
||||
"first_name": user.first_name,
|
||||
|
|
@ -1039,7 +1040,7 @@ def create_contact(user, ignore_links=False, ignore_mandatory=False):
|
|||
})
|
||||
|
||||
if user.email:
|
||||
contact.add_email(user.email)
|
||||
contact.add_email(user.email, is_primary=True)
|
||||
|
||||
if user.phone:
|
||||
contact.add_phone(user.phone)
|
||||
|
|
@ -1048,7 +1049,6 @@ def create_contact(user, ignore_links=False, ignore_mandatory=False):
|
|||
contact.add_phone(user.mobile_no)
|
||||
contact.insert(ignore_permissions=True, ignore_links=ignore_links, ignore_mandatory=ignore_mandatory)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def generate_keys(user):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ user_privacy_documents = [
|
|||
{
|
||||
'doctype': 'Contact',
|
||||
'match_field': 'email_id',
|
||||
'personal_fields': ['first_name', 'last_name', 'phone'],
|
||||
'personal_fields': ['first_name', 'last_name', 'phone', 'mobile_no'],
|
||||
},
|
||||
{
|
||||
'doctype': 'Contact Email',
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ def sync_contacts_from_google_contacts(g_contact):
|
|||
contact.add_email(email_id=email.get("value"), is_primary=1 if email.get("metadata").get("primary") else 0)
|
||||
|
||||
for phone in connection.get("phoneNumbers", []):
|
||||
contact.add_phone(phone=phone.get("value"), is_primary=1 if phone.get("metadata").get("primary") else 0)
|
||||
contact.add_phone(phone=phone.get("value"), is_primary_phone=1 if phone.get("metadata").get("primary") else 0)
|
||||
|
||||
contact.insert(ignore_permissions=True)
|
||||
|
||||
|
|
|
|||
|
|
@ -7,15 +7,19 @@ import frappe
|
|||
import unittest
|
||||
import json
|
||||
from frappe.website.doctype.personal_data_download_request.personal_data_download_request import get_user_data
|
||||
|
||||
from frappe.contacts.doctype.contact.contact import get_contact_name
|
||||
|
||||
class TestRequestPersonalData(unittest.TestCase):
|
||||
def setUp(self):
|
||||
create_user_if_not_exists(email='test_privacy@example.com')
|
||||
|
||||
def tearDown(self):
|
||||
frappe.db.sql("""DELETE FROM `tabPersonal Data Download Request`""")
|
||||
|
||||
def test_user_data_creation(self):
|
||||
user_data = json.loads(get_user_data('test_privacy@example.com'))
|
||||
expected_data = {'Contact': frappe.get_all('Contact', {'email_id':'test_privacy@example.com'}, ["*"])}
|
||||
contact_name = get_contact_name('test_privacy@example.com')
|
||||
expected_data = {'Contact': frappe.get_all('Contact', {"name": contact_name}, ["*"])}
|
||||
expected_data = json.loads(json.dumps(expected_data, default=str))
|
||||
self.assertEqual({'Contact': user_data['Contact']}, expected_data)
|
||||
|
||||
|
|
@ -45,8 +49,7 @@ class TestRequestPersonalData(unittest.TestCase):
|
|||
frappe.db.sql("delete from `tabEmail Queue`")
|
||||
|
||||
def create_user_if_not_exists(email, first_name = None):
|
||||
if frappe.db.exists("User", email):
|
||||
return
|
||||
frappe.delete_doc_if_exists("User", email)
|
||||
|
||||
frappe.get_doc({
|
||||
"doctype": "User",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue