Ver código fonte

Moved Backup Manager and Social Login keys to the new Integrations Module, prepared frappe for Mandrill Integration

version-14
Anand Doshi 10 anos atrás
pai
commit
c079e27d3f
28 arquivos alterados com 599 adições e 317 exclusões
  1. +1
    -1
      frappe/__init__.py
  2. +1
    -0
      frappe/change_log/current/integrations.md
  3. +6
    -0
      frappe/config/desktop.py
  4. +23
    -0
      frappe/config/integrations.py
  5. +0
    -6
      frappe/config/setup.py
  6. +0
    -5
      frappe/config/website.py
  7. +215
    -199
      frappe/core/doctype/communication/communication.json
  8. +1
    -1
      frappe/desk/form/load.py
  9. +15
    -7
      frappe/email/bulk.py
  10. +30
    -6
      frappe/email/doctype/email_unsubscribe/email_unsubscribe.json
  11. +28
    -2
      frappe/email/doctype/email_unsubscribe/email_unsubscribe.py
  12. +5
    -1
      frappe/email/email_body.py
  13. +2
    -2
      frappe/handler.py
  14. +0
    -0
      frappe/integrations/__init__.py
  15. +0
    -0
      frappe/integrations/doctype/__init__.py
  16. +0
    -0
      frappe/integrations/doctype/social_login_keys/__init__.py
  17. +221
    -0
      frappe/integrations/doctype/social_login_keys/social_login_keys.json
  18. +0
    -0
      frappe/integrations/doctype/social_login_keys/social_login_keys.py
  19. +1
    -1
      frappe/model/document.py
  20. +1
    -0
      frappe/modules.txt
  21. +12
    -0
      frappe/public/css/form.css
  22. +1
    -1
      frappe/public/js/frappe/form/dashboard.js
  23. +17
    -4
      frappe/public/js/frappe/form/footer/timeline_item.html
  24. +15
    -0
      frappe/public/less/form.less
  25. +1
    -0
      frappe/public/less/variables.less
  26. +1
    -1
      frappe/utils/boilerplate.py
  27. +0
    -80
      frappe/website/doctype/social_login_keys/social_login_keys.json
  28. +2
    -0
      requirements.txt

+ 1
- 1
frappe/__init__.py Ver arquivo

@@ -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>'

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 ''))
_raise_exception()


+ 1
- 0
frappe/change_log/current/integrations.md Ver arquivo

@@ -0,0 +1 @@
- Moved Backup Manager and Social Login Keys to the new **Integrations** module

+ 6
- 0
frappe/config/desktop.py Ver arquivo

@@ -72,4 +72,10 @@ def get_data():
"type": "module",
"system_manager": 1
},
"Integrations": {
"color": "#36414C",
"icon": "octicon octicon-plug",
"type": "module",
"system_manager": 1
}
}

+ 23
- 0
frappe/config/integrations.py Ver arquivo

@@ -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
}
]
}
]

+ 0
- 6
frappe/config/setup.py Ver arquivo

@@ -208,12 +208,6 @@ def get_data():
"description": _("Install Applications."),
"icon": "icon-download"
},
{
"type": "doctype",
"name": "Backup Manager",
"description": _("Manage cloud backups on Dropbox"),
"hide_count": True
},
{
"type": "doctype",
"name": "Scheduler Log",


+ 0
- 5
frappe/config/website.py Ver arquivo

@@ -77,11 +77,6 @@ def get_data():
"type": "doctype",
"name": "Website Theme",
"description": _("List of themes for Website."),
},
{
"type": "doctype",
"name": "Social Login Keys",
"description": _("Enter keys to enable login via Facebook, Google, GitHub."),
}
]
},


+ 215
- 199
frappe/core/doctype/communication/communication.json Ver arquivo

@@ -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": [
{
"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
},
{
"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
},
},
{
"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": ""
},
},
{
"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
},
},
{
"fieldname": "column_break_5",
"fieldtype": "Column Break",
"permlevel": 0,
"fieldname": "column_break_5",
"fieldtype": "Column Break",
"permlevel": 0,
"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": ""
},
},
{
"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": ""
},
},
{
"fieldname": "section_break_8",
"fieldtype": "Section Break",
"permlevel": 0,
"fieldname": "section_break_8",
"fieldtype": "Section Break",
"permlevel": 0,
"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"
},
},
{
"fieldname": "additional_info",
"fieldtype": "Section Break",
"label": "Additional Info",
"fieldname": "additional_info",
"fieldtype": "Section Break",
"label": "Additional Info",
"permlevel": 0
},
},
{
"fieldname": "recipients",
"fieldtype": "Data",
"label": "Recipients",
"fieldname": "recipients",
"fieldtype": "Data",
"label": "Recipients",
"permlevel": 0
},
},
{
"fieldname": "sender",
"fieldtype": "Data",
"label": "Sender",
"fieldname": "phone_no",
"fieldtype": "Data",
"label": "Phone No.",
"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": ""
},
},
{
"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
},
},
{
"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
},
},
{
"fieldname": "column_break4",
"fieldtype": "Column Break",
"label": "By",
"fieldname": "column_break4",
"fieldtype": "Column Break",
"label": "By",
"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": ""
},
{
"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
},
},
{
"fieldname": "column_break5",
"fieldtype": "Column Break",
"label": "On",
"fieldname": "column_break5",
"fieldtype": "Column Break",
"label": "On",
"permlevel": 0
},
},
{
"default": "Today",
"fieldname": "communication_date",
"fieldtype": "Datetime",
"label": "Date",
"default": "Today",
"fieldname": "communication_date",
"fieldtype": "Datetime",
"label": "Date",
"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
},
{
"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
}
],
"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": [
{
"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
},
{
"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
},
{
"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
},
{
"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
}
],
"search_fields": "subject",
],
"search_fields": "subject",
"title_field": "subject"
}
}

+ 1
- 1
frappe/desk/form/load.py Ver arquivo

@@ -113,7 +113,7 @@ def get_comments(dt, dn, limit=100):

communications = frappe.db.sql("""select name,
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
from tabCommunication
where reference_doctype=%s and reference_name=%s


+ 15
- 7
frappe/email/bulk.py Ver arquivo

@@ -60,6 +60,9 @@ def send(recipients=None, sender=None, subject=None, message=None, reference_doc
if reference_doctype and reference_name:
unsubscribed = [d.email for d in frappe.db.get_all("Email Unsubscribe", "email",
{"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:
unsubscribed = []

@@ -159,14 +162,19 @@ def unsubscribe(doctype, name, email):
if not verify_request():
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)



+ 30
- 6
frappe/email/doctype/email_unsubscribe/email_unsubscribe.json Ver arquivo

@@ -25,7 +25,8 @@
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
@@ -43,9 +44,10 @@
"print_hide": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"reqd": 0,
"search_index": 0,
"set_only_once": 0
"set_only_once": 0,
"unique": 0
},
{
"allow_on_submit": 0,
@@ -63,9 +65,30 @@
"print_hide": 0,
"read_only": 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,
"set_only_once": 0
"set_only_once": 0,
"unique": 0
}
],
"hide_heading": 0,
@@ -75,7 +98,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"modified": "2015-03-18 09:41:20.216319",
"modified": "2015-08-05 06:02:12.805282",
"modified_by": "Administrator",
"module": "Email",
"name": "Email Unsubscribe",
@@ -90,6 +113,7 @@
"delete": 1,
"email": 1,
"export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1,


+ 28
- 2
frappe/email/doctype/email_unsubscribe/email_unsubscribe.py Ver arquivo

@@ -8,6 +8,32 @@ from frappe.model.document import Document
from frappe import _

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):
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)


+ 5
- 1
frappe/email/email_body.py Ver arquivo

@@ -192,7 +192,7 @@ class EMail:
"Date": email.utils.formatdate(),
"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,
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.
@@ -201,6 +201,10 @@ class EMail:
del self.msg_root[key]
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):
"""validate, build message and convert to string"""
self.validate()


+ 2
- 2
frappe/handler.py Ver arquivo

@@ -83,11 +83,11 @@ def execute_cmd(cmd):
if frappe.session['user'] == 'Guest':
if (method not in frappe.guest_methods):
frappe.msgprint(_("Not permitted"))
raise frappe.PermissionError('Not Allowed, %s' % str(method))
raise frappe.PermissionError('Not Allowed, {0}'.format(method))
else:
if not method in frappe.whitelisted:
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)



frappe/website/doctype/social_login_keys/__init__.py → frappe/integrations/__init__.py Ver arquivo


+ 0
- 0
frappe/integrations/doctype/__init__.py Ver arquivo


+ 0
- 0
frappe/integrations/doctype/social_login_keys/__init__.py Ver arquivo


+ 221
- 0
frappe/integrations/doctype/social_login_keys/social_login_keys.json Ver arquivo

@@ -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
}

frappe/website/doctype/social_login_keys/social_login_keys.py → frappe/integrations/doctype/social_login_keys/social_login_keys.py Ver arquivo


+ 1
- 1
frappe/model/document.py Ver arquivo

@@ -457,7 +457,7 @@ class Document(BaseDocument):
msgprint(msg)

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)))



+ 1
- 0
frappe/modules.txt Ver arquivo

@@ -6,3 +6,4 @@ Custom
Geo
Desk
Print
Integrations

+ 12
- 0
frappe/public/css/form.css Ver arquivo

@@ -157,3 +157,15 @@ select.form-control {
-moz-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;
}

+ 1
- 1
frappe/public/js/frappe/form/dashboard.js Ver arquivo

@@ -24,7 +24,7 @@ frappe.ui.form.Dashboard = Class.extend({
},
set_headline_alert: function(text, alert_class, icon) {
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+'" /> ' : "",
"text": text
}));


+ 17
- 4
frappe/public/js/frappe/form/footer/timeline_item.html Ver arquivo

@@ -10,15 +10,28 @@
</span>
</div>
{% if(data.doctype=="Communication" || data.comment_type=="Comment") { %}
<h6>
<h6>
<i class="{%= data.icon %} icon-fixed-width"></i>
<span title="{%= data.comment_by %}">{%= data.fullname %}</span>
<span class="text-muted" style="font-weight: normal;">
&ndash; {%= data.comment_on %}</span>
{% if(data.doctype=="Communication") { %}
<span class="text-muted">&ndash;</span>
<a href="#Form/{%= data.doctype %}/{%= data.name %}"
class="text-muted">{%= __("Details") %}</a>
<span class="text-muted">&ndash;</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"
data-name="{%= data.name %}">{%= __("Reply") %}</a>
{% } %}


+ 15
- 0
frappe/public/less/form.less Ver arquivo

@@ -204,3 +204,18 @@ select.form-control {
-moz-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;
}

+ 1
- 0
frappe/public/less/variables.less Ver arquivo

@@ -10,6 +10,7 @@
@modal-backdrop-bg: #334143;
@light-yellow: #fffce7;
@text-extra-muted: @border-color;
@text-regular: 14px;
@text-medium: 12px;
@text-small: 10px;



+ 1
- 1
frappe/utils/boilerplate.py Ver arquivo

@@ -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:
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


+ 0
- 80
frappe/website/doctype/social_login_keys/social_login_keys.json Ver arquivo

@@ -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
}
]
}

+ 2
- 0
requirements.txt Ver arquivo

@@ -28,3 +28,5 @@ html2text
email_reply_parser
click
num2words
watchdog
pyopenssl

Carregando…
Cancelar
Salvar