Mandrill integration editsversion-14
@@ -239,7 +239,7 @@ def msgprint(msg, small=0, raise_exception=0, as_table=False): | |||||
msg = '<table border="1px" style="border-collapse: collapse" cellpadding="2px">' + ''.join(['<tr>'+''.join(['<td>%s</td>' % c for c in r])+'</tr>' for r in msg]) + '</table>' | msg = '<table border="1px" style="border-collapse: collapse" cellpadding="2px">' + ''.join(['<tr>'+''.join(['<td>%s</td>' % c for c in r])+'</tr>' for r in msg]) + '</table>' | ||||
if flags.print_messages: | if flags.print_messages: | ||||
print "Message: " + repr(msg) | |||||
print "Message: " + repr(msg).encode("utf-8") | |||||
message_log.append((small and '__small:' or '')+cstr(msg or '')) | message_log.append((small and '__small:' or '')+cstr(msg or '')) | ||||
_raise_exception() | _raise_exception() | ||||
@@ -0,0 +1 @@ | |||||
- Moved Backup Manager and Social Login Keys to the new **Integrations** module |
@@ -72,4 +72,10 @@ def get_data(): | |||||
"type": "module", | "type": "module", | ||||
"system_manager": 1 | "system_manager": 1 | ||||
}, | }, | ||||
"Integrations": { | |||||
"color": "#36414C", | |||||
"icon": "octicon octicon-plug", | |||||
"type": "module", | |||||
"system_manager": 1 | |||||
} | |||||
} | } |
@@ -0,0 +1,23 @@ | |||||
from __future__ import unicode_literals | |||||
from frappe import _ | |||||
def get_data(): | |||||
return [ | |||||
{ | |||||
"label": _("Documents"), | |||||
"icon": "icon-star", | |||||
"items": [ | |||||
{ | |||||
"type": "doctype", | |||||
"name": "Social Login Keys", | |||||
"description": _("Enter keys to enable login via Facebook, Google, GitHub."), | |||||
}, | |||||
{ | |||||
"type": "doctype", | |||||
"name": "Backup Manager", | |||||
"description": _("Manage cloud backups on Dropbox"), | |||||
"hide_count": True | |||||
} | |||||
] | |||||
} | |||||
] |
@@ -208,12 +208,6 @@ def get_data(): | |||||
"description": _("Install Applications."), | "description": _("Install Applications."), | ||||
"icon": "icon-download" | "icon": "icon-download" | ||||
}, | }, | ||||
{ | |||||
"type": "doctype", | |||||
"name": "Backup Manager", | |||||
"description": _("Manage cloud backups on Dropbox"), | |||||
"hide_count": True | |||||
}, | |||||
{ | { | ||||
"type": "doctype", | "type": "doctype", | ||||
"name": "Scheduler Log", | "name": "Scheduler Log", | ||||
@@ -77,11 +77,6 @@ def get_data(): | |||||
"type": "doctype", | "type": "doctype", | ||||
"name": "Website Theme", | "name": "Website Theme", | ||||
"description": _("List of themes for Website."), | "description": _("List of themes for Website."), | ||||
}, | |||||
{ | |||||
"type": "doctype", | |||||
"name": "Social Login Keys", | |||||
"description": _("Enter keys to enable login via Facebook, Google, GitHub."), | |||||
} | } | ||||
] | ] | ||||
}, | }, | ||||
@@ -1,251 +1,267 @@ | |||||
{ | { | ||||
"allow_import": 1, | |||||
"autoname": "naming_series:", | |||||
"creation": "2013-01-29 10:47:14", | |||||
"description": "Keep a track of all communications", | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"document_type": "Master", | |||||
"allow_import": 1, | |||||
"autoname": "naming_series:", | |||||
"creation": "2013-01-29 10:47:14", | |||||
"description": "Keep a track of all communications", | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"document_type": "Master", | |||||
"fields": [ | "fields": [ | ||||
{ | { | ||||
"default": "COMM-", | |||||
"fieldname": "naming_series", | |||||
"fieldtype": "Select", | |||||
"hidden": 1, | |||||
"label": "Series", | |||||
"options": "COMM-", | |||||
"default": "COMM-", | |||||
"fieldname": "naming_series", | |||||
"fieldtype": "Select", | |||||
"hidden": 1, | |||||
"label": "Series", | |||||
"options": "COMM-", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
{ | |||||
"fieldname": "sent_or_received", | |||||
"fieldtype": "Select", | |||||
"in_list_view": 1, | |||||
"label": "Sent or Received", | |||||
"options": "Sent\nReceived", | |||||
"permlevel": 0, | |||||
}, | |||||
{ | |||||
"fieldname": "sent_or_received", | |||||
"fieldtype": "Select", | |||||
"in_list_view": 1, | |||||
"label": "Sent or Received", | |||||
"options": "Sent\nReceived", | |||||
"permlevel": 0, | |||||
"reqd": 1 | "reqd": 1 | ||||
}, | |||||
}, | |||||
{ | |||||
"fieldname": "status", | |||||
"fieldtype": "Select", | |||||
"label": "Status", | |||||
"options": "Open\nReplied\nArchived", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | { | ||||
"fieldname": "status", | |||||
"fieldtype": "Select", | |||||
"label": "Status", | |||||
"options": "Open\nReplied\nArchived", | |||||
"permlevel": 0, | |||||
"description": "Integrations can use this field to set email delivery status", | |||||
"fieldname": "delivery_status", | |||||
"fieldtype": "Select", | |||||
"hidden": 1, | |||||
"label": "Delivery Status", | |||||
"options": "\nSent\nBounced\nOpened\nMarked As Spam\nRejected\nDelayed\nSoft-Bounced\nClicked\nRecipient Unsubscribed", | |||||
"permlevel": 0, | |||||
"precision": "" | "precision": "" | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "subject", | |||||
"fieldtype": "Data", | |||||
"in_list_view": 0, | |||||
"label": "Subject", | |||||
"permlevel": 0, | |||||
"fieldname": "subject", | |||||
"fieldtype": "Data", | |||||
"in_list_view": 0, | |||||
"label": "Subject", | |||||
"permlevel": 0, | |||||
"reqd": 1 | "reqd": 1 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "column_break_5", | |||||
"fieldtype": "Column Break", | |||||
"permlevel": 0, | |||||
"fieldname": "column_break_5", | |||||
"fieldtype": "Column Break", | |||||
"permlevel": 0, | |||||
"precision": "" | "precision": "" | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "reference_doctype", | |||||
"fieldtype": "Link", | |||||
"label": "Reference DocType", | |||||
"options": "DocType", | |||||
"permlevel": 0, | |||||
"fieldname": "reference_doctype", | |||||
"fieldtype": "Link", | |||||
"label": "Reference DocType", | |||||
"options": "DocType", | |||||
"permlevel": 0, | |||||
"precision": "" | "precision": "" | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "reference_name", | |||||
"fieldtype": "Dynamic Link", | |||||
"label": "Reference Name", | |||||
"options": "reference_doctype", | |||||
"permlevel": 0, | |||||
"fieldname": "reference_name", | |||||
"fieldtype": "Dynamic Link", | |||||
"label": "Reference Name", | |||||
"options": "reference_doctype", | |||||
"permlevel": 0, | |||||
"precision": "" | "precision": "" | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "section_break_8", | |||||
"fieldtype": "Section Break", | |||||
"permlevel": 0, | |||||
"fieldname": "section_break_8", | |||||
"fieldtype": "Section Break", | |||||
"permlevel": 0, | |||||
"precision": "" | "precision": "" | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "content", | |||||
"fieldtype": "Text Editor", | |||||
"label": "Content", | |||||
"permlevel": 0, | |||||
"reqd": 0, | |||||
"fieldname": "content", | |||||
"fieldtype": "Text Editor", | |||||
"label": "Content", | |||||
"permlevel": 0, | |||||
"reqd": 0, | |||||
"width": "400" | "width": "400" | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "additional_info", | |||||
"fieldtype": "Section Break", | |||||
"label": "Additional Info", | |||||
"fieldname": "additional_info", | |||||
"fieldtype": "Section Break", | |||||
"label": "Additional Info", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "recipients", | |||||
"fieldtype": "Data", | |||||
"label": "Recipients", | |||||
"fieldname": "recipients", | |||||
"fieldtype": "Data", | |||||
"label": "Recipients", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "sender", | |||||
"fieldtype": "Data", | |||||
"label": "Sender", | |||||
"fieldname": "phone_no", | |||||
"fieldtype": "Data", | |||||
"label": "Phone No.", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "sender_full_name", | |||||
"fieldtype": "Data", | |||||
"label": "Sender Full Name", | |||||
"permlevel": 0, | |||||
"fieldname": "communication_medium", | |||||
"fieldtype": "Select", | |||||
"in_list_view": 1, | |||||
"label": "Communication Medium", | |||||
"options": "\nChat\nPhone\nEmail\nSMS\nVisit\nOther", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "column_break_14", | |||||
"fieldtype": "Column Break", | |||||
"permlevel": 0, | |||||
"precision": "" | "precision": "" | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "communication_medium", | |||||
"fieldtype": "Select", | |||||
"in_list_view": 1, | |||||
"label": "Communication Medium", | |||||
"options": "\nChat\nPhone\nEmail\nSMS\nVisit\nOther", | |||||
"fieldname": "sender", | |||||
"fieldtype": "Data", | |||||
"label": "Sender", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "phone_no", | |||||
"fieldtype": "Data", | |||||
"label": "Phone No.", | |||||
"permlevel": 0 | |||||
}, | |||||
"fieldname": "sender_full_name", | |||||
"fieldtype": "Data", | |||||
"label": "Sender Full Name", | |||||
"permlevel": 0, | |||||
"precision": "" | |||||
}, | |||||
{ | { | ||||
"fieldname": "section_break2", | |||||
"fieldtype": "Section Break", | |||||
"options": "simple", | |||||
"fieldname": "section_break2", | |||||
"fieldtype": "Section Break", | |||||
"options": "simple", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "column_break4", | |||||
"fieldtype": "Column Break", | |||||
"label": "By", | |||||
"fieldname": "column_break4", | |||||
"fieldtype": "Column Break", | |||||
"label": "By", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "email_account", | |||||
"fieldtype": "Link", | |||||
"label": "Email Account", | |||||
"options": "Email Account", | |||||
"permlevel": 0, | |||||
"fieldname": "email_account", | |||||
"fieldtype": "Link", | |||||
"label": "Email Account", | |||||
"options": "Email Account", | |||||
"permlevel": 0, | |||||
"precision": "" | "precision": "" | ||||
}, | |||||
{ | |||||
"default": "__user", | |||||
"fieldname": "user", | |||||
"fieldtype": "Link", | |||||
"ignore_user_permissions": 1, | |||||
"label": "User", | |||||
"options": "User", | |||||
"permlevel": 0, | |||||
}, | |||||
{ | |||||
"default": "__user", | |||||
"fieldname": "user", | |||||
"fieldtype": "Link", | |||||
"ignore_user_permissions": 1, | |||||
"label": "User", | |||||
"options": "User", | |||||
"permlevel": 0, | |||||
"read_only": 1 | "read_only": 1 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"fieldname": "column_break5", | |||||
"fieldtype": "Column Break", | |||||
"label": "On", | |||||
"fieldname": "column_break5", | |||||
"fieldtype": "Column Break", | |||||
"label": "On", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
}, | |||||
{ | { | ||||
"default": "Today", | |||||
"fieldname": "communication_date", | |||||
"fieldtype": "Datetime", | |||||
"label": "Date", | |||||
"default": "Today", | |||||
"fieldname": "communication_date", | |||||
"fieldtype": "Datetime", | |||||
"label": "Date", | |||||
"permlevel": 0 | "permlevel": 0 | ||||
}, | |||||
{ | |||||
"fieldname": "_user_tags", | |||||
"fieldtype": "Data", | |||||
"hidden": 1, | |||||
"label": "User Tags", | |||||
"no_copy": 1, | |||||
"permlevel": 0, | |||||
}, | |||||
{ | |||||
"fieldname": "_user_tags", | |||||
"fieldtype": "Data", | |||||
"hidden": 1, | |||||
"label": "User Tags", | |||||
"no_copy": 1, | |||||
"permlevel": 0, | |||||
"print_hide": 1 | "print_hide": 1 | ||||
}, | |||||
{ | |||||
"default": "0", | |||||
"fieldname": "unread_notification_sent", | |||||
"fieldtype": "Check", | |||||
"label": "Unread Notification Sent", | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
}, | |||||
{ | |||||
"default": "0", | |||||
"fieldname": "unread_notification_sent", | |||||
"fieldtype": "Check", | |||||
"label": "Unread Notification Sent", | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"read_only": 1 | "read_only": 1 | ||||
} | } | ||||
], | |||||
"icon": "icon-comment", | |||||
"idx": 1, | |||||
"in_dialog": 0, | |||||
"issingle": 0, | |||||
"modified": "2015-03-23 02:33:55.289739", | |||||
"modified_by": "Administrator", | |||||
"module": "Core", | |||||
"name": "Communication", | |||||
"owner": "Administrator", | |||||
], | |||||
"icon": "icon-comment", | |||||
"idx": 1, | |||||
"in_dialog": 0, | |||||
"issingle": 0, | |||||
"modified": "2015-07-28 07:28:11.457131", | |||||
"modified_by": "Administrator", | |||||
"module": "Core", | |||||
"name": "Communication", | |||||
"owner": "Administrator", | |||||
"permissions": [ | "permissions": [ | ||||
{ | { | ||||
"amend": 0, | |||||
"apply_user_permissions": 1, | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "Support Team", | |||||
"share": 1, | |||||
"submit": 0, | |||||
"amend": 0, | |||||
"apply_user_permissions": 1, | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "Support Team", | |||||
"share": 1, | |||||
"submit": 0, | |||||
"write": 1 | "write": 1 | ||||
}, | |||||
{ | |||||
"amend": 0, | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "Sales Manager", | |||||
"share": 1, | |||||
"submit": 0, | |||||
}, | |||||
{ | |||||
"amend": 0, | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "Sales Manager", | |||||
"share": 1, | |||||
"submit": 0, | |||||
"write": 1 | "write": 1 | ||||
}, | |||||
{ | |||||
"amend": 0, | |||||
"apply_user_permissions": 1, | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "Sales User", | |||||
"share": 1, | |||||
"submit": 0, | |||||
}, | |||||
{ | |||||
"amend": 0, | |||||
"apply_user_permissions": 1, | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "Sales User", | |||||
"share": 1, | |||||
"submit": 0, | |||||
"write": 1 | "write": 1 | ||||
}, | |||||
{ | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "System Manager", | |||||
"share": 1, | |||||
"submit": 0, | |||||
}, | |||||
{ | |||||
"create": 1, | |||||
"delete": 1, | |||||
"email": 1, | |||||
"permlevel": 0, | |||||
"print": 1, | |||||
"read": 1, | |||||
"report": 1, | |||||
"role": "System Manager", | |||||
"share": 1, | |||||
"submit": 0, | |||||
"write": 1 | "write": 1 | ||||
} | } | ||||
], | |||||
"search_fields": "subject", | |||||
], | |||||
"search_fields": "subject", | |||||
"title_field": "subject" | "title_field": "subject" | ||||
} | |||||
} |
@@ -113,7 +113,7 @@ def get_comments(dt, dn, limit=100): | |||||
communications = frappe.db.sql("""select name, | communications = frappe.db.sql("""select name, | ||||
content as comment, sender as comment_by, creation, | content as comment, sender as comment_by, creation, | ||||
communication_medium as comment_type, subject, | |||||
communication_medium as comment_type, subject, delivery_status, | |||||
"Communication" as doctype | "Communication" as doctype | ||||
from tabCommunication | from tabCommunication | ||||
where reference_doctype=%s and reference_name=%s | where reference_doctype=%s and reference_name=%s | ||||
@@ -60,6 +60,9 @@ def send(recipients=None, sender=None, subject=None, message=None, reference_doc | |||||
if reference_doctype and reference_name: | if reference_doctype and reference_name: | ||||
unsubscribed = [d.email for d in frappe.db.get_all("Email Unsubscribe", "email", | unsubscribed = [d.email for d in frappe.db.get_all("Email Unsubscribe", "email", | ||||
{"reference_doctype": reference_doctype, "reference_name": reference_name})] | {"reference_doctype": reference_doctype, "reference_name": reference_name})] | ||||
unsubscribed += [d.email for d in frappe.db.get_all("Email Unsubscribe", "email", | |||||
{"global_unsubscribe": 1})] | |||||
else: | else: | ||||
unsubscribed = [] | unsubscribed = [] | ||||
@@ -159,14 +162,19 @@ def unsubscribe(doctype, name, email): | |||||
if not verify_request(): | if not verify_request(): | ||||
return | return | ||||
frappe.get_doc({ | |||||
"doctype": "Email Unsubscribe", | |||||
"email": email, | |||||
"reference_doctype": doctype, | |||||
"reference_name": name | |||||
}).insert(ignore_permissions=True) | |||||
try: | |||||
frappe.get_doc({ | |||||
"doctype": "Email Unsubscribe", | |||||
"email": email, | |||||
"reference_doctype": doctype, | |||||
"reference_name": name | |||||
}).insert(ignore_permissions=True) | |||||
except frappe.DuplicateEntryError: | |||||
frappe.db.rollback() | |||||
frappe.db.commit() | |||||
else: | |||||
frappe.db.commit() | |||||
return_unsubscribed_page(email, doctype, name) | return_unsubscribed_page(email, doctype, name) | ||||
@@ -25,7 +25,8 @@ | |||||
"report_hide": 0, | "report_hide": 0, | ||||
"reqd": 1, | "reqd": 1, | ||||
"search_index": 0, | "search_index": 0, | ||||
"set_only_once": 0 | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | }, | ||||
{ | { | ||||
"allow_on_submit": 0, | "allow_on_submit": 0, | ||||
@@ -43,9 +44,10 @@ | |||||
"print_hide": 0, | "print_hide": 0, | ||||
"read_only": 0, | "read_only": 0, | ||||
"report_hide": 0, | "report_hide": 0, | ||||
"reqd": 1, | |||||
"reqd": 0, | |||||
"search_index": 0, | "search_index": 0, | ||||
"set_only_once": 0 | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | }, | ||||
{ | { | ||||
"allow_on_submit": 0, | "allow_on_submit": 0, | ||||
@@ -63,9 +65,30 @@ | |||||
"print_hide": 0, | "print_hide": 0, | ||||
"read_only": 0, | "read_only": 0, | ||||
"report_hide": 0, | "report_hide": 0, | ||||
"reqd": 1, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "global_unsubscribe", | |||||
"fieldtype": "Check", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 1, | |||||
"label": "Global Unsubscribe", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | "search_index": 0, | ||||
"set_only_once": 0 | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
} | } | ||||
], | ], | ||||
"hide_heading": 0, | "hide_heading": 0, | ||||
@@ -75,7 +98,7 @@ | |||||
"is_submittable": 0, | "is_submittable": 0, | ||||
"issingle": 0, | "issingle": 0, | ||||
"istable": 0, | "istable": 0, | ||||
"modified": "2015-03-18 09:41:20.216319", | |||||
"modified": "2015-08-05 06:02:12.805282", | |||||
"modified_by": "Administrator", | "modified_by": "Administrator", | ||||
"module": "Email", | "module": "Email", | ||||
"name": "Email Unsubscribe", | "name": "Email Unsubscribe", | ||||
@@ -90,6 +113,7 @@ | |||||
"delete": 1, | "delete": 1, | ||||
"email": 1, | "email": 1, | ||||
"export": 1, | "export": 1, | ||||
"if_owner": 0, | |||||
"import": 0, | "import": 0, | ||||
"permlevel": 0, | "permlevel": 0, | ||||
"print": 1, | "print": 1, | ||||
@@ -8,6 +8,32 @@ from frappe.model.document import Document | |||||
from frappe import _ | from frappe import _ | ||||
class EmailUnsubscribe(Document): | class EmailUnsubscribe(Document): | ||||
def validate(self): | |||||
if not self.global_unsubscribe and not (self.reference_doctype and self.reference_name): | |||||
frappe.throw(_("Reference DocType and Reference Name are required"), frappe.MandatoryError) | |||||
if not self.global_unsubscribe and frappe.db.get_value(self.doctype, self.name, "global_unsubscribe"): | |||||
frappe.throw(_("Delete this record to allow sending to this email address")) | |||||
if self.global_unsubscribe: | |||||
if frappe.get_all("Email Unsubscribe", | |||||
filters={"email": self.email, "global_unsubscribe": 1, "name": ["!=", self.name]}): | |||||
frappe.throw(_("{0} already unsubscribed").format(self.email), frappe.DuplicateEntryError) | |||||
else: | |||||
if frappe.get_all("Email Unsubscribe", | |||||
filters={ | |||||
"email": self.email, | |||||
"reference_doctype": self.reference_doctype, | |||||
"reference_name": self.reference_name, | |||||
"name": ["!=", self.name] | |||||
}): | |||||
frappe.throw(_("{0} already unsubscribed for {1} {2}").format( | |||||
self.email, self.reference_doctype, self.reference_name), | |||||
frappe.DuplicateEntryError) | |||||
def on_update(self): | def on_update(self): | ||||
doc = frappe.get_doc(self.reference_doctype, self.reference_name) | |||||
doc.add_comment("Label", _("Left this conversation"), comment_by=self.email) | |||||
if self.reference_doctype and self.reference_name: | |||||
doc = frappe.get_doc(self.reference_doctype, self.reference_name) | |||||
doc.add_comment("Label", _("Left this conversation"), comment_by=self.email) | |||||
@@ -192,7 +192,7 @@ class EMail: | |||||
"Date": email.utils.formatdate(), | "Date": email.utils.formatdate(), | ||||
"Reply-To": self.reply_to.encode("utf-8") if self.reply_to else None, | "Reply-To": self.reply_to.encode("utf-8") if self.reply_to else None, | ||||
"CC": ', '.join(self.cc).encode("utf-8") if self.cc else None, | "CC": ', '.join(self.cc).encode("utf-8") if self.cc else None, | ||||
b'X-Frappe-Site': get_url().encode('utf-8') | |||||
b'X-Frappe-Site': get_url().encode('utf-8'), | |||||
} | } | ||||
# reset headers as values may be changed. | # reset headers as values may be changed. | ||||
@@ -201,6 +201,10 @@ class EMail: | |||||
del self.msg_root[key] | del self.msg_root[key] | ||||
self.msg_root[key] = val | self.msg_root[key] = val | ||||
# call hook to enable apps to modify msg_root before sending | |||||
for hook in frappe.get_hooks("make_email_body_message"): | |||||
frappe.get_attr(hook)(self) | |||||
def as_string(self): | def as_string(self): | ||||
"""validate, build message and convert to string""" | """validate, build message and convert to string""" | ||||
self.validate() | self.validate() | ||||
@@ -83,11 +83,11 @@ def execute_cmd(cmd): | |||||
if frappe.session['user'] == 'Guest': | if frappe.session['user'] == 'Guest': | ||||
if (method not in frappe.guest_methods): | if (method not in frappe.guest_methods): | ||||
frappe.msgprint(_("Not permitted")) | frappe.msgprint(_("Not permitted")) | ||||
raise frappe.PermissionError('Not Allowed, %s' % str(method)) | |||||
raise frappe.PermissionError('Not Allowed, {0}'.format(method)) | |||||
else: | else: | ||||
if not method in frappe.whitelisted: | if not method in frappe.whitelisted: | ||||
frappe.msgprint(_("Not permitted")) | frappe.msgprint(_("Not permitted")) | ||||
raise frappe.PermissionError('Not Allowed, %s' % str(method)) | |||||
raise frappe.PermissionError('Not Allowed, {0}'.format(method)) | |||||
ret = frappe.call(method, **frappe.form_dict) | ret = frappe.call(method, **frappe.form_dict) | ||||
@@ -0,0 +1,221 @@ | |||||
{ | |||||
"allow_copy": 0, | |||||
"allow_import": 0, | |||||
"allow_rename": 0, | |||||
"creation": "2014-03-04 08:29:52", | |||||
"custom": 0, | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"document_type": "System", | |||||
"fields": [ | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "facebook", | |||||
"fieldtype": "Section Break", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "Facebook", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "facebook_client_id", | |||||
"fieldtype": "Data", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "Facebook Client ID", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "facebook_client_secret", | |||||
"fieldtype": "Data", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "Facebook Client Secret", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "google", | |||||
"fieldtype": "Section Break", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "Google", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "google_client_id", | |||||
"fieldtype": "Data", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "Google Client ID", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "google_client_secret", | |||||
"fieldtype": "Data", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "Google Client Secret", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "github", | |||||
"fieldtype": "Section Break", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "GitHub", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "github_client_id", | |||||
"fieldtype": "Data", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "GitHub Client ID", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_on_submit": 0, | |||||
"fieldname": "github_client_secret", | |||||
"fieldtype": "Data", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"in_filter": 0, | |||||
"in_list_view": 0, | |||||
"label": "GitHub Client Secret", | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"print_hide": 0, | |||||
"read_only": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
} | |||||
], | |||||
"hide_heading": 0, | |||||
"hide_toolbar": 0, | |||||
"icon": "icon-signin", | |||||
"idx": 1, | |||||
"in_create": 0, | |||||
"in_dialog": 0, | |||||
"is_submittable": 0, | |||||
"issingle": 1, | |||||
"istable": 0, | |||||
"modified": "2015-08-05 08:14:52.667728", | |||||
"modified_by": "Administrator", | |||||
"module": "Integrations", | |||||
"name": "Social Login Keys", | |||||
"owner": "Administrator", | |||||
"permissions": [ | |||||
{ | |||||
"amend": 0, | |||||
"apply_user_permissions": 0, | |||||
"cancel": 0, | |||||
"create": 1, | |||||
"delete": 0, | |||||
"email": 0, | |||||
"export": 0, | |||||
"if_owner": 0, | |||||
"import": 0, | |||||
"permlevel": 0, | |||||
"print": 0, | |||||
"read": 1, | |||||
"report": 0, | |||||
"role": "System Manager", | |||||
"set_user_permissions": 0, | |||||
"share": 1, | |||||
"submit": 0, | |||||
"write": 1 | |||||
} | |||||
], | |||||
"read_only": 0, | |||||
"read_only_onload": 0 | |||||
} |
@@ -457,7 +457,7 @@ class Document(BaseDocument): | |||||
msgprint(msg) | msgprint(msg) | ||||
if frappe.flags.print_messages: | if frappe.flags.print_messages: | ||||
print self.as_dict() | |||||
print self.as_json().encode("utf-8") | |||||
raise frappe.MandatoryError(", ".join((each[0] for each in missing))) | raise frappe.MandatoryError(", ".join((each[0] for each in missing))) | ||||
@@ -6,3 +6,4 @@ Custom | |||||
Geo | Geo | ||||
Desk | Desk | ||||
Integrations |
@@ -157,3 +157,15 @@ select.form-control { | |||||
-moz-appearance: none; | -moz-appearance: none; | ||||
appearance: none; | appearance: none; | ||||
} | } | ||||
.form-headline .alert { | |||||
font-size: 12px; | |||||
border-color: #d1d8dd; | |||||
margin-bottom: 0px; | |||||
} | |||||
.delivery-status-indicator { | |||||
display: inline-block; | |||||
margin-top: -3px; | |||||
margin-left: 1px; | |||||
font-weight: 500; | |||||
color: #8d99a6; | |||||
} |
@@ -24,7 +24,7 @@ frappe.ui.form.Dashboard = Class.extend({ | |||||
}, | }, | ||||
set_headline_alert: function(text, alert_class, icon) { | set_headline_alert: function(text, alert_class, icon) { | ||||
this.set_headline(repl('<div class="alert %(alert_class)s">%(icon)s%(text)s</div>', { | this.set_headline(repl('<div class="alert %(alert_class)s">%(icon)s%(text)s</div>', { | ||||
"alert_class": alert_class || "alert-info", | |||||
"alert_class": alert_class || "", | |||||
"icon": icon ? '<i class="'+icon+'" /> ' : "", | "icon": icon ? '<i class="'+icon+'" /> ' : "", | ||||
"text": text | "text": text | ||||
})); | })); | ||||
@@ -10,15 +10,28 @@ | |||||
</span> | </span> | ||||
</div> | </div> | ||||
{% if(data.doctype=="Communication" || data.comment_type=="Comment") { %} | {% if(data.doctype=="Communication" || data.comment_type=="Comment") { %} | ||||
<h6> | |||||
<h6> | |||||
<i class="{%= data.icon %} icon-fixed-width"></i> | <i class="{%= data.icon %} icon-fixed-width"></i> | ||||
<span title="{%= data.comment_by %}">{%= data.fullname %}</span> | <span title="{%= data.comment_by %}">{%= data.fullname %}</span> | ||||
<span class="text-muted" style="font-weight: normal;"> | <span class="text-muted" style="font-weight: normal;"> | ||||
– {%= data.comment_on %}</span> | – {%= data.comment_on %}</span> | ||||
{% if(data.doctype=="Communication") { %} | {% if(data.doctype=="Communication") { %} | ||||
<span class="text-muted">–</span> | |||||
<a href="#Form/{%= data.doctype %}/{%= data.name %}" | |||||
class="text-muted">{%= __("Details") %}</a> | |||||
<span class="text-muted">–</span> | |||||
<a href="#Form/{%= data.doctype %}/{%= data.name %}" | |||||
class="text-muted"> | |||||
{% if (data.delivery_status) { | |||||
if (in_list(["Sent", "Opened", "Clicked"], data.delivery_status)) { | |||||
var indicator_class = "green"; | |||||
} else { | |||||
var indicator_class = "red"; | |||||
} | |||||
%} | |||||
<span class="indicator-right {%= indicator_class %} delivery-status-indicator" | |||||
title="{%= data.delivery_status %}"> | |||||
{%= data.delivery_status %}</span> | |||||
{% } else { %} {%= __("Details") %} {% } %} | |||||
</a> | |||||
<a class="text-muted reply-link pull-right" | <a class="text-muted reply-link pull-right" | ||||
data-name="{%= data.name %}">{%= __("Reply") %}</a> | data-name="{%= data.name %}">{%= __("Reply") %}</a> | ||||
{% } %} | {% } %} | ||||
@@ -204,3 +204,18 @@ select.form-control { | |||||
-moz-appearance: none; | -moz-appearance: none; | ||||
appearance: none; | appearance: none; | ||||
} | } | ||||
.form-headline .alert { | |||||
font-size: @text-medium; | |||||
border-color: @border-color; | |||||
// background-color: @light-bg; | |||||
margin-bottom: 0px; | |||||
} | |||||
.delivery-status-indicator { | |||||
display: inline-block; | |||||
margin-top: -3px; | |||||
margin-left: 1px; | |||||
font-weight: 500; | |||||
color: @text-muted; | |||||
} |
@@ -10,6 +10,7 @@ | |||||
@modal-backdrop-bg: #334143; | @modal-backdrop-bg: #334143; | ||||
@light-yellow: #fffce7; | @light-yellow: #fffce7; | ||||
@text-extra-muted: @border-color; | @text-extra-muted: @border-color; | ||||
@text-regular: 14px; | |||||
@text-medium: 12px; | @text-medium: 12px; | ||||
@text-small: 10px; | @text-small: 10px; | ||||
@@ -82,7 +82,7 @@ def make_boilerplate(dest, app_name): | |||||
with open(os.path.join(dest, hooks.app_name, hooks.app_name, "config", "desktop.py"), "w") as f: | with open(os.path.join(dest, hooks.app_name, hooks.app_name, "config", "desktop.py"), "w") as f: | ||||
f.write(encode(desktop_template.format(**hooks))) | f.write(encode(desktop_template.format(**hooks))) | ||||
print "'{app}' created at {path}".format(app=app_name, path=os.path.join(dest, app_name)) | |||||
manifest_template = """include MANIFEST.in | manifest_template = """include MANIFEST.in | ||||
@@ -1,80 +0,0 @@ | |||||
{ | |||||
"creation": "2014-03-04 08:29:52", | |||||
"docstatus": 0, | |||||
"doctype": "DocType", | |||||
"document_type": "System", | |||||
"fields": [ | |||||
{ | |||||
"fieldname": "facebook", | |||||
"fieldtype": "Section Break", | |||||
"label": "Facebook", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "facebook_client_id", | |||||
"fieldtype": "Data", | |||||
"label": "Facebook Client ID", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "facebook_client_secret", | |||||
"fieldtype": "Data", | |||||
"label": "Facebook Client Secret", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "google", | |||||
"fieldtype": "Section Break", | |||||
"label": "Google", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "google_client_id", | |||||
"fieldtype": "Data", | |||||
"label": "Google Client ID", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "google_client_secret", | |||||
"fieldtype": "Data", | |||||
"label": "Google Client Secret", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "github", | |||||
"fieldtype": "Section Break", | |||||
"label": "GitHub", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "github_client_id", | |||||
"fieldtype": "Data", | |||||
"label": "GitHub Client ID", | |||||
"permlevel": 0 | |||||
}, | |||||
{ | |||||
"fieldname": "github_client_secret", | |||||
"fieldtype": "Data", | |||||
"label": "GitHub Client Secret", | |||||
"permlevel": 0 | |||||
} | |||||
], | |||||
"icon": "icon-signin", | |||||
"idx": 1, | |||||
"issingle": 1, | |||||
"modified": "2015-02-05 05:11:46.875246", | |||||
"modified_by": "Administrator", | |||||
"module": "Website", | |||||
"name": "Social Login Keys", | |||||
"owner": "Administrator", | |||||
"permissions": [ | |||||
{ | |||||
"create": 1, | |||||
"permlevel": 0, | |||||
"read": 1, | |||||
"role": "System Manager", | |||||
"share": 1, | |||||
"write": 1 | |||||
} | |||||
] | |||||
} |
@@ -28,3 +28,5 @@ html2text | |||||
email_reply_parser | email_reply_parser | ||||
click | click | ||||
num2words | num2words | ||||
watchdog | |||||
pyopenssl |