From 19a8a6cdc0430e2913f1ed34b3299ba2c77a1d0d Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Wed, 16 Jan 2019 18:54:37 +0530 Subject: [PATCH 1/3] fix: Address and contact report (#6763) --- .../addresses_and_contacts.py | 54 ++++++++----------- 1 file changed, 22 insertions(+), 32 deletions(-) diff --git a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py index edb69b831d..16451d0d46 100644 --- a/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py +++ b/frappe/contacts/report/addresses_and_contacts/addresses_and_contacts.py @@ -2,7 +2,6 @@ # For license information, please see license.txt from __future__ import unicode_literals -from six.moves import range from six import iteritems import frappe @@ -35,66 +34,57 @@ def get_columns(filters): ] def get_data(filters): - data = [] party_type = filters.get("party_type") party = filters.get("party_name") return get_party_addresses_and_contact(party_type, party) -def get_party_addresses_and_contact(party_type, party): +def get_party_addresses_and_contact(reference_doctype, reference_name): data = [] filters = None - party_details = frappe._dict() + reference_details = frappe._dict() - if not party_type: + if not reference_doctype: return [] - if party: - filters = { "name": party } + if reference_name: + filters = { "name": reference_name } - party_list = [d[0] for d in frappe.get_list(party_type, filters=filters, fields=["name"], as_list=True)] - for d in party_list: - party_details.setdefault(d, frappe._dict()) + reference_list = [d[0] for d in frappe.get_list(reference_doctype, filters=filters, fields=["name"], as_list=True)] + for d in reference_list: + reference_details.setdefault(d, frappe._dict()) - party_details = get_party_details(party_type, party_list, "Address", party_details) - party_details = get_party_details(party_type, party_list, "Contact", party_details) + reference_details = get_party_details(reference_doctype, "Address", reference_list, reference_details) + reference_details = get_party_details(reference_doctype, "Contact", reference_list, reference_details) - for party, details in iteritems(party_details): + for reference_name, details in iteritems(reference_details): addresses = details.get("address", []) contacts = details.get("contact", []) if not any([addresses, contacts]): - result = [party] + result = [reference_name] result.extend(add_blank_columns_for("Contact")) result.extend(add_blank_columns_for("Address")) data.append(result) else: - addresses = map(list, addresses) - contacts = map(list, contacts) + result = [reference_name] + result.extend(list(addresses) or add_blank_columns_for("Address")) + result.extend(list(contacts) or add_blank_columns_for("Contact")) + data.append(result) - max_length = max(len(addresses), len(contacts)) - for idx in range(0, max_length): - result = [party] - address = addresses[idx] if idx < len(addresses) else add_blank_columns_for("Address") - contact = contacts[idx] if idx < len(contacts) else add_blank_columns_for("Contact") - result.extend(address) - result.extend(contact) - - data.append(result) return data -def get_party_details(party_type, party_list, doctype, party_details): +def get_party_details(reference_doctype, doctype, reference_list, reference_details): filters = [ - ["Dynamic Link", "link_doctype", "=", party_type], - ["Dynamic Link", "link_name", "in", party_list] + ["Dynamic Link", "link_doctype", "=", reference_doctype], + ["Dynamic Link", "link_name", "in", reference_list] ] fields = ["`tabDynamic Link`.link_name"] + field_map.get(doctype, []) records = frappe.get_list(doctype, filters=filters, fields=fields, as_list=True) for d in records: - details = party_details.get(d[0]) or {} - details.setdefault(frappe.scrub(doctype), []).append(d[1:]) + reference_details[d[0]][frappe.scrub(doctype)] = d[1:] - return party_details + return reference_details def add_blank_columns_for(doctype): - return ["" for field in field_map.get(doctype, [])] \ No newline at end of file + return ["" for _ in field_map.get(doctype, [])] \ No newline at end of file From 3d95621cd5e2cf3515207351f3201499efb228b3 Mon Sep 17 00:00:00 2001 From: Zarrar Date: Fri, 18 Jan 2019 13:33:59 +0530 Subject: [PATCH 2/3] feat(email): Retry sending Email 3 times before deeming it as error (#6754) * added field to note number of retries * incase of unprecedented errors increase retry counter and try sending again --- .../doctype/email_queue/email_queue.json | 33 ++++++++++++++++++- frappe/email/queue.py | 16 +++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/frappe/email/doctype/email_queue/email_queue.json b/frappe/email/doctype/email_queue/email_queue.json index e4ebc153b5..ec640b19e9 100644 --- a/frappe/email/doctype/email_queue/email_queue.json +++ b/frappe/email/doctype/email_queue/email_queue.json @@ -524,6 +524,37 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "fieldname": "retry", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Retry", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "has_web_view": 0, @@ -537,7 +568,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2017-09-25 15:39:21.781324", + "modified": "2019-01-11 09:05:04.175368", "modified_by": "Administrator", "module": "Email", "name": "Email Queue", diff --git a/frappe/email/queue.py b/frappe/email/queue.py index 8f5a28efac..5fb1228034 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -382,7 +382,7 @@ def send_one(email, smtpserver=None, auto_commit=True, now=False, from_test=Fals email = frappe.db.sql('''select name, status, communication, message, sender, reference_doctype, reference_name, unsubscribe_param, unsubscribe_method, expose_recipients, - show_as_cc, add_unsubscribe_link, attachments + show_as_cc, add_unsubscribe_link, attachments, retry from `tabEmail Queue` where @@ -464,12 +464,16 @@ def send_one(email, smtpserver=None, auto_commit=True, now=False, from_test=Fals except Exception as e: frappe.db.rollback() - if any("Sent" == s.status for s in recipients_list): - frappe.db.sql("""update `tabEmail Queue` set status='Partially Errored', error=%s where name=%s""", - (text_type(e), email.name), auto_commit=auto_commit) + if email.retry < 3: + frappe.db.sql("""update `tabEmail Queue` set status='Not Sent', modified=%s, retry=retry+1 where name=%s""", + (now_datetime(), email.name), auto_commit=auto_commit) else: - frappe.db.sql("""update `tabEmail Queue` set status='Error', error=%s -where name=%s""", (text_type(e), email.name), auto_commit=auto_commit) + if any("Sent" == s.status for s in recipients_list): + frappe.db.sql("""update `tabEmail Queue` set status='Partially Errored', error=%s where name=%s""", + (text_type(e), email.name), auto_commit=auto_commit) + else: + frappe.db.sql("""update `tabEmail Queue` set status='Error', error=%s + where name=%s""", (text_type(e), email.name), auto_commit=auto_commit) if email.communication: frappe.get_doc('Communication', email.communication).set_delivery_status(commit=auto_commit) From a00b063d36995c522a8a6648ea1ddb47a4e577dd Mon Sep 17 00:00:00 2001 From: Sagar Vora Date: Tue, 22 Jan 2019 15:39:38 +0550 Subject: [PATCH 3/3] bumped to version 10.1.70 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index c5784af033..fb344b50ee 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template, get_email_from_template -__version__ = '10.1.69' +__version__ = '10.1.70' __title__ = "Frappe Framework" local = Local()