diff --git a/frappe/__init__.py b/frappe/__init__.py index 5f68452f3c..ee84d8b785 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -318,7 +318,7 @@ def sendmail(recipients=(), sender="", subject="No Subject", message="No Message as_markdown=False, bulk=False, reference_doctype=None, reference_name=None, unsubscribe_method=None, unsubscribe_params=None, unsubscribe_message=None, attachments=None, content=None, doctype=None, name=None, reply_to=None, - cc=(), show_as_cc=(), message_id=None, as_bulk=False, send_after=None, expose_recipients=False, + cc=(), show_as_cc=(), message_id=None, in_reply_to=None, as_bulk=False, send_after=None, expose_recipients=False, bulk_priority=1): """Send email using user's default **Email Account** or global default **Email Account**. @@ -337,6 +337,7 @@ def sendmail(recipients=(), sender="", subject="No Subject", message="No Message :param attachments: List of attachments. :param reply_to: Reply-To email id. :param message_id: Used for threading. If a reply is received to this email, Message-Id is sent back as In-Reply-To in received email. + :param in_reply_to: Used to send the Message-Id of a received email back as In-Reply-To. :param send_after: Send after the given datetime. :param expose_recipients: Display all recipients in the footer message - "This email was sent to" """ @@ -347,18 +348,18 @@ def sendmail(recipients=(), sender="", subject="No Subject", message="No Message subject=subject, message=content or message, reference_doctype = doctype or reference_doctype, reference_name = name or reference_name, unsubscribe_method=unsubscribe_method, unsubscribe_params=unsubscribe_params, unsubscribe_message=unsubscribe_message, - attachments=attachments, reply_to=reply_to, cc=cc, show_as_cc=show_as_cc, message_id=message_id, send_after=send_after, - expose_recipients=expose_recipients, bulk_priority=bulk_priority) + attachments=attachments, reply_to=reply_to, cc=cc, show_as_cc=show_as_cc, message_id=message_id, in_reply_to=in_reply_to, + send_after=send_after, expose_recipients=expose_recipients, bulk_priority=bulk_priority) else: import frappe.email if as_markdown: frappe.email.sendmail_md(recipients, sender=sender, subject=subject, msg=content or message, attachments=attachments, reply_to=reply_to, - cc=cc, message_id=message_id) + cc=cc, message_id=message_id, in_reply_to=in_reply_to) else: frappe.email.sendmail(recipients, sender=sender, subject=subject, msg=content or message, attachments=attachments, reply_to=reply_to, - cc=cc, message_id=message_id) + cc=cc, message_id=message_id, in_reply_to=in_reply_to) logger = None whitelisted = [] diff --git a/frappe/__version__.py b/frappe/__version__.py index 4e6731b58a..2057eea754 100644 --- a/frappe/__version__.py +++ b/frappe/__version__.py @@ -1,2 +1,2 @@ from __future__ import unicode_literals -__version__ = "6.23.3" +__version__ = "6.24.10" diff --git a/frappe/core/doctype/communication/comment.py b/frappe/core/doctype/communication/comment.py index 78f7b2ab67..589210918b 100644 --- a/frappe/core/doctype/communication/comment.py +++ b/frappe/core/doctype/communication/comment.py @@ -15,15 +15,8 @@ def validate_comment(doc): if not (doc.communication_type=='Comment' and doc.reference_doctype and doc.reference_name): return - comment_count = frappe.db.sql("""select count(*) from `tabCommunication` - where - communication_type='Comment' - and reference_doctype=%(reference_doctype)s - and reference_name=%(reference_name)s""", - {"reference_doctype": doc.reference_doctype, "reference_name": doc.reference_name})[0][0] - - if comment_count >= 50: - frappe.throw(_("Cannot add more than 50 comments")) + if doc.comment_type=="Comment" and "" not in doc.content: + doc.content += '\n' def on_trash(doc): if doc.communication_type != "Comment": diff --git a/frappe/core/doctype/communication/communication.json b/frappe/core/doctype/communication/communication.json index 4fab1d0e52..b2177277f3 100644 --- a/frappe/core/doctype/communication/communication.json +++ b/frappe/core/doctype/communication/communication.json @@ -1,955 +1,994 @@ { - "allow_copy": 0, - "allow_import": 1, - "allow_rename": 0, - "autoname": "", - "creation": "2013-01-29 10:47:14", - "custom": 0, - "description": "Keep a track of all communications", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", + "allow_copy": 0, + "allow_import": 1, + "allow_rename": 0, + "autoname": "", + "creation": "2013-01-29 10:47:14", + "custom": 0, + "description": "Keep a track of all communications", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "subject", - "fieldtype": "Small Text", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Subject", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "subject", + "fieldtype": "Small Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Subject", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": "eval:doc.communication_type==='Communication'", - "fieldname": "section_break_10", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "collapsible_depends_on": "eval:doc.communication_type==='Communication'", + "fieldname": "section_break_10", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "", - "depends_on": "eval:doc.communication_type===\"Communication\"", - "fieldname": "communication_medium", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Type", - "length": 0, - "no_copy": 0, - "options": "\nEmail\nChat\nPhone\nSMS\nVisit\nOther", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "", + "depends_on": "eval:doc.communication_type===\"Communication\"", + "fieldname": "communication_medium", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Type", + "length": 0, + "no_copy": 0, + "options": "\nEmail\nChat\nPhone\nSMS\nVisit\nOther", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.communication_medium===\"Email\"", - "fieldname": "sender", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "From", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.communication_medium===\"Email\"", + "fieldname": "sender", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "From", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_4", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "fieldname": "recipients", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "To", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "fieldname": "recipients", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "To", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.communication_medium===\"Email\"", - "fieldname": "cc", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "CC", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.communication_medium===\"Email\"", + "fieldname": "cc", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "CC", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:in_list([\"Phone\", \"SMS\"], doc.communication_medium)", - "fieldname": "phone_no", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Phone No.", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:in_list([\"Phone\", \"SMS\"], doc.communication_medium)", + "fieldname": "phone_no", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Phone No.", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "Integrations can use this field to set email delivery status", - "fieldname": "delivery_status", - "fieldtype": "Select", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Delivery Status", - "length": 0, - "no_copy": 0, - "options": "\nSent\nBounced\nOpened\nMarked As Spam\nRejected\nDelayed\nSoft-Bounced\nClicked\nRecipient Unsubscribed", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Integrations can use this field to set email delivery status", + "fieldname": "delivery_status", + "fieldtype": "Select", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Delivery Status", + "length": 0, + "no_copy": 0, + "options": "\nSent\nBounced\nOpened\nMarked As Spam\nRejected\nDelayed\nSoft-Bounced\nClicked\nRecipient Unsubscribed", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break_8", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_8", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "content", - "fieldtype": "Text Editor", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Message", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "content", + "fieldtype": "Text Editor", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Message", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "400" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "fieldname": "status_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Status", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "status_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Status", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "Communication", - "fieldname": "communication_type", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Communication Type", - "length": 0, - "no_copy": 0, - "options": "Communication\nComment\nChat\nNotification", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "Communication", + "fieldname": "communication_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Communication Type", + "length": 0, + "no_copy": 0, + "options": "Communication\nComment\nChat\nNotification", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "comment_type", - "fieldtype": "Select", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Comment Type", - "length": 0, - "no_copy": 0, - "options": "\nComment\nLike\nInfo\nLabel\nWorkflow\nCreated\nUpdated\nSubmitted\nCancelled\nDeleted\nAssigned\nAssignment Completed\nAttachment\nAttachment Removed\nShared\nUnshared", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "comment_type", + "fieldtype": "Select", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Comment Type", + "length": 0, + "no_copy": 0, + "options": "\nComment\nLike\nInfo\nLabel\nWorkflow\nCreated\nUpdated\nSubmitted\nCancelled\nDeleted\nAssigned\nAssignment Completed\nAttachment\nAttachment Removed\nShared\nUnshared", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_5", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_5", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.communication_type===\"Communication\"", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "Open\nReplied\nClosed\nLinked", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.communication_type===\"Communication\"", + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "Open\nReplied\nClosed\nLinked", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.communication_type===\"Communication\"", - "fieldname": "sent_or_received", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Sent or Received", - "length": 0, - "no_copy": 0, - "options": "Sent\nReceived", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.communication_type===\"Communication\"", + "fieldname": "sent_or_received", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Sent or Received", + "length": 0, + "no_copy": 0, + "options": "Sent\nReceived", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "fieldname": "additional_info", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "More Information", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "additional_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "More Information", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "Today", - "fieldname": "communication_date", - "fieldtype": "Datetime", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "Today", + "fieldname": "communication_date", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_14", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_14", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "sender_full_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "From Full Name", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "sender_full_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "From Full Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "fieldname": "reference_section", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "reference_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "reference_doctype", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference DocType", - "length": 0, - "no_copy": 0, - "options": "DocType", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "reference_doctype", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference DocType", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "reference_name", - "fieldtype": "Dynamic Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference Name", - "length": 0, - "no_copy": 0, - "options": "reference_doctype", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "reference_name", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference Name", + "length": 0, + "no_copy": 0, + "options": "reference_doctype", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "reference_owner", - "fieldtype": "Read Only", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference Owner", - "length": 0, - "no_copy": 0, - "options": "reference_name.owner", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "reference_owner", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference Owner", + "length": 0, + "no_copy": 0, + "options": "reference_name.owner", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.communication_medium===\"Email\"", - "fieldname": "email_account", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Email Account", - "length": 0, - "no_copy": 0, - "options": "Email Account", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.communication_medium===\"Email\"", + "fieldname": "email_account", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Email Account", + "length": 0, + "no_copy": 0, + "options": "Email Account", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "in_reply_to", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "In Reply To", - "length": 0, - "no_copy": 0, - "options": "Communication", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "in_reply_to", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "In Reply To", + "length": 0, + "no_copy": 0, + "options": "Communication", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "__user", - "fieldname": "user", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "User", - "length": 0, - "no_copy": 0, - "options": "User", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "__user", + "fieldname": "user", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "User", + "length": 0, + "no_copy": 0, + "options": "User", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break_27", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break_27", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "link_doctype", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Link DocType", - "length": 0, - "no_copy": 0, - "options": "DocType", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "link_doctype", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Link DocType", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "link_name", - "fieldtype": "Dynamic Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Link Name", - "length": 0, - "no_copy": 0, - "options": "link_doctype", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "link_name", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Link Name", + "length": 0, + "no_copy": 0, + "options": "link_doctype", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "timeline_doctype", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Timeline DocType", - "length": 0, - "no_copy": 0, - "options": "DocType", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "timeline_doctype", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Timeline DocType", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "timeline_name", - "fieldtype": "Dynamic Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Timeline Name", - "length": 0, - "no_copy": 0, - "options": "timeline_doctype", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "timeline_name", + "fieldtype": "Dynamic Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Timeline Name", + "length": 0, + "no_copy": 0, + "options": "timeline_doctype", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "0", - "fieldname": "unread_notification_sent", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Unread Notification Sent", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "0", + "fieldname": "unread_notification_sent", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Unread Notification Sent", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "seen", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Seen", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "seen", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Seen", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "_user_tags", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "User Tags", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "_user_tags", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "User Tags", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 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-comment", - "idx": 1, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2016-02-13 06:39:17.516884", - "modified_by": "Administrator", - "module": "Core", - "name": "Communication", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-comment", + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2016-02-25 04:48:34.595179", + "modified_by": "Administrator", + "module": "Core", + "name": "Communication", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 0, - "export": 0, - "if_owner": 1, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "All", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 0, + "export": 0, + "if_owner": 1, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "All", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 1 } - ], - "read_only": 0, - "read_only_onload": 0, - "search_fields": "subject", - "sort_order": "DESC", + ], + "read_only": 0, + "read_only_onload": 0, + "search_fields": "subject", + "sort_order": "DESC", "title_field": "subject" -} +} \ No newline at end of file diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index f53ebdda47..9d81c082c0 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -16,6 +16,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "", @@ -39,6 +40,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Label", @@ -67,6 +69,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Type", @@ -93,6 +96,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Name", @@ -118,6 +122,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Mandatory", @@ -147,6 +152,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Precision", @@ -172,6 +178,7 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Length", @@ -196,6 +203,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Index", @@ -223,6 +231,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "In List View", @@ -248,6 +257,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Bold", @@ -273,6 +283,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Collapsible", @@ -295,9 +306,10 @@ "collapsible": 0, "depends_on": "eval:doc.fieldtype==\"Section Break\"", "fieldname": "collapsible_depends_on", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Collapsible Depends On", @@ -322,6 +334,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -345,6 +358,7 @@ "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Options", @@ -370,6 +384,7 @@ "fieldtype": "Small Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Default", @@ -395,6 +410,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Permissions", @@ -415,9 +431,10 @@ "bold": 0, "collapsible": 0, "fieldname": "depends_on", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Depends On", @@ -443,6 +460,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Hidden", @@ -470,6 +488,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Read Only", @@ -495,6 +514,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Unique", @@ -520,6 +540,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Set Only Once", @@ -543,6 +564,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -566,6 +588,7 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Perm Level", @@ -594,6 +617,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Ignore User Permissions", @@ -617,6 +641,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Allow on Submit", @@ -644,6 +669,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Report Hide", @@ -663,6 +689,32 @@ "unique": 0, "width": "50px" }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Don't HTML Encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field", + "fieldname": "ignore_xss_filter", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Ignore XSS Filter", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -671,6 +723,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Display", @@ -694,6 +747,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "In Filter", @@ -721,6 +775,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "No Copy", @@ -748,6 +803,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Hide", @@ -776,6 +832,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Hide If No Value", @@ -800,6 +857,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Width", @@ -823,6 +881,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Width", @@ -850,6 +909,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -872,6 +932,7 @@ "fieldtype": "Small Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Description", @@ -899,6 +960,7 @@ "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -923,6 +985,7 @@ "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -949,12 +1012,13 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2015-11-24 02:28:08.985496", + "modified": "2016-02-22 09:08:47.112186", "modified_by": "Administrator", "module": "Core", "name": "DocField", "owner": "Administrator", "permissions": [], "read_only": 0, - "read_only_onload": 0 + "read_only_onload": 0, + "sort_order": "ASC" } \ No newline at end of file diff --git a/frappe/core/doctype/docperm/docperm.json b/frappe/core/doctype/docperm/docperm.json index c8085aa8fb..7b4be6800c 100644 --- a/frappe/core/doctype/docperm/docperm.json +++ b/frappe/core/doctype/docperm/docperm.json @@ -16,6 +16,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Role and Level", @@ -23,6 +24,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -38,6 +40,7 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Role", @@ -48,6 +51,7 @@ "options": "Role", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "150px", "read_only": 0, "report_hide": 0, @@ -66,6 +70,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Apply User Permissions", @@ -73,6 +78,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -89,6 +95,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "If user is the owner", @@ -97,6 +104,7 @@ "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -112,12 +120,14 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -134,6 +144,7 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Level", @@ -143,6 +154,7 @@ "oldfieldtype": "Int", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "40px", "read_only": 0, "report_hide": 0, @@ -159,9 +171,10 @@ "depends_on": "", "description": "JSON list of DocTypes used to apply User Permissions. If empty, all linked DocTypes will be used to apply User Permissions.", "fieldname": "user_permission_doctypes", - "fieldtype": "Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "User Permission DocTypes", @@ -169,6 +182,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -184,6 +198,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Permissions", @@ -191,6 +206,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -207,6 +223,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Read", @@ -216,6 +233,7 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "32px", "read_only": 0, "report_hide": 0, @@ -234,6 +252,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Write", @@ -243,6 +262,7 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "32px", "read_only": 0, "report_hide": 0, @@ -261,6 +281,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Create", @@ -270,6 +291,7 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "32px", "read_only": 0, "report_hide": 0, @@ -288,6 +310,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Delete", @@ -295,6 +318,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -310,12 +334,14 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -331,6 +357,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Submit", @@ -340,6 +367,7 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "32px", "read_only": 0, "report_hide": 0, @@ -357,6 +385,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Cancel", @@ -366,6 +395,7 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "32px", "read_only": 0, "report_hide": 0, @@ -383,6 +413,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Amend", @@ -392,6 +423,7 @@ "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "32px", "read_only": 0, "report_hide": 0, @@ -409,6 +441,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Additional Permissions", @@ -416,6 +449,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -432,6 +466,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Report", @@ -439,6 +474,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "print_width": "32px", "read_only": 0, "report_hide": 0, @@ -457,6 +493,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Export", @@ -464,6 +501,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -479,6 +517,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Import", @@ -486,6 +525,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -502,6 +542,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Set User Permissions", @@ -509,6 +550,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -524,12 +566,14 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -546,6 +590,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Share", @@ -554,6 +599,7 @@ "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -570,6 +616,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print", @@ -577,6 +624,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -593,6 +641,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Email", @@ -600,6 +649,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -617,7 +667,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2015-11-16 06:29:45.429411", + "modified": "2016-02-22 09:18:14.138259", "modified_by": "Administrator", "module": "Core", "name": "DocPerm", diff --git a/frappe/core/doctype/error_snapshot/error_snapshot.json b/frappe/core/doctype/error_snapshot/error_snapshot.json index b9dd81387b..e7dd851b2d 100644 --- a/frappe/core/doctype/error_snapshot/error_snapshot.json +++ b/frappe/core/doctype/error_snapshot/error_snapshot.json @@ -16,6 +16,7 @@ "fieldtype": "HTML", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Snapshot View", @@ -40,6 +41,7 @@ "fieldtype": "Check", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 0, "label": "Seen", @@ -61,9 +63,10 @@ "bold": 0, "collapsible": 0, "fieldname": "evalue", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Friendly Title", @@ -88,6 +91,7 @@ "fieldtype": "Datetime", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Timestamp", @@ -113,6 +117,7 @@ "fieldtype": "Int", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Relapses", @@ -137,6 +142,7 @@ "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Exception Type", @@ -158,9 +164,10 @@ "bold": 0, "collapsible": 0, "fieldname": "traceback", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Traceback", @@ -185,6 +192,7 @@ "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Parent Error Snapshot", @@ -207,9 +215,10 @@ "bold": 0, "collapsible": 0, "fieldname": "pyver", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Pyver", @@ -231,9 +240,10 @@ "bold": 0, "collapsible": 0, "fieldname": "exception", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Exception", @@ -255,9 +265,10 @@ "bold": 0, "collapsible": 0, "fieldname": "locals", - "fieldtype": "Text", + "fieldtype": "Code", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Locals", @@ -279,9 +290,10 @@ "bold": 0, "collapsible": 0, "fieldname": "frames", - "fieldtype": "Text", + "fieldtype": "Code", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Frames", @@ -308,7 +320,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-12-28 00:44:30.751680", + "modified": "2016-02-22 09:23:46.208471", "modified_by": "Administrator", "module": "Core", "name": "Error Snapshot", diff --git a/frappe/core/doctype/file/file.json b/frappe/core/doctype/file/file.json index 7c7b2a0a2a..7ad3426de3 100644 --- a/frappe/core/doctype/file/file.json +++ b/frappe/core/doctype/file/file.json @@ -16,6 +16,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "File Name", @@ -42,6 +43,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Is Private", @@ -66,6 +68,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Preview", @@ -90,6 +93,7 @@ "fieldtype": "HTML", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Preview HTML", @@ -114,6 +118,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -138,6 +143,7 @@ "fieldtype": "Check", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Is Home Folder", @@ -162,6 +168,7 @@ "fieldtype": "Check", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Is Attachments Folder", @@ -186,6 +193,7 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "File Size", @@ -209,6 +217,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -230,9 +239,10 @@ "collapsible": 0, "depends_on": "eval:!doc.is_folder", "fieldname": "file_url", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "File URL", @@ -256,6 +266,7 @@ "fieldtype": "Small Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Thumbnail URL", @@ -280,6 +291,7 @@ "fieldtype": "Link", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Folder", @@ -305,6 +317,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Is Folder", @@ -330,6 +343,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -353,6 +367,7 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Attached To DocType", @@ -377,6 +392,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -400,6 +416,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Attached To Name", @@ -423,6 +440,7 @@ "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Content Hash", @@ -446,6 +464,7 @@ "fieldtype": "Int", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "lft", @@ -470,6 +489,7 @@ "fieldtype": "Int", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "rgt", @@ -494,6 +514,7 @@ "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "old_parent", @@ -522,7 +543,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2015-12-08 05:03:48.767257", + "modified": "2016-02-22 09:23:59.892258", "modified_by": "Administrator", "module": "Core", "name": "File", diff --git a/frappe/core/doctype/patch_log/patch_log.js b/frappe/core/doctype/patch_log/patch_log.js new file mode 100644 index 0000000000..0080584a29 --- /dev/null +++ b/frappe/core/doctype/patch_log/patch_log.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Patch Log', { + refresh: function(frm) { + + } +}); diff --git a/frappe/core/doctype/patch_log/patch_log.json b/frappe/core/doctype/patch_log/patch_log.json index 96a0e4fff8..edbd03bceb 100644 --- a/frappe/core/doctype/patch_log/patch_log.json +++ b/frappe/core/doctype/patch_log/patch_log.json @@ -15,9 +15,10 @@ "bold": 0, "collapsible": 0, "fieldname": "patch", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Patch", @@ -25,6 +26,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -43,7 +45,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-11-16 06:29:51.487656", + "modified": "2016-02-22 09:31:31.854246", "modified_by": "Administrator", "module": "Core", "name": "Patch Log", diff --git a/frappe/core/doctype/report/report.json b/frappe/core/doctype/report/report.json index ffe98701f0..4d40a60899 100644 --- a/frappe/core/doctype/report/report.json +++ b/frappe/core/doctype/report/report.json @@ -17,6 +17,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Report Name", @@ -24,6 +25,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -39,6 +41,7 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Ref DocType", @@ -47,6 +50,7 @@ "options": "DocType", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -62,6 +66,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Is Standard", @@ -70,6 +75,7 @@ "options": "No\nYes", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -85,6 +91,7 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Module", @@ -93,6 +100,7 @@ "options": "Module Def", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -108,6 +116,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Add Total Row", @@ -115,6 +124,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -130,12 +140,14 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -151,6 +163,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Report Type", @@ -159,6 +172,7 @@ "options": "Report Builder\nQuery Report\nScript Report", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -174,6 +188,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Disabled", @@ -181,6 +196,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -198,6 +214,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Apply User Permissions", @@ -205,6 +222,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -220,12 +238,14 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -242,6 +262,7 @@ "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Query", @@ -249,6 +270,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -266,6 +288,7 @@ "fieldtype": "Code", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Javascript", @@ -273,6 +296,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -286,9 +310,10 @@ "collapsible": 0, "depends_on": "eval:doc.report_type==\"Report Builder\"", "fieldname": "json", - "fieldtype": "Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "JSON", @@ -296,6 +321,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 1, "report_hide": 0, "reqd": 0, @@ -314,7 +340,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-11-16 06:29:55.357855", + "modified": "2016-02-22 09:14:41.050580", "modified_by": "Administrator", "module": "Core", "name": "Report", diff --git a/frappe/core/doctype/scheduler_log/scheduler_log.js b/frappe/core/doctype/scheduler_log/scheduler_log.js new file mode 100644 index 0000000000..ac3b026934 --- /dev/null +++ b/frappe/core/doctype/scheduler_log/scheduler_log.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Scheduler Log', { + refresh: function(frm) { + + } +}); diff --git a/frappe/core/doctype/scheduler_log/scheduler_log.json b/frappe/core/doctype/scheduler_log/scheduler_log.json index 7582bb8960..fb94e75991 100644 --- a/frappe/core/doctype/scheduler_log/scheduler_log.json +++ b/frappe/core/doctype/scheduler_log/scheduler_log.json @@ -19,6 +19,7 @@ "fieldtype": "Check", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Seen", @@ -27,6 +28,7 @@ "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -42,6 +44,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Method", @@ -49,6 +52,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -61,9 +65,10 @@ "bold": 0, "collapsible": 0, "fieldname": "error", - "fieldtype": "Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Error", @@ -71,6 +76,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -89,7 +95,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-11-16 06:29:57.440897", + "modified": "2016-02-22 09:35:31.852571", "modified_by": "Administrator", "module": "Core", "name": "Scheduler Log", diff --git a/frappe/core/doctype/version/version.json b/frappe/core/doctype/version/version.json index a86578db39..ba9a975797 100644 --- a/frappe/core/doctype/version/version.json +++ b/frappe/core/doctype/version/version.json @@ -17,6 +17,7 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Ref DocType", @@ -25,6 +26,7 @@ "options": "DocType", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -40,6 +42,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Docname", @@ -47,6 +50,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -62,6 +66,7 @@ "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Doclist JSON", @@ -69,6 +74,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -87,7 +93,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2015-11-16 06:30:00.036254", + "modified": "2016-02-22 07:59:43.968145", "modified_by": "Administrator", "module": "Core", "name": "Version", @@ -115,5 +121,6 @@ } ], "read_only": 0, - "read_only_onload": 0 + "read_only_onload": 0, + "sort_order": "ASC" } \ No newline at end of file diff --git a/frappe/custom/doctype/custom_field/custom_field.json b/frappe/custom/doctype/custom_field/custom_field.json index e7bb910d58..6b320b6c68 100644 --- a/frappe/custom/doctype/custom_field/custom_field.json +++ b/frappe/custom/doctype/custom_field/custom_field.json @@ -7,6 +7,7 @@ "description": "Adds a custom field to a DocType", "docstatus": 0, "doctype": "DocType", + "document_type": "Setup", "fields": [ { "allow_on_submit": 0, @@ -16,6 +17,7 @@ "fieldtype": "Link", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 1, "label": "Document", @@ -42,6 +44,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 0, "label": "Label", @@ -67,6 +70,7 @@ "fieldtype": "HTML", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Label Help", @@ -91,6 +95,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Fieldname", @@ -118,6 +123,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Insert After", @@ -143,6 +149,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -167,6 +174,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 1, "in_list_view": 1, "label": "Field Type", @@ -195,6 +203,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Precision", @@ -220,6 +229,7 @@ "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Options", @@ -245,6 +255,7 @@ "fieldtype": "HTML", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Options Help", @@ -269,6 +280,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -293,6 +305,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Collapsible", @@ -315,9 +328,10 @@ "collapsible": 0, "depends_on": "eval:doc.fieldtype==\"Section Break\"", "fieldname": "collapsible_depends_on", - "fieldtype": "Data", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Collapsible Depends On", @@ -342,6 +356,7 @@ "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Default Value", @@ -364,9 +379,10 @@ "bold": 0, "collapsible": 0, "fieldname": "depends_on", - "fieldtype": "Small Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Depends On", @@ -390,6 +406,7 @@ "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Field Description", @@ -418,6 +435,7 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Permission Level", @@ -443,6 +461,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Width", @@ -468,6 +487,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "", @@ -494,6 +514,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Is Mandatory Field", @@ -519,6 +540,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Unique", @@ -543,6 +565,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Read Only", @@ -567,6 +590,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Ignore User Permissions", @@ -590,6 +614,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Hidden", @@ -613,6 +638,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Hide", @@ -639,6 +665,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Hide If No Value", @@ -663,6 +690,7 @@ "fieldtype": "Data", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Width", @@ -686,6 +714,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "No Copy", @@ -711,6 +740,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Allow on Submit", @@ -736,6 +766,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "In Report Filter", @@ -761,6 +792,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "In List View", @@ -784,6 +816,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Report Hide", @@ -809,6 +842,7 @@ "fieldtype": "Check", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Index", @@ -823,6 +857,32 @@ "search_index": 0, "set_only_once": 0, "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Don't HTML Encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field", + "fieldname": "ignore_xss_filter", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Ignore XSS Filter", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 } ], "hide_heading": 0, @@ -835,7 +895,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-01-25 04:54:05.700031", + "modified": "2016-02-22 09:11:06.796094", "modified_by": "Administrator", "module": "Custom", "name": "Custom Field", diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.json b/frappe/custom/doctype/customize_form_field/customize_form_field.json index 0c332c2ddf..27d3ff8600 100644 --- a/frappe/custom/doctype/customize_form_field/customize_form_field.json +++ b/frappe/custom/doctype/customize_form_field/customize_form_field.json @@ -7,6 +7,7 @@ "custom": 0, "docstatus": 0, "doctype": "DocType", + "document_type": "Setup", "fields": [ { "allow_on_submit": 0, @@ -16,6 +17,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Label and Type", @@ -40,6 +42,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Label", @@ -66,6 +69,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Type", @@ -92,6 +96,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Name", @@ -117,6 +122,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Mandatory", @@ -144,6 +150,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Unique", @@ -168,6 +175,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "In List View", @@ -191,6 +199,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -216,6 +225,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Precision", @@ -242,6 +252,7 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Length", @@ -267,6 +278,7 @@ "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Options", @@ -292,6 +304,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Permissions", @@ -312,11 +325,12 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "description": "This field will appear only if the fieldname defined here has value OR the rules are true (examples): \nmyfield\neval:doc.myfield=='My Value'\neval:doc.age>18", + "description": "This field will appear only if the fieldname defined here has value OR the rules are true (examples): \nmyfield\neval:doc.myfield=='My Value'\neval:doc.age>18", "fieldname": "depends_on", - "fieldtype": "Data", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Depends On", @@ -343,6 +357,7 @@ "fieldtype": "Int", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Perm Level", @@ -368,6 +383,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Hidden", @@ -395,6 +411,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Read Only", @@ -420,6 +437,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Collapsible", @@ -442,9 +460,10 @@ "collapsible": 0, "depends_on": "eval:doc.fieldtype==\"Section Break\"", "fieldname": "collapsible_depends_on", - "fieldtype": "Data", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Collapsible Depends On", @@ -469,6 +488,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -492,6 +512,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Ignore User Permissions", @@ -515,6 +536,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Allow on Submit", @@ -540,6 +562,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Report Hide", @@ -565,6 +588,7 @@ "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Display", @@ -589,6 +613,7 @@ "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Default", @@ -614,6 +639,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "In Filter", @@ -641,6 +667,7 @@ "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "length": 0, @@ -664,6 +691,7 @@ "fieldtype": "Text", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Description", @@ -691,6 +719,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Hide", @@ -717,6 +746,7 @@ "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Hide If No Value", @@ -742,6 +772,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Print Width", @@ -767,6 +798,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Width", @@ -794,6 +826,7 @@ "fieldtype": "Check", "hidden": 1, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, "label": "Is Custom Field", @@ -820,7 +853,7 @@ "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2015-11-24 02:27:50.426961", + "modified": "2016-02-22 09:11:53.773635", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form Field", diff --git a/frappe/data/app_listing/erpnext_shopify.json b/frappe/data/app_listing/erpnext_shopify.json index 3eb6584ec2..88db8f6494 100644 --- a/frappe/data/app_listing/erpnext_shopify.json +++ b/frappe/data/app_listing/erpnext_shopify.json @@ -9,5 +9,6 @@ "repo_url": "https://github.com/frappe/erpnext_shopify.git", "app_title": "ERPNext Shopify", "app_version": "1.0.0", - "app_category": "Integrations" + "app_category": "Integrations", + "featured": 1 } diff --git a/frappe/data/app_listing/paypal_integration.json b/frappe/data/app_listing/paypal_integration.json new file mode 100644 index 0000000000..937e915c0c --- /dev/null +++ b/frappe/data/app_listing/paypal_integration.json @@ -0,0 +1,14 @@ +{ + "app_url": "https://frappe.github.io/paypal_integration", + "app_name": "paypal_integration", + "app_icon": "octicon octicon-credit-card", + "app_color": "#179bd7", + "app_description": "Accept Payment via PayPal", + "app_publisher": "Frappe", + "app_email": "hello@frappe.io", + "repo_url": "https://github.com/frappe/paypal_integration.git", + "app_title": "Paypal Integation", + "app_version": "1.0.0", + "app_category": "Integrations", + "featured": 1 +} diff --git a/frappe/desk/form/load.py b/frappe/desk/form/load.py index b8971079cd..fcc4859e42 100644 --- a/frappe/desk/form/load.py +++ b/frappe/desk/form/load.py @@ -147,6 +147,9 @@ def _get_communications(doctype, name, start=0, limit=20): "attached_to_name": c.name} )) + elif c.communication_type=="Comment" and c.comment_type=="Comment": + c.content = frappe.utils.markdown(c.content) + return communications def get_assignments(dt, dn): diff --git a/frappe/desk/notifications.py b/frappe/desk/notifications.py index 247c45cd94..c4910175bb 100644 --- a/frappe/desk/notifications.py +++ b/frappe/desk/notifications.py @@ -68,7 +68,8 @@ def get_notifications_for(notification_type, config, notification_count): frappe.cache().hset("notification_count:" + m, frappe.session.user, open_count[m]) except frappe.PermissionError: - frappe.msgprint("Permission Error in notifications for {0}".format(m)) + pass + # frappe.msgprint("Permission Error in notifications for {0}".format(m)) return open_count @@ -92,7 +93,8 @@ def get_notifications_for_doctypes(config, notification_count): result = frappe.get_attr(condition)() except frappe.PermissionError: - frappe.msgprint("Permission Error in notifications for {0}".format(d)) + pass + # frappe.msgprint("Permission Error in notifications for {0}".format(d)) except Exception, e: # OperationalError: (1412, 'Table definition has changed, please retry transaction') diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index a56091459d..bd649c7762 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -4,6 +4,7 @@ frappe.provide("frappe.wiz.events"); frappe.wiz = { slides: [], events: {}, + remove_app_slides: [], on: function(event, fn) { if(!frappe.wiz.events[event]) { frappe.wiz.events[event] = []; @@ -13,6 +14,7 @@ frappe.wiz = { add_slide: function(slide) { frappe.wiz.slides.push(slide); }, + run_event: function(event) { $.each(frappe.wiz.events[event] || [], function(i, fn) { fn(frappe.wiz.wizard); @@ -32,7 +34,7 @@ frappe.pages['setup-wizard'].on_page_load = function(wrapper) { }); frappe.wiz.run_event("before_load"); - + var wizard_settings = { page_name: "setup-wizard", parent: wrapper, @@ -237,6 +239,7 @@ function load_frappe_slides() { // language selection frappe.wiz.welcome = { name: "welcome", + app_name: "frappe", title: __("Welcome"), icon: "icon-world", help: __("Let's prepare the system for first use."), @@ -299,6 +302,18 @@ function load_frappe_slides() { // reset all slides so that labels are translated frappe.wiz.slides = []; frappe.wiz.run_event("before_load"); + + // remove slides listed in remove_app_slides + for (var app in frappe.wiz.remove_app_slides) { + var new_slides = [] + for (var i in frappe.wiz.slides) { + if (frappe.wiz.slides[i].app_name != frappe.wiz.remove_app_slides[app]) { + new_slides.push(frappe.wiz.slides[i]); + } + } + frappe.wiz.slides = new_slides; + } + frappe.wiz.wizard.slides = frappe.wiz.slides; frappe.wiz.run_event("after_load"); @@ -315,10 +330,11 @@ function load_frappe_slides() { }); }); } - } + }, // region selection frappe.wiz.region = { + app_name: "frappe", title: __("Region"), icon: "icon-flag", help: __("Select your Country, Time Zone and Currency"), @@ -404,6 +420,44 @@ function load_frappe_slides() { }); }); } + }, + + + frappe.wiz.user= { + app_name: "frappe", + title: __("The First User: You"), + icon: "icon-user", + fields: [ + {"fieldname": "first_name", "label": __("First Name"), "fieldtype": "Data", + reqd:1}, + {"fieldname": "last_name", "label": __("Last Name"), "fieldtype": "Data"}, + {"fieldname": "email", "label": __("Email Address"), "fieldtype": "Data", + reqd:1, "description": __("You will use it to Login"), "options":"Email"}, + {"fieldname": "password", "label": __("Password"), "fieldtype": "Password", + reqd:1}, + {fieldtype:"Attach Image", fieldname:"attach_user", + label: __("Attach Your Picture"), is_private: 0}, + ], + help: __('The first user will become the System Manager (you can change this later).'), + onload: function(slide) { + if(user!=="Administrator") { + slide.form.fields_dict.password.$wrapper.toggle(false); + slide.form.fields_dict.email.$wrapper.toggle(false); + slide.form.fields_dict.first_name.set_input(frappe.boot.user.first_name); + slide.form.fields_dict.last_name.set_input(frappe.boot.user.last_name); + + var user_image = frappe.get_cookie("user_image"); + if(user_image) { + var $attach_user = slide.form.fields_dict.attach_user.$wrapper; + $attach_user.find(".missing-image").toggle(false); + $attach_user.find("img").attr("src", decodeURIComponent(user_image)).toggle(true); + } + + delete slide.form.fields_dict.email; + delete slide.form.fields_dict.password; + } + }, + css_class: "single-column" }; }; @@ -413,4 +467,5 @@ frappe.wiz.on("before_load", function() { // add welcome slide frappe.wiz.add_slide(frappe.wiz.welcome); frappe.wiz.add_slide(frappe.wiz.region); + frappe.wiz.add_slide(frappe.wiz.user); }); diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index 53c6b15826..bf0b94795d 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -8,6 +8,7 @@ from frappe.utils import strip from frappe.translate import (set_default_language, get_dict, get_lang_dict, send_translations, get_language_from_code) from frappe.geo.country_info import get_country_info +from frappe.utils.file_manager import save_file @frappe.whitelist() def setup_complete(args): @@ -23,6 +24,7 @@ def setup_complete(args): # update system settings update_system_settings(args) + update_user_name(args) for method in frappe.get_hooks("setup_wizard_complete"): frappe.get_attr(method)(args) @@ -63,6 +65,41 @@ def update_system_settings(args): }) system_settings.save() +def update_user_name(args): + if args.get("email"): + args['name'] = args.get("email") + + _mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True + doc = frappe.get_doc({ + "doctype":"User", + "email": args.get("email"), + "first_name": args.get("first_name"), + "last_name": args.get("last_name") + }) + doc.flags.no_welcome_mail = True + doc.insert() + frappe.flags.mute_emails = _mute_emails + from frappe.auth import _update_password + _update_password(args.get("email"), args.get("password")) + + else: + args['name'] = frappe.session.user + + # Update User + if not args.get('last_name') or args.get('last_name')=='None': + args['last_name'] = None + frappe.db.sql("""update `tabUser` SET first_name=%(first_name)s, + last_name=%(last_name)s WHERE name=%(name)s""", args) + + if args.get("attach_user"): + attach_user = args.get("attach_user").split(",") + if len(attach_user)==3: + filename, filetype, content = attach_user + fileurl = save_file(filename, content, "User", args.get("name"), decode=True).file_url + frappe.db.set_value("User", args.get("name"), "user_image", fileurl) + + add_all_roles_to(args.get("name")) + def process_args(args): if not args: args = frappe.local.form_dict @@ -78,6 +115,14 @@ def process_args(args): return args +def add_all_roles_to(name): + user = frappe.get_doc("User", name) + for role in frappe.db.sql("""select name from tabRole"""): + if role[0] not in ["Administrator", "Guest", "All", "Customer", "Supplier", "Partner", "Employee"]: + d = user.append("user_roles") + d.role = role[0] + user.save() + @frappe.whitelist() def load_messages(language): """Load translation messages for given langauge from all `setup_wizard_requires` diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 5e12a26a30..d5a2291c19 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -8,7 +8,7 @@ import os, json from frappe import _ from frappe.modules import scrub, get_module_path -from frappe.utils import flt, cint, get_html_format +from frappe.utils import flt, cint, get_html_format, cstr from frappe.translate import send_translations import frappe.desk.reportview from frappe.permissions import get_role_permissions @@ -80,7 +80,7 @@ def run(report_name, filters=()): frappe.msgprint(_("Query must be a SELECT"), raise_exception=True) result = [list(t) for t in frappe.db.sql(report.query, filters)] - columns = [c[0] for c in frappe.db.get_description()] + columns = [cstr(c[0]) for c in frappe.db.get_description()] else: module = report.module or frappe.db.get_value("DocType", report.ref_doctype, "module") if report.is_standard=="Yes": @@ -242,11 +242,11 @@ def get_linked_doctypes(columns, data): row = enumerate(row) elif isinstance(row, dict): row = row.items() - + for col, val in row: if val and col not in columns_with_value: columns_with_value.append(col) - + for doctype, key in linked_doctypes.items(): if key not in columns_with_value: del linked_doctypes[doctype] diff --git a/frappe/docs/user/guides/.txt b/frappe/docs/user/en/guides/.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/.txt rename to frappe/docs/user/en/guides/.txt diff --git a/frappe/docs/user/guides/app-development/adding-module-icons-on-desktop.md b/frappe/docs/user/en/guides/app-development/adding-module-icons-on-desktop.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/adding-module-icons-on-desktop.md rename to frappe/docs/user/en/guides/app-development/adding-module-icons-on-desktop.md diff --git a/frappe/docs/user/guides/app-development/custom-module-icon.md b/frappe/docs/user/en/guides/app-development/custom-module-icon.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/custom-module-icon.md rename to frappe/docs/user/en/guides/app-development/custom-module-icon.md diff --git a/frappe/docs/user/guides/app-development/dialogs-types.md b/frappe/docs/user/en/guides/app-development/dialogs-types.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/dialogs-types.md rename to frappe/docs/user/en/guides/app-development/dialogs-types.md diff --git a/frappe/docs/user/guides/app-development/executing-code-on-doctype-events.md b/frappe/docs/user/en/guides/app-development/executing-code-on-doctype-events.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/executing-code-on-doctype-events.md rename to frappe/docs/user/en/guides/app-development/executing-code-on-doctype-events.md diff --git a/frappe/docs/user/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md b/frappe/docs/user/en/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md rename to frappe/docs/user/en/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md diff --git a/frappe/docs/user/guides/app-development/generating-docs.md b/frappe/docs/user/en/guides/app-development/generating-docs.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/generating-docs.md rename to frappe/docs/user/en/guides/app-development/generating-docs.md diff --git a/frappe/docs/user/guides/app-development/how-enable-developer-mode-in-frappe.md b/frappe/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/how-enable-developer-mode-in-frappe.md rename to frappe/docs/user/en/guides/app-development/how-enable-developer-mode-in-frappe.md diff --git a/frappe/docs/user/guides/app-development/how-to-create-custom-fields-during-app-installation.md b/frappe/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/how-to-create-custom-fields-during-app-installation.md rename to frappe/docs/user/en/guides/app-development/how-to-create-custom-fields-during-app-installation.md diff --git a/frappe/docs/user/guides/app-development/how-to-improve-a-standard-control.md b/frappe/docs/user/en/guides/app-development/how-to-improve-a-standard-control.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/how-to-improve-a-standard-control.md rename to frappe/docs/user/en/guides/app-development/how-to-improve-a-standard-control.md diff --git a/frappe/docs/user/guides/app-development/index.md b/frappe/docs/user/en/guides/app-development/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/index.md rename to frappe/docs/user/en/guides/app-development/index.md diff --git a/frappe/docs/user/guides/app-development/index.txt b/frappe/docs/user/en/guides/app-development/index.txt old mode 100644 new mode 100755 similarity index 88% rename from frappe/docs/user/guides/app-development/index.txt rename to frappe/docs/user/en/guides/app-development/index.txt index 32b9c08c0d..2c74940479 --- a/frappe/docs/user/guides/app-development/index.txt +++ b/frappe/docs/user/en/guides/app-development/index.txt @@ -4,7 +4,7 @@ generating-docs how-enable-developer-mode-in-frappe fetch-custom-field-value-from-master-to-all-related-transactions executing-code-on-doctype-events -how-to-add-customizations-to-app +how-to-create-custom-fields-during-app-installation insert-a-document-via-api how-to-improve-a-standard-control overriding-link-query-by-custom-script diff --git a/frappe/docs/user/guides/app-development/insert-a-document-via-api.md b/frappe/docs/user/en/guides/app-development/insert-a-document-via-api.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/insert-a-document-via-api.md rename to frappe/docs/user/en/guides/app-development/insert-a-document-via-api.md diff --git a/frappe/docs/user/guides/app-development/overriding-link-query-by-custom-script.md b/frappe/docs/user/en/guides/app-development/overriding-link-query-by-custom-script.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/overriding-link-query-by-custom-script.md rename to frappe/docs/user/en/guides/app-development/overriding-link-query-by-custom-script.md diff --git a/frappe/docs/user/guides/app-development/single-type-doctype.md b/frappe/docs/user/en/guides/app-development/single-type-doctype.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/single-type-doctype.md rename to frappe/docs/user/en/guides/app-development/single-type-doctype.md diff --git a/frappe/docs/user/guides/app-development/trigger-event-on-deletion-of-grid-row.md b/frappe/docs/user/en/guides/app-development/trigger-event-on-deletion-of-grid-row.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/trigger-event-on-deletion-of-grid-row.md rename to frappe/docs/user/en/guides/app-development/trigger-event-on-deletion-of-grid-row.md diff --git a/frappe/docs/user/guides/app-development/using-html-templates-in-javascript.md b/frappe/docs/user/en/guides/app-development/using-html-templates-in-javascript.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/app-development/using-html-templates-in-javascript.md rename to frappe/docs/user/en/guides/app-development/using-html-templates-in-javascript.md diff --git a/frappe/docs/user/guides/basics/apps.md b/frappe/docs/user/en/guides/basics/apps.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/apps.md rename to frappe/docs/user/en/guides/basics/apps.md diff --git a/frappe/docs/user/guides/basics/hooks.md b/frappe/docs/user/en/guides/basics/hooks.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/hooks.md rename to frappe/docs/user/en/guides/basics/hooks.md diff --git a/frappe/docs/user/guides/basics/index.md b/frappe/docs/user/en/guides/basics/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/index.md rename to frappe/docs/user/en/guides/basics/index.md diff --git a/frappe/docs/user/guides/basics/index.txt b/frappe/docs/user/en/guides/basics/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/index.txt rename to frappe/docs/user/en/guides/basics/index.txt diff --git a/frappe/docs/user/guides/basics/install.md b/frappe/docs/user/en/guides/basics/install.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/install.md rename to frappe/docs/user/en/guides/basics/install.md diff --git a/frappe/docs/user/guides/basics/site_config.md b/frappe/docs/user/en/guides/basics/site_config.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/site_config.md rename to frappe/docs/user/en/guides/basics/site_config.md diff --git a/frappe/docs/user/guides/basics/sites.md b/frappe/docs/user/en/guides/basics/sites.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/sites.md rename to frappe/docs/user/en/guides/basics/sites.md diff --git a/frappe/docs/user/guides/basics/translations.md b/frappe/docs/user/en/guides/basics/translations.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/translations.md rename to frappe/docs/user/en/guides/basics/translations.md diff --git a/frappe/docs/user/guides/basics/writing-tests.md b/frappe/docs/user/en/guides/basics/writing-tests.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/basics/writing-tests.md rename to frappe/docs/user/en/guides/basics/writing-tests.md diff --git a/frappe/docs/user/guides/data/import-large-csv-file.md b/frappe/docs/user/en/guides/data/import-large-csv-file.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/data/import-large-csv-file.md rename to frappe/docs/user/en/guides/data/import-large-csv-file.md diff --git a/frappe/docs/user/guides/data/index.md b/frappe/docs/user/en/guides/data/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/data/index.md rename to frappe/docs/user/en/guides/data/index.md diff --git a/frappe/docs/user/guides/data/index.txt b/frappe/docs/user/en/guides/data/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/data/index.txt rename to frappe/docs/user/en/guides/data/index.txt diff --git a/frappe/docs/user/guides/deployment/checking-problems-in-bench.md b/frappe/docs/user/en/guides/deployment/checking-problems-in-bench.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/checking-problems-in-bench.md rename to frappe/docs/user/en/guides/deployment/checking-problems-in-bench.md diff --git a/frappe/docs/user/guides/deployment/configuring-https.md b/frappe/docs/user/en/guides/deployment/configuring-https.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/configuring-https.md rename to frappe/docs/user/en/guides/deployment/configuring-https.md diff --git a/frappe/docs/user/guides/deployment/email-notifications-for-failed-background-jobs.md b/frappe/docs/user/en/guides/deployment/email-notifications-for-failed-background-jobs.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/email-notifications-for-failed-background-jobs.md rename to frappe/docs/user/en/guides/deployment/email-notifications-for-failed-background-jobs.md diff --git a/frappe/docs/user/guides/deployment/how-to-change-host-name-from-localhost.md b/frappe/docs/user/en/guides/deployment/how-to-change-host-name-from-localhost.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/how-to-change-host-name-from-localhost.md rename to frappe/docs/user/en/guides/deployment/how-to-change-host-name-from-localhost.md diff --git a/frappe/docs/user/guides/deployment/how-to-enable-social-logins.md b/frappe/docs/user/en/guides/deployment/how-to-enable-social-logins.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/how-to-enable-social-logins.md rename to frappe/docs/user/en/guides/deployment/how-to-enable-social-logins.md diff --git a/frappe/docs/user/guides/deployment/how-to-migrate-doctype-changes-to-production.md b/frappe/docs/user/en/guides/deployment/how-to-migrate-doctype-changes-to-production.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/how-to-migrate-doctype-changes-to-production.md rename to frappe/docs/user/en/guides/deployment/how-to-migrate-doctype-changes-to-production.md diff --git a/frappe/docs/user/guides/deployment/index.md b/frappe/docs/user/en/guides/deployment/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/index.md rename to frappe/docs/user/en/guides/deployment/index.md diff --git a/frappe/docs/user/guides/deployment/index.txt b/frappe/docs/user/en/guides/deployment/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/index.txt rename to frappe/docs/user/en/guides/deployment/index.txt diff --git a/frappe/docs/user/guides/deployment/migrations.md b/frappe/docs/user/en/guides/deployment/migrations.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/deployment/migrations.md rename to frappe/docs/user/en/guides/deployment/migrations.md diff --git a/frappe/docs/user/guides/index.md b/frappe/docs/user/en/guides/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/index.md rename to frappe/docs/user/en/guides/index.md diff --git a/frappe/docs/user/guides/index.txt b/frappe/docs/user/en/guides/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/index.txt rename to frappe/docs/user/en/guides/index.txt diff --git a/frappe/docs/user/guides/integration/index.md b/frappe/docs/user/en/guides/integration/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/integration/index.md rename to frappe/docs/user/en/guides/integration/index.md diff --git a/frappe/docs/user/guides/integration/index.txt b/frappe/docs/user/en/guides/integration/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/integration/index.txt rename to frappe/docs/user/en/guides/integration/index.txt diff --git a/frappe/docs/user/guides/integration/rest_api.md b/frappe/docs/user/en/guides/integration/rest_api.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/integration/rest_api.md rename to frappe/docs/user/en/guides/integration/rest_api.md diff --git a/frappe/docs/user/guides/portal-development/.md b/frappe/docs/user/en/guides/portal-development/.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/.md rename to frappe/docs/user/en/guides/portal-development/.md diff --git a/frappe/docs/user/guides/portal-development/adding-pages.md b/frappe/docs/user/en/guides/portal-development/adding-pages.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/adding-pages.md rename to frappe/docs/user/en/guides/portal-development/adding-pages.md diff --git a/frappe/docs/user/guides/portal-development/building.md b/frappe/docs/user/en/guides/portal-development/building.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/building.md rename to frappe/docs/user/en/guides/portal-development/building.md diff --git a/frappe/docs/user/guides/portal-development/contents.md b/frappe/docs/user/en/guides/portal-development/contents.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/contents.md rename to frappe/docs/user/en/guides/portal-development/contents.md diff --git a/frappe/docs/user/guides/portal-development/context.md b/frappe/docs/user/en/guides/portal-development/context.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/context.md rename to frappe/docs/user/en/guides/portal-development/context.md diff --git a/frappe/docs/user/guides/portal-development/index.md b/frappe/docs/user/en/guides/portal-development/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/index.md rename to frappe/docs/user/en/guides/portal-development/index.md diff --git a/frappe/docs/user/guides/portal-development/index.txt b/frappe/docs/user/en/guides/portal-development/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/index.txt rename to frappe/docs/user/en/guides/portal-development/index.txt diff --git a/frappe/docs/user/guides/portal-development/ordering.md b/frappe/docs/user/en/guides/portal-development/ordering.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/portal-development/ordering.md rename to frappe/docs/user/en/guides/portal-development/ordering.md diff --git a/frappe/docs/user/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md b/frappe/docs/user/en/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md rename to frappe/docs/user/en/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md diff --git a/frappe/docs/user/guides/reports-and-printing/how-to-make-query-report.md b/frappe/docs/user/en/guides/reports-and-printing/how-to-make-query-report.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/reports-and-printing/how-to-make-query-report.md rename to frappe/docs/user/en/guides/reports-and-printing/how-to-make-query-report.md diff --git a/frappe/docs/user/guides/reports-and-printing/how-to-make-script-reports.md b/frappe/docs/user/en/guides/reports-and-printing/how-to-make-script-reports.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/reports-and-printing/how-to-make-script-reports.md rename to frappe/docs/user/en/guides/reports-and-printing/how-to-make-script-reports.md diff --git a/frappe/docs/user/guides/reports-and-printing/index.md b/frappe/docs/user/en/guides/reports-and-printing/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/reports-and-printing/index.md rename to frappe/docs/user/en/guides/reports-and-printing/index.md diff --git a/frappe/docs/user/guides/reports-and-printing/index.txt b/frappe/docs/user/en/guides/reports-and-printing/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/reports-and-printing/index.txt rename to frappe/docs/user/en/guides/reports-and-printing/index.txt diff --git a/frappe/docs/user/guides/reports-and-printing/print-format-for-reports.md b/frappe/docs/user/en/guides/reports-and-printing/print-format-for-reports.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/reports-and-printing/print-format-for-reports.md rename to frappe/docs/user/en/guides/reports-and-printing/print-format-for-reports.md diff --git a/frappe/docs/user/guides/reports-and-printing/where-do-i-find-standard-print-formats.md b/frappe/docs/user/en/guides/reports-and-printing/where-do-i-find-standard-print-formats.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/guides/reports-and-printing/where-do-i-find-standard-print-formats.md rename to frappe/docs/user/en/guides/reports-and-printing/where-do-i-find-standard-print-formats.md diff --git a/frappe/docs/user/index.md b/frappe/docs/user/en/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/index.md rename to frappe/docs/user/en/index.md diff --git a/frappe/docs/user/index.txt b/frappe/docs/user/en/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/index.txt rename to frappe/docs/user/en/index.txt diff --git a/frappe/docs/user/tutorial/app.md b/frappe/docs/user/en/tutorial/app.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/app.md rename to frappe/docs/user/en/tutorial/app.md diff --git a/frappe/docs/user/tutorial/before.md b/frappe/docs/user/en/tutorial/before.md old mode 100644 new mode 100755 similarity index 98% rename from frappe/docs/user/tutorial/before.md rename to frappe/docs/user/en/tutorial/before.md index ec29631faf..4c7c51c114 --- a/frappe/docs/user/tutorial/before.md +++ b/frappe/docs/user/en/tutorial/before.md @@ -44,5 +44,5 @@ If you are customizing Print templates, you need to learn the [Jinja Templating --- -When you are ready, [try building a sample application on Frappe]({{ docs_base_url }}/user/tutorial/app) +When you are ready, [try building a sample application on Frappe]({{ docs_base_url }}/user/en/tutorial/app) diff --git a/frappe/docs/user/tutorial/bench.md b/frappe/docs/user/en/tutorial/bench.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/bench.md rename to frappe/docs/user/en/tutorial/bench.md diff --git a/frappe/docs/user/tutorial/conclusion.md b/frappe/docs/user/en/tutorial/conclusion.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/conclusion.md rename to frappe/docs/user/en/tutorial/conclusion.md diff --git a/frappe/docs/user/tutorial/controllers.md b/frappe/docs/user/en/tutorial/controllers.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/controllers.md rename to frappe/docs/user/en/tutorial/controllers.md diff --git a/frappe/docs/user/tutorial/doctype-directory-structure.md b/frappe/docs/user/en/tutorial/doctype-directory-structure.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/doctype-directory-structure.md rename to frappe/docs/user/en/tutorial/doctype-directory-structure.md diff --git a/frappe/docs/user/tutorial/doctypes.md b/frappe/docs/user/en/tutorial/doctypes.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/doctypes.md rename to frappe/docs/user/en/tutorial/doctypes.md diff --git a/frappe/docs/user/tutorial/form-client-scripting.md b/frappe/docs/user/en/tutorial/form-client-scripting.md old mode 100644 new mode 100755 similarity index 97% rename from frappe/docs/user/tutorial/form-client-scripting.md rename to frappe/docs/user/en/tutorial/form-client-scripting.md index 70e2edb520..a70b8475ff --- a/frappe/docs/user/tutorial/form-client-scripting.md +++ b/frappe/docs/user/en/tutorial/form-client-scripting.md @@ -29,7 +29,7 @@ To start the script, in the `library_management/doctype/library_transaction` fol }); 1. **frappe.ui.form.on(*doctype*, *fieldname*, *handler*)** is used to bind a handler to the event when the property library_member is set. -1. In the handler, we trigger an AJAX call to `frappe.client.get`. In response we get the requested object as JSON. [Learn more about the API](/frappe/user/guides/integration/rest_api). +1. In the handler, we trigger an AJAX call to `frappe.client.get`. In response we get the requested object as JSON. [Learn more about the API](/frappe/user/en/guides/integration/rest_api). 1. Using **frappe.model.set_value(*doctype*, *name*, *fieldname*, *value*)** we set the value in the form. **Note:** To check if your script works, remember to 'reload' the page before testing your script. Client script changes are not automatically picked up when you are in developer mode. diff --git a/frappe/docs/user/tutorial/index.md b/frappe/docs/user/en/tutorial/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/index.md rename to frappe/docs/user/en/tutorial/index.md diff --git a/frappe/docs/user/tutorial/index.txt b/frappe/docs/user/en/tutorial/index.txt old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/index.txt rename to frappe/docs/user/en/tutorial/index.txt diff --git a/frappe/docs/user/tutorial/models.md b/frappe/docs/user/en/tutorial/models.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/models.md rename to frappe/docs/user/en/tutorial/models.md diff --git a/frappe/docs/user/tutorial/naming-and-linking.md b/frappe/docs/user/en/tutorial/naming-and-linking.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/naming-and-linking.md rename to frappe/docs/user/en/tutorial/naming-and-linking.md diff --git a/frappe/docs/user/tutorial/new-app.md b/frappe/docs/user/en/tutorial/new-app.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/new-app.md rename to frappe/docs/user/en/tutorial/new-app.md diff --git a/frappe/docs/user/tutorial/reports.md b/frappe/docs/user/en/tutorial/reports.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/reports.md rename to frappe/docs/user/en/tutorial/reports.md diff --git a/frappe/docs/user/tutorial/roles.md b/frappe/docs/user/en/tutorial/roles.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/roles.md rename to frappe/docs/user/en/tutorial/roles.md diff --git a/frappe/docs/user/tutorial/setting-up-the-site.md b/frappe/docs/user/en/tutorial/setting-up-the-site.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/setting-up-the-site.md rename to frappe/docs/user/en/tutorial/setting-up-the-site.md diff --git a/frappe/docs/user/tutorial/single-doctypes.md b/frappe/docs/user/en/tutorial/single-doctypes.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/single-doctypes.md rename to frappe/docs/user/en/tutorial/single-doctypes.md diff --git a/frappe/docs/user/tutorial/start.md b/frappe/docs/user/en/tutorial/start.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/start.md rename to frappe/docs/user/en/tutorial/start.md diff --git a/frappe/docs/user/tutorial/task-runner.md b/frappe/docs/user/en/tutorial/task-runner.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/task-runner.md rename to frappe/docs/user/en/tutorial/task-runner.md diff --git a/frappe/docs/user/tutorial/users-and-records.md b/frappe/docs/user/en/tutorial/users-and-records.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/users-and-records.md rename to frappe/docs/user/en/tutorial/users-and-records.md diff --git a/frappe/docs/user/tutorial/web-views.md b/frappe/docs/user/en/tutorial/web-views.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/tutorial/web-views.md rename to frappe/docs/user/en/tutorial/web-views.md diff --git a/frappe/docs/user/videos/index.md b/frappe/docs/user/en/videos/index.md old mode 100644 new mode 100755 similarity index 100% rename from frappe/docs/user/videos/index.md rename to frappe/docs/user/en/videos/index.md diff --git a/frappe/docs/user/fr/guides/.txt b/frappe/docs/user/fr/guides/.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/docs/user/fr/guides/app-development/adding-module-icons-on-desktop.md b/frappe/docs/user/fr/guides/app-development/adding-module-icons-on-desktop.md new file mode 100644 index 0000000000..e6e0156bf6 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/adding-module-icons-on-desktop.md @@ -0,0 +1,34 @@ +To create a module icon for a Page, List or Module, you will have to edit the `config/desktop.py` file in your app. + +In this file you will have to write the `get_data` method that will return a dict object with the module icon parameters + +### Example 1: Module Icon + + def get_data(): + return { + "Accounts": { + "color": "#3498db", + "icon": "octicon octicon-repo", + "type": "module" + }, + } + +### Example 2: List Icon + + def get_data(): + return { + "To Do": { + "color": "#f1c40f", + "icon": "icon-check", + "icon": "octicon octicon-check", + "label": _("To Do"), + "link": "List/ToDo", + "doctype": "ToDo", + "type": "list" + }, + } + + +Note: Module views are visible based on permissions. + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/app-development/custom-module-icon.md b/frappe/docs/user/fr/guides/app-development/custom-module-icon.md new file mode 100644 index 0000000000..609f7f3803 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/custom-module-icon.md @@ -0,0 +1,21 @@ +If you want to create a custom icon for your module, you will have to create an SVG file for your module and set the path to this file in the `desktop/config.py` of your app.
+ +This icon is loaded via AJAX first time, then it will be rendered. + +Example: + + from frappe import _ + + def get_data(): + return { + "Frappe Apps": { + "color": "orange", + "icon": "assets/frappe/images/frappe.svg", + "label": _("Frappe.io Portal"), + "type": "module" + } + } + +> PS: A great place to buy SVG icons for a low cost is the awesome [Noun Project](http://thenounproject.com/) + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/app-development/dialogs-types.md b/frappe/docs/user/fr/guides/app-development/dialogs-types.md new file mode 100644 index 0000000000..6b17121dd0 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/dialogs-types.md @@ -0,0 +1,118 @@ +Frappe provide a group of standard dialogs that are very usefull while coding. + +## Alert Dialog + +![Alert](/files/show_alert.png) + +Is helpfull for show a non-obstrutive message. + +This dialog have 2 parameters `txt`that is the message and `seconds` that is the time that the message will be showed for the user, the standard is `3 seconds`. + +### Example + + show_alert('Hi, do you have a new message', 5); + +--- + +## Prompt Dialog + +![Prompt](/files/promp_dialog.png) + +Is helpful for ask a value for the user + +This dialog have 4 parameters, they are: + +- **fields:** a list with the fields objects +- **callback:** the function that manage the received values +- **title:** the title of the dialog +- **primary_label:** the label of the primary button + +### Example + + frappe.prompt([ + {'fieldname': 'birth', 'fieldtype': 'Date', 'label': 'Birth Date', 'reqd': 1} + ], + function(values){ + show_alert(values, 5); + }, + 'Age verification', + 'Subscribe me' + ) + +--- +## Confirm Dialog + +![Confirm](/files/confirm_dialog.png) + +Usefull to get a confirmation from the user before do an action + +This dialog have 3 arguments, they are: + +- **mesage:** The message content +- **onyes:** The callback on positive confirmation +- **oncancel:** The callback on negative confirmation + +### Example + + frappe.confirm( + 'Are you sure to leave this page?', + function(){ + window.close(); + }, + function(){ + show_alert('Thanks for continue here!') + } + ) + +--- + +## Message Print + +![MSGPrint](/files/msgprint_dialog.png) + +Is helpfull for show a informational dialog for the user; + +This dialog have 2 arguments, they are: + +- **message:** The message content, can be a HTML string too +- **title:** The title of the dialog + +### Example + + msgprint("Server Status" + + "
" + + "", 'Server Info') + +--- + +### Custom Dialog + +![Class](/files/dialog_constructor.png) + +Frappé provide too a `Class` that you can extend and build your own custom dialogs + +`frappe.ui.Dialog` + +### Example + + var d = new frappe.ui.Dialog({ + 'fields': [ + {'fieldname': 'ht', 'fieldtype': 'HTML'}, + {'fieldname': 'today', 'fieldtype': 'Date', 'default': frappe.datetime.nowdate()} + ], + primary_action: function(){ + d.hide(); + show_alert(d.get_values()); + } + }); + d.fields_dict.ht.$wrapper.html('Hello World'); + d.show(); + + + + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/app-development/executing-code-on-doctype-events.md b/frappe/docs/user/fr/guides/app-development/executing-code-on-doctype-events.md new file mode 100644 index 0000000000..a5b57e0920 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/executing-code-on-doctype-events.md @@ -0,0 +1,29 @@ +To execute code when a DocType is inserted, validated (before saving), updated, submitted, cancelled, deleted, you must write in the DocType's controller module. + +#### 1. Controller Module + +The controller module exists in the `doctype` folder in the Module of the `DocType`. For example, the controller for **ToDo** exists in `frappe/desk/doctype/todo/todo.py` (version 5). A controller template is created when the DocType is created. which looks like + + from __future__ import unicode_literals + + import frappe + from frappe.model.document import Document + + class CustomType(Document): + pass + +#### 2. Document Properties + +All the fields and child tables are available to the class as attributes. For example the **name** property is `self.name` + +#### 3. Adding Methods + +In this module, you can add standard methods to the class that are called when a document of that type is created. Standard Handlers are: + +1. `autoname`: Called while naming. You can set the `self.name` property in the method. +1. `before_insert`: Called before a document is inserted. +1. `validate`: Called before document is saved. You can throw an exception if you don't want the document to be saved +1. `on_update`: Called after the document is inserted or updated in the database. +1. `on_submit`: Called after submission. +1. `on_cancel`: Called after cancellation. +1. `on_trash`: Called after document is deleted. diff --git a/frappe/docs/user/fr/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md b/frappe/docs/user/fr/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md new file mode 100644 index 0000000000..d6e495ca1e --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/fetch-custom-field-value-from-master-to-all-related-transactions.md @@ -0,0 +1,15 @@ +# Fetch a Field Value from a Document into a Transaction + +Let's say, there is a custom field "VAT Number" in Supplier, which should be fetched in Purchase Order. + +#### Steps: + +1. Create a Custom Field **VAT Number** for *Supplier* document with *Field Type* as **Data**. + + +1. Create another Custom Field **VAT Number** for *Purchase Order* document, but in this case with *Field Type* as **Read Only** or check **Read Only** checkbox. Set the **Options** as `supplier.vat_number`. + + +1. Go to the user menu and click "Reload". +1. Now, on selection of Supplier in a new Purchase Order, **VAT Number** will be fetched automatically from the selected Supplier. + diff --git a/frappe/docs/user/fr/guides/app-development/generating-docs.md b/frappe/docs/user/fr/guides/app-development/generating-docs.md new file mode 100644 index 0000000000..ca3d92a61d --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/generating-docs.md @@ -0,0 +1,110 @@ +# Generating Documentation Website for your App + +Frappe version 6.7 onwards includes a full-blown documentation generator so that you can easily create a website for your app that has both user docs and developers docs (auto-generated). These pages are generated as static HTML pages so that you can add them as GitHub pages. + +## Writing Docs + +### 1. Setting up docs + +#### 1.1. Setup `docs.py` + +The first step is to setup the docs folder. For that you must create a new file in your app `config/docs.py` if it is not auto-generated. In your `docs.py` file, add the following module properties. + + + source_link = "https://github.com/[orgname]/[reponame]" + docs_base_url = "https://[orgname].github.io/[reponame]" + headline = "This is what my app does" + sub_heading = "Slightly more details with key features" + long_description = """(long description in markdown)""" + + def get_context(context): + # optional settings + + # context.brand_html = 'Brand info on the top left' + # context.favicon = 'path to favicon' + # + # context.top_bar_items = [ + # {"label": "About", "url": context.docs_base_url + "/about"}, + # ] + + pass + +#### 1.2. Generate `/docs` + +To generate the docs for the `current` version, go to the command line and write + + bench --site sitename make-docs app_name current + +If you want to maintain versions of your docs, then you can add a version number instead of `current` + +This will create a `/docs` folder in your app. + +### 2. Add User Documentation + +To add user documentation, add folders and pages in your `/docs/user` folder in the same way you would build a website pages in the `www` folder. + +Some quick tips: + +1. Add your pages as `.md` or `.html` pages +2. Optionally add `.css` files with the same name that will be automatically served +3. Add index by adding `{index}` + +### 3. Linking + +While linking make sure you add `{{ docs_base_url }}` to all your links. + + + {% raw %}Link Description{% endraw %} + + +### 4. Adding Images + +You can add images in the `/docs/assets` folder. You can add links to the images as follows: + + {% raw %}{% endraw %} + +--- + +## Setting up output docs + +1. Create a `/docs` folder in your bench, parallel to your `/sites` folder. e.g. `/frappe-bench/docs` +2. Copy the repo of your app to the docs folder. e.g. `cp -R apps/myapp docs/myapp` (you can also clone it here using `git clone`). +3. Go to your docs folder `cd docs/myapp` +4. Checkout the gh-pages branch `git checkout --orphan gh-pages` +5. Clean everything `git rm -rf .` + +Note > The branch name `gh-pages` is only if you are using GitHub. If you are hosting this on any other static file server, can just skip this and just create your docs folder for your app like `docs/myapp` + +Putting it all together: + + mkdir docs + cp -R apps/myapp docs/myapp + cd docs/myapp + git checkout --orphan gh-pages + git rm -rf . + +--- + +## Viewing Locally + +To test your docs locally, add a `--local` option to the `build-docs` command. + + bench --site [site] build-docs [appname] --local + +Then it will build urls so that you can view these files locally. To view them locally in your browser, you can use the Python SimpleHTTPServer + +Run this from your `docs/myapp` folder: + + python -m SimpleHTTPServer 8080 + +--- + +## Publishing to GitHub Pages + +To publish your docs on GitHub pages, you will have to create an empty and orphan branch in your repository called `gh-pages` and write yours there + +Now go back to your bench folder and write these docs to this branch. For example if your path to the `gh-pages` repo is `docs/reponame` + + bench --site [site] build-docs [appname] + +To check your documentation online go to: https://[orgname].github.io/[reponame] diff --git a/frappe/docs/user/fr/guides/app-development/how-enable-developer-mode-in-frappe.md b/frappe/docs/user/fr/guides/app-development/how-enable-developer-mode-in-frappe.md new file mode 100644 index 0000000000..5c47385fbd --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/how-enable-developer-mode-in-frappe.md @@ -0,0 +1,15 @@ +When you are in application design mode and you want the changes in your DocTypes, Reports etc to affect the app repository, you must be in **Developer Mode**. + +To enable developer mode, update the `site_config.json` file of your site in the sites folder for example: + + frappe-bench/sites/site1/site_config.json + +Add this to the JSON object + + "developer_mode": 1 + +After setting developer mode, clear the cache: + + $ bench clear-cache + + diff --git a/frappe/docs/user/fr/guides/app-development/how-to-create-custom-fields-during-app-installation.md b/frappe/docs/user/fr/guides/app-development/how-to-create-custom-fields-during-app-installation.md new file mode 100644 index 0000000000..20b7fdce30 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/how-to-create-custom-fields-during-app-installation.md @@ -0,0 +1,20 @@ +Your custom app can automatically add **Custom Fields** to DocTypes outside of your app when it is installed to a new site. + +To do this, add the new custom fields that your app requires, using the Frappe web application. + +In your `hooks.py` file, add `"Custom Fields"` + + fixtures = ["Custom Field"] + +Export fixtures before you commit your app with: + + $ bench --site mysite export-fixtures + +This will create a new folder called `fixtures` in your app folder and a `.csv` or `.json` file will be created with the definition of the custom fields you added. + +This file will be automatically imported when the app is installed in a new site or updated via `bench update`. + +Note: You can also add single DocTypes like "Website Settings" as fixtures + + + diff --git a/frappe/docs/user/fr/guides/app-development/how-to-improve-a-standard-control.md b/frappe/docs/user/fr/guides/app-development/how-to-improve-a-standard-control.md new file mode 100644 index 0000000000..bfbf320612 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/how-to-improve-a-standard-control.md @@ -0,0 +1,102 @@ +Frappé has a couple of elegant and useful widgets, but some times we need to edit them to add small improvements. This small article will describe how to add new resources to the standard widgets. + +Let me explain first our goal: + +> Add `many` alternative translations in `numerous records` and in a `lot of doctypes` + +Look the highlighted sections in the __goal__, we have _many translations_ to add in _many records_ and in _many doctypes_, so, we heave a **many of work**, so we have a lot to do right? + +The answer for this question is: _-Of course not! Because we know that if one element exists in many records and in many doctypes, this element is the `Control` or `Widget`_ + +So, what we need do, is improve your goal based on the `Control`, to reduce our quantity of work. + +But, where will we find this magic element, the control? _-For now, we can look it in the JavaScript sources - let's look now at [Github](https://github.com/frappe/frappe/blob/develop/frappe/public/js/frappe/form/control.js#L13)_ + +> Don't worry if you don't understand the code for now, our goal there is simplify our work. + +Let's go ahead with the thought! + +We know where we need to make the changes, but how will we dismember which are the controls that are affected by our feature and which aren't ? + +We need to keep in mind, that `Control` are instance of `DocFields` and the `DocFields` have a field that is very important for us in this case, the field that will help us to dismember which are affected by our feature and which aren't is the field `options` in the `DocField`. + +_-Wait!, we understood that the field `options` can help us, but, how will it help us?_ + +Good question, we will define a word to put in the `options` of the `DocFields` that we need to include the feature, this world will be **`Translatable`.** + +> If you forget how to customize the options of a field look [this article](https://kb.erpnext.com/kb/customize/creating-custom-link-field), it can refresh your knowledge. + +Well, with the defined word in `options` of our selected `DocFields`, now is time to code: + +_-At last, we think we would never stop talking!_ + + frappe.ui.form.ControlData = frappe.ui.form.ControlData.$extend({ + make_input: function(){ + var options = this.df.options; + if (!options || options!=="Translatable"){ + this._super(); + return; + } + var me = this; + $('').prependTo(this.input_area); + this.$input_area = $(this.input_area); + this.$input = this.$input_area.find('input'); + this.$btn = this.$input_area.find('.dialog-btn'); + this.set_input_attributes(); + this.$input.on("focus", function(){ + me.$btn.toggle(true); + }); + this.$input.on("blur", function(){ + setTimeout(function(){ me.$btn.toggle(false) }, 500); + }); + this.input = $this.input.get(0); + this.has_input = true; + var me = this; + this.setup_button(); + }, + setup_button: function(){ + var me = this; + if (this.only_input){ + this.$btn.remove(); + return; + } + this.$btn.on("click", function(){ + var value = me.get_value(); + var options = me.df.options; + if (value && options && options==="Translatable"){ + this.open_dialog(); + } + }); + }, + open_dialog: function(){ + var doc = this.doc; + if (!doc.__unsaved){ + new frappe.ui.form.TranslationSelector({ + doc: doc, + df: this.doc, + text: this.value + }); + } + } + }); + +_-Other letter soup, for my gosh!_ + +In fact, it IS a soup of letters, for a newbie, but we are not a beginner. + +Let me explain what this code does; + + - At line 1 the code overrides the `ControlData` by one extended `Class` of itself. + - The method `make_input` checks if the docfield is **`Translatable`** to make the new `Control` if not, it calls the *original* `make_input` using `_super()` + - The method `setup_button` checks if the docfield is **`Translatable`** to enable it show a `dialog` + - The method `open_dialog` invokes a new instance of the `TranslationSelector` that we will create in the code below. + + + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/app-development/index.md b/frappe/docs/user/fr/guides/app-development/index.md new file mode 100644 index 0000000000..b04ae83043 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/index.md @@ -0,0 +1,3 @@ +# App Development + +{index} diff --git a/frappe/docs/user/fr/guides/app-development/index.txt b/frappe/docs/user/fr/guides/app-development/index.txt new file mode 100644 index 0000000000..2c74940479 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/index.txt @@ -0,0 +1,14 @@ +adding-module-icons-on-desktop +custom-module-icon +generating-docs +how-enable-developer-mode-in-frappe +fetch-custom-field-value-from-master-to-all-related-transactions +executing-code-on-doctype-events +how-to-create-custom-fields-during-app-installation +insert-a-document-via-api +how-to-improve-a-standard-control +overriding-link-query-by-custom-script +single-type-doctype +trigger-event-on-deletion-of-grid-row +dialogs-types +using-html-templates-in-javascript diff --git a/frappe/docs/user/fr/guides/app-development/insert-a-document-via-api.md b/frappe/docs/user/fr/guides/app-development/insert-a-document-via-api.md new file mode 100644 index 0000000000..aab15b4ac9 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/insert-a-document-via-api.md @@ -0,0 +1,53 @@ +You can insert documents via a script using the `frappe.get_doc` method + +### Examples: + +#### 1. Insert a ToDo + + todo = frappe.get_doc({"doctype":"ToDo", "description": "test"}) + todo.insert() + +--- + +#### 2. Insert without the user's permissions being checked: + + todo = frappe.get_doc({"doctype":"ToDo", "description": "test"}) + todo.insert(ignore_permissions = True) + + +--- + +#### 3. Submit after inserting + + todo = frappe.get_doc({"doctype":"ToDo", "description": "test"}) + todo.insert(ignore_permissions=True) + todo.submit() + +--- + +#### 4. Insert a document on saving of another document + + class MyType(Document): + def on_update(self): + todo = frappe.get_doc({"doctype":"ToDo", "description": "test"}) + todo.insert() + +---- + +#### 5. Insert a document with child tables: + + sales_order = frappe.get_doc({ + "doctype": "Sales Order", + "company": "_Test Company", + "customer": "_Test Customer", + "delivery_date": "2013-02-23", + "sales_order_details": [ + { + "item_code": "_Test Item Home Desktop 100", + "qty": 10.0, + "rate": 100.0, + "warehouse": "_Test Warehouse - _TC" + } + ] + }) + sales_order.insert() diff --git a/frappe/docs/user/fr/guides/app-development/overriding-link-query-by-custom-script.md b/frappe/docs/user/fr/guides/app-development/overriding-link-query-by-custom-script.md new file mode 100644 index 0000000000..cc8c8058fd --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/overriding-link-query-by-custom-script.md @@ -0,0 +1,87 @@ +You can override the standard link query by using `set_query` + +### 1. Adding Fitlers + +You can add filters to the query: + + frappe.ui.form.on("Bank Reconciliation", "onload", function(frm) { + cur_frm.set_query("bank_account", function() { + return { + "filters": { + "account_type": "Bank", + "group_or_ledger": "Ledger" + } + }; + }); + }); + +A more complex query: + + frappe.ui.form.on("Bank Reconciliation", "onload", function(frm){ + cur_frm.set_query("bank_account", function(){ + return { + "filters": [ + ["Bank Account": "account_type", "=", "Bank"], + ["Bank Account": "group_or_ledger", "!=", "Group"] + ] + } + }); + }); + +--- + +### 2. Calling a Different Method to Generate Results + +You can also set a server side method to be called on the query: + + frm.set_query("item_code", "items", function() { + return { + query: "erpnext.controllers.queries.item_query", + filters: frm.doc.enquiry_type === "Maintenance" ? + {"is_service_item": "Yes"} : {"is_sales_item": "Yes"} + }; + }); + + + +#### Custom Method + +The custom method should return a list of items for auto select. If you want to send additional data, you can send multiple columns in the list. + +Parameters to the custom method are: + +`def custom_query(doctype, txt, searchfield, start, page_len, filters)` + +**Example:** + + # searches for leads which are not converted + def lead_query(doctype, txt, searchfield, start, page_len, filters): + return frappe.db.sql("""select name, lead_name, company_name from `tabLead` + where docstatus < 2 + and ifnull(status, '') != 'Converted' + and ({key} like %(txt)s + or lead_name like %(txt)s + or company_name like %(txt)s) + {mcond} + order by + if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999), + if(locate(%(_txt)s, lead_name), locate(%(_txt)s, lead_name), 99999), + if(locate(%(_txt)s, company_name), locate(%(_txt)s, company_name), 99999), + name, lead_name + limit %(start)s, %(page_len)s""".format(**{ + 'key': searchfield, + 'mcond':get_match_cond(doctype) + }), { + 'txt': "%%%s%%" % txt, + '_txt': txt.replace("%", ""), + 'start': start, + 'page_len': page_len + }) + + + +For more examples see: + +[https://github.com/frappe/erpnext/blob/develop/erpnext/controllers/queries.py](https://github.com/frappe/erpnext/blob/develop/erpnext/controllers/queries.py) + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/app-development/single-type-doctype.md b/frappe/docs/user/fr/guides/app-development/single-type-doctype.md new file mode 100644 index 0000000000..ee5c24b492 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/single-type-doctype.md @@ -0,0 +1,9 @@ +DocTypes have a table associated with them. For example DocType **Customer** will have a table `tabCustomer` associated with it. + +**Single** type DocTypes have no table associated and there is only one Document for it. This is similar to the Singleton pattern in Java. Single DocTypes are ideal for saving Settings (that are globally applicable) and for wizard / helper type forms that have no documents, but when the DocType is used for the Form UI. + +The data in Single DocType is stored in `tabSingles` (`doctype`, `field`, `value`) + +#### Examples + +In Frappe, Single types are **System Settings** and **Customize Form** \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/app-development/trigger-event-on-deletion-of-grid-row.md b/frappe/docs/user/fr/guides/app-development/trigger-event-on-deletion-of-grid-row.md new file mode 100644 index 0000000000..68f1b77129 --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/trigger-event-on-deletion-of-grid-row.md @@ -0,0 +1,22 @@ + +To trigger an event when a row from a grid has been deleted, you need to add a handler the `fieldname_remove` event, where fieldname is the fieldname of the grid (Table) + +

Example for add

+ +

Recalculate totals when a Journal Entry row has been added

+ + frappe.ui.form.on("Journal Entry Account", "accounts_add", function(frm){ + cur_frm.cscript.update_totals(frm.doc); + }); + + + +

Example for delete

+ +

Recalculate totals when a Journal Entry row has been deleted

+ + frappe.ui.form.on("Journal Entry Account", "accounts_remove", function(frm){ + cur_frm.cscript.update_totals(frm.doc); + }); + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/app-development/using-html-templates-in-javascript.md b/frappe/docs/user/fr/guides/app-development/using-html-templates-in-javascript.md new file mode 100644 index 0000000000..db0cd90b4c --- /dev/null +++ b/frappe/docs/user/fr/guides/app-development/using-html-templates-in-javascript.md @@ -0,0 +1,42 @@ +Often while building javascript interfaces, there is a need to render DOM as an HTML template. Frappe Framework uses John Resig's Microtemplate script to render HTML templates in the Desk application. + +> Note 1: In Frappe we use the Jinja-like `{%` tags to embed code rather than the standard `<%` + +> Note 2: Never use single quotes `'` inside the HTML template. + +To render a template, + +1. Create a template `html` file in your app. e.g. `address_list.html` +1. Add it to `build.json` for your app (you can include it in `frappe.min.js` or your own javascript file). +1. To render it in your app, use `frappe.render(frappe.templates.address_list, {[context]})` + +#### Example Template: + +From `erpnext/public/js/templates/address_list.js` + + +

+ {% for(var i=0, l=addr_list.length; i + + {%= __("Edit") %} +

{%= addr_list[i].address_type %}

+
+
+ {% if(addr_list[i].is_primary_address) { %} + {%= __("Primary") %}{% } %} + {% if(addr_list[i].is_shipping_address) { %} + {%= __("Shipping") %}{% } %} +
+

{%= addr_list[i].display %}

+
+ {% } %} + {% if(!addr_list.length) { %} +

{%= __("No address added yet.") %}

+ {% } %} + + + + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/basics/apps.md b/frappe/docs/user/fr/guides/basics/apps.md new file mode 100644 index 0000000000..f79a9f4642 --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/apps.md @@ -0,0 +1,109 @@ +# Frappe Apps + +Frappe Apps are Python packages which use the Frappe platform. They can live +anywhere on the [Python +path](https://docs.python.org/2/tutorial/modules.html#the-module-search-path) +and must have an entry in the `apps.txt` file. + + +### Creating an app + +Frappe ships with a boiler plate for a new app. The command `bench make-app +app-name` helps you start a new app by starting an interactive shell. + + + % bench make-app sample_app + App Name: sample_app + App Title: Sample App + App Description: This is a sample app. + App Publisher: Acme Inc. + App Icon: icon-linux + App Color: #6DAFC9 + App Email: info@example.com + App URL: http://example.com + App License: MIT + +The above command would create an app with the following directory structure. + + sample_app + ├── license.txt + ├── MANIFEST.in + ├── README.md + ├── sample_app + │   ├── __init__.py + │   ├── sample_app + │   │   └── __init__.py + │   ├── config + │   │   ├── desktop.py + │   │   └── __init__.py + │   ├── hooks.py + │   ├── modules.txt + │   ├── patches.txt + │   └── templates + │   ├── generators + │   │   └── __init__.py + │   ├── __init__.py + │   ├── pages + │   │   └── __init__.py + │   └── statics + └── setup.py + +Here, "App Icon" is a font awesome class that you can select from +[http://fortawesome.github.io/Font-Awesome/icons/](http://fortawesome.github.io/Font-Awesome/icons/). + +The boiler plate contains just enough files to show your app icon on the [Desk]. + +### Files in the app + +#### `hooks.py` + +The `hooks.py` file defines the metadata of your app and integration points +with other parts of Frappe or Frappe apps. Examples of such parts include task +scheduling or listening to updates to different documents in the system. For +now, it just contains the details you entered during app creation. + + + app_name = "sample-app" + app_title = "Sample App" + app_publisher = "Acme Inc." + app_description = "This is a sample app." + app_icon = "fa-linux" + app_color = "black" + app_email = "info@example.com" + app_url = "http://example.com" + app_version = 0.0.1 + +#### `modules.txt` + +Modules in Frappe help you organize Documents in Frappe and they are defined in +the `modules.txt` file in your app. It is necessary for every [DocType] to be +attached to a module. By default a module by the name of your app is added. +Also, each module gets an icon on the [Desk]. For example, the [ERPNext] app is +organized in the following modules. + + accounts + buying + home + hr + manufacturing + projects + selling + setup + stock + support + utilities + contacts + +### Adding app to a site + +Once you have an app, whether it's the one you just created or any other you +downloaded, you are required to do the following things. + +Download the app via git + + bench get-app https://github.com/org/app_name + +Install the app to your site + + bench --site app_name install-app app_name + diff --git a/frappe/docs/user/fr/guides/basics/hooks.md b/frappe/docs/user/fr/guides/basics/hooks.md new file mode 100644 index 0000000000..9bfaaeee3c --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/hooks.md @@ -0,0 +1,273 @@ +# Hooks + + +Hooks are the duct tape of the Frappe system. Hooks allow you to "hook" in to +functionality and events of other parts of the Frappe system. Following are the +official hooks from Frappe. + +### Application Name and Details + +1. `app_name` - slugified name with underscores e.g. "shopping\_cart" +2. `app_title` - full title name e.g. "Frappe" +3. `app_publisher` +4. `app_description` +5. `app_version` +6. `app_icon` - font-awesome icon or image url +7. `app_color` - hex colour background of the app icon + +### Install Events + +1. `before_install` +2. `after_install` + +The above hooks are called before and after installation of the app they are in. +For example, [ERPNext](/apps/erpnext)'s hooks contains a line, + + after_install = "erpnext.setup.install.after_install" + +So, the function after\_install is imported and called after ERPNext is installed. + +Note, the `before_install` and `after_install` hooks are called with no arguments. + +### Boot Session + +After a successful login, the Frappe JS Client requests for a resource called +`bootinfo`. The `bootinfo` is available as a global in Javascript via +`frappe.boot`. By default, the `bootinfo` contains + +* System defaults +* Notification status +* Permissions +* List of icons on desktop +* User settings +* Language and timezone info + +If your app wants to modify bootinfo, it can declare a hook `boot_session`. The +value is assumed to be a dotted path to a function and is called with one +argument, bootinfo which it can modify and return. + +Eg, + + boot_session = "erpnext.startup.boot.boot_session" + +### Notification configurations + +The notification configuration hook is expected to return a Python dictionary. + + { + "for_doctype": { + "Issue": {"status":"Open"}, + "Customer Issue": {"status":"Open"}, + }, + "for_module_doctypes": { + "ToDo": "To Do", + "Event": "Calendar", + "Comment": "Messages" + }, + "for_module": { + "To Do": "frappe.core.notifications.get_things_todo", + "Calendar": "frappe.core.notifications.get_todays_events", + "Messages": "frappe.core.notifications.get_unread_messages" + } + } + + +The above configuration has three parts, + +1. `for_doctype` part of the above configuration marks any "Issue" + or "Customer Issue" as unread if its status is Open +2. `for_module_doctypes` maps doctypes to module's unread count. +3. `for_module` maps modules to functions to obtain its unread count. The + functions are called without any argument. + +### Javascript / CSS Assets + +The following hooks allow you to bundle built assets to your app for serving. +There are two types of assets, app and web. The app assets are loaded in the +Desk and web assets are loaded in the website. + +1. `app_include_js` +2. `app_include_css` +3. `web_include_js` +4. `web_include_css` + +Eg, + + app_include_js = "assets/js/erpnext.min.js" + web_include_js = "assets/js/erpnext-web.min.js" + +Note: to create an asset bundle (eg, assets/js/erpnext.min.js) the target file +should be in build.json of your app. + +### Configuring Reports + +In the report view, you can force filters as per doctype using `dump_report_map` +hook. The hook should be a dotted path to a Python function which will be called +without any arguments. Example of output of this function is below. + + + "Warehouse": { + "columns": ["name"], + "conditions": ["docstatus < 2"], + "order_by": "name" + } + +Here, for a report with Warehouse doctype, would include only those records that +are not cancelled (docstatus < 2) and will be ordered by name. + +### Modifying Website Context + +Context used in website pages can be modified by adding +a `update_website_context` hook. This hook should be a dotted path to a function +which will be called with a context (dictionary) argument. + +### Customizing Email footer + +By default, for every email, a footer with content, "Sent via Frappe" is sent. +You can customize this globally by adding a `mail_footer` hook. The hook should +be a dotted path to a variable. + +### Session Creation Hook + +You can attach custom logic to the event of a successful login using +`on_session_creation` hook. The hook should be a dotted path to a Python +function that takes login\_manager as an argument. + +Eg, + + def on_session_creation(login_manager): + """make feed""" + if frappe.session['user'] != 'Guest': + # log to timesheet + pass + +### Website Clear Cache + +If you cache values in your views, the `website_clear_cache` allows you to hook +methods that invalidate your caches when Frappe tries to clear cache for all +website related pages. + +### Document hooks + +#### Permissions + +#### Query Permissions +You can customize how permissions are resolved for a DocType by hooking custom +permission match conditions using the `permission_query_conditions` hook. This +match condition is expected to be fragment for a where clause in an sql query. +Structure for this hook is as follows. + + + permission_query_conditions = { + "{doctype}": "{dotted.path.to.function}", + } + +The output of the function should be a string with a match condition. +Example of such a function, + + + def get_permission_query_conditions(): + return "(tabevent.event_type='public' or tabevent.owner='{user}'".format(user=frappe.session.user) + +The above function returns a fragment that permits an event to listed if it's +public or owned by the current user. + +#### Document permissions +You can hook to `doc.has_permission` for any DocType and add special permission +checking logic using the `has_permission` hook. Structure for this hook is, + + has_permission = { + "{doctype}": "{dotted.path.to.function}", + } + +The function will be passed the concerned document as an argument. It should +True or a falsy value after running the required logic. + +For Example, + + def has_permission(doc): + if doc.event_type=="Public" or doc.owner==frappe.session.user: + return True + +The above function permits an event if it's public or owned by the current user. + +#### CRUD Events + +You can hook to various CRUD events of any doctype, the syntax for such a hook +is as follows, + + doc_events = { + "{doctype}": { + "{event}": "{dotted.path.to.function}", + } + } + +To hook to events of all doctypes, you can use the follwing syntax also, + + doc_events = { + "*": { + "on_update": "{dotted.path.to.function}", + } + } + +The hook function will be passed the doc in concern as the only argument. + +##### List of events + +* `validate` +* `before_save` +* `after_save` +* `before_insert` +* `after_insert` +* `before_submit` +* `before_cancel` +* `before_update_after_submit` +* `on_update` +* `on_submit` +* `on_cancel` +* `on_update_after_submit` + + +Eg, + + doc_events = { + "Cab Request": { + "after_insert": topcab.schedule_cab", + } + } + +### Scheduler Hooks + +Scheduler hooks are methods that are run periodically in background. Structure for such a hook is, + + scheduler_events = { + "{event_name}": [ + "{dotted.path.to.function}" + ], + } + +#### Events + +* `daily` +* `daily_long` +* `weekly` +* `weekly_long` +* `monthly` +* `monthly_long` +* `hourly` +* `all` + +The scheduler events require celery, celerybeat and redis (or a supported and +configured broker) to be running. The events with suffix '\_long' are for long +jobs. The `all` event is triggered everytime (as per the celerybeat interval). + +Example, + + scheduler_events = { + "{daily}": [ + "erpnext.accounts.doctype.sales_invoice.sales_invoice.manage_recurring_invoices" + ], + "{daily_long}": [ + "erpnext.setup.doctype.backup_manager.backup_manager.take_backups_daily" + ], + } diff --git a/frappe/docs/user/fr/guides/basics/index.md b/frappe/docs/user/fr/guides/basics/index.md new file mode 100644 index 0000000000..645bed29a7 --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/index.md @@ -0,0 +1,3 @@ +# Basics + +{index} diff --git a/frappe/docs/user/fr/guides/basics/index.txt b/frappe/docs/user/fr/guides/basics/index.txt new file mode 100644 index 0000000000..910ba191d4 --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/index.txt @@ -0,0 +1,7 @@ +install +apps +sites +site_config +hooks +translations +writing-tests diff --git a/frappe/docs/user/fr/guides/basics/install.md b/frappe/docs/user/fr/guides/basics/install.md new file mode 100644 index 0000000000..3afa43a37c --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/install.md @@ -0,0 +1,10 @@ +# Installing Frappe + +## Frappe bench + +The following steps help you setup an isolated environment (bench) to run and +develop Frappe apps. A virtualenv is installed in the env directory. You can +activate it by running `source ./env/bin/activate` or use execute using +absolute/relative path (eg, `./env/bin/frappe`). + +For more info, see [Frappe Bench](https://github.com/frappe/bench/) diff --git a/frappe/docs/user/fr/guides/basics/site_config.md b/frappe/docs/user/fr/guides/basics/site_config.md new file mode 100644 index 0000000000..322cc1937c --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/site_config.md @@ -0,0 +1,40 @@ +# Site Config + +Settings for `sites/[site]/site_config.json` + +`site_config.json` stores global settings for a particular site and is present in the site directory. Here is a list of properties you can set in `site_config.json`. + +Example: + + { + "db_name": "test_frappe", + "db_password": "test_frappe", + "admin_password": "admin", + } + +### Mandatory Settings + +- `db_name`: Database Name. +- `db_password`: Database password. + +### Optional Settings + +- `db_host`: Database host if not `localhost`. +- `admin_password`: Default Password for "Administrator". +- `mute_emails`: Stops email sending if true. +- `deny_multiple_logins`: Stop users from having more than one active session. +- `root_password`: MariaDB root password. + +### Defaut Outgoing Email Settings + +- `mail_server`: SMTP server hostname. +- `mail_port`: STMP port. +- `use_ssl`: Connect via SSL / TLS. +- `mail_login`: Login id for SMTP server. +- `mail_password`: Password for SMTP server. + +### Developer Settings + +- `developer_mode`: If developer mode is set, DocType changes are automatically updated in files. +- `disable_website_cache`: Don't cache website pages. +- `logging`: writes logs if **1**, writes queries also if set to **2**. diff --git a/frappe/docs/user/fr/guides/basics/sites.md b/frappe/docs/user/fr/guides/basics/sites.md new file mode 100644 index 0000000000..81f51aa599 --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/sites.md @@ -0,0 +1,82 @@ +# Sites + +## Sites Directory + +Frappe is a multitenant platform and each tenant is called a site. Sites exist +in a directory called `sites_dir`, assumed as the current working directory when +running a frappe command or other services like Celery worker or a WSGI server. + +You can set `sites_dir` with an environment variable `SITES_DIR` or pass +`--sites_dir` option to the frappe command. + +Apart from the sites, the `sites_dir` should contain the following. + +#### apps.txt + +`apps.txt` contain a list of Python packages to treat as Frappe apps. Every +frappe app that you intend to use in you site should have an entry in this file. +Also, they should be in the `PYTHONPATH`. For more information, refer +[Frappe Apps](/help/apps). + +#### common\_site\_config.json + +`common_site_config.json` is an optional file. Configuration common to all sites +can be put in this file. + +#### assets + +Assets contain files that are required to be served for the browser client. +These generally include *.js, *.css, *.png files. This directory is auto +generated using the `bench build` command. + +#### languages.txt + +`languages.txt` is an autogenerated file which maps every language to it's code. + +## Site + +A site is a directory in `sites_dir` which represents a tenant in Frappe Platform. + + +### Directory Structure + + site + ├── locks + ├── private + │   └── backups + ├── public + │   └── files + │ └── testfile.txt + └── site_config.json + +* `locks` directory is used by the scheduler to synchronize various jobs using +the [file locking concept](http://en.wikipedia.org/wiki/File_locking). + +* `private` directory contains files that require authentication to access. +Presently, it is limited only to backups. + +* `public` directory contains files that can directly served. In the above + example, `testfile.txt` can be accessed by the URL, + http://site/files/testfile.txt + +* `site_config.json` contains site specific configuration + +### Site Config + +[See configuration options for `site_config.json`](/docs/user-guide/site_config.md) + +### Site Resolution + +While responding to an HTTP request, a site is automatically selected based on, + +* `Host` header in the HTTP request matches a site +* `X-Frappe-Site-Name` header in the HTTP request matches a site + +It is also possible to force the development server to serve a specific site by +starting it with the following command. + `bench --site SITENAME serve` + + +### Adding a new site + +`frappe new-site SITENAME` diff --git a/frappe/docs/user/fr/guides/basics/translations.md b/frappe/docs/user/fr/guides/basics/translations.md new file mode 100644 index 0000000000..e5ff22e9f2 --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/translations.md @@ -0,0 +1,86 @@ + + + +This document shows how to translations are managed in ERPNext and how to add +a new language or update translations of an existing language. + +### 1. Source + +Translatable text exists in 3 main sources: + + 1. Javascript Code Files (both framework and application) + 2. Python Code Files + 3. DocTypes (names, labels and select options) + +#### Strings in Code Files + +Strings in code files are annotated using the `_` (underscore) method + + 1. In Python it is the `frappe._` method. Example: + +`frappe._("String {0} must be translated".format(txt))` + + 2. In Javascript it is the `__` method. Example: + +`__("String {0} must be translated", [txt])` + +**Note:** If you find translatable strings are not properly annotated using the `_` +method, you can add them in the code and rebuild the translations. + +### 2. How Translations Are Picked up During Execution + +Whenever a translation is called via the _ method, the entire translation +dictionaries from all apps are built and stored in memcache. + +Based on the user preferences or request preferences, the appropriate +translations are loaded at the time of request on the server side. Or if +metadata (DocType) is queried, then the appropriate translations are appended +when the DocType data is requested. + +The underscore `_` method will replace the strings based on the available +translations loaded at the time. + +### 3. Adding New Translations + +1. To find untranslated strings, run `bench get-untranslated [lang] [path]` +1. Add the translated strings in another file in the same order +1. run `bench update-translations [lang] [path of untranslated strings] [path of translated strings]` + +### 4. Improving Translations: + +For updating translations, please go to the to [the translation portal](https://frappe.io/translator). + +If you want to do it directly via code: + +To improve an existing translation, just edit the master translation files in +the `translations` of each app + +> Please contribute your translations back to ERPNext by sending us a Pull +Request. + +### 5. Bootstrapping a New Language + +If you want to add a new language it is similar to adding new translations. You need to first export all the translations strings in one file, get them translated via Google Translate Tool or Bing Translate Tool and then import the translations into individual apps. + +**Step 1: Export to a file** + + $ bench get-untranslated [lang] [path] + +**Step 2: Translate** + +Create another file with updated translations (in the same order as the source file). For this you can use the [Google Translator Toolkit](https://translate.google.com/toolkit) or [Bing Translator](http://www.bing.com/translator/). + +**Step 3: Import your translations** + + $ bench update-translations [lang] [source path] [translated path] + +**Step 4: Update `languages.txt`** + +Add your language in `apps/languages.txt` and also `frappe/data/languages.txt` (fore new bench installs) + +**Step 5: Commit each app and push** + +A new file will be added to the `translations` folder in each app. You need to add that file and push to your repo. Then send us a pull-request. + +--- + diff --git a/frappe/docs/user/fr/guides/basics/writing-tests.md b/frappe/docs/user/fr/guides/basics/writing-tests.md new file mode 100644 index 0000000000..f151416ccd --- /dev/null +++ b/frappe/docs/user/fr/guides/basics/writing-tests.md @@ -0,0 +1,109 @@ +# Writing Tests + +### Introduction + +Frappe provides some basic tooling to quickly write automated tests. There are some basic rules: + +1. Test can be anywhere in your repository but must begin with `test_` and should be a `.py` file. +1. Tests must run on a site that starts with `test_`. This is to prevent accidental loss of data. +1. Test stubs are automatically generated for new DocTypes. +1. Frappe test runner will automatically build test records for dependant DocTypes identified by the `Link` type field (Foreign Key) +1. Tests can be executed using `bench run-tests` +1. For non-DocType tests, you can write simple unittests and prefix your file names with `test_`. + +### Tests for a DocType + +#### Writing DocType Tests: + +1. Records that are used for testing are stored in a file `test_records.json` in the doctype folder. [For example see the Event Tests](https://github.com/frappe/frappe/blob/develop/frappe/core/doctype/event/test_records.json). +1. Test cases are in a file named `test_[doctype].py` +1. To provide the test records (and dependencies) call `test_records = frappe.get_test_records('Event')` in your test case file. + +#### Example (for `test_records.json`): + + [ + { + "doctype": "Event", + "subject":"_Test Event 1", + "starts_on": "2014-01-01", + "event_type": "Public" + }, + { + "doctype": "Event", + "starts_on": "2014-01-01", + "subject":"_Test Event 2", + "event_type": "Private" + }, + { + "doctype": "Event", + "starts_on": "2014-01-01", + "subject":"_Test Event 3", + "event_type": "Private", + "event_individuals": [{ + "person": "test1@example.com" + }] + } + ] + + +#### Example (for `test_event.py`): + + # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors + # MIT License. See license.txt + + import frappe + import frappe.defaults + import unittest + + # load test records and dependencies + test_records = frappe.get_test_records('Event') + + class TestEvent(unittest.TestCase): + def tearDown(self): + frappe.set_user("Administrator") + + def test_allowed_public(self): + frappe.set_user("test1@example.com") + doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 1"})) + self.assertTrue(frappe.has_permission("Event", doc=doc)) + + def test_not_allowed_private(self): + frappe.set_user("test1@example.com") + doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 2"})) + self.assertFalse(frappe.has_permission("Event", doc=doc)) + + def test_allowed_private_if_in_event_user(self): + frappe.set_user("test1@example.com") + doc = frappe.get_doc("Event", frappe.db.get_value("Event", {"subject":"_Test Event 3"})) + self.assertTrue(frappe.has_permission("Event", doc=doc)) + + def test_event_list(self): + frappe.set_user("test1@example.com") + res = frappe.get_list("Event", filters=[["Event", "subject", "like", "_Test Event%"]], fields=["name", "subject"]) + self.assertEquals(len(res), 2) + subjects = [r.subject for r in res] + self.assertTrue("_Test Event 1" in subjects) + self.assertTrue("_Test Event 3" in subjects) + self.assertFalse("_Test Event 2" in subjects) + +#### Running Tests + +To run a test for a doctype + + bench run-tests --doctype [doctype] + +This function will build all the test dependencies and run your tests. + +### Running All Tests + +To run all tests: + + bench run-tests + +--- + +## Client Side Testing (Using Selenium) + +> This feature is still under development. + +For an example see, [https://github.com/frappe/erpnext/blob/develop/erpnext/tests/sel_tests.py](https://github.com/frappe/erpnext/blob/develop/erpnext/tests/sel_tests.py) diff --git a/frappe/docs/user/fr/guides/data/import-large-csv-file.md b/frappe/docs/user/fr/guides/data/import-large-csv-file.md new file mode 100644 index 0000000000..5194ebd98d --- /dev/null +++ b/frappe/docs/user/fr/guides/data/import-large-csv-file.md @@ -0,0 +1,23 @@ +To import very large CSV files, you can use the bench utility `import-csv`. + +The benefit is that this is not subject to timeouts if you use the web interface. + +Here is an example: + + bench --site test.erpnext.com import-csv ~/Downloads/Activity_Type.csv + +### Help + + $ bench import-csv --help + Usage: bench import-csv [OPTIONS] PATH + + Import CSV using data import tool + + Options: + --only-insert Do not overwrite existing records + --submit-after-import Submit document after importing it + --ignore-encoding-errors Ignore encoding errors while coverting to unicode + --help Show this message and exit. + + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/data/index.md b/frappe/docs/user/fr/guides/data/index.md new file mode 100644 index 0000000000..e6f341b236 --- /dev/null +++ b/frappe/docs/user/fr/guides/data/index.md @@ -0,0 +1,3 @@ +# Data Management + +{index} diff --git a/frappe/docs/user/fr/guides/data/index.txt b/frappe/docs/user/fr/guides/data/index.txt new file mode 100644 index 0000000000..4794a002bc --- /dev/null +++ b/frappe/docs/user/fr/guides/data/index.txt @@ -0,0 +1 @@ +import-large-csv-file diff --git a/frappe/docs/user/fr/guides/deployment/checking-problems-in-bench.md b/frappe/docs/user/fr/guides/deployment/checking-problems-in-bench.md new file mode 100644 index 0000000000..05fcd3d879 --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/checking-problems-in-bench.md @@ -0,0 +1,15 @@ + + +If you're experiencing delays in scheduled jobs or they don't seem to run, you run run the following command to diagnose the issue. + +`bench doctor` + +A desirable output is like below + + + Workers online: True + Pending tasks 0 + Timed out locks: + + +We'll be adding more health checks soon. diff --git a/frappe/docs/user/fr/guides/deployment/configuring-https.md b/frappe/docs/user/fr/guides/deployment/configuring-https.md new file mode 100644 index 0000000000..4fb90be226 --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/configuring-https.md @@ -0,0 +1,43 @@ + +### Get the required files + +You can buy a SSL certificate from a trusted Certificate Authority or generate your own. For self signed certificates the browser will show a warning that the certificate is not trusted. + +The files required are + +* Certificate (usually with extension .crt) +* Decrypted private key + +If you have multiple certificates (primary and intermediate), you will have to concatenate them. For example, + + cat your_certificate.crt CA.crt >> certificate_bundle.crt + +Also make sure that your private key is not world readable. Generally, it is owned and readable only by root + + chown root private.key + chmod 600 private.key + +### Move the two files to an appropriate location + + mkdir /etc/nginx/conf.d/ssl + mv private.key /etc/nginx/conf.d/ssl/private.key + mv certificate_bundle.crt /etc/nginx/conf.d/ssl/certificate_bundle.crt + +### Setup nginx config + +Set the paths to the certificate and private key for your site + + bench set-ssl-certificate site1.local /etc/nginx/ssl/certificate_bundle.crt + bench set-ssl-key site1.local /etc/nginx/ssl/private.key + +### Generate nginx config + + bench setup nginx + +### Reload nginx + + service nginx reload + +or + + systemctl reload nginx # for CentOS 7 \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/deployment/email-notifications-for-failed-background-jobs.md b/frappe/docs/user/fr/guides/deployment/email-notifications-for-failed-background-jobs.md new file mode 100644 index 0000000000..3c582762ec --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/email-notifications-for-failed-background-jobs.md @@ -0,0 +1,23 @@ + + +

Frappe handles failure of jobs in the following way,

1) If a job fails, (raises exception), it's logged in Scheduler Log and  logs/worker.error.log.
2) Keeps a lock file and would not run anymore if lock file is there.
3) Raises LockTimeoutError in case the lock file is more than 10 minutes old.

+ +

You can configure email notification for scheduler errors. By writing a file, sites/common_site_config.json with content

+ +
{
+  "celery_error_emails": {
+    "ADMINS": [
+      [
+        "Person 1",
+        "person1@example.com"
+      ],
+      [
+        "Person2 ",
+        "person2@example.com"
+      ]
+    ],
+    "SERVER_EMAIL": "exceptions@example.com"
+  }
+}
+ +

One limitation is that it'll use local mailserver on port 25 to send the emails.

\ No newline at end of file diff --git a/frappe/docs/user/fr/guides/deployment/how-to-change-host-name-from-localhost.md b/frappe/docs/user/fr/guides/deployment/how-to-change-host-name-from-localhost.md new file mode 100644 index 0000000000..39d0008ec8 --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/how-to-change-host-name-from-localhost.md @@ -0,0 +1,18 @@ +While using a virtual machine, links within emails will be point to your host, e.g. localhost, like **http://localhost/set-password** etc. + +Frappe will automatically extract the host name from the incoming request, or from the `host_name` property from `site_config`. + +### bench set-config + +To fix this, you can use **bench set-config** to set your public IP or domain name as the host name. + +#### Example: + + bench --site mysite.com set-config host_name mysite.com + +--- + +Or edit the `frappe-bench/sites/mysite.com/site_config.json` and add a `host_name` property. + + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/deployment/how-to-enable-social-logins.md b/frappe/docs/user/fr/guides/deployment/how-to-enable-social-logins.md new file mode 100644 index 0000000000..847cf78ea3 --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/how-to-enable-social-logins.md @@ -0,0 +1,67 @@ +Use Facebook, Google or GitHub authentication to login to Frappe, and your users will be spared from remembering another password. + +The system uses the **Email ID** supplied by these services to **match with an existing user** in Frappe. If no such user is found, **a new user is created** of the default type **Website User**, if Signup is not disabled in Website Settings. Any System Manager can later change the user type from **Website User** to **System User**, so that the user can access the Desktop. + +
+ Login screen with Social Logins enabled +
Login screen with Social Logins enabled
+
+ +To enable these signups, you need to have **Client ID** and **Client Secret** from these authentication services for your Frappe site. The Client ID and Client Secret are to be set in Website > Setup > Social Login Keys. Here are the steps to obtain these credentials. + +> Use **https://{{ yoursite }}** if your site is HTTPS enabled. + +--- + +### Facebook + +1. Go to [https://developers.facebook.com](https://developers.facebook.com) +1. Click on Apps (topbar) > New App, fill in the form. +1. Go to Settings > Basic, set the **Contact Email** and save the changes. +1. Go to Settings > Advanced, find the field **Valid OAuth redirect URIs**, and enter: + **http://{{ yoursite }}/api/method/frappe.templates.pages.login.login\_via\_facebook** +1. Save the changes in Advance tab. +1. Go to Status & Review and switch on "Do you want to make this app and all its live features available to the general public?" +1. Go to Dashboard, click on the show button besides App Secret, and copy the App ID and App Secret into **Desktop > Website > Setup > Social Login Keys** + +
+ +
+ +--- + +### Google + +1. Go to [https://console.developers.google.com](https://console.developers.google.com) +1. Create a new Project and fill in the form. +1. Click on APIs & Auth > Credentials > Create new Client ID +1. Fill the form with: + - Web Application + - Authorized JavaScript origins as **http://{{ yoursite }}** + - Authorized redirect URI as + **http://{{ yoursite }}/api/method/frappe.templates.pages.login.login\_via\_google** +1. Go to the section **Client ID for web application** and copy the Client ID and Client Secret into **Desktop > Website > Setup > Social Login Keys** + +
+ +
+ +--- + +### GitHub + +1. Go to [https://github.com/settings/applications](https://github.com/settings/applications) +1. Click on **Register new application** +1. Fill the form with: + - Homepage URL as **http://{{ yoursite }}** + - Authorization callback URL as + **http://{{ yoursite }}/api/method/frappe.templates.pages.login.login\_via\_github** +1. Click on Register application. +1. Copy the generated Client ID and Client Secret into **Desktop > Website > Setup > Social Login Keys** + +
+ +
+ + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/deployment/how-to-migrate-doctype-changes-to-production.md b/frappe/docs/user/fr/guides/deployment/how-to-migrate-doctype-changes-to-production.md new file mode 100644 index 0000000000..35a15645ab --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/how-to-migrate-doctype-changes-to-production.md @@ -0,0 +1,13 @@ +#### 1. DocType / Schema Changes + +If you are in `developer_mode`, the `.json` files for each **DocType** are automatically updated. + +When you update in your production using `--latest` or `bench update`, these changes are updated in the site's schema too! + +#### 2. Permissions + +Permissions do not get updated because the user may have changed them. To update permissions, you can add a new patch in the `patches.txt` of your app. + + execute:frappe.permissions.reset_perms("[docype]") + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/deployment/index.md b/frappe/docs/user/fr/guides/deployment/index.md new file mode 100644 index 0000000000..9487bbf803 --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/index.md @@ -0,0 +1,5 @@ +# Deployment + +Deploying your apps on remote servers + +{index} diff --git a/frappe/docs/user/fr/guides/deployment/index.txt b/frappe/docs/user/fr/guides/deployment/index.txt new file mode 100644 index 0000000000..bf719dcf09 --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/index.txt @@ -0,0 +1,7 @@ +migrations +how-to-migrate-doctype-changes-to-production +how-to-change-host-name-from-localhost +configuring-https +checking-problems-in-bench +email-notifications-for-failed-background-jobs +how-to-enable-social-logins diff --git a/frappe/docs/user/fr/guides/deployment/migrations.md b/frappe/docs/user/fr/guides/deployment/migrations.md new file mode 100644 index 0000000000..c40a2a7c4b --- /dev/null +++ b/frappe/docs/user/fr/guides/deployment/migrations.md @@ -0,0 +1,69 @@ +# Migrations + +A project often undergoes changes related to database schema during course of +its life. It may also be required patch existing data. Frappe bundles tools to +handle these schenarios. + +When you pull updates from any Frappe app (including Frappe), you should run +`bench migrate` to apply schema changes and data migrations if any. + +## Schema changes + +You can edit a DocType to add, remove or change fields. On saving a DocType, +a JSON file containing the DocType data is added to source tree of your app. +When you add an app to a site, the DocTypes are installed using this JSON file. +For making schema changes, it's required to set `developer_mode` in the +configuration. + +On running a sync (`bench migrate`), doctypes in the system are synced to +their latest version from the JSON files in the app. + +Note: Fields are soft deleted ie. the columns are not removed from the database +table and however, they will not be visible in the documents. This is done to +avoid any potential data loss situations and to allow you write related data +migrations which might need values from deleted fields. + +Note: Frappe doesn't support reverse schema migrations. + +## Data Migrations + +On introducing data related changes, you might want to run one off scripts to +change existing data to match expectations as per new code. + +To add a data migration to your code, you will have to write an `execute` +function to a python module and add it to `patches.txt` of your app. + +It is recommended to make a file with a patch number and name in its path and +add it to a patches package (directory) in your app. You can then add a line +with dotted path to the patch module to `patches.txt`. + +The directory structure followed in Frappe is as below + + + frappe + └── patches + └── 4_0 + └── my_awesome_patch.py + +The patch can be added to `patches.txt` by adding a line like + + frappe.patches.4_0.my_awesome_patch + +The metadata ie. DocType available in the execute function will be the latest as +per JSON files in the apps. However, you will not be able to access metadata of +any previous states of the system. + +#### One off Python statements + +You can also add one off python statements in `patches.txt` using the syntax, + execute:{python statement} + +For example, + execute:frappe.get_doc("User", "Guest").save() + +Note: All lines in patches.txt have to be unique. If you want to run a line +twice, you can make it unique by adding a distinct comment. + +For Example, + + execute:frappe.installer.make_site_dirs() #2014-02-19 diff --git a/frappe/docs/user/fr/guides/index.md b/frappe/docs/user/fr/guides/index.md new file mode 100644 index 0000000000..9eeed8baa8 --- /dev/null +++ b/frappe/docs/user/fr/guides/index.md @@ -0,0 +1,7 @@ +# Guides + +The Frappe Framework is a server side and client side framework and is built with the philosophy make it a "battries included" framework. It has libraries and API for everything from authentication to reports. + +In this section we will try and cover the most commonly used API on client and server side that will be useful for app development. + +{index} diff --git a/frappe/docs/user/fr/guides/index.txt b/frappe/docs/user/fr/guides/index.txt new file mode 100644 index 0000000000..d47785065a --- /dev/null +++ b/frappe/docs/user/fr/guides/index.txt @@ -0,0 +1,7 @@ +basics +app-development +deployment +reports-and-printing +portal-development +data +integration diff --git a/frappe/docs/user/fr/guides/integration/index.md b/frappe/docs/user/fr/guides/integration/index.md new file mode 100644 index 0000000000..b97815866a --- /dev/null +++ b/frappe/docs/user/fr/guides/integration/index.md @@ -0,0 +1,3 @@ +# Integrations + +{index} diff --git a/frappe/docs/user/fr/guides/integration/index.txt b/frappe/docs/user/fr/guides/integration/index.txt new file mode 100644 index 0000000000..8f8d276e69 --- /dev/null +++ b/frappe/docs/user/fr/guides/integration/index.txt @@ -0,0 +1 @@ +rest_api diff --git a/frappe/docs/user/fr/guides/integration/rest_api.md b/frappe/docs/user/fr/guides/integration/rest_api.md new file mode 100644 index 0000000000..7f28f82b38 --- /dev/null +++ b/frappe/docs/user/fr/guides/integration/rest_api.md @@ -0,0 +1,283 @@ +# REST API + +Frappe ships with an HTTP API. There are two parts of this API. + +1. Remote Procedure Calls (RPC) +2. REST + +## 1. RPC + +A request to an endpoint `/api/method/{dotted.path.to.function}` will call +a whitelisted python function. A function can be whitelisted using the +`frappe.whitelist` decorator. + +For example, Add the following to sample\_app/\_\_init\_\_.py + + @frappe.whitelist(allow_guest=True) + def ping(): + return 'pong' + +GET http://frappe.local:8000**/api/method/sample_app.ping** + +_Response:_ + + { + "message": "pong" + } + + +## 2. REST + +All documents in Frappe are available via a RESTful API with prefix +`/api/resource/`. + +### Login + +To login, you will have to send a POST request to the login method. + +POST http://frappe.local:8000**/api/method/login** + + usr=Administrator&pwd=admin + +_Response:_ + + { + "full_name": "Administrator", + "message": "Logged In" + } + + +Try to make an authenticated request + +GET http://frappe.local:8000**/api/method/frappe.auth.get\_logged\_user** + +_Response:_ + + { + "message": "Administrator" + } + + +### Listing Documents + +To list documents, the URL endpoint is `/api/resource/{doctype}` and the +expected HTTP verb is GET. + +Response is returned as JSON Object and the listing is an array in with the key `data`. + +GET http://frappe.local:8000**/api/resource/Person** + +_Response:_ + + { + "data": [ + { + "name": "000000012" + }, + { + "name": "000000008" + } + ] + } + + +#### Fields + +By default, only name field is included in the listing, to add more fields, you +can pass the fields param to GET request. The param has to be a JSON array. + +GET http://frappe.local:8000**/api/resource/Person/?fields=["name", "first\_name"]** + +_Response:_ + + { + "data": [ + { + "first_name": "Jane", + "name": "000000012" + }, + { + "first_name": "John", + "name": "000000008" + } + ] + } + + +#### Filters + +You can filter the listing using sql conditions by passing them as the `filters` +GET param. Each condition is an array of the format, [{doctype}, {field}, +{operator}, {operand}]. + +Eg, to filter persons with name Jane, pass a param `filters=[["Person", "first_name", "=", "Jane"]]` + +GET http://frappe.local:8000**/api/resource/Person/** + +_Response:_ + { + "data": [ + { + "name": "000000012" + } + ] + } + + +#### Pagination + +All listings are returned paginated by 20 items. To change the page size, you +can pass `limit_page_length`. To request succesive pages, pass `limit_start` as +per your `limit_page_length`. + +For Example, to request second page, pass `limit_start` as 20. + +GET http://frappe.local:8000**/api/resource/DocType** + +_Response:_ + + { + "data": [ + { + "name": "testdoc" + }, + { + "name": "Person" + }, + + ...... + + { + "name": "Website Template" + } + ] + } + + +GET http://frappe.local:8000**/api/resource/DocType?limit_start=20** + +_Response:_ + + { + "data": [ + { + "name": "Website Route" + }, + { + "name": "Version" + }, + { + "name": "Blog Post" + }, + + ...... + + { + "name": "Custom Field" + } + ] + } + + +### CRUD + +#### Create + +You can create a document by sending a `POST` request to the url, `/api/resource/{doctype}`. + +POST http://frappe.local:8000**/api/resource/Person** + +_Body_: + + data={"first_name": "Robert"} + +_Response:_ + + { + "data": { + "first_name": "Robert", + "last_name": null, + "modified_by": "Administrator", + "name": "000000051", + "parent": null, + "creation": "2014-05-04 17:22:38.037685", + "modified": "2014-05-04 17:22:38.037685", + "doctype": "Person", + "idx": null, + "parenttype": null, + "owner": "Administrator", + "docstatus": 0, + "parentfield": null + } + } + +#### Read + +You can get a document by its name using the url, `/api/resource/{doctype}/{name}` + +For Example, + +GET http://frappe.local:8000**/api/resource/Person/000000012** + +_Response:_ + + { + "data": { + "first_name": "Jane", + "last_name": "Doe", + "modified_by": "Administrator", + "name": "000000012", + "parent": null, + "creation": "2014-04-25 17:56:51.105372", + "modified": "2014-04-25 17:56:51.105372", + "doctype": "Person", + "idx": null, + "parenttype": null, + "owner": "Administrator", + "docstatus": 0, + "parentfield": null + } + } + +### Update + +You can create a document by sending a `PUT` request to the url, +`/api/resource/{doctype}`. This acts like a `PATCH` HTTP request in which you do +not have to send the whole document but only the parts you want to change. + +For Example, + +PUT http://frappe.local:8000**/api/resource/Person/000000008** + +_Body:_ + + data={"last_name": "Watson"} + +_Response:_ + + { + "data": { + "first_name": "John ", + "last_name": "Watson", + "modified_by": "Administrator", + "name": "000000008", + "creation": "2014-04-25 17:26:22.728327", + "modified": "2014-05-04 18:21:45.385995", + "doctype": "Person", + "owner": "Administrator", + "docstatus": 0 + } + } + +### Delete + +You can delete a document by its name by sending a `DELETE` request to the url, +`/api/resource/{doctype}/{name}`. + +For Example, + +DELETE http://frappe.local:8000**/api/resource/Person/000000008** + +_Response:_ + + {"message":"ok"} diff --git a/frappe/docs/user/fr/guides/portal-development/.md b/frappe/docs/user/fr/guides/portal-development/.md new file mode 100644 index 0000000000..9136f09c29 --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/.md @@ -0,0 +1,5 @@ +# Pages + +You can make your website by adding pages to the `/www` folder of your website. The urls of your site will match the path of your pages within the `/www` folder. + +Pages must be `.html` or `.md` (Markdown) files. Basic HTML template is provided in frappe in `frappe/templates/base_template.html` diff --git a/frappe/docs/user/fr/guides/portal-development/adding-pages.md b/frappe/docs/user/fr/guides/portal-development/adding-pages.md new file mode 100644 index 0000000000..c8bdd53552 --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/adding-pages.md @@ -0,0 +1,39 @@ +# Adding Pages + +To add pages, just add `.html` or `.md` files in the `www` folder. The pages must only have the content, not the `` and `` tags. + +You can also write markdown pages + +### Index + +The first file in a folder must be called `index.md` or `index.html` + +Either file must be present for the system to make this a valid folder to build pages. + +### Markdown + + # This is a title + + This is some page content + a [link](/link/to/page) + +### Adding Links + +Links urls to pages can be given without the `.html` extension for example `/home/link` + +### Title + +The first `

` block if present will be the page title if not specified in a special tag. If no `

` or title is specified, the file name will be the title. + +### Adding CSS + +You can also add a `.css` file with the same filename (e.g. `index.css` for `index.md`) that will be rendered with the page. + +### Special Tags + +1. `` will make the page render in Jinja +2. `` will add a custom title +3. `` will not add breadcrumbs in the page +4. `` will enable caching (if you have used Jinja templating) + +{next} diff --git a/frappe/docs/user/fr/guides/portal-development/building.md b/frappe/docs/user/fr/guides/portal-development/building.md new file mode 100644 index 0000000000..1e7ca23c9a --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/building.md @@ -0,0 +1,15 @@ +# Building the site + +To make the pages to be served on the web, they must first be synced with the database. This is done by running: + + bench --site sitename sync-www + +To re-build the site + + bench --site sitename --force sync-www + +Clearing the website cache + + bench --site sitename clear-website-cache + +{next} diff --git a/frappe/docs/user/fr/guides/portal-development/contents.md b/frappe/docs/user/fr/guides/portal-development/contents.md new file mode 100644 index 0000000000..c2ebaf5551 --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/contents.md @@ -0,0 +1,17 @@ +# Table of Contents + +You can add a table of contents by adding `{index}` string on a new line. + +You can also make Previous and Next buttons by adding `previous` or `next` in `{}` + +### Showing contents + + # This is a title + + Hello paragraph + + ### Contents: + + {index} + +{next} diff --git a/frappe/docs/user/fr/guides/portal-development/context.md b/frappe/docs/user/fr/guides/portal-development/context.md new file mode 100644 index 0000000000..5c72a1835b --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/context.md @@ -0,0 +1,8 @@ +# Adding to context + +You can add more data for the pages by adding a `.py` file with the same filename (e.g. `index.py` for `index.md`) with a `get_context` method. + + def get_context(context): + context.data = frappe.db.sql("some query") + +{next} diff --git a/frappe/docs/user/fr/guides/portal-development/index.md b/frappe/docs/user/fr/guides/portal-development/index.md new file mode 100644 index 0000000000..348e7cf9e5 --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/index.md @@ -0,0 +1,7 @@ +# Making Portals + +You can make your website by adding pages to the `/www` folder of your website. The urls of your site will match the path of your pages within the `/www` folder. + +Pages must be `.html` or `.md` (Markdown) files. Basic HTML template is provided in frappe in `frappe/templates/base_template.html` + +{index} diff --git a/frappe/docs/user/fr/guides/portal-development/index.txt b/frappe/docs/user/fr/guides/portal-development/index.txt new file mode 100644 index 0000000000..3eeece6502 --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/index.txt @@ -0,0 +1,5 @@ +adding-pages +ordering +contents +context +building diff --git a/frappe/docs/user/fr/guides/portal-development/ordering.md b/frappe/docs/user/fr/guides/portal-development/ordering.md new file mode 100644 index 0000000000..76db949fbb --- /dev/null +++ b/frappe/docs/user/fr/guides/portal-development/ordering.md @@ -0,0 +1,13 @@ +# Ordering + +You can defining the ordering of pages in index by defining the index.txt file in your folder. The index.txt file must have the names (without extensions) of the pages in that folder indicating the order. + +For example for this folder the `index.txt` looks like: + + adding-pages + ordering + contents + context + building + +{next} diff --git a/frappe/docs/user/fr/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md b/frappe/docs/user/fr/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md new file mode 100644 index 0000000000..321028d7af --- /dev/null +++ b/frappe/docs/user/fr/guides/reports-and-printing/getting-information-from-another-document-in-print-format.md @@ -0,0 +1,7 @@ +In a print format, you can get data from another document. For example in if you have a fields called `sales_order` in Sales Invoice, then you can get the sales order details using `frappe.get_doc`: + +{% raw %} + {% set sales_order_doc = frappe.get_doc("Sales Order", sales_order) %} + + {{ sales_order_doc.customer }} +{% endraw %} diff --git a/frappe/docs/user/fr/guides/reports-and-printing/how-to-make-query-report.md b/frappe/docs/user/fr/guides/reports-and-printing/how-to-make-query-report.md new file mode 100644 index 0000000000..92ea7d4b2e --- /dev/null +++ b/frappe/docs/user/fr/guides/reports-and-printing/how-to-make-query-report.md @@ -0,0 +1,56 @@ +You can create tabulated reports using complex SQL queries by creating a new Report. These reports can be created by a System Manager and are stored in the Database + +> Note: You will need System Manager Permissions for this. + +To create a new Query Report: + +### 1. Create a new Report + +![Query Report](/assets/frappe_io/images/how-to/query-report.png) + +1. Set type as "Query Report" +1. Set the reference DocType - Users that have access to the reference DocType will have access to the report +1. Set the module - The report will appear in the "Custom Reports" section of the module. +1. Add your Query + +### 2. Set the Query + +You can define complex queries such as: + + + SELECT + `tabProduction Order`.name as "Production Order:Link/Production Order:200", + `tabProduction Order`.creation as "Date:Date:120", + `tabProduction Order`.production_item as "Item:Link/Item:150", + `tabProduction Order`.qty as "To Produce:Int:100", + `tabProduction Order`.produced_qty as "Produced:Int:100" + FROM + `tabProduction Order` + WHERE + `tabProduction Order`.docstatus=1 + AND ifnull(`tabProduction Order`.produced_qty,0) < `tabProduction Order`.qty + AND EXISTS (SELECT name from `tabStock Entry` where production_order =`tabProduction Order`.name) + +1. To format the columns, set labels for each column in the format: [Label]:[Field Type]/[Options]:[Width] + +### 3. Check the Report + +![Query Report](/assets/frappe_io/images/how-to/query-report-out.png) + +### 4. Advanced (adding filters) + +If you are making a standard report, you can add filters in your query report just like [script reports](https://frappe.io/kb/reports/how-to-make-script-reports) by adding a `.js` file in your query report folder. To include filters in your query, use `%(filter_key)s` where your filter value will be shown. + +For example + + SELECT ... FROM ... WHERE item_code = %(item_code)s ORDER BY ... + +--- + +### Note: Standard Script Report + +If you are developing a standard report for an app, make sure to set "Is Standard" as "Yes" + + + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/reports-and-printing/how-to-make-script-reports.md b/frappe/docs/user/fr/guides/reports-and-printing/how-to-make-script-reports.md new file mode 100644 index 0000000000..4f097b34d5 --- /dev/null +++ b/frappe/docs/user/fr/guides/reports-and-printing/how-to-make-script-reports.md @@ -0,0 +1,51 @@ +# Script Report + +You can create tabulated reports using server side scripts by creating a new Report. + +> Note: You will need Administrator Permissions for this. + +Since these reports give you unrestricted access via Python scripts, they can only be created by Administrators. The script part of the report becomes a part of the repository of the application. If you have not created an app, [read this](/developers/guide). + +> Note: You must be in [Developer Mode](/developers/how-to/enable-developer-mode) to do this + +### 1. Create a new Report + +![Query Report](/assets/frappe_io/images/how-to/script-report.png) + +1. Set Report Type as "Script Report" +1. Set "Is Standard" as "Yes" +1. Select the Module in which you want to add this report +1. In the module folder (for example if it is Accounts in ERPnext the folder will be `erpnext/accounts/report/[report-name]`) you will see that templates for the report files will be created. +1. In the `.js` file, you can set filters for the reports +1. In the `.py` file, you can write the script that will generate the report + +### 2. Add Filters + +You can add filters in the `.js`. See an example below: + + frappe.query_reports["Accounts Receivable"] = { + "filters": [ + { + "fieldname":"company", + "label": __("Company"), + "fieldtype": "Link", + "options": "Company", + "default": frappe.defaults.get_user_default("company") + }, + ] + } + +1. These properties are the same as you would set in a DocField in a DocType + +### 3. Add the Script + +In the `.py` file you can add the script for generating the report. + +1. In the `execute` method, two lists `columns` and `data` are returned +2. Columns must be a list of labels in the same format as query report. **[Label]:[Field Type]/[Options]:[Width]**. For example `Item:Link/Item:150` +3. You can use all server side modules to build your report. +4. For example see existing reports. ([Balance Sheet](https://github.com/frappe/erpnext/blob/develop/erpnext/accounts/report/balance_sheet/balance_sheet.py)) + +### 4. Commit and Push the app + +Don't forget to commit and push your app. diff --git a/frappe/docs/user/fr/guides/reports-and-printing/index.md b/frappe/docs/user/fr/guides/reports-and-printing/index.md new file mode 100644 index 0000000000..8c464f691c --- /dev/null +++ b/frappe/docs/user/fr/guides/reports-and-printing/index.md @@ -0,0 +1 @@ +# Reports and Printing diff --git a/frappe/docs/user/fr/guides/reports-and-printing/index.txt b/frappe/docs/user/fr/guides/reports-and-printing/index.txt new file mode 100644 index 0000000000..ec34e2b102 --- /dev/null +++ b/frappe/docs/user/fr/guides/reports-and-printing/index.txt @@ -0,0 +1,5 @@ +how-to-make-script-reports +how-to-make-query-report +getting-information-from-another-document-in-print-format +where-do-i-find-standard-print-formats +print-format-for-reports diff --git a/frappe/docs/user/fr/guides/reports-and-printing/print-format-for-reports.md b/frappe/docs/user/fr/guides/reports-and-printing/print-format-for-reports.md new file mode 100644 index 0000000000..dd582169c0 --- /dev/null +++ b/frappe/docs/user/fr/guides/reports-and-printing/print-format-for-reports.md @@ -0,0 +1,70 @@ +# Report Print Formats + +In version 4.1 we introduce Report Print Formats. These are HTML templates that you can use to format Query Report data for printing. + +### 1. Creating New Print Formats + +To create a new Print Format, just drop in a `.html` file in the folder of the query report. For example, for the [General Ledger](https://github.com/frappe/erpnext/tree/develop/erpnext/accounts/report/general_ledger) report in ERPNext, you can drop in a file called `general_ledger.html` along side the `.js` and `.py` files. + +##### Tree Of `erpnext/accounts/general_ledger` + + general_ledger/ + ├── __init__.py + ├── general_ledger.html + ├── general_ledger.js + ├── general_ledger.json + └── general_ledger.py + + +### 2. Templating + +For templating, we use an adapted version of [John Resig's microtemplating script](http://ejohn.org/blog/javascript-micro-templating/). If you know Javascript, it is very easy to follow this templating language. + +##### Here are some examples (from John Resig's Blog): + +Example: Properities: + +
"> +
+ +
+
+
+ <%=from_user%>: <%=text%>
+
+
+ +Example: Code structures, Loops + + <% for ( var i = 0; i < users.length; i++ ) { %> +
  • <%=users[i].name%>
  • + <% } %> + +> **Note**: It is important to note that you should not use single quotes (') in your template as the engine cannot handle them effectively. + +### 3. Data + +Data is available to the template as: + +- `data`: this is a list of records, with each record as an object with slugified properties from labels. For example "Posting Date" becomes "posting_date" +- `filters`: filters set in the report +- `report`: reportview object + +### 4. Example + +Here is how the General Ledger Report is built: + +[General Ledger Print Format Template](https://github.com/frappe/erpnext/blob/develop/erpnext/accounts/report/general_ledger/general_ledger.html) + +Here is what the report looks like: + +![General Ledger](/assets/frappe_io/images/how-to/general-ledger.png) + +##### Comments: + +1. [Bootstrap Stylesheet](http://getbootstrap.com) is pre-loaded. +1. You can use all global functions like `fmt_money` and dateutil. +1. Translatable strings should be written as `__("text")` +1. You can create modules and import using `{% include "templates/includes/formats/common_format" %}` + + \ No newline at end of file diff --git a/frappe/docs/user/fr/guides/reports-and-printing/where-do-i-find-standard-print-formats.md b/frappe/docs/user/fr/guides/reports-and-printing/where-do-i-find-standard-print-formats.md new file mode 100644 index 0000000000..00e351c615 --- /dev/null +++ b/frappe/docs/user/fr/guides/reports-and-printing/where-do-i-find-standard-print-formats.md @@ -0,0 +1,40 @@ +Standard Print formats are auto generated from the layout of the DocType. You can customize the standard format by +
    +
    + +

    1. Customizing Standard Print

    +Go to Setup > Customize > Customize Form View and you can: +
    +
      +
    1. Re-arranging fields by dragging and dropping
    2. +
    3. Add static elements by adding HTML type fields and adding your HTML in Options + +
    4. +
    5. Hiding fields by setting the Print Hide property
    6. +
    +
    + +

    2. Creating new layouts based on Print Formats

    + +

    As there are not templates that are generated for standard Print Formats, you will have to create new templates from scratch using the Jinja Templating Language via

    +

    Setup > Printing and Branding > Print Format + +

    +
      +
    1. See Print Format help. +
      +
    2. +
    3. You can use the Bootstrap CSS framework to layout your print formats +
      +
    4. +
    +
    +

    Tip: You can import Standard Template macros for building your print formats. + +

    +

    Example, adding the standard header: +
    +

    +
    {% raw %}{%- from "templates/print_formats/standard_macros.html" import add_header -%}
    +{{ add_header() }}{% endraw %}
    +
    diff --git a/frappe/docs/user/fr/index.md b/frappe/docs/user/fr/index.md new file mode 100644 index 0000000000..a25785e59e --- /dev/null +++ b/frappe/docs/user/fr/index.md @@ -0,0 +1,3 @@ +# Develop Apps with Frappe + +{index} diff --git a/frappe/docs/user/fr/index.txt b/frappe/docs/user/fr/index.txt new file mode 100644 index 0000000000..dfc33261aa --- /dev/null +++ b/frappe/docs/user/fr/index.txt @@ -0,0 +1,2 @@ +tutorial +guides diff --git a/frappe/docs/user/fr/tutorial/app.md b/frappe/docs/user/fr/tutorial/app.md new file mode 100644 index 0000000000..b52d71e97c --- /dev/null +++ b/frappe/docs/user/fr/tutorial/app.md @@ -0,0 +1,13 @@ +# Qu'est ce qu'une application ? + +Dans Frappe, une application est juste une application Python standard. Vous pouvez structurer une application Frappe de +la même facon que vous structurez une application Python standard. Pour le déploiement, Frappe utilise Setuptools donc +vous pouvez facilement déployer votre application sur n'importe quelle machine. + +Frappe fournit une interface WSGI et pendant vos développements vous pouvez utiliser le serveur Werkzeug embarqué. Pour le +déploiemenent en production, nous recommandons d'utiliser nginx et gunicorn. + +Frappe, c'est aussune une architecture multi-tenant ce qui signifie que vous pouvez lancer plusieurs sites sur une meme +configuration, chaque site utilisant ses propres applications et utilisateurs. La base de données de chaque site est indépendante. + +{suite} diff --git a/frappe/docs/user/fr/tutorial/before.md b/frappe/docs/user/fr/tutorial/before.md new file mode 100644 index 0000000000..775c395c38 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/before.md @@ -0,0 +1,52 @@ +# Avant de commencer + +

    Liste des outils, technologies utiles dans le développement d'applications avec Frappe.

    + +Il y a un grand nombres de tutoriels en ligne et nous recommandons [CodeAcademy](http://www.codecademy.com/) ou vous +trouverez beaucoup de ressources de qualité. +--- + +#### 1. Python + +La partie serveur de Frappe est codée en Python et c'est une bonne idée d'[apprendre rapidement Python](http://www.codecademy.com/tracks/python) +avant de commencer à comprendre Frappe. [Le tutoriel sur docs.python.org](https://docs.python.org/2.7/tutorial/index.html) +est aussi une excellente ressource pour apprendre Python. Notez que Frappe utilise Python 2.7. + +Pour produire une application de qualité, vous devez inclure des tests automatiques. Vous pouvez comprendre les bases +du développement par les tests [ici](http://code.tutsplus.com/tutorials/beginning-test-driven-development-in-python--net-30137). + +--- + +#### 2. MariaDB / MySQL + +Vous devez comprendre les notions essentielles des bases de données, comment installer, se connecter, créer de nouvelles bases, +et comment faire des requêtes. Voici [une rapide introduction à MySQL](https://www.digitalocean.com/community/tutorials/a-basic-mysql-tutorial) ou dirigez vous vers [le site MariaDB pour des informations plus détaillées](https://mariadb.com/kb/en/mariadb/documentation/getting-started/) + +--- + +#### 3. HTML / CSS + +Pour construire des interfaces utilisateur, vous devez [apprendre les bases HTML / CSS](http://www.codecademy.com/tracks/web) et [connaître le framework CSS Boostrap](http://getbootstrap.com) + +--- + +#### 4. Construire des interfaces avec Javascript et JQuery + +Pour customiser les formulaires et créer des interfaces riches, le mieux est [d'apprendre Javascript](http://www.codecademy.com/tracks/javascript) et la [fameuse librairie JQuery](http://www.codecademy.com/tracks/jquery). + +--- + +#### 5. Modifier les affichages et les pages web avec le sysème de template Jinja + +Si vous voulez modifier les affichages, vous devez apprendre le [language de template Jinja](http://jinja.pocoo.org/). C'est un moyen rapide de construire des pages web dynamiques. + +--- + +#### 6. Git et GitHub + +[Apprenz à contrinuer à un projet open source en utilisant Git et GitHub](https://guides.github.com/activities/contributing-to-open-source/), deux outils fantastiques pour vous aider à gérer et partager votre code. + +--- + +Quand vous êtes prêts, [essayez de développer une simple applicationa avec Frappe]({{ docs_base_url }}/user/fr/tutorial/app) + diff --git a/frappe/docs/user/fr/tutorial/bench.md b/frappe/docs/user/fr/tutorial/bench.md new file mode 100644 index 0000000000..65a82f29a2 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/bench.md @@ -0,0 +1,13 @@ +# Installer le bench de Frappe + +La facon la plus rapide d'installer Frappe sur un système Unix est d'utiliser frappe-bench. Lisez les instructions détaillées sur +comment installer et utiliser Frappe Bench. + +> [https://github.com/frappe/bench](https://github.com/frappe/bench) + +Avec Frappe Bench vous pourrez configurer et héberger de multiples applications et sites. Frappe Bench configure aussi un Virtualenv +Python donc vos applications seront isolées les unes des autres (et vous n'aurez pas de conflits avce d'autres environnements de developpement). + +La commande `bench` sera installé et vous aidera aidera dans le développement et la gestion des vos applications. + +{suite} diff --git a/frappe/docs/user/fr/tutorial/conclusion.md b/frappe/docs/user/fr/tutorial/conclusion.md new file mode 100644 index 0000000000..44590555f1 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/conclusion.md @@ -0,0 +1,10 @@ +# Conclusion + + +Nous espérons vous avoir donné un apercu de comment les applications sont développées avec Frappe. L'ojectif était de vous +montrer brievement, les différents aspects du développement d'une application en vous donnant un apércu général. Pour aller plus +loin dans les explications, consultez l'API. + +Pour obtenir de l'aider, rejoingnez la communauté sur le[chat sur Gitter](https://gitter.im/frappe/erpnext) ou sur le +[forum des développeurs](https://discuss.erpnext.com) + diff --git a/frappe/docs/user/fr/tutorial/controllers.md b/frappe/docs/user/fr/tutorial/controllers.md new file mode 100644 index 0000000000..963feec9e9 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/controllers.md @@ -0,0 +1,61 @@ +# Les controleurs + +La prochaine étape est d'ajouter quelques méthodes et évéements à nos modèles. Dans l'application, nous devons nous +assurer que si une opération est faite, l'article concerné doit être disponible en stock et que le membre qui souhaite +faire le prêt à un abonnement valide. + +Pour cela, nous pouvons écrire une règle de validation au moment de la sauvegarde du prêt. Ouvrez le template `library_management/doctype/library_transaction/library_transaction.py`. + +Ce fichier est le controleur qui gère les opérations de la librairie, vous pouvez y écrire des méthodes pour: + +1. `before_insert` +1. `validate` (avant l'insertion ou la mise à jour) +1. `on_update` (après la sauvegarde) +1. `on_submit` (quand le document est soumis) +1. `on_cancel` +1. `on_trash` (avant qu'il ne soit sur le point d'être supprimé) + +Vous pouvez écrire des méthodes pour ces événement et elles seront appelées par le framework au bon moment. + +Voici pour finir le controleur: + + from __future__ import unicode_literals + import frappe + from frappe import _ + from frappe.model.document import Document + + class LibraryTransaction(Document): + def validate(self): + last_transaction = frappe.get_list("Library Transaction", + fields=["transaction_type", "transaction_date"], + filters = { + "article": self.article, + "transaction_date": ("<=", self.transaction_date), + "name": ("!=", self.name) + }) + if self.transaction_type=="Issue": + msg = _("Article {0} {1} has not been recorded as returned since {2}") + if last_transaction and last_transaction[0].transaction_type=="Issue": + frappe.throw(msg.format(self.article, self.article_name, + last_transaction[0].transaction_date)) + else: + if not last_transaction or last_transaction[0].transaction_type!="Issue": + frappe.throw(_("Cannot return article not issued")) + +Dans ce scrit: + +1. Nous récuperons la dernière opération, avant la date de l'opération en cours en utilisant la méthode `frappe.get_list` +1. Si la dernière opération est quelque chose qui n'est pas attendu, alors nous levons une exception en utilisant `frappe.throw` +1. Nous utilisons la méthode `_("text")` pour identifier une chaine traduisible. + +Verifiez vos validations en créant de nouveux enregistrements. + +Transaction + +#### Debogage + +Pour debugger, gardez toujours votre console JS ouverte, vérifier les erreurs à la fois de Javascript mais aussi du serveur. + +Regardez aussi votre fenêtre de terminal pour les esceptions. Chaque **erreur 500 pour des problèmes internes** seront affichées dans le terminal du serveur en cours d'utilisation. + +{suite} diff --git a/frappe/docs/user/fr/tutorial/doctype-directory-structure.md b/frappe/docs/user/fr/tutorial/doctype-directory-structure.md new file mode 100644 index 0000000000..2fbfcb4c30 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/doctype-directory-structure.md @@ -0,0 +1,32 @@ +# Structure du repertoire d'un DocType + +Après avoir sauvegardé vos DocTypes, vérifiez que les modèles dans les fichiers `.json` et `.py` soient créés dans le module +`apps/library_management/library_management`. La structure du repertoire devrait ressembler à: + + . + ├── MANIFEST.in + ├── README.md + ├── library_management + .. + │   ├── library_management + │   │   ├── __init__.py + │   │   └── doctype + │   │   ├── __init__.py + │   │   ├── article + │   │   │   ├── __init__.py + │   │   │   ├── article.json + │   │   │   └── article.py + │   │   ├── library_member + │   │   │   ├── __init__.py + │   │   │   ├── library_member.json + │   │   │   └── library_member.py + │   │   ├── library_membership + │   │   │   ├── __init__.py + │   │   │   ├── library_membership.json + │   │   │   └── library_membership.py + │   │   └── library_transaction + │   │   ├── __init__.py + │   │   ├── library_transaction.json + │   │   └── library_transaction.py + +{suite} diff --git a/frappe/docs/user/fr/tutorial/doctypes.md b/frappe/docs/user/fr/tutorial/doctypes.md new file mode 100644 index 0000000000..199fa92f7c --- /dev/null +++ b/frappe/docs/user/fr/tutorial/doctypes.md @@ -0,0 +1,105 @@ +# DocType + +Après avoir créé les ^oles, créons des **DocTypes** + +Pour créer un nouveau **DocType**, rendez-vous sur: + +> Developer > Documents > Doctype > New + +New Doctype + +Dans un premier temps, saisissez le module, dans notre cas, **Library Managment** + +#### Ajouter des champs + +Dans le tableau des champs, vous pouvez ajouter des champs (propriétés) du **DocType** (Article). + +Les champs sont bien plus que des colonnes d'une base de données, ils peuvent être: + +1. Des colonnes d'une base de données +1. Des aides pour la mise en page (section / saut de lignes) +1. Des tableaux enfants (Champs de type tableau) +1. HTML +1. Des actions (button) +1. Des pièces jointes ou des images + +Ajoutons des champs pour l'article. + +Adding Fields + +Quand vous ajoutez des champs, vous devez entrer le **Type**. Le **Label** est optionnel pour les retours de sections et de colonnes. +Le **Name** (`fieldname`) ets le nom de la colonne dans la base de données et aussi la propriété du controleur. Les définitions +doivent être *code friendly*, (par exemple insérer des underscores (_) à la place de espaces. Si vous laissez le champs `fieldname` +vide, il sera automatiquement complété à la sauvegarde. + +Vous pouvez aussi définir d'autres propriétés comme par exemple prciser que le champs est requis ou en lecture seule etc. + +Nous pouvons ajouter les champs suivants: + +1. Article Name (Data) +2. Author (Data) +3. Description +4. ISBN +5. Status (Select): Pour les champs de type select, vous devez compléter les options. entrer **Issued** et **Available** +sur chacune des lignes comme ci-dessous +6. Publisher (Data) +7. Language (Data) +8. Image (Attach Image) + + +#### Ajouter des permissins + +Après avoir ajouté les champs, validez et ajoutez un nouveau rôle dans la section des règles de permissions. Pour le moment +ajoutons les droits le lecture, ecriture, création et suppression au modèle **Librarian**. Frappe à une gestion fine des +permissions sur les modèles. Vous pouvez aussi changer les permissions plus tard en utilisant le gestionnaire de permissions +dans la configuration. + +Adding Permissions + +#### Sauvegarde + +Cliquez sur le bouton **Save**. Quand le bouton est cliqué, une popup vous demandera le nom. Donnez le nom **Article** et +sauvegardez le **DocType**. + +Maintenant, connectez vous à MySQL et vérifiez la base de données créée: + + $ bench mysql + Welcome to the MariaDB monitor. Commands end with ; or \g. + Your MariaDB connection id is 3931 + Server version: 5.5.36-MariaDB-log Homebrew + + Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others. + + Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + + MariaDB [library]> DESC tabArticle; + +--------------+--------------+------+-----+---------+-------+ + | Field | Type | Null | Key | Default | Extra | + +--------------+--------------+------+-----+---------+-------+ + | name | varchar(255) | NO | PRI | NULL | | + | creation | datetime(6) | YES | | NULL | | + | modified | datetime(6) | YES | | NULL | | + | modified_by | varchar(40) | YES | | NULL | | + | owner | varchar(60) | YES | | NULL | | + | docstatus | int(1) | YES | | 0 | | + | parent | varchar(255) | YES | MUL | NULL | | + | parentfield | varchar(255) | YES | | NULL | | + | parenttype | varchar(255) | YES | | NULL | | + | idx | int(8) | YES | | NULL | | + | article_name | varchar(255) | YES | | NULL | | + | status | varchar(255) | YES | | NULL | | + | description | text | YES | | NULL | | + | image | varchar(255) | YES | | NULL | | + | publisher | varchar(255) | YES | | NULL | | + | isbn | varchar(255) | YES | | NULL | | + | language | varchar(255) | YES | | NULL | | + | author | varchar(255) | YES | | NULL | | + +--------------+--------------+------+-----+---------+-------+ + 18 rows in set (0.00 sec) + + +Comme vous pouvez le voir, en plus de nos **DocFields**, d'autres colonnes ont été ajoutées dans notre table. Notez les +changement, la clé primaire sur, `name`, `owner`(l'utilisateur quia créer l'enregistrement), `creation` et `modified` (des timestamps pour enregistrer les dates de creation et de modification). + +{suite} + diff --git a/frappe/docs/user/fr/tutorial/form-client-scripting.md b/frappe/docs/user/fr/tutorial/form-client-scripting.md new file mode 100644 index 0000000000..28786d1e39 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/form-client-scripting.md @@ -0,0 +1,46 @@ +## Codes des formulaires + +Jusqu'a maintenant, nous avons développé un système basique qui fonctionne parfaitement sans avoir eu besoin d'écrire une + seule ligne de code. Ajoutons donc quelques scripts pour rendre l'applications plus professionnelle et ajoutons des validations + pour éviter que les utilisateurs n'enregistrent des données invalides. + + +### Les scripts coté client + +Dans le **DocType** **Library Transaction**, nous n'avons qu'un seul champ `Member Name`. Nous n'avons pas fait 2 champs. +Ca pourrait être bien d'avoir deux champs, mais juste pour l'exemple, considérons que nous avons à implémenter cela. Pour ce +faire, nous allons devoir écrire un gestionnaire d'évenements pour lorsque l'utilisateur sélectionne le champs `library_member` et accède aux données de l'utilisateur depuis le serveur en utilisant une API REST, remplisse les données dans le formaulaire. + +Pour commencer ce script, dans le repertoire `library_management/doctype/library_transaction`, créez un nouveau fichier +`library_transaction.js`. Ce fichier sera automatiquement executé lorsque le modèle `Library Transaction` est appelé par l'utilisateur. +Donc, dans ce fichier nous pouvons lier des actions à des événemenents mais aussi écrire d'autres fonctiones. + +#### library_transaction.js + + frappe.ui.form.on("Library Transaction", "library_member", + function(frm) { + frappe.call({ + "method": "frappe.client.get", + args: { + doctype: "Library Member", + name: frm.doc.library_member + }, + callback: function (data) { + frappe.model.set_value(frm.doctype, + frm.docname, "member_name", + data.message.first_name + + (data.message.last_name ? + (" " + data.message.last_name) : "")) + } + }) + }); + +1. **frappe.ui.form.on(*doctype*, *fieldname*, *handler*)** est utilisé pour lier un évenement au gestionnaire d'évenements + quand la propriété `library_member` est complétée. +1. Dans le gestionnaire, nous déclenchons un appel AJAX vers `frappe.client.get`. En réponse, nous avons l'ojet demandé sous forme d'une JSON. [En savoir plus sur l'API](/frappe/user/fr/guides/integration/rest_api). +1. En utilisant **frappe.model.set_value(*doctype*, *name*, *fieldname*, *value*)** nous définissons la valeur dans le formulaire. + +**Note:** Pour vérifier que votre script fonctionne, n'oubliez pas de recharger votre page avant de tester. +Les changements dans les scripts côté client ne sont pas automatiquement pris en compte quand vous êtes en mode développeur. + +{suite} diff --git a/frappe/docs/user/fr/tutorial/index.md b/frappe/docs/user/fr/tutorial/index.md new file mode 100644 index 0000000000..a0bd012fb0 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/index.md @@ -0,0 +1,41 @@ +# Tutoriel Frappe + +Dans ce guide nous allons vous montrer comment créer une application de A à Z en utilisant **Frappe**. Avec un +exemple de gestion d'une librairie, nous allons aborder les sujets suivants: + +1. Installation +1. Créer une nouvelle application +1. Créer des modèles +1. Créer des utilisateurs et des enregristrements +1. Créer des contrôleurs +1. Créer des vues web +1. Configurer des Hooks et des tâches + +## A qui s'adresse ce tutoriel ? + +Ce guide est à destination des développeurs familiers avec la création d'applications web. Le framework Frappe est développé +avec Python, utilise le système de base de données MariaDB et database and HTML/CSS/Javascript pour le rendu des pages. +Il est donc necessaire d'être familier avec ces technologies. Si vous n'avez jamais utilisé Python auparavant, vous devriez +suivre un tutoriel rapide avant de suivre ce guide. + +Frappe utilise le système de gestion de version git sur Github. Il est donc imporant que vous connaissiez les basiques de +l'utilisation de git et que vous ayez un compte sur Github pour gérer vos applications. + +## Exemple + +Dans ce guide, nous allons développer une simple application de **gestion de librairie**. Dans cette applications nous aurons +les modèles suivants: + +1. Article (un livre ou tout autre produit qui peut être emprunté) +1. Library Member (membre de la librairie) +1. Library Transaction (prêt ou retour d'un article) +1. Library Membership (Periode pendant laquelle un membre peut emprunter) +1. Library Management Setting (configuration générale) + +L'interace utilisateur (UI) pour le libraire sera **Frappe Desk**, un système de rendu d'interface où les formulaires sont +automatiquement générés depuis les modèles en appliquant rôles et permissions. + +Nous allons aussi créer des vues pour la lirairie afin que les utilisateurs puissent parcourir les articles depuis un site +internet. + +{index} diff --git a/frappe/docs/user/fr/tutorial/index.txt b/frappe/docs/user/fr/tutorial/index.txt new file mode 100644 index 0000000000..1fed6aed93 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/index.txt @@ -0,0 +1,19 @@ +before +app +bench +new-app +setting-up-the-site +start +models +roles +doctypes +naming-and-linking +doctype-directory-structure +users-and-records +form-client-scripting +controllers +reports +web-views +single-doctypes +task-runner +conclusion diff --git a/frappe/docs/user/fr/tutorial/models.md b/frappe/docs/user/fr/tutorial/models.md new file mode 100644 index 0000000000..7f49a254a1 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/models.md @@ -0,0 +1,26 @@ +# Définir des modèles + +La prochaine étape est de définir les modèles que nous avons présenté en introduction. Dans Frappe, les modèles sont appelés +des **DocTypes**. Vous pouvez définir de nouveaux **DocTypes** depuis l'interface. Les **DocTypes** sont faits de **DocField** +et de permissions appelées **DocPerms**. + +Quand un DocType est sauvegardé, une nouvelle table est créee dans la base de données. Cette table est nommée `tab[doctype]`. + +Quand vous créez un **DocType**, un nouveau repertoire est créé dans le **Module**, un fichier JSON définissant le modèles +ainsin qu'un template de controleur sont automatiquement créés. +Qaund vous mettez à jour un **DocType**, le modèle JSON est mis à jour et lorsque la commande `bench migrate` est exécutée, +c'est synchronisé avec la base de données. Cela facilite a mise à jour et la migrations des schemas. + +### Le mode développeur + +Pour créer des modèles, vous devez définir la valeur de `developer_mode` à 1 dans le fichier `site_config.json` situé dans +le repertoire /sites/library et executer la commande `bench clear-cache` ou utiliser l'interface et cliquer sur "Recharger" +pour appliquer les changements. Vous devriez maintenant voir l'application "Developer" sur le bureau. + + { + "db_name": "bcad64afbf", + "db_password": "v3qHDeVKvWVi7s97", + "developer_mode": 1 + } + +{suite} diff --git a/frappe/docs/user/fr/tutorial/naming-and-linking.md b/frappe/docs/user/fr/tutorial/naming-and-linking.md new file mode 100644 index 0000000000..cf4be0af57 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/naming-and-linking.md @@ -0,0 +1,79 @@ +# Nommage et relation entre DocType + +Définissons un nouveau **DocType**: + +1. Library Member (First Name, Last Name, Email ID, Phone, Address) + +Doctype Saved + + +#### Le nommage des DocTypes + +Les **DocTypes** peuvent être nommés de différentes facons: + +1. Sur la base d'un champ +1. Sur la base d'une série +1. Par le controlleur (code) +1. Par la console + +Cela peut être configuré par le champs **Autoname**. Pour le controlerur, laissez vide. + +> **Search Fields**: Un **DocType** peut être nommé sur la base d'une serie mais nous devons toujours pouvoir le chercher par un nom. +Dans notre cas, l'arcicle peut etre cherché par un titre ou par l'auteur. Remplissons donc le champs **Search Fields**. + +Autonaming and Search Field + +#### Relation et champs select + +Les clés étrangères sont, dans Frappe, traduits par un champs de type **Link**. Le **DocType** ciblé doit être mentionné + dans le champs **Options**. + +Dans notre exemple, pour le **doctype** `Library Transaction`, nous avons un lien vers `Library Member` et vers `Article`. + +**Note:** Souvenez vous que les champs **Link** ne sont pas automatiquement enregistré comme clé étrangère afin d'éviter +d'indexer la colonne. Cela pourrait ne pas être optimum, c'est pour cela que la validation de la clé étrangère est faite +par le framework. + +Link Field + +Pour les champs **select**, comme mentionné plus tôt, ajoutez chacune des options dans le champs **Options**, chaque +option sur une nouvelle ligne. + +Select Field + +faites de même pour les autres modèles. + +#### Valeurs liées + +Un modèle standard c'est lorsque vous selectionnez un ID, admettons **Library Member** dans **Library Membership**, alors, +les noms et prénoms du membre doivent être copiés dans le champs adequat lors d'enregistrements dans `Library Membership Transaction`. + +Pour cela, nous pouvons utiliser des champs en lecture seules et, dans les options, nous pouvons définir le nom du lien +et le nom du champs de la propriété que nous voulons parcourir. Dans cet exemple, dans **Member First Name** nous pouvons +définir `library_member.first_name` + +Fetch values + +### Completeter les Modeles + +De la même facon, vous pouvez compléter les autres modèles pour qu'au final le résultat soit: + +#### Article + +Article + +#### Library Member + +Library Member + +#### Library Membership + +Library Membership + +#### Library Transaction + +Library Transaction + +> Vérifiez que le modèles **Librarian** ait les permissions sur chaque **DocType**. + +{suite} diff --git a/frappe/docs/user/fr/tutorial/new-app.md b/frappe/docs/user/fr/tutorial/new-app.md new file mode 100644 index 0000000000..d3ae222f46 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/new-app.md @@ -0,0 +1,56 @@ +# Créer une nouvelle application + +Une fois que Bench est installé, vous apercevrez deux répertoires, `apps` and `sites`. Toutes les applications seront +installées dans `apps`. + +Pour créer une nouvelle application, allez dans votre répertoire et lancer la commande, `bench new-app {app_name}` et +remplissez les informations à propos de votre application. Cela va créer un template d'application pour vous. + + $ bench new-app library_management + App Title (defaut: Lib Mgt): Library Management + App Description: App for managing Articles, Members, Memberships and Transactions for Libraries + App Publisher: Frappe + App Email: info@frappe.io + App Icon (default 'octicon octicon-file-directory'): octicon octicon-book + App Color (default 'grey'): #589494 + App License (default 'MIT'): GNU General Public License + +### Structure d'une application + +L'application sera créée dans un répertoire appelé `library_management` et aura la structure suivante: + + . + ├── MANIFEST.in + ├── README.md + ├── library_management + │   ├── __init__.py + │   ├── config + │   │   ├── __init__.py + │   │   └── desktop.py + │   ├── hooks.py + │   ├── library_management + │   │   └── __init__.py + │   ├── modules.txt + │   ├── patches.txt + │   └── templates + │   ├── __init__.py + │   ├── generators + │   │   └── __init__.py + │   ├── pages + │   │   └── __init__.py + │   └── statics + ├── license.txt + ├── requirements.txt + └── setup.py + +1. `config` configuration de l'applicationfolder contains application configuration info +1. `desktop.py` est l'endroit ou les icones peuvent être ajoutées au bureau +1. `hooks.py` contient les définitions de la facon dont l'intégration avec l'environnement et les autres applications est faite. +1. `library_management` (interne) est un **module** bootstrappé. Dans Frappe, un **module** est l'endroit ou sont les controlleurs et les modeles. +1. `modules.txt` contient la liste des **modules** dans l'application. Quand vous créez un nouveau module, c'est obligatoire de l'ajouter dans ce fichier. +1. `patches.txt` contient les patchs de migration. Ce sont des références Python utilisant la notation par point. +1. `templates` est le repertoire qui contient les templates des vues. Les templates pour **Login** et autres pages par défaut sont déjà contenus dans Frappe. +1. `generators` est l'endroit ou sont stockés les templates des modèles. Chaque instance du modèle a une route web comme par exemple les **articles de blog** ou chaque article a une adresse unique. Dans Frappe, Jinj2 est utilisé pour les templates. +1. `pages` contient les routes uniques pour les templates. Par exemple "/blog" ou "/article" + +{suite} diff --git a/frappe/docs/user/fr/tutorial/reports.md b/frappe/docs/user/fr/tutorial/reports.md new file mode 100644 index 0000000000..ee93a0eb14 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/reports.md @@ -0,0 +1,7 @@ +# Rapports + +Vous pouvez aussi cliquer sur le texte "Rapports" dans la barre latérale de gauche pour voir vos données dans un tableau. + +Report + +{suite} diff --git a/frappe/docs/user/fr/tutorial/roles.md b/frappe/docs/user/fr/tutorial/roles.md new file mode 100644 index 0000000000..8ea3498166 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/roles.md @@ -0,0 +1,15 @@ +# Créer des rôles + +Avant de créer des modèles, nous devons auparavant créer des rôles qui auront des permissions sur le modèles. Nous allons +créer deux rôles: + +1. Librarian pour définir le libraire +1. Library Member pour définir un membre + +Pour créer un nouveau rôle, se rendre sur: + +> Setup > Users > Role > New + +Adding Roles + +{suite} diff --git a/frappe/docs/user/fr/tutorial/setting-up-the-site.md b/frappe/docs/user/fr/tutorial/setting-up-the-site.md new file mode 100644 index 0000000000..9c595e2974 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/setting-up-the-site.md @@ -0,0 +1,56 @@ +# Configurer le site + +Créons un site et appelons le `library`. + +Vous pouvez installer un nouveau site avec la commande `bench new-site library` + +Cette commande va créer une nouvelle base de données, un repertoire et installer `frappe` (qui est aussi une application!) +dans le nouveau site. L'application `frappe` a deux modules par défaut, **Core** et **Website**. Le module **Core** +contient les modèles basiques pour l'application. En effet, Frappe contient des modèles par défaut qui sont appelés **DocTypes** +mais nous en reparlerons plus tard. + + $ bench new-site library + MySQL root password: + Installing frappe... + Updating frappe : [========================================] + Updating country info : [========================================] + Set Administrator password: + Re-enter Administrator password: + Installing fixtures... + *** Scheduler is disabled *** + +### Structure du site + +Un nouveau repertoires appelé `library` sera créé dans le repertoire `sites`. Voici la structure standard pour un site. + + . + ├── locks + ├── private + │   └── backups + ├── public + │   └── files + └── site_config.json + +1. `public/files` contient les fichiers uploadés. +1. `private/backups` contient les backups. +1. `site_config.json` contient la configuration du site. + +### COnfiguration par défaut + +Dans le cas ou vous avez plusieurs sites, utilisez la commande `bench use [site_name]` pour définir le site par défaut. + +Exemple: + + $ bench use library + +### Installer une application + +Maintenant installons notre application `library_management` dans notre site `library` + +1. Installer library_management avec la commande: `bench --site [site_name] install-app [app_name]` + +Exemple: + + $ bench --site library install-app library_management + +{suite} diff --git a/frappe/docs/user/fr/tutorial/single-doctypes.md b/frappe/docs/user/fr/tutorial/single-doctypes.md new file mode 100644 index 0000000000..e3b10a0523 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/single-doctypes.md @@ -0,0 +1,12 @@ +# Les DocTypes de type Single + +Une application aura en générale une seule page de configuration. Dans notre application nous pouvons donc définir une page +ou nous définierons la période prêt. Nous avons aussi besoin de sauvegarder cette propriété. Dans Frappe, ceci est possible +en utilisant un un Doctype de type **Single**. Un DocType **Single** est comme le pattern Singleton, une instance unique +d'une classe. Appelons le **Library Managment Settings**. + +Pour créer un DocType de type **Single** cochez la case **Is Single**. + +Single Doctypes + +{suite} diff --git a/frappe/docs/user/fr/tutorial/start.md b/frappe/docs/user/fr/tutorial/start.md new file mode 100644 index 0000000000..bc71edd27e --- /dev/null +++ b/frappe/docs/user/fr/tutorial/start.md @@ -0,0 +1,32 @@ +# Demarrer avec Bench + +Maintenant, nous pouvons nous connecter et vérifier que tout fonctionne normalement. + +Pour démarrer le serveur de développement, lancez la commande `bench start` + + $ bench start + 13:58:51 web.1 | started with pid 22135 + 13:58:51 worker.1 | started with pid 22136 + 13:58:51 workerbeat.1 | started with pid 22137 + 13:58:52 web.1 | * Running on http://0.0.0.0:8000/ + 13:58:52 web.1 | * Restarting with reloader + 13:58:52 workerbeat.1 | [2014-09-17 13:58:52,343: INFO/MainProcess] beat: Starting... + +Vous pouvez maintenant ouvrir votre navigateur et vous rendre sur `http://localhost:8000`. Si tout se passe bien vous devriez voir: + +Login Screen + +Maintenant, connectez vous avec les identifiants suivants: + +Login ID: **Administrator** + +Mot de passe: **Le mot de passe que vous avez définis pendant l'installation** + +Une fois connecté, vous devriez voir le `Desk`, c'est à dire la page d'accueil + +Desk + +Comme vous pouvez le voir, Frappe fournit quelques applications comme un To Do, un gestionnaire de fichiers etc. Ces applications +peuvent être intégrées par la suite. + +{suite} diff --git a/frappe/docs/user/fr/tutorial/task-runner.md b/frappe/docs/user/fr/tutorial/task-runner.md new file mode 100644 index 0000000000..9bc2d4aa42 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/task-runner.md @@ -0,0 +1,82 @@ +# Les tâches planifiées + +Finalement, une application a aussi à envoyer des emails de notifications ou d'autres taches planifiées. Dans Frappe, si + vous avez configuré le **bench**, la tâche / planificateur est configuré via Celery en utilisant les queues Redis. + +Pour ajouter un nouveau gestionnaire de tâches, ouvrez le fichier `hooks.py` et ajoutez un nouveau gestionnaire. Les gestionnaire + par defaut sont `all`, `daily`, `weekly`, `monthly`. Le gestionanire `all` est appelé toutes les 3 minutes par defaut. + + # Scheduled Tasks + # --------------- + + scheduler_events = { + "daily": [ + "library_management.tasks.daily" + ], + } + +Ici, nous pointons sur une fonction en Python et cette fonction sera appelée tous les jours. Voyons à quoi cette fonction +ressemble: + + # Copyright (c) 2013, Frappe + # For license information, please see license.txt + + from __future__ import unicode_literals + import frappe + from frappe.utils import datediff, nowdate, format_date, add_days + + def daily(): + loan_period = frappe.db.get_value("Library Management Settings", + None, "loan_period") + + overdue = get_overdue(loan_period) + + for member, items in overdue.iteritems(): + content = """

    Following Items are Overdue

    +

    Please return them as soon as possible

      """ + + for i in items: + content += "
    1. {0} ({1}) due on {2}
    2. ".format(i.article_name, + i.article, + format_date(add_days(i.transaction_date, loan_period))) + + content += "
    " + + recipient = frappe.db.get_value("Library Member", member, "email_id") + frappe.sendmail(recipients=[recipient], + sender="test@example.com", + subject="Library Articles Overdue", content=content, bulk=True) + + def get_overdue(loan_period): + # check for overdue articles + today = nowdate() + + overdue_by_member = {} + articles_transacted = [] + + for d in frappe.db.sql("""select name, article, article_name, + library_member, member_name + from `tabLibrary Transaction` + order by transaction_date desc, modified desc""", as_dict=1): + + if d.article in articles_transacted: + continue + + if d.transaction_type=="Issue" and \ + datediff(today, d.transaction_date) > loan_period: + overdue_by_member.setdefault(d.library_member, []) + overdue_by_member[d.library_member].append(d) + + articles_transacted.append(d.article) + +Nous pouvons placer ce code dans un n'importe quel module Python accessible. La route est définie dans `hooks.py`, donc + +so for nso besoins, nos placerons ce code dans `library_management/tasks.py`. + +Note: + +1. Nous obtenons la durée de prêt depuis **Library Management Settings** en utilisant `frappe.db.get_value`. +1. Nous lancons une requête dans la base de données via `frappe.db.sql` +1. Les emails sont envoyés via `frappe.sendmail` + +{suite} diff --git a/frappe/docs/user/fr/tutorial/users-and-records.md b/frappe/docs/user/fr/tutorial/users-and-records.md new file mode 100644 index 0000000000..20302ab91a --- /dev/null +++ b/frappe/docs/user/fr/tutorial/users-and-records.md @@ -0,0 +1,59 @@ +# Créer des utilisateurs et des enregistrements + +Maintenant que nous avons définis des modèles, nous pouvons créér des enregistrements directemnt depuis l'interface. Vous +n'avez pas à créer des vues ! Les vues dans Frappe sont automatiquements créees à partir des propriétés de vos **DocTypes**. + +### 4.1 Créer des utilisateurs + +Afin de créer des enregistreents, nous avons tout d'abord besoin de créer un utilisateur. Rendez-vous sur: + +> Setup > Users > User > New + +Saisissez un nom, un prénom ainsi qu'un mot de passe à votre utilisateur pour le créer et donnez lui les rôles `Librarian` + et `Library Member`. + +Add User Roles + +Maintenant deconnectez-vous puis connectez vous avec l'utilisateur que vous venez de créer. + +### 4.2 Créer des enregistrements + +Vous allez désormais voirs une icones pour notre module de gestion de librairie. Cliquez sur cette icone et vous apercevrez +la page du module: + +Library Management Module + +Vous pouvez donc voir les **DocTypes** que nous avons créés pour l'application. Créons quelques enregistrements. + +Définissons un nouvel Article: + +New Article + +Le **DocType** que vous avons déinis est transformé en formulaire. Les règles de valdiation seront appliquées selons nos +définitions. Remplissons le formulaire pour créer notre premier article. + +New Article + +Vous pouvez aussi ajouter une image. + +Attach Image + +Maintenant créons un nouveau membre. + +New Library Member + +Après cela, définissons un nouvel abonnement pour ce membre. + +Ici, si vous vous souvenez, nous avons définis que les noms et prénoms doivent automatiquement être renseignés dès que nous +avons selectionné l'ID du membre. + +New Library Membership + +Comme vous pouvez le voir, la date est formattée en années-mois-jour qui est le format du système. Pour configurer / changer +le format de la date et de l'heure, rendez-vous sur: + +> Setup > Settings > System Settings + +System Settings + +{suite} diff --git a/frappe/docs/user/fr/tutorial/web-views.md b/frappe/docs/user/fr/tutorial/web-views.md new file mode 100644 index 0000000000..ed5409d800 --- /dev/null +++ b/frappe/docs/user/fr/tutorial/web-views.md @@ -0,0 +1,72 @@ +# es vues web + +Frappe a deux principaux environnements, le **bureau** et **le web**. Le **bureau** est un environnement riche AJAX alors +que **le web** est une collection plus traditionnelle de fichers HTML pour la consultation publique. Les vues web peuvent +aussi être générées pour créer des vues plus controllées pour les utilisateurs qui peuvent se connecter mais qui n'ont pas +accès au desk. + +Dans Frappe, les vues sont gérées par des templates et sont tout naturellement placés dans le repertoire `templates`. Il +y a 2 principaux types de templates. + +1. Pages: Ce sont des templates Jinja ou une vue unique existe pour une route (exemple:`/blog`). +2. Générateurs: Ce sont des templates ou chaque instance représente un **DocType** réprésenté par une url unique. (exemple:`/blog/a-blog`, `blog/b-blog` etc.) +3. Les listes et les vues: Ce sont des listes standards et des vues avec l'url `[doctype]/[name]` et sont affichées en fonction des permissions. + +### Les vues web standards + +> Cette fonctionnalité est encore en développement. + +Jettons un oeuil aux vues standards: + +Si vous êtes connecté avec votre utilisateur de test, rendez-vous sur`/article` et vous devriez voir la liste des articles: + +![Web List]({{docs_base_url}}/assets/img/guide/26-web-list.png) + +Cliquez sur un article et vous devriez voir une vue par défaut. + +![Web List]({{docs_base_url}}/assets/img/guide/26-web-view.png) + +Maintenant, si vous voulez une meilleur liste pour vos articles, créez un fichier appelé `list_item.html` dans le +repertoire `library_management/doctype/article`. Voici un exemple du contenu de ce fichier: + +
    +
    + + + +
    +
    +

    {{ doc.article_name }}

    +

    {{ doc.author }}

    +

    {{ (doc.description[:200] + "...") + if doc.description|length > 200 else doc.description }}

    +

    Publisher: {{ doc.publisher }}

    +
    +
    + + +Ici, vous aurez toutes les propriétés d'un article dans l'object `doc`. + +La mise à jour de la liste ressemble à ca ! + +![Web List]({{docs_base_url}}/assets/img/guide/27-web-view-list.png) + +#### La page d'accueil + +Frappe permet l'inscription et inclut les inscriptions via Google, Facebook et Github. Quand un utilisateur s'inscrit via +le web, il n'a pas accès à l'interface du desk par defaut. + +> Pour autoriser les utilisateurs à accéder au Desk, ouvrez la configuration de l'utilisateur (Setup > User) et définissez + le type d'utilisatuer à "System User". + +Pour les utilisateurs qui n'ont pas accès au desk, nous pouvons définir une page d'accueil ou ils peuvent se connecter via +`hooks.py` le tout en respectant les rôles. + +Quand un membre de la librairie se connecte, il doit être redirigé vers la page `article` donc ouvrez le fichier `library_management/hooks.py` et ajoutez: + + role_home_page = { + "Library Member": "article" + } + +{suite} diff --git a/frappe/docs/user/fr/videos/index.md b/frappe/docs/user/fr/videos/index.md new file mode 100644 index 0000000000..edcdf8ac54 --- /dev/null +++ b/frappe/docs/user/fr/videos/index.md @@ -0,0 +1,9 @@ +# Video Tutorials for Frappe Framework + +This 10-part video tutorial will teach you how to build complex apps in Frappe + +Pre-requisites: You must have some understanding of Python, Javascript and MySQL before you start this tutorial. + +--- + + diff --git a/frappe/email/__init__.py b/frappe/email/__init__.py index 4218598484..3867f5470c 100644 --- a/frappe/email/__init__.py +++ b/frappe/email/__init__.py @@ -6,19 +6,21 @@ import frappe from frappe.email.email_body import get_email from frappe.email.smtp import send +from frappe.utils import markdown def sendmail_md(recipients, sender=None, msg=None, subject=None, attachments=None, content=None, - reply_to=None, cc=(), message_id=None): + reply_to=None, cc=(), message_id=None, in_reply_to=None): """send markdown email""" - import markdown2 - sendmail(recipients, sender, markdown2.markdown(content or msg), subject, attachments, reply_to=reply_to, cc=cc) + sendmail(recipients, sender, markdown(content or msg), subject, attachments, reply_to=reply_to, cc=cc) def sendmail(recipients, sender='', msg='', subject='[No Subject]', attachments=None, content=None, - reply_to=None, cc=(), message_id=None): + reply_to=None, cc=(), message_id=None, in_reply_to=None): """send an html email as multipart with attachments and all""" mail = get_email(recipients, sender, content or msg, subject, attachments=attachments, reply_to=reply_to, cc=cc) if message_id: mail.set_message_id(message_id) + if in_reply_to: + mail.set_in_reply_to(in_reply_to) send(mail) diff --git a/frappe/email/bulk.py b/frappe/email/bulk.py index f89ed6ddd7..327184fc95 100644 --- a/frappe/email/bulk.py +++ b/frappe/email/bulk.py @@ -10,13 +10,13 @@ from frappe.email.smtp import SMTPServer, get_outgoing_email_account from frappe.email.email_body import get_email, get_formatted_html from frappe.utils.verified_command import get_signed_params, verify_request from html2text import html2text -from frappe.utils import get_url, nowdate, encode, now_datetime, add_days, split_emails +from frappe.utils import get_url, nowdate, encode, now_datetime, add_days, split_emails, cstr class BulkLimitCrossedError(frappe.ValidationError): pass def send(recipients=None, sender=None, subject=None, message=None, reference_doctype=None, reference_name=None, unsubscribe_method=None, unsubscribe_params=None, unsubscribe_message=None, - attachments=None, reply_to=None, cc=(), show_as_cc=(), message_id=None, send_after=None, + attachments=None, reply_to=None, cc=(), show_as_cc=(), message_id=None, in_reply_to=None, send_after=None, expose_recipients=False, bulk_priority=1): """Add email to sending queue (Bulk Email) @@ -32,6 +32,7 @@ def send(recipients=None, sender=None, subject=None, message=None, reference_doc :param attachments: Attachments to be sent. :param reply_to: Reply to be captured here (default inbox) :param message_id: Used for threading. If a reply is received to this email, Message-Id is sent back as In-Reply-To in received email. + :param in_reply_to: Used to send the Message-Id of a received email back as In-Reply-To. :param send_after: Send this email after the given datetime. If value is in integer, then `send_after` will be the automatically set to no of days from current date. """ if not unsubscribe_method: @@ -100,11 +101,11 @@ def send(recipients=None, sender=None, subject=None, message=None, reference_doc # add to queue add(email, sender, subject, email_content, email_text_context, reference_doctype, - reference_name, attachments, reply_to, cc, message_id, send_after, bulk_priority) + reference_name, attachments, reply_to, cc, message_id, in_reply_to, send_after, bulk_priority) def add(email, sender, subject, formatted, text_content=None, reference_doctype=None, reference_name=None, attachments=None, reply_to=None, - cc=(), message_id=None, send_after=None, bulk_priority=1, email_account=None): + cc=(), message_id=None, in_reply_to=None, send_after=None, bulk_priority=1, email_account=None): """add to bulk mail queue""" e = frappe.new_doc('Bulk Email') e.sender = sender @@ -118,7 +119,10 @@ def add(email, sender, subject, formatted, text_content=None, if message_id: mail.set_message_id(message_id) - e.message = mail.as_string() + if in_reply_to: + mail.set_in_reply_to(in_reply_to) + + e.message = cstr(mail.as_string()) except frappe.InvalidEmailAddressError: # bad email id - don't add to queue diff --git a/frappe/email/doctype/bulk_email/bulk_email.json b/frappe/email/doctype/bulk_email/bulk_email.json index b84f496968..7ca9ebb6f6 100644 --- a/frappe/email/doctype/bulk_email/bulk_email.json +++ b/frappe/email/doctype/bulk_email/bulk_email.json @@ -1,257 +1,278 @@ { - "allow_copy": 0, - "allow_import": 0, - "allow_rename": 0, - "autoname": "hash", - "creation": "2012-08-02 15:17:28", - "custom": 0, - "description": "Bulk Email records.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "System", + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "hash", + "creation": "2012-08-02 15:17:28", + "custom": 0, + "description": "Bulk Email records.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "System", "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "sender", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Sender", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "sender", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Sender", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "recipient", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Recipient", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "recipient", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Recipient", + "length": 0, + "no_copy": 0, + "options": "Email", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "message", - "fieldtype": "Code", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Message", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "message", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Message", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "Not Sent", - "fieldname": "status", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Status", - "length": 0, - "no_copy": 0, - "options": "\nNot Sent\nSending\nSent\nError\nExpired", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "Not Sent", + "fieldname": "status", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Status", + "length": 0, + "no_copy": 0, + "options": "\nNot Sent\nSending\nSent\nError\nExpired", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "error", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Error", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "error", + "fieldtype": "Code", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Error", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "reference_doctype", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference DocType", - "length": 0, - "no_copy": 0, - "options": "DocType", - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "reference_doctype", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference DocType", + "length": 0, + "no_copy": 0, + "options": "DocType", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "reference_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reference DocName", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "reference_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Reference DocName", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "send_after", - "fieldtype": "Datetime", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Send After", - "length": 0, - "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "send_after", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Send After", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "default": "1", - "fieldname": "priority", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Priority", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "default": "1", + "fieldname": "priority", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Priority", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-envelope", - "idx": 1, - "in_create": 1, - "in_dialog": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2015-12-24 06:29:43.089602", - "modified_by": "Administrator", - "module": "Email", - "name": "Bulk Email", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-envelope", + "idx": 1, + "in_create": 1, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2016-02-26 06:44:01.199764", + "modified_by": "anand@erpnext.com", + "module": "Email", + "name": "Bulk Email", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "System Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 } - ], - "read_only": 0, - "read_only_onload": 0 -} + ], + "read_only": 0, + "read_only_onload": 0, + "sort_order": "DESC" +} \ No newline at end of file diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index 39f1d43082..47f1fd892b 100644 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -345,6 +345,7 @@ class EmailAccount(Document): reference_doctype = communication.reference_doctype, reference_name = communication.reference_name, message_id = communication.name, + in_reply_to = email.mail.get("Message-Id"), # send back the Message-Id as In-Reply-To unsubscribe_message = _("Leave this conversation"), bulk=True) diff --git a/frappe/email/doctype/email_account/test_email_account.py b/frappe/email/doctype/email_account/test_email_account.py index 23d4cfe409..92fa8633cd 100644 --- a/frappe/email/doctype/email_account/test_email_account.py +++ b/frappe/email/doctype/email_account/test_email_account.py @@ -106,6 +106,7 @@ class TestEmailAccount(unittest.TestCase): send_email=True)["name"] sent_mail = email.message_from_string(frappe.get_last_doc("Bulk Email").message) + with open(os.path.join(os.path.dirname(__file__), "test_mails", "reply-1.raw"), "r") as f: raw = f.read() raw = raw.replace("<-- in-reply-to -->", sent_mail.get("Message-Id")) diff --git a/frappe/email/doctype/email_alert_recipient/email_alert_recipient.json b/frappe/email/doctype/email_alert_recipient/email_alert_recipient.json index c28dc54e22..a2c82fdfe5 100644 --- a/frappe/email/doctype/email_alert_recipient/email_alert_recipient.json +++ b/frappe/email/doctype/email_alert_recipient/email_alert_recipient.json @@ -17,6 +17,7 @@ "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Email By Document Field", @@ -24,6 +25,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -37,16 +39,19 @@ "collapsible": 0, "description": "Optional: Always send to these ids. Each email id on a new row", "fieldname": "cc", - "fieldtype": "Text", + "fieldtype": "Code", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "CC", "length": 0, "no_copy": 0, + "options": "Email", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -63,6 +68,7 @@ "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, + "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, "label": "Condition", @@ -70,6 +76,7 @@ "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -80,13 +87,14 @@ ], "hide_heading": 0, "hide_toolbar": 0, + "idx": 0, "in_create": 0, "in_dialog": 0, "is_submittable": 0, "issingle": 0, "istable": 1, "max_attachments": 0, - "modified": "2015-11-16 06:29:46.092268", + "modified": "2016-02-22 09:19:41.689603", "modified_by": "Administrator", "module": "Email", "name": "Email Alert Recipient", diff --git a/frappe/email/email_body.py b/frappe/email/email_body.py index 93345b03f3..55f3baf757 100644 --- a/frappe/email/email_body.py +++ b/frappe/email/email_body.py @@ -5,9 +5,8 @@ from __future__ import unicode_literals import frappe from frappe.utils.pdf import get_pdf from frappe.email.smtp import get_outgoing_email_account -from frappe.utils import get_url, scrub_urls, strip, expand_relative_urls, cint, split_emails, to_markdown +from frappe.utils import get_url, scrub_urls, strip, expand_relative_urls, cint, split_emails, to_markdown, markdown import email.utils -from markdown2 import markdown def get_email(recipients, sender='', msg='', subject='[No Subject]', text_content = None, footer=None, print_html=None, formatted=None, attachments=None, @@ -179,6 +178,10 @@ class EMail: def set_message_id(self, message_id): self.msg_root["Message-Id"] = "<{0}@{1}>".format(message_id, frappe.local.site) + def set_in_reply_to(self, in_reply_to): + """Used to send the Message-Id of a received email back as In-Reply-To""" + self.msg_root["In-Reply-To"] = in_reply_to + def make(self): """build into msg_root""" headers = { diff --git a/frappe/handler.py b/frappe/handler.py index 5325530d7b..c3f51adf8e 100755 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -10,7 +10,6 @@ import frappe.sessions import frappe.utils.file_manager import frappe.desk.form.run_method from frappe.utils.response import build_response -import bleach def handle(): """handle request""" @@ -50,10 +49,9 @@ def is_whitelisted(method): if method not in frappe.xss_safe_methods: # strictly sanitize form_dict # escapes html characters like <> except for predefined tags like a, b, ul etc. - # if required, we can add more whitelisted tags like div, p, etc. (see its documentation) for key, value in frappe.form_dict.items(): if isinstance(value, basestring): - frappe.form_dict[key] = bleach.clean(value) + frappe.form_dict[key] = frappe.utils.sanitize_html(value) else: if not method in frappe.whitelisted: @@ -109,6 +107,7 @@ def uploadfile(): return ret + def get_attr(cmd): """get method object from cmd""" if '.' in cmd: diff --git a/frappe/hooks.py b/frappe/hooks.py index 5203f1a5bb..cbc85d27bf 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -1,11 +1,11 @@ from __future__ import unicode_literals app_name = "frappe" app_title = "Frappe Framework" -app_publisher = "Frappe Technologies Pvt. Ltd." +app_publisher = "Frappe Technologies" app_description = "Full stack web framework with Python, Javascript, MariaDB, Redis, Node" app_icon = "octicon octicon-circuit-board" -app_version = "6.23.3" +app_version = "6.24.10" app_color = "orange" source_link = "https://github.com/frappe/frappe" app_license = "MIT" diff --git a/frappe/integrations/doctype/dropbox_backup/dropbox_backup.py b/frappe/integrations/doctype/dropbox_backup/dropbox_backup.py index 9e0723e0b9..bf9198c73c 100644 --- a/frappe/integrations/doctype/dropbox_backup/dropbox_backup.py +++ b/frappe/integrations/doctype/dropbox_backup/dropbox_backup.py @@ -15,6 +15,9 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe.utils import cint, split_emails, get_request_site_address, cstr +from frappe.utils.backups import new_backup +from frappe.utils import get_files_path, get_backups_path + import os from frappe import _ @@ -38,7 +41,6 @@ def take_backups_if(freq): def take_backups_dropbox(): did_not_upload, error_log = [], [] try: - from frappe.integrations.doctype.dropbox_backup.dropbox_backup import backup_to_dropbox did_not_upload, error_log = backup_to_dropbox() if did_not_upload: raise Exception @@ -60,7 +62,9 @@ def send_email(success, service_name, error_status=None): subject = "[Warning] Backup Upload Failed" message ="""

    Backup Upload Failed

    Oops, your automated backup to %s failed.

    -

    Error message: %s

    +

    Error message:
    +

    %s
    +

    Please contact your system manager for more information.

    """ % (service_name, error_status) @@ -87,7 +91,6 @@ def get_dropbox_authorize_url(): @frappe.whitelist(allow_guest=True) def dropbox_callback(oauth_token=None, not_approved=False): - from dropbox import client if not not_approved: if frappe.db.get_value("Dropbox Backup", None, "dropbox_access_key")==oauth_token: allowed = 1 @@ -127,23 +130,15 @@ def dropbox_callback(oauth_token=None, not_approved=False): frappe.response['page_name'] = 'message.html' def backup_to_dropbox(): - from dropbox import client, session - from frappe.utils.backups import new_backup - from frappe.utils import get_files_path, get_backups_path if not frappe.db: frappe.connect() - sess = session.DropboxSession(frappe.conf.dropbox_access_key, frappe.conf.dropbox_secret_key, "app_folder") - - sess.set_token(frappe.db.get_value("Dropbox Backup", None, "dropbox_access_key"), - frappe.db.get_value("Dropbox Backup", None, "dropbox_access_secret")) - - dropbox_client = client.DropboxClient(sess) + dropbox_client = get_dropbox_client() # upload database backup = new_backup(ignore_files=True) filename = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_db)) - upload_file_to_dropbox(filename, "/database", dropbox_client) + dropbox_client = upload_file_to_dropbox(filename, "/database", dropbox_client) frappe.db.close() @@ -151,12 +146,33 @@ def backup_to_dropbox(): did_not_upload = [] error_log = [] - upload_from_folder(get_files_path(), "/files", dropbox_client, did_not_upload, error_log) - upload_from_folder(get_files_path(is_private=1), "/private/files", dropbox_client, did_not_upload, error_log) + dropbox_client = upload_from_folder(get_files_path(), "/files", dropbox_client, did_not_upload, error_log) + dropbox_client = upload_from_folder(get_files_path(is_private=1), "/private/files", dropbox_client, did_not_upload, error_log) frappe.connect() return did_not_upload, list(set(error_log)) +def get_dropbox_client(previous_dropbox_client=None): + from dropbox import client + + sess = get_dropbox_session() + + sess.set_token(frappe.db.get_value("Dropbox Backup", None, "dropbox_access_key"), + frappe.db.get_value("Dropbox Backup", None, "dropbox_access_secret")) + + dropbox_client = client.DropboxClient(sess) + + # upgrade to oauth2 + token = dropbox_client.create_oauth2_access_token() + dropbox_client = client.DropboxClient(token) + + if previous_dropbox_client: + dropbox_client.connection_reset_count = previous_dropbox_client.connection_reset_count + 1 + else: + dropbox_client.connection_reset_count = 0 + + return dropbox_client + def upload_from_folder(path, dropbox_folder, dropbox_client, did_not_upload, error_log): import dropbox.rest @@ -187,11 +203,13 @@ def upload_from_folder(path, dropbox_folder, dropbox_client, did_not_upload, err if not found: try: - upload_file_to_dropbox(filepath, dropbox_folder, dropbox_client) + dropbox_client = upload_file_to_dropbox(filepath, dropbox_folder, dropbox_client) except Exception: did_not_upload.append(filename) error_log.append(frappe.get_traceback()) + return dropbox_client + def get_dropbox_session(): try: from dropbox import session @@ -218,10 +236,26 @@ def upload_file_to_dropbox(filename, folder, dropbox_client): try: uploader.upload_chunked() uploader.finish(folder + "/" + os.path.basename(filename), overwrite=True) - except rest.ErrorResponse: - pass + + except rest.ErrorResponse, e: + # if "[401] u'Access token not found.'", + # it means that the user needs to again allow dropbox backup from the UI + # so re-raise + + if (e.startswith("[401]") + and dropbox_client.connection_reset_count < 10 + and e != "[401] u'Access token not found.'"): + + # session expired, so get a new connection! + # [401] u"The given OAuth 2 access token doesn't exist or has expired." + dropbox_client = get_dropbox_client(dropbox_client) + + else: + raise else: dropbox_client.put_file(folder + "/" + os.path.basename(filename), f, overwrite=True) + return dropbox_client + if __name__=="__main__": backup_to_dropbox() diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index a94030cd64..f98b7e997c 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -4,7 +4,8 @@ from __future__ import unicode_literals import frappe, sys from frappe import _ -from frappe.utils import cint, flt, now, cstr, strip_html, getdate, get_datetime, to_timedelta +from frappe.utils import (cint, flt, now, cstr, strip_html, getdate, get_datetime, to_timedelta, + sanitize_html, sanitize_email) from frappe.model import default_fields from frappe.model.naming import set_new_name from frappe.modules import load_doctype_module @@ -177,7 +178,7 @@ class BaseDocument(object): d = frappe._dict() for fieldname in self.meta.get_valid_columns(): d[fieldname] = self.get(fieldname) - + # if no need for sanitization and value is None, continue if not sanitize and d[fieldname] is None: continue @@ -188,7 +189,7 @@ class BaseDocument(object): d[fieldname] = cint(d[fieldname]) elif df.fieldtype in ("Currency", "Float", "Percent") and not isinstance(d[fieldname], float): - + d[fieldname] = flt(d[fieldname]) elif df.fieldtype in ("Datetime", "Date") and d[fieldname]=="": @@ -505,6 +506,42 @@ class BaseDocument(object): frappe.throw(_("Not allowed to change {0} after submission").format(df.label), frappe.UpdateAfterSubmitError) + def _sanitize_content(self): + """Sanitize HTML and Email in field values. Used to prevent XSS. + + - Ignore if 'Ignore XSS Filter' is checked or fieldtype is 'Code' + """ + if frappe.flags.in_install: + return + + for fieldname, value in self.get_valid_dict().items(): + if not value or not isinstance(value, basestring): + continue + + elif ("<" not in value and ">" not in value): + # doesn't look like html so no need + continue + + elif "" in value and not (" 0, then reset the values to original / default""" if self.flags.ignore_permissions or frappe.flags.in_install: diff --git a/frappe/model/naming.py b/frappe/model/naming.py index 5152e83df0..709364ce7e 100644 --- a/frappe/model/naming.py +++ b/frappe/model/naming.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.utils import now_datetime, cint +import re def set_new_name(doc): """Sets the `name`` property for the document based on various rules. @@ -61,9 +62,9 @@ def set_name_by_naming_series(doc): if not doc.naming_series: frappe.throw(frappe._("Naming Series mandatory")) - doc.name = make_autoname(doc.naming_series+'.#####') + doc.name = make_autoname(doc.naming_series+'.#####', '', doc) -def make_autoname(key, doctype=''): +def make_autoname(key='', doctype='', doc=''): """ Creates an autoname from the given key: @@ -109,6 +110,8 @@ def make_autoname(key, doctype=''): en = today.strftime("%d") elif e=='YYYY': en = today.strftime('%Y') + elif doc and doc.get(e): + en = doc.get(e) else: en = e n+=en return n @@ -161,6 +164,11 @@ def validate_name(doctype, name, case=None, merge=False): if not frappe.get_meta(doctype).get("issingle") and (doctype == name) and (name!="DocType"): frappe.throw(_("Name of {0} cannot be {1}").format(doctype, name), frappe.NameError) + special_characters = "<>" + if re.findall("[{0}]+".format(special_characters), name): + message = ", ".join("'{0}'".format(c) for c in special_characters) + frappe.throw(_("Name cannot contain special characters like {0}").format(special_characters), frappe.NameError) + return name def _set_amended_name(doc): diff --git a/frappe/patches.txt b/frappe/patches.txt index f90b3bc188..1d78506bc3 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -1,8 +1,8 @@ execute:frappe.db.sql("""update `tabPatch Log` set patch=replace(patch, '.4_0.', '.v4_0.')""") #2014-05-12 frappe.patches.v5_0.convert_to_barracuda_and_utf8mb4 frappe.patches.v6_1.rename_file_data -execute:frappe.reload_doc('core', 'doctype', 'doctype', force=True) #2014-01-24 -execute:frappe.reload_doc('core', 'doctype', 'docfield', force=True) #2015-10-16 +execute:frappe.reload_doc('core', 'doctype', 'doctype', force=True) #2016-02-17 +execute:frappe.reload_doc('core', 'doctype', 'docfield', force=True) #2016-02-26 execute:frappe.reload_doc('core', 'doctype', 'docperm') #2014-06-24 execute:frappe.reload_doc('custom', 'doctype', 'custom_field') #2015-10-19 execute:frappe.reload_doc('core', 'doctype', 'page') #2013-13-26 diff --git a/frappe/public/css/form.css b/frappe/public/css/form.css index 581a4223bf..4836063a02 100644 --- a/frappe/public/css/form.css +++ b/frappe/public/css/form.css @@ -327,6 +327,9 @@ select.form-control { max-width: none; padding-right: 0px; } + .form-column.col-sm-6 textarea[data-fieldtype="Code"] { + height: 120px !important; + } } @media (max-width: 991px) { .form-section .form-section-heading { diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index 6569c7ee15..cf9233633a 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -434,11 +434,30 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ callback(""); return; } - if(!validate_email(v)) { - msgprint(__("Invalid Email: {0}", [v])); + + var email_list = frappe.utils.split_emails(v); + if (!email_list) { + // invalid email + callback(""); + + } else { + var invalid_email = false; + email_list.forEach(function(email) { + if (!validate_email(email)) { + msgprint(__("Invalid Email: {0}", [email])); + invalid_email = true; + } + }); + + if (invalid_email) { + // at least 1 invalid email callback(""); - } else - callback(v); + } else { + // all good + callback(v); + } + } + } else { callback(v); } diff --git a/frappe/public/js/frappe/form/footer/timeline.js b/frappe/public/js/frappe/form/footer/timeline.js index c6da1145e2..5abe958638 100644 --- a/frappe/public/js/frappe/form/footer/timeline.js +++ b/frappe/public/js/frappe/form/footer/timeline.js @@ -195,7 +195,6 @@ frappe.ui.form.Timeline = Class.extend({ if(c.communication_type=="Communication" && c.communication_medium=="Email") { c.content = c.content.split("")[0]; c.content = frappe.utils.strip_original_content(c.content); - c.content = frappe.dom.remove_script_and_style(c.content); c.original_content = c.content; c.content = frappe.utils.toggle_blockquote(c.content); @@ -222,6 +221,9 @@ frappe.ui.form.Timeline = Class.extend({ c.liked_by_user = c._liked_by.indexOf(user)!==-1; } } + + // basic level of XSS protection + c.content_html = frappe.dom.remove_script_and_style(c.content_html); }, is_communication_or_comment: function(c) { diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index bf4484c468..981d45d9e1 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -55,9 +55,9 @@ frappe.form.formatters = { }, Check: function(value) { if(value) { - return ''; + return ''; } else { - return ''; + return ''; } }, Link: function(value, docfield, options) { diff --git a/frappe/public/js/frappe/list/doclistview.js b/frappe/public/js/frappe/list/doclistview.js index e304172a2d..a20682a008 100644 --- a/frappe/public/js/frappe/list/doclistview.js +++ b/frappe/public/js/frappe/list/doclistview.js @@ -452,6 +452,54 @@ frappe.views.DocListView = frappe.ui.Listing.extend({ frappe.msgprint(__("Select records for assignment")) } }, true) + + //bulk assignment + me.page.add_menu_item(__("Print"), function(){ + + docname = []; + + $.each(me.get_checked_items(), function(i, doc){ + docname.push(doc.name); + }) + + if(docname.length >= 1){ + + var dialog = new frappe.ui.Dialog({ + title: "Print Documents", + fields: [ + {"fieldtype": "Check", "label": __("Print Letterhead"), "fieldname": "print_letterhead"}, + {"fieldtype": "Select", "label": __("Print Format"), "fieldname": "print_sel"}, + + {"fieldtype": "Button", "label": __("Print"), "fieldname": "print"}, + ] + }); + + print_formats = frappe.meta.get_print_formats(me.doctype); + dialog.fields_dict.print_sel.$input.empty().add_options(print_formats); + + dialog.fields_dict.print.$input.click(function() { + args = dialog.get_values(); + if(!args) return; + var default_print_format = locals.DocType[me.doctype].default_print_format; + with_letterhead = args.print_letterhead ? 1 : 0; + print_format = args.print_sel ? args.print_sel:default_print_format; + + var json_string = JSON.stringify(docname); + var w = window.open("/api/method/frappe.templates.pages.print.download_multi_pdf?" + +"doctype="+encodeURIComponent(me.doctype) + +"&name="+encodeURIComponent(json_string) + +"&format="+encodeURIComponent(print_format) + +"&no_letterhead="+(with_letterhead ? "0" : "1")); + if(!w) { + msgprint(__("Please enable pop-ups")); return; + } + }); + dialog.show(); + } + else{ + frappe.msgprint(__("Select records for assignment")) + } + }, true) }, init_like: function() { diff --git a/frappe/public/js/frappe/misc/tools.js b/frappe/public/js/frappe/misc/tools.js index f5a8015968..63f05552c6 100644 --- a/frappe/public/js/frappe/misc/tools.js +++ b/frappe/public/js/frappe/misc/tools.js @@ -9,15 +9,22 @@ frappe.tools.downloadify = function(data, roles, title) { return; } + var filename = title + ".csv"; var csv_data = frappe.tools.to_csv(data); - - // Used Blob object, because it can handle large files - var blob_object = new Blob([csv_data], { type: 'text/csv' }); - var blob_url = URL.createObjectURL(blob_object); - var a = document.createElement('a'); - a.download = title + '.csv'; - a.href = blob_url; + + if ("download" in a) { + // Used Blob object, because it can handle large files + var blob_object = new Blob([csv_data], { type: 'text/csv;charset=UTF-8' }); + a.href = URL.createObjectURL(blob_object); + a.download = filename; + + } else { + // use old method + a.href = 'data:attachment/csv,' + encodeURIComponent(csv_data); + a.download = filename; + a.target = "_blank"; + } document.body.appendChild(a); a.click(); diff --git a/frappe/public/js/frappe/misc/utils.js b/frappe/public/js/frappe/misc/utils.js index be43bd9e6b..de0603e297 100644 --- a/frappe/public/js/frappe/misc/utils.js +++ b/frappe/public/js/frappe/misc/utils.js @@ -498,5 +498,22 @@ frappe.utils = { // pass } + }, + split_emails: function(txt) { + var email_list = []; + + if (!txt) { + return email_list; + } + + // emails can be separated by comma or newline + txt.split(/[,\n](?=(?:[^"]|"[^"]*")*$)/g).forEach(function(email) { + email = email.trim(); + if (email) { + email_list.push(email); + } + }); + + return email_list; } }; diff --git a/frappe/public/less/form.less b/frappe/public/less/form.less index a6a99cffaf..c5e95a9764 100644 --- a/frappe/public/less/form.less +++ b/frappe/public/less/form.less @@ -409,6 +409,10 @@ select.form-control { max-width: none; padding-right: 0px; } + + .form-column.col-sm-6 textarea[data-fieldtype="Code"] { + height: 120px !important; + } } // upto tablets diff --git a/frappe/tasks.py b/frappe/tasks.py index bc5c122403..e0e651ab0d 100644 --- a/frappe/tasks.py +++ b/frappe/tasks.py @@ -92,6 +92,10 @@ def is_site_in_maintenance_mode(queue, prefix): if not frappe.local.conf.db_name or frappe.local.conf.maintenance_mode or frappe.conf.disable_scheduler: # don't add site if in maintenance mode return True + + except frappe.IncorrectSitePath: + return True + finally: frappe.destroy() diff --git a/frappe/templates/includes/comments/comments.py b/frappe/templates/includes/comments/comments.py index 54423a537e..fe5b7f2c45 100644 --- a/frappe/templates/includes/comments/comments.py +++ b/frappe/templates/includes/comments/comments.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe -import frappe.utils, markdown2 +import frappe.utils from frappe.website.render import clear_cache from frappe import _ @@ -45,7 +45,7 @@ def add_comment(args=None): owner = frappe.db.get_value(doc.doctype, doc.name, "owner") recipients = list(set(commentors if owner=="Administrator" else (commentors + [owner]))) - message = _("{0} by {1}").format(markdown2.markdown(args.get("comment")), comment.sender_full_name) + message = _("{0} by {1}").format(frappe.utils.markdown(args.get("comment")), comment.sender_full_name) message += "

    {2}

    ".format(frappe.utils.get_request_site_address(), page_name, _("View it in your browser")) diff --git a/frappe/templates/pages/print.py b/frappe/templates/pages/print.py index 35184a5fa6..42d1c62ce6 100644 --- a/frappe/templates/pages/print.py +++ b/frappe/templates/pages/print.py @@ -143,6 +143,38 @@ def get_html_and_style(doc, name=None, print_format=None, meta=None, "style": get_print_style(print_format=print_format) } +@frappe.whitelist() +def download_multi_pdf(doctype, name, format=None): + # name can include names of many docs of the same doctype. + totalhtml = "" + # Pagebreak to be added between each doc html + pagebreak = """

    """ + + options = {} + + import json + result = json.loads(name) + # Get html of each doc and combine including page breaks + for i, ss in enumerate(result): + html = frappe.get_print(doctype, ss, format) + if i == len(result)-1: + totalhtml = totalhtml + html + else: + totalhtml = totalhtml + html + pagebreak + + + + frappe.local.response.filename = "{doctype}.pdf".format(doctype=doctype.replace(" ", "-").replace("/", "-")) + + + # Title of pdf + options.update({ + 'title': doctype, + }) + + frappe.local.response.filecontent = get_pdf(totalhtml,options) + frappe.local.response.type = "download" + @frappe.whitelist() def download_pdf(doctype, name, format=None): html = frappe.get_print(doctype, name, format) diff --git a/frappe/tests/test_document.py b/frappe/tests/test_document.py index 995103376a..62c3bc40d8 100644 --- a/frappe/tests/test_document.py +++ b/frappe/tests/test_document.py @@ -156,3 +156,36 @@ class TestDocument(unittest.TestCase): d.subject = "abcde"*100 self.assertRaises(frappe.CharacterLengthExceededError, d.save) + def test_xss_filter(self): + d = self.test_insert() + + # script + xss = '' + escaped_xss = xss.replace('<', '<').replace('>', '>') + d.subject += xss + d.save() + d.load_from_db() + + self.assertTrue(xss not in d.subject) + self.assertTrue(escaped_xss in d.subject) + + # onload + xss = '
    Test
    ' + escaped_xss = '
    Test
    ' + d.subject += xss + d.save() + d.load_from_db() + + self.assertTrue(xss not in d.subject) + self.assertTrue(escaped_xss in d.subject) + + # css attributes + xss = '
    Test
    ' + escaped_xss = '
    Test
    ' + d.subject += xss + d.save() + d.load_from_db() + + self.assertTrue(xss not in d.subject) + self.assertTrue(escaped_xss in d.subject) + diff --git a/frappe/translations/fr.csv b/frappe/translations/fr.csv index fa8bc2b2eb..c935473c52 100644 --- a/frappe/translations/fr.csv +++ b/frappe/translations/fr.csv @@ -26,7 +26,7 @@ apps/frappe/frappe/config/core.py +42,Logs,Logs DocType: DocPerm,This role update User Permissions for a user,Ce rôle Permission mise à jour de l'utilisateur pour un utilisateur apps/frappe/frappe/public/js/frappe/model/model.js +510,Rename {0},Renommer {0} DocType: Workflow State,zoom-out,Réduire -apps/frappe/frappe/public/js/legacy/form.js +66,Cannot open {0} when its instance is open,pas trouvé +apps/frappe/frappe/public/js/legacy/form.js +66,Cannot open {0} when its instance is open,Ne peut ouvrir {0} quand son instance est ouverte apps/frappe/frappe/model/document.py +756,Table {0} cannot be empty,La Table {0} ne peut pas être vide apps/frappe/frappe/public/js/frappe/views/reports/grid_report.js +893,With Ledgers,Permanence Annuler {0} ? DocType: Communication,Reference Owner,référence propriétaire @@ -63,7 +63,7 @@ apps/frappe/frappe/public/js/frappe/ui/upload.html +12,Web Link,Lien Web apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +41,1 minute ago,il y a 1 minute apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +33,"Recommended bulk editing records via import, or understanding the import format.","Modification d'enregistrements en vrac Recommandé par l'importation, ou de comprendre le format d'importation." apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +36,"Apart from System Manager, roles with Set User Permissions right can set permissions for other users for that Document Type.","En dehors de System Manager, les rôles avec Définir les autorisations de droit d'utilisateur peut définir des autorisations pour d'autres utilisateurs pour ce type de document." -DocType: Company History,Company History,Historique de l'entreprise +DocType: Company History,Company History,Historique de la société DocType: Workflow State,volume-up,Augmenter le volume apps/frappe/frappe/core/page/data_import_tool/importer.py +45,Only allowed {0} rows in one import,Seulement autorisés {0} lignes d'une importation apps/frappe/frappe/public/js/frappe/list/list_sidebar.js +61,Refresh Stats,Actualiser Statistiques @@ -224,7 +224,7 @@ apps/frappe/frappe/core/doctype/file/file_list.js +176,New,Nouveau DocType: System Settings,Loading...,Chargement en cours ... DocType: DocField,Password,Mot de passe DocType: Blogger,Will be used in url (usually first name).,Sera utilisé dans url (généralement prénom). -apps/frappe/frappe/client.py +63,Can not edit Read Only fields,Ne peut Editer les champs en Lecture Seule +apps/frappe/frappe/client.py +63,Can not edit Read Only fields,Ne peut éditer les champs en lecture seule apps/frappe/frappe/print/page/print_format_builder/print_format_builder.js +463,Edit Heading,Modifier rubrique DocType: File,File URL,URL du fichier apps/frappe/frappe/desk/doctype/event/event.py +68,Upcoming Events for Today,Prochains événements pour Aujourd'hui @@ -347,13 +347,13 @@ DocType: Workflow Transition,Defines actions on states and the next step and all apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +11,"As a best practice, do not assign the same set of permission rule to different Roles. Instead, set multiple Roles to the same User.","Comme une meilleure pratique , ne pas attribuer le même ensemble de règle d'autorisation pour différents rôles . Au lieu de cela , définir plusieurs rôles à un même utilisateur ." DocType: Web Form,Message to be displayed on successful completion,Message qui sera affiché sur la réussite DocType: Contact Us Settings,Address Title,Titre de l'adresse -DocType: Website Settings,Footer Items,Articles de bas de page +DocType: Website Settings,Footer Items,Éléments du pied de page apps/frappe/frappe/public/js/frappe/ui/page.html +21,Menu,Menu DocType: DefaultValue,DefaultValue,Valeur par défaut DocType: Dropbox Backup,Daily,Quotidien apps/frappe/frappe/config/setup.py +19,User Roles,Définition des rôles DocType: Property Setter,Property Setter overrides a standard DocType or Field property,Propriété Setter remplace un DOCTYPE standard ou bien le terrain -apps/frappe/frappe/core/doctype/user/user.py +380,Cannot Update: Incorrect / Expired Link.,Vous ne pouvez pas mettre à jour : Lien Mauvais ou périmée . +apps/frappe/frappe/core/doctype/user/user.py +380,Cannot Update: Incorrect / Expired Link.,La mise à jour ne peut être effectuée : Lien incorrect ou périmé . DocType: DocField,Set Only Once,Défini qu'une seule fois apps/frappe/frappe/core/doctype/user/user.py +315,Username {0} already exists,Nom d'utilisateur {0} existe déjà apps/frappe/frappe/core/doctype/doctype/doctype.py +528,{0}: Cannot set import as {1} is not importable,{0} : Impossible de définir l'importation car {1} n'est pas importable @@ -463,7 +463,7 @@ apps/frappe/frappe/config/setup.py +176,"States for workflow (e.g. Draft, Approv apps/frappe/frappe/public/js/frappe/form/link_selector.js +136,Set Quantity,Ensemble Quantité DocType: User,Unsubscribed,Désabonné ,Data Import Tool,Outil d'importation de données -apps/frappe/frappe/core/doctype/user/user.py +425,Registration Details Emailed.,Modalités d'inscription envoyé par courriel. +apps/frappe/frappe/core/doctype/user/user.py +425,Registration Details Emailed.,Modalités d'inscription envoyé par E-mail. DocType: Workflow State,Stop,arrêtez DocType: Top Bar Item,Link to the page you want to open. Leave blank if you want to make it a group parent.,Lien vers la page que vous souhaitez ouvrir. Laissez ce champ vide si vous voulez faire un parent du groupe. DocType: DocType,Is Single,Est célibataire @@ -471,7 +471,7 @@ apps/frappe/frappe/email/bulk.py +231,{0} has left the conversation in {1} {2},{ DocType: Blogger,User ID of a Blogger,ID de l'utilisateur d'un Blogger apps/frappe/frappe/core/doctype/user/user.py +201,There should remain at least one System Manager,Il devrait y rester au moins un administrateur système DocType: Workflow State,circle-arrow-right,cercle flèche à droite -apps/frappe/frappe/public/js/legacy/form.js +72,Cannot open instance when its {0} is open,Création / modification par +apps/frappe/frappe/public/js/legacy/form.js +72,Cannot open instance when its {0} is open,Ne peut ouvrir un instance quand son {0} est ouverte DocType: Scheduler Log,Method,Méthode DocType: Report,Script Report,Rapport de Script DocType: About Us Settings,Company Introduction,Présentation de l'entreprise @@ -639,7 +639,7 @@ DocType: DocPerm,Set User Permissions,Définir les autorisations des utilisateur DocType: Email Account,Email Account Name,Nom du compte E-mail apps/frappe/frappe/core/page/permission_manager/permission_manager.js +249,Select Document Types,Sélectionnez Types de documents DocType: File,old_parent,old_parent -DocType: Email Account,"e.g. ""Support"", ""Sales"", ""Jerry Yang""","par exemple ""Support "","" vente "","" Jerry Yang """ +DocType: Email Account,"e.g. ""Support"", ""Sales"", ""Jerry Yang""","Ex. ""Support "","" vente "",""Jerry Yang""" apps/frappe/frappe/public/js/frappe/form/workflow.js +115,Document Status transition from,Statut du document de transition DocType: DocField,Description,Description DocType: Print Settings,Repeat Header and Footer in PDF,Répétez-tête et pied de page en PDF @@ -739,7 +739,7 @@ apps/frappe/frappe/core/page/data_import_tool/exporter.py +60,Notes:,Remarques: apps/frappe/frappe/public/js/frappe/form/control.js +1391,Markdown,Markdown DocType: DocShare,Document Name,Nom du document DocType: ToDo,Medium,Moyen -apps/frappe/frappe/public/js/frappe/form/linked_with.js +86,Not enough permission to see links.,Pas l'autorisation suffisante pour voir les liens. +apps/frappe/frappe/public/js/frappe/form/linked_with.js +86,Not enough permission to see links.,Autorisation insuffisante pour voir les liens. DocType: Customize Form,Customize Form,Personnaliser le formulaire DocType: Currency,A symbol for this currency. For e.g. $,Un symbole pour cette monnaie. Par exemple $ apps/frappe/frappe/public/js/frappe/ui/toolbar/about.js +4,Frappe Framework,Framework Frappe @@ -831,7 +831,7 @@ apps/frappe/frappe/public/js/frappe/form/control.js +765,Please save the documen apps/frappe/frappe/public/js/frappe/ui/messages.js +163,Enter your password,Entrez votre mot de passe DocType: Dropbox Backup,Dropbox Access Secret,Dropbox accès secrète apps/frappe/frappe/core/doctype/doctype/doctype.py +351,Fold must come before a Section Break,Pliez doit venir avant un saut de section -apps/frappe/frappe/core/doctype/user/user.py +430,Not allowed to reset the password of {0},Non autorisé pour réinitialiser le mot de passe de {0} +apps/frappe/frappe/core/doctype/user/user.py +430,Not allowed to reset the password of {0},Non autorisé a réinitialiser le mot de passe de {0} DocType: Workflow State,hand-down,la main vers le bas apps/frappe/frappe/core/doctype/doctype/doctype.py +494,{0}: Cannot set Cancel without Submit,{0} : Impossible de définir Annuler sans Soumettre DocType: Website Theme,Theme,Thème @@ -931,7 +931,7 @@ apps/frappe/frappe/core/doctype/doctype/doctype.py +446,Enter at least one permi apps/frappe/frappe/public/js/frappe/model/model.js +20,Created On,Créé le DocType: Workflow State,align-center,Centrer apps/frappe/frappe/public/js/frappe/form/set_sharing.html +6,Can Write,Peut Ecrire -apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +16,"Certain documents, like an Invoice, should not be changed once final. The final state for such documents is called Submitted. You can restrict which roles can Submit.","Certains documents , comme une facture , ne devraient pas être modifiés une fois finale . L'état final de ces documents est appelée Soumis . Vous pouvez limiter les rôles pouvant Soumettre." +apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +16,"Certain documents, like an Invoice, should not be changed once final. The final state for such documents is called Submitted. You can restrict which roles can Submit.","Certains documents , comme une facture , ne devraient pas être modifiés une fois finalisés . L'état final de ces documents est appelée soumis . Vous pouvez limiter les rôles pouvant soumettre." apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +619,You are not allowed to export this report,Vous n'êtes pas autorisé à exporter ce rapport. DocType: ToDo,Sender,Expéditeur DocType: Web Page,Description for search engine optimization.,Description pour l'optimisation des moteurs de recherche. @@ -1005,7 +1005,7 @@ apps/frappe/frappe/public/js/legacy/print_format.js +125,You are not allowed to apps/frappe/frappe/public/js/frappe/views/reports/grid_report.js +286,Loading Report,Chargement rapport DocType: Page,Standard,Standard apps/frappe/frappe/public/js/frappe/form/form_sidebar.html +26,Attach File,Joindre un fichier -apps/frappe/frappe/templates/emails/password_update.html +1,Password Update Notification,Mot de passe Mise à jour de notification +apps/frappe/frappe/templates/emails/password_update.html +1,Password Update Notification,Notification de mise à jour du mot de passe apps/frappe/frappe/desk/page/backups/backups.html +13,Size,Taille apps/frappe/frappe/public/js/frappe/form/footer/assign_to.js +62,Assignment Complete,Cession complète DocType: DocPerm,User Permission DocTypes,DocTypes d'autorisation de l'utilisateur @@ -1279,7 +1279,7 @@ apps/frappe/frappe/core/doctype/user/user.js +317,Role Permissions,Permissions d apps/frappe/frappe/public/js/frappe/form/set_sharing.html +5,Can Read,Peut Lire DocType: Standard Reply,Response,Réponse apps/frappe/frappe/public/js/frappe/form/workflow.js +41,Workflow will start after saving.,Workflow démarre après la sauvegarde. -apps/frappe/frappe/public/js/frappe/form/set_sharing.html +7,Can Share,Peuvent partager +apps/frappe/frappe/public/js/frappe/form/set_sharing.html +7,Can Share,Peut partager apps/frappe/frappe/email/smtp.py +33,Invalid recipient address,Adresse de destinataire invalide DocType: Workflow State,step-forward,l'étape de l'avant- apps/frappe/frappe/core/doctype/user/user.js +41,Refreshing...,Actualisation ... @@ -1300,7 +1300,7 @@ DocType: Website Theme,Apply Style,Appliquer le style apps/frappe/frappe/public/js/frappe/form/form_sidebar.html +39,Shared With,Partagé avec ,Modules Setup,modules installation apps/frappe/frappe/core/page/data_import_tool/exporter.py +230,Type:,Type: -DocType: Communication,Unshared,non partagée +DocType: Communication,Unshared,Non partagée apps/frappe/frappe/desk/moduleview.py +57,Module Not Found,Module introuvable DocType: User,Location,Lieu ,Permitted Documents For User,Documents autorisés pour l'utilisateur @@ -1364,7 +1364,7 @@ DocType: DocType,Allow Import via Data Import Tool,Autoriser l'importation v apps/frappe/frappe/model/base_document.py +505,Not allowed to change {0} after submission,Non autorisé à changer {0} après la présentation DocType: Communication,Comment Type,Type de commentaire apps/frappe/frappe/config/setup.py +8,Users,Utilisateurs -DocType: Report,Report Type,Rapport Genre +DocType: Report,Report Type,Rapport type DocType: Email Account,Signature,Signature apps/frappe/frappe/public/js/frappe/form/share.js +112,Share With,Partager avec apps/frappe/frappe/core/doctype/user/user.js +130,Loading,Chargement @@ -1383,7 +1383,7 @@ DocType: Event,Sunday,Dimanche apps/frappe/frappe/public/js/frappe/form/save.js +14,Amending,Amendement apps/frappe/frappe/public/js/frappe/form/link_selector.js +5,Dialog box to select a Link Value,Boîte de dialogue pour sélectionner une valeur de lien DocType: Contact Us Settings,Send enquiries to this email address,Envoyer une demande à cette adresse courriel -DocType: Letter Head,Letter Head Name,Nom de A en-tête +DocType: Letter Head,Letter Head Name,Nom de l'en-tête apps/frappe/frappe/config/website.py +23,User editable form on Website.,Utilisateur formulaire modifiable sur le Site. DocType: Workflow State,file,fichier apps/frappe/frappe/templates/pages/login.html +74,Back to Login,Retour connexion @@ -1499,7 +1499,7 @@ DocType: Website Theme,This must be checked if the below style settings are appl apps/frappe/frappe/print/page/print_format_builder/print_format_builder.js +111,Name of the new Print Format,Nom du nouveau Format d'Impression apps/frappe/frappe/core/page/data_import_tool/exporter.py +229,Mandatory:,Obligatoire: ,User Permissions Manager,Gestion autorisations des utilisateurs -DocType: Property Setter,New value to be set,La nouvelle valeur à régler +DocType: Property Setter,New value to be set,Nouvelle valeur à régler DocType: Email Alert,Days Before or After,Jours avant ou après DocType: Email Alert,Email Alert,Alerte E-mail apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +34,Select Document Types to set which User Permissions are used to limit access.,Sélectionner les types de document pour définir les autorisations utilisateur sont utilisés pour limiter l'accès. @@ -1760,7 +1760,7 @@ DocType: Role,Role Name,Nom du Rôle apps/frappe/frappe/config/core.py +27,Script or Query reports,Script ou une requête rapports DocType: Workflow Document State,Workflow Document State,Etat du document de workflow apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +32,"To give acess to a role for only specific records, check the Apply User Permissions. User Permissions are used to limit users with such role to specific records.","Pour donner acess à un rôle pour que les enregistrements spécifiques, vérifiez les permissions d'utilisation se appliquent. les autorisations des utilisateurs sont utilisés pour limiter les utilisateurs avec ce rôle à des enregistrements spécifiques." -apps/frappe/frappe/workflow/doctype/workflow/workflow.py +70,Cannot cancel before submitting. See Transition {0},Vous ne pouvez pas annuler avant de soumettre . +apps/frappe/frappe/workflow/doctype/workflow/workflow.py +70,Cannot cancel before submitting. See Transition {0},Impossible d'annuler avant de soumettre . Voir transition {0} apps/frappe/frappe/templates/pages/print.py +173,Print Format {0} is disabled,Format d'impression {0} est désactivé DocType: Email Alert,Send days before or after the reference date,Envoyer jours avant ou après la date de référence DocType: User,Allow user to login only after this hour (0-24),Permettre à l'utilisateur de se connecter seulement après cette heure (0-24) @@ -1894,14 +1894,14 @@ apps/frappe/frappe/core/doctype/user/user.py +240,User {0} cannot be renamed,Uti DocType: Website Settings,An icon file with .ico extension. Should be 16 x 16 px. Generated using a favicon generator. [favicon-generator.org],Un fichier d'icône avec .ico. Devrait être 16 x 16 px. Généré en utilisant un générateur de favicon. [favicon-generator.org] apps/frappe/frappe/website/doctype/website_settings/website_settings.js +17,Exported,exporté DocType: DocPerm,"JSON list of DocTypes used to apply User Permissions. If empty, all linked DocTypes will be used to apply User Permissions.","JSON liste des DocTypes utilisés pour appliquer les autorisations des utilisateurs. Se il est vide, tous liés DocTypes seront utilisés pour appliquer les autorisations des utilisateurs." -DocType: Report,Ref DocType,Réf DocType +DocType: Report,Ref DocType,Réf. DocType apps/frappe/frappe/core/doctype/doctype/doctype.py +499,{0}: Cannot set Amend without Cancel,{0} : Impossible de définir Modifier sans Annuler apps/frappe/frappe/public/js/frappe/form/print_layout.html +20,Full Page,Pleine page DocType: DocType,Is Child Table,Est-table enfant apps/frappe/frappe/utils/csvutils.py +123,{0} must be one of {1},{0} doit être l'un des {1} apps/frappe/frappe/public/js/frappe/form/form_viewers.js +26,{0} is currently viewing this document,{0} est en train de regarder ce document apps/frappe/frappe/config/core.py +52,Background Email Queue,Contexte Email Queue -apps/frappe/frappe/templates/emails/password_reset.html +1,Password Reset,Password Reset +apps/frappe/frappe/templates/emails/password_reset.html +1,Password Reset,Initialisation du mot de passe DocType: Communication,Opened,Ouvert DocType: Workflow State,chevron-left,chevron gauche DocType: Bulk Email,Sending,Envoi @@ -2002,7 +2002,7 @@ apps/frappe/frappe/custom/doctype/customize_form/customize_form.js +158,"Change apps/frappe/frappe/website/doctype/web_form/web_form.py +27,You need to be in developer mode to edit a Standard Web Form,Vous devez être en mode développeur pour modifier un formulaire Web standard apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +48,"For comparative filters, start with","Pour les filtres de comparaison, commencez par" DocType: Website Theme,Link to Bootstrap CSS,Lien vers Bootstrap CSS -DocType: Workflow State,camera,appareil photo +DocType: Workflow State,camera,Caméra DocType: Website Settings,Brand HTML,Marque HTML apps/frappe/frappe/templates/includes/login/login.js +19,Both login and password required,Un login et un mot de passe sont requis apps/frappe/frappe/model/document.py +436,Please refresh to get the latest document.,S'il vous plaît Refresh pour obtenir la dernière version du document. diff --git a/frappe/translations/hr.csv b/frappe/translations/hr.csv index 595bcfa747..af1ec10ca0 100644 --- a/frappe/translations/hr.csv +++ b/frappe/translations/hr.csv @@ -60,7 +60,7 @@ DocType: Print Settings,Classic,Klasik apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +49,For ranges,Za raspone DocType: Workflow State,indent-right,alineje-desno apps/frappe/frappe/public/js/frappe/ui/upload.html +12,Web Link,Web Link -apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +41,1 minute ago,prije 1 minutu +apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +41,1 minute ago,Prije 1 minutu apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +33,"Recommended bulk editing records via import, or understanding the import format.","Preporučena skupno uređivanje zapisa putem uvoza, odnosno razumijevanje uvoz formatu." apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +36,"Apart from System Manager, roles with Set User Permissions right can set permissions for other users for that Document Type.","Osim System Manager, uloge s postavite korisnički Dozvole pravo može postaviti dozvole za ostale korisnike za tu vrstu dokumenta." DocType: Company History,Company History,Povijest tvrtke @@ -108,7 +108,7 @@ apps/frappe/frappe/custom/doctype/custom_field/custom_field.py +108,"Insert Afte DocType: Workflow State,circle-arrow-up,krug sa strelicom prema gore apps/frappe/frappe/public/js/frappe/upload.js +156,Uploading...,Prijenos ... DocType: Workflow State,italic,kurzivan -apps/frappe/frappe/core/doctype/doctype/doctype.py +501,{0}: Cannot set Import without Create,{0} : Ne može se uvoz bez Stvoriti +apps/frappe/frappe/core/doctype/doctype/doctype.py +501,{0}: Cannot set Import without Create,{0} : Ne može se uvesti bez stvaranja apps/frappe/frappe/config/desk.py +21,Event and other calendars.,Događaj i druge kalendare. apps/frappe/frappe/public/js/frappe/views/reports/reportview.js +614,Drag to sort columns,Povucite kako bi sortirali stupce apps/frappe/frappe/print/page/print_format_builder/print_format_builder_column_selector.html +2,Widths can be set in px or %.,Širina može biti postavljena u px ili%. @@ -355,7 +355,7 @@ DocType: Property Setter,Property Setter overrides a standard DocType or Field p apps/frappe/frappe/core/doctype/user/user.py +380,Cannot Update: Incorrect / Expired Link.,Ne možete ažurirati : Nepravilan / istekla . DocType: DocField,Set Only Once,Postaviti samo jednom apps/frappe/frappe/core/doctype/user/user.py +315,Username {0} already exists,Korisničko ime {0} već postoji -apps/frappe/frappe/core/doctype/doctype/doctype.py +528,{0}: Cannot set import as {1} is not importable,{0} : Ne može se uvesti kao {1} nije za uvoz +apps/frappe/frappe/core/doctype/doctype/doctype.py +528,{0}: Cannot set import as {1} is not importable,{0} : Ne može se postaviti uvoz kao {1} nije za uvoz DocType: Top Bar Item,"target = ""_blank""",target = "_blank" DocType: Workflow State,hdd,HDD DocType: ToDo,High,Visok @@ -365,7 +365,7 @@ apps/frappe/frappe/desk/query_report.py +19,You don't have access to Report: {0} DocType: User,Send Welcome Email,Pošalji e-mail dobrodošlice apps/frappe/frappe/core/page/user_permissions/user_permissions.js +132,Upload CSV file containing all user permissions in the same format as Download.,Pošalji CSV datoteku koja sadrži sve korisničke dozvole u istom obliku kao preuzimanje. apps/frappe/frappe/public/js/frappe/ui/filters/filters.js +359,Remove Filter,Uklonite filtar -apps/frappe/frappe/config/setup.py +108,Bulk Rename,Bulk Rename +apps/frappe/frappe/config/setup.py +108,Bulk Rename,Skupno preimenuj DocType: DocField,Heading,Naslov DocType: Workflow State,resize-vertical,resize-vertikalna DocType: Contact Us Settings,Introductory information for the Contact Us Page,Uvodni podaci za stranicu Kontaktirajte nas @@ -386,7 +386,7 @@ DocType: DocType,Sort Order,sortiranje apps/frappe/frappe/custom/doctype/customize_form/customize_form.py +137,'In List View' not allowed for type {0} in row {1},'U prikazu popisa' nisu dopušteni za tip {0} u redu {1} DocType: Custom Field,Select the label after which you want to insert new field.,Odaberite oznaku nakon što želite umetnuti novo polje. DocType: Website Settings,Tweet will be shared via your user account (if specified),Tweet će se dijeliti putem vašeg korisničkog računa (ako je određeno) -,Document Share Report,Dokument Podijeli Prijavi +,Document Share Report,Dokument podijele prijava DocType: User,Last Login,Zadnja prijava apps/frappe/frappe/core/doctype/doctype/doctype.py +411,Fieldname is required in row {0},"Podataka, Naziv Polja je potrebno u redu {0}" apps/frappe/frappe/print/page/print_format_builder/print_format_builder_column_selector.html +4,Column,Kolona @@ -408,7 +408,7 @@ apps/frappe/frappe/public/js/frappe/ui/editor.html +12,Number list,Popis brojeva apps/frappe/frappe/config/setup.py +84,Log of error during requests.,Prijava pogreške prilikom zahtjeva. DocType: DocShare,Everyone,Svako DocType: Workflow State,backward,Natrag -apps/frappe/frappe/core/doctype/doctype/doctype.py +475,"{0}: Only one rule allowed with the same Role, Level and {1}","{0}: Samo jedno pravilo dopušten uz istu ulogu, razine i {1}" +apps/frappe/frappe/core/doctype/doctype/doctype.py +475,"{0}: Only one rule allowed with the same Role, Level and {1}","{0}: Samo je jedno pravilo dopušteno za istu ulogu, razinu i {1}" DocType: Workflow State,share,udio apps/frappe/frappe/config/setup.py +102,Set numbering series for transactions.,Postavi brojni slijed za transakcije. apps/frappe/frappe/desk/like.py +38,You cannot like something that you created,Ne možete se sviđa nešto što ste stvorili @@ -610,7 +610,7 @@ DocType: Custom Field,Field Type,Vrsta polja apps/frappe/frappe/utils/data.py +429,only.,samo. apps/frappe/frappe/public/js/frappe/views/reports/reportview.js +455,Descending,Silazni apps/frappe/frappe/email/receive.py +57,Invalid Mail Server. Please rectify and try again.,Nevažeći mail server. Ispravi i pokušaj ponovno. -DocType: Dropbox Backup,Dropbox Backup,Dropbox Backup +DocType: Dropbox Backup,Dropbox Backup,Dropbox backup DocType: DocField,"For Links, enter the DocType as range. For Select, enter list of Options, each on a new line.","Za Linkovi unesite DOCTYPE kao raspona. Za Odaberi unesite popisu opcija, svaki na novoj liniji." DocType: Workflow State,film,film @@ -704,7 +704,7 @@ DocType: DocPerm,If user is the owner,Ako korisnik je vlasnik ,Activity,Aktivnost DocType: Note,"Help: To link to another record in the system, use ""#Form/Note/[Note Name]"" as the Link URL. (don't use ""http://"")","Pomoć: Za povezivanje na drugi zapis u sustavu, koristite "# Forma / Napomena / [Napomena ime]" kao URL veze. (Ne koristite "http://")" DocType: Communication,Delayed,Odgođeno -apps/frappe/frappe/config/setup.py +116,List of backups available for download,Popis kopija dostupna za preuzimanje +apps/frappe/frappe/config/setup.py +116,List of backups available for download,Popis kopija dostupnih za preuzimanje apps/frappe/frappe/templates/pages/login.html +61,Sign up,Prijavite se apps/frappe/frappe/config/setup.py +222,Add fields to forms.,Dodaj polja obrascima. DocType: File,rgt,RGT @@ -832,7 +832,7 @@ DocType: Dropbox Backup,Dropbox Access Secret,Dropbox tajni pristup apps/frappe/frappe/core/doctype/doctype/doctype.py +351,Fold must come before a Section Break,Preklopite moraju doći pred Odjeljak Break apps/frappe/frappe/core/doctype/user/user.py +430,Not allowed to reset the password of {0},Nije dopušteno za resetiranje lozinke od {0} DocType: Workflow State,hand-down,rukom prema dolje -apps/frappe/frappe/core/doctype/doctype/doctype.py +494,{0}: Cannot set Cancel without Submit,{0} : Ne mogu postaviti Odustani bez Podnijeti +apps/frappe/frappe/core/doctype/doctype/doctype.py +494,{0}: Cannot set Cancel without Submit,{0} : Ne može se postaviti Odustani bez Potvrdi DocType: Website Theme,Theme,Tema apps/frappe/frappe/desk/page/setup_wizard/setup_wizard.js +146,There were errors.,Bilo je grešaka . DocType: DocType,Is Submittable,Je Submittable @@ -862,7 +862,7 @@ apps/frappe/frappe/desk/page/setup_wizard/setup_wizard.js +115,Sit tight while y apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +7,Roles can be set for users from their User page.,Uloge se mogu postaviti za korisnike iz svoje korisničke stranice . DocType: DocField,Mandatory,Obavezno apps/frappe/frappe/core/doctype/doctype/doctype.py +458,{0}: No basic permissions set,{0}: Nisu postavljene osnovne ovlasti -apps/frappe/frappe/utils/backups.py +158,Download link for your backup will be emailed on the following email address: {0},Preuzmite link za Vašu backup će biti poslana na e-mail adresu: {0} +apps/frappe/frappe/utils/backups.py +158,Download link for your backup will be emailed on the following email address: {0},Poveznica za Vašu sigurnosnu kopiju će biti poslana na email adresu: {0} apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +14,"Meaning of Submit, Cancel, Amend","Značenje od Podnijeti, Odustati, Izmijeniti" apps/frappe/frappe/desk/doctype/todo/todo_list.js +7,To Do,Podsjetnik apps/frappe/frappe/public/js/frappe/ui/editor.html +25,Paragraph,Paragraf @@ -1069,7 +1069,7 @@ apps/frappe/frappe/public/js/frappe/ui/toolbar/offcanvas_left_sidebar.html +31,R apps/frappe/frappe/email/doctype/email_account/email_account_list.js +14,Default Sending,Zadana Slanje DocType: Workflow State,volume-off,volumen-off apps/frappe/frappe/public/js/frappe/form/footer/timeline_item.html +107,Liked by {0},Svidjelo mi se {0} -,Download Backups,Preuzmite Sigurnosne kopije +,Download Backups,Preuzmi sigurnosne kopije apps/frappe/frappe/core/doctype/file/test_file.py +43,Home/Test Folder 1,Početna / Ispitni mapa 1 apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +47,"Do not update, but insert new records.","Nemoj ažurirati, ali ubacite nove rekorde." apps/frappe/frappe/public/js/frappe/form/footer/assign_to.js +160,Assign to me,Dodijeli mi @@ -1476,7 +1476,7 @@ DocType: Workflow Transition,Action,Akcija apps/frappe/frappe/core/page/data_import_tool/exporter.py +231,Info:,Info: DocType: Custom Field,Permission Level,Razina ovlasti DocType: User,Send Notifications for Transactions I Follow,Pošalji obavijesti o transakcijama | Prati -apps/frappe/frappe/core/doctype/doctype/doctype.py +497,"{0}: Cannot set Submit, Cancel, Amend without Write","{0} : Ne mogu postaviti Podnijeti , Odustani , Izmijeniti bez zapisivanja" +apps/frappe/frappe/core/doctype/doctype/doctype.py +497,"{0}: Cannot set Submit, Cancel, Amend without Write","{0} : Ne može se postaviti Potvrdi, Odustani, Izmijeni bez zapisivanja" apps/frappe/frappe/public/js/frappe/form/footer/attachments.js +83,Are you sure you want to delete the attachment?,Jeste li sigurni da želite izbrisati privitak? apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +8,Setup > User,Postavke > Korisnik apps/frappe/frappe/model/base_document.py +483,"{0}: '{1}' will get truncated, as max characters allowed is {2}","{0}: '{1}' bi bio skraćen, kao max likovi dopušteno je {2}" @@ -1701,7 +1701,7 @@ apps/frappe/frappe/core/doctype/docshare/docshare.py +49,{0} shared this documen apps/frappe/frappe/desk/page/activity/activity_row.html +20,Commented on {0}: {1},Komentirano {0}: {1} apps/frappe/frappe/core/page/user_permissions/user_permissions.js +248,These restrictions will apply for Document Types where 'Apply User Permissions' is checked for the permission rule and a field with this value is present.,"Ova ograničenja primjenjivat će se za vrste dokumenata, gdje 'Primijeni korisnik dozvole' se provjerava za vladavinu dozvole i polje s ovim vrijednosti prisutan." DocType: Email Alert,Send alert if this field's value changes,Pošalji upozorenje ako se vrijednost mijenja ovom području je -apps/frappe/frappe/print/page/print_format_builder/print_format_builder.js +102,Select a DocType to make a new format,Odaberite vrstu dokumenta kako bi novi format +apps/frappe/frappe/print/page/print_format_builder/print_format_builder.js +102,Select a DocType to make a new format,Odaberite Doctype za kreiranje novog formata apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +40,just now,upravo sad DocType: Module Def,Module Def,Definicija modula apps/frappe/frappe/public/js/frappe/form/grid_form.html +7,Done,Pospremljen @@ -1749,7 +1749,7 @@ DocType: Communication,Info,Info DocType: Communication,Email,E-mail apps/frappe/frappe/templates/includes/contact.js +30,Thank you for your message,Hvala vam za vašu poruku apps/frappe/frappe/templates/pages/login.py +54,Invalid Login Token,Pogrešna Prijava token -apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +43,1 hour ago,prije 1 sat +apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +43,1 hour ago,Prije 1 sat DocType: Website Settings,Home Page,Početna stranica DocType: Error Snapshot,Parent Error Snapshot,Roditelj Greška Snimak DocType: Email Alert,Filters,Filteri @@ -1821,7 +1821,7 @@ DocType: User,Enabled,Omogućeno DocType: Blog Category,Category Name,Naziv kategorije DocType: Print Settings,PDF Settings,PDF postavke apps/frappe/frappe/core/page/data_import_tool/data_import_tool.py +16,Column Name,Naziv Stupac -apps/frappe/frappe/print/doctype/print_format/print_format.js +18,Make Default,Make Default +apps/frappe/frappe/print/doctype/print_format/print_format.js +18,Make Default,Napravi zadani apps/frappe/frappe/core/doctype/doctype/doctype.py +339,Fieldtype {0} for {1} cannot be indexed,Fieldtype {0} od {1} ne može biti indeksirana DocType: Communication,Email Account,E-mail računa DocType: Workflow State,Download,Preuzimanje diff --git a/frappe/translations/ko.csv b/frappe/translations/ko.csv index c8b144f039..96a6caa40c 100644 --- a/frappe/translations/ko.csv +++ b/frappe/translations/ko.csv @@ -36,7 +36,7 @@ apps/frappe/frappe/model/base_document.py +478,"{0}, Row {1}",{0} 행 {1} apps/frappe/frappe/model/document.py +730,Beginning with,로 시작 apps/frappe/frappe/core/page/data_import_tool/exporter.py +51,Data Import Template,데이터 가져 오기 템플릿 apps/frappe/frappe/public/js/frappe/model/model.js +31,Parent,부모의 -DocType: About Us Settings,"""Team Members"" or ""Management""","""팀 회원""또는 ""관리""" +DocType: About Us Settings,"""Team Members"" or ""Management""","""Team Members""또는 ""Management""" apps/frappe/frappe/core/doctype/doctype/doctype.py +302,Default for 'Check' type of field must be either '0' or '1',필드의 '확인'유형의 기본 중 하나를 '0'또는 '1'이어야합니다 apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +45,Yesterday,Yester일 apps/frappe/frappe/public/js/frappe/views/test_runner.js +10,Test Runner,테스트 러너 @@ -1168,7 +1168,7 @@ DocType: Web Form,Success Message,성공 메시지 DocType: DocType,User Cannot Search,사용자는 검색 할 수 없습니다 DocType: DocPerm,Apply this rule if the User is the Owner,사용자가 소유자 인 경우이 규칙 적용 apps/frappe/frappe/desk/page/activity/activity.js +73,Build Report,보고서보기 빌드 -apps/frappe/frappe/model/rename_doc.py +91,"{0} {1} does not exist, select a new target to merge","{0} {1}이 (가) 없습니다, 병합하는 새로운 대상을 선택" +apps/frappe/frappe/model/rename_doc.py +91,"{0} {1} does not exist, select a new target to merge","{0} {1}이 (가) 없습니다, 새로운 대상을 선택해서 병합하세요." apps/frappe/frappe/core/page/user_permissions/user_permissions.py +66,Cannot set permission for DocType: {0} and Name: {1},문서 종류에 대한 사용 권한을 설정할 수 없습니다 : {0}과 이름 : {1} apps/frappe/frappe/public/js/frappe/form/footer/assign_to.js +158,Add to To Do,할일 추가 apps/frappe/frappe/public/js/frappe/list/list_sidebar.html +10,Assigned To Me,나에게 할당 @@ -1185,7 +1185,7 @@ apps/frappe/frappe/email/doctype/email_unsubscribe/email_unsubscribe.py +21,{0} apps/frappe/frappe/public/js/frappe/views/communication.js +69,Communication Medium,통신 매체 DocType: Website Settings,Banner HTML,배너 HTML DocType: Error Snapshot,Pyver,Pyver -apps/frappe/frappe/model/base_document.py +451,"{0} {1} cannot be ""{2}"". It should be one of ""{3}""","{0} {1}이 될 수 없습니다 ""{2}"".그것은 ""{3}""중 하나 여야합니다" +apps/frappe/frappe/model/base_document.py +451,"{0} {1} cannot be ""{2}"". It should be one of ""{3}""","{0} {1} ""{2}""가 될 수 없습니다. ""{3}""중 하나입니다." apps/frappe/frappe/utils/data.py +516,{0} or {1},{0} 또는 {1} apps/frappe/frappe/core/doctype/user/user.py +160,Password Update,암호 업데이트 DocType: Workflow State,trash,쓰레기 @@ -1294,7 +1294,7 @@ DocType: Workflow State,ok-sign,확인 서명 apps/frappe/frappe/public/js/frappe/form/toolbar.js +126,Duplicate,복제 apps/frappe/frappe/public/js/frappe/views/reports/grid_report.js +305,From Date must be before To Date,날짜 누계 이전이어야합니다 apps/frappe/frappe/email/doctype/email_alert/email_alert.py +21,Please specify which value field must be checked,값 필드를 선택해야하는 이유를 적어주세요 -apps/frappe/frappe/core/page/data_import_tool/exporter.py +69,"""Parent"" signifies the parent table in which this row must be added","""부모는""이 행을 추가해야하는 부모 테이블을 의미" +apps/frappe/frappe/core/page/data_import_tool/exporter.py +69,"""Parent"" signifies the parent table in which this row must be added","""상위항목"" 테이블에서 열이 추가되어야 합니다." DocType: Website Theme,Apply Style,스타일 적용 apps/frappe/frappe/public/js/frappe/form/form_sidebar.html +39,Shared With,함께 공유 ,Modules Setup,모듈 설치 @@ -1517,7 +1517,7 @@ apps/frappe/frappe/public/js/frappe/list/listview.js +342,2 days ago,1 일 전 apps/frappe/frappe/config/website.py +64,Categorize blog posts.,블로그 게시물을 분류합니다. DocType: Workflow State,Time,시간 DocType: DocField,Attach,첨부 -apps/frappe/frappe/core/doctype/doctype/doctype.py +386,{{{0}}} is not a valid fieldname pattern. It should be {{field_name}}.,{{{0}}} 유효한 필드 이름 패턴이 아니다. 그것은해야한다 {{FIELD_NAME}}. +apps/frappe/frappe/core/doctype/doctype/doctype.py +386,{{{0}}} is not a valid fieldname pattern. It should be {{field_name}}.,{{{0}}} 유효한 필드명 유형이 아닙니다. {{field_name}} 이어야 합니다. DocType: DocType,Permission Rules,권한 규칙 apps/frappe/frappe/public/js/frappe/form/toolbar.js +119,Links,링크 apps/frappe/frappe/model/base_document.py +369,Value missing for,값을 누락 @@ -1724,7 +1724,7 @@ DocType: DocType,Naming,Naming DocType: Event,Every Year,매년 apps/frappe/frappe/public/js/frappe/list/list_item_main_head.html +23,Select All,모두 선택 apps/frappe/frappe/public/js/frappe/form/linked_with.js +86,Not Linked to any record.,모든 레코드에 연결되어 있지. -apps/frappe/frappe/public/js/frappe/form/workflow.js +32, by Role ,역할에 따라 +apps/frappe/frappe/public/js/frappe/form/workflow.js +32, by Role ,역할별 apps/frappe/frappe/core/doctype/user/user.py +406,Registered but disabled.,등록 만 사용할. apps/frappe/frappe/public/js/frappe/list/doclistview.js +538,Delete permanently?,영구적으로 삭제 하시겠습니까? apps/frappe/frappe/public/js/frappe/ui/toolbar/awesome_bar.js +95,Search in a document type,문서 유형의 검색 @@ -1745,7 +1745,7 @@ apps/frappe/frappe/public/js/frappe/views/pageview.js +110,Sorry! You are not pe DocType: Workflow State,bell,벨 apps/frappe/frappe/public/js/frappe/form/set_sharing.html +39,Share this document with,이 문서를 공유하기 apps/frappe/frappe/desk/page/activity/activity.js +203,Jun,6월 -apps/frappe/frappe/utils/nestedset.py +235,{0} {1} cannot be a leaf node as it has children,이 아이를 가지고 {0} {1} 잎 노드가 될 수 없습니다 +apps/frappe/frappe/utils/nestedset.py +235,{0} {1} cannot be a leaf node as it has children,{0} {1} 은 가지 노드가 될 수 없습니다. 하위 항목을 가지고 있습니다. DocType: Communication,Info,정보 DocType: Communication,Email,이메일 apps/frappe/frappe/templates/includes/contact.js +30,Thank you for your message,메시지를 수신했습니다 diff --git a/frappe/translations/nl.csv b/frappe/translations/nl.csv index bafc498dcc..4eb2725750 100644 --- a/frappe/translations/nl.csv +++ b/frappe/translations/nl.csv @@ -44,7 +44,7 @@ DocType: Email Account,Enable Incoming,Inschakelen Binnenkomend DocType: Workflow State,Danger,Gevaar apps/frappe/frappe/templates/pages/login.html +35,Email Address,E-mailadres DocType: Workflow State,th-large,th-large -DocType: Communication,Unread Notification Sent,Ongelezen Notification Sent +DocType: Communication,Unread Notification Sent,Melding 'Ongelezen' verstuurd apps/frappe/frappe/public/js/frappe/misc/tools.js +8,Export not allowed. You need {0} role to export.,Exporteren niet toegestaan. Je hebt rol {0} nodig om te kunnen exporteren . apps/frappe/frappe/public/js/frappe/ui/filters/edit_filter.html +11,Not Like,Niet zoals apps/frappe/frappe/custom/doctype/customize_form/customize_form.js +154,Set the display label for the field,Stel het display label voor het veld @@ -59,8 +59,8 @@ apps/frappe/frappe/public/js/frappe/form/link_selector.js +21,Select {0},Selecte DocType: Print Settings,Classic,Klassiek apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +49,For ranges,Voor bereiken DocType: Workflow State,indent-right,inspringing-rechts -apps/frappe/frappe/public/js/frappe/ui/upload.html +12,Web Link,Web Link -apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +41,1 minute ago,1 uur geleden +apps/frappe/frappe/public/js/frappe/ui/upload.html +12,Web Link,Link +apps/frappe/frappe/public/js/frappe/misc/pretty_date.js +41,1 minute ago,1 minuut geleden apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +33,"Recommended bulk editing records via import, or understanding the import format.","Aanbevolen bulk bewerken verslagen via import, of het begrijpen van de import-formaat." apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +36,"Apart from System Manager, roles with Set User Permissions right can set permissions for other users for that Document Type.","Afgezien van de System Manager, rollen met Set User Permissions recht kunt toestemmingen voor andere gebruikers voor dat type document." DocType: Company History,Company History,Bedrijf Geschiedenis @@ -144,7 +144,7 @@ DocType: Dropbox Backup,Dropbox Access Key,Dropbox Access Key DocType: Workflow State,headphones,hoofdtelefoon DocType: Bulk Email,Bulk Email records.,Bulk Email records. DocType: Email Account,e.g. replies@yourcomany.com. All replies will come to this inbox.,bijv. antwoord@uwbedrijf.nl. Alle antwoorden zullen op deze inbox binnenkomen. -apps/frappe/frappe/templates/includes/login/login.js +33,Valid email and name required,Geldige e-mail en naam vereist +apps/frappe/frappe/templates/includes/login/login.js +33,Valid email and name required,Geldig e-mailadres en naam vereist DocType: DocType,Hide Heading,Verberg rubriek apps/frappe/frappe/config/core.py +17,Groups of DocTypes,Groepen DocTypes DocType: Workflow State,remove-circle,remove-cirkel @@ -158,7 +158,7 @@ DocType: DocType,Show this field as title,Toon dit gebied als titel apps/frappe/frappe/model/db_schema.py +539,Fieldname {0} cannot have special characters like {1},"Veldnaam {0} kan geen speciale tekens, zoals hebben {1}" apps/frappe/frappe/desk/page/setup_wizard/setup_wizard.js +245,Select Your Language,Selecteer uw taal apps/frappe/frappe/model/document.py +434,Error: Document has been modified after you have opened it,Fout: Document is gewijzigd nadat u het hebt geopend -apps/frappe/frappe/core/doctype/doctype/doctype.py +522,{0}: Cannot set Assign Submit if not Submittable,{0} : Kan geen toewijzen indienen indien niet Submittable +apps/frappe/frappe/core/doctype/doctype/doctype.py +522,{0}: Cannot set Assign Submit if not Submittable,"{0} : Kan niet op ""In te dienen"" gezet worden indien niet indienbaar" DocType: Social Login Keys,Facebook,Facebook apps/frappe/frappe/templates/pages/list.py +46,"Filtered by ""{0}""",Gefilterd op "{0}" DocType: DocType,Administrator,Beheerder @@ -226,7 +226,7 @@ DocType: Blogger,Will be used in url (usually first name).,Wordt gebruikt in url apps/frappe/frappe/client.py +63,Can not edit Read Only fields,Kan Alleen-lezen velden niet bewerken apps/frappe/frappe/print/page/print_format_builder/print_format_builder.js +463,Edit Heading,Bewerken Koptekst DocType: File,File URL,File-URL -apps/frappe/frappe/desk/doctype/event/event.py +68,Upcoming Events for Today,Gebeurtenissen voor vandaag +apps/frappe/frappe/desk/doctype/event/event.py +68,Upcoming Events for Today,Geplande evenementen voor vandaag DocType: Email Alert Recipient,Email By Document Field,E-mail Door Document Field apps/frappe/frappe/email/receive.py +61,Cannot connect: {0},Kan geen verbinding maken: {0} apps/frappe/frappe/utils/nestedset.py +218,Merging is only possible between Group-to-Group or Leaf Node-to-Leaf Node,Samenvoegen is alleen mogelijk tussen de Groepen of tussen Blad Nodes. @@ -268,7 +268,7 @@ DocType: DocField,Link,Link apps/frappe/frappe/utils/file_manager.py +93,No file attached,Geen bestand bijgevoegd DocType: Version,Version,Versie DocType: User,Fill Screen,Scherm vullen -apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +462,"Unable to display this tree report, due to missing data. Most likely, it is being filtered out due to permissions.","Niet in staat om deze boom rapport weer te geven, als gevolg van ontbrekende gegevens. Waarschijnlijk wordt ze uitgefilterd vanwege permissies." +apps/frappe/frappe/public/js/frappe/views/reports/query_report.js +462,"Unable to display this tree report, due to missing data. Most likely, it is being filtered out due to permissions.",Niet in staat om dit boomrapport weer te geven omdat er gegevens ontbreken. Waarschijnlijk wordt ze uitgefilterd vanwege permissies. apps/frappe/frappe/core/doctype/role/role.js +9,Edit Permissions,Bewerken Machtigingen apps/frappe/frappe/public/js/frappe/form/grid.js +271,Edit via Upload,Bewerken via uploaden apps/frappe/frappe/public/js/frappe/ui/toolbar/awesome_bar.js +94,"document type..., e.g. customer","documenttype ..., bijvoorbeeld klant" @@ -411,7 +411,7 @@ DocType: Workflow State,backward,achterwaarts apps/frappe/frappe/core/doctype/doctype/doctype.py +475,"{0}: Only one rule allowed with the same Role, Level and {1}","{0}: Slechts één regel toegestaan met dezelfde rol, niveau en {1}" DocType: Workflow State,share,aandeel apps/frappe/frappe/config/setup.py +102,Set numbering series for transactions.,Instellen nummerreeksen voor transacties. -apps/frappe/frappe/desk/like.py +38,You cannot like something that you created,Je kunt niet als iets dat je gemaakt +apps/frappe/frappe/desk/like.py +38,You cannot like something that you created,U kan niets 'liken' dat u zelf gemaakt hebt. DocType: User,Last IP,Laatste IP- DocType: DocPerm,Filter records based on User Permissions defined for a user,Records filteren op basis van Gebruikersmachtigingen gedefinieerd voor een gebruiker apps/frappe/frappe/public/js/frappe/ui/editor.html +46,Insert picture (or just drag & drop),Plaats foto (of sleep & gewoon drop) @@ -426,7 +426,7 @@ apps/frappe/frappe/public/js/frappe/form/form_sidebar.html +24,Attachments,Toebe apps/frappe/frappe/website/doctype/web_form/web_form.py +74,You don't have the permissions to access this document,U hebt niet de rechten om toegang te krijgen tot dit document DocType: Email Alert,Value Changed,Waarde Veranderd apps/frappe/frappe/model/base_document.py +287,Duplicate name {0} {1},Dubbele naam {0} {1} -DocType: Web Form Field,Web Form Field,Web Form Field +DocType: Web Form Field,Web Form Field,Webformulier invulveld apps/frappe/frappe/custom/doctype/customize_form/customize_form.js +197,Hide field in Report Builder,Veld verbergen in Report Builder apps/frappe/frappe/templates/generators/blog_post.html +25,This post is filed under {0},Dit bericht is gearchiveerd onder {0} apps/frappe/frappe/print/page/print_format_builder/print_format_builder_field.html +14,Edit HTML,Bewerken HTML @@ -466,7 +466,7 @@ apps/frappe/frappe/core/doctype/user/user.py +425,Registration Details Emailed., DocType: Workflow State,Stop,stoppen DocType: Top Bar Item,Link to the page you want to open. Leave blank if you want to make it a group parent.,Link naar de pagina die u wilt openen. Laat leeg als u wilt dat een groep ouders te maken. DocType: DocType,Is Single,Is Single -apps/frappe/frappe/email/bulk.py +231,{0} has left the conversation in {1} {2},{0} is het gesprek linker {1} {2} +apps/frappe/frappe/email/bulk.py +231,{0} has left the conversation in {1} {2},{0} heeft gesprek verlaten in {1} {2} DocType: Blogger,User ID of a Blogger,Gebruikers-ID van een Blogger apps/frappe/frappe/core/doctype/user/user.py +201,There should remain at least one System Manager,Er moet ten minste één System Manager blijven DocType: Workflow State,circle-arrow-right,cirkel-pijl-rechts @@ -587,12 +587,12 @@ apps/frappe/frappe/public/js/frappe/list/list_sidebar_stat.html +5,No records ta DocType: User,Send Password Update Notification,Stuur wachtwoord-update apps/frappe/frappe/public/js/legacy/form.js +62,"Allowing DocType, DocType. Be careful!","Het toestaan DocType , DocType . Wees voorzichtig !" apps/frappe/frappe/config/core.py +32,"Customized Formats for Printing, Email","Aangepaste Formaten voor afdrukken, e-mail" -apps/frappe/frappe/public/js/frappe/desk.js +308,Updated To New Version,Bijgewerkt Aan Nieuwe versie +apps/frappe/frappe/public/js/frappe/desk.js +308,Updated To New Version,Geupdate naar nieuwe versie DocType: DocField,Depends On,Hangt af van DocType: DocPerm,Additional Permissions,Additionele Machtigingen apps/frappe/frappe/core/page/data_import_tool/data_import_tool.py +13,Start entering data below this line,Beginnen met het invoeren onder deze lijn DocType: Workflow State,retweet,retweet -apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +40,Update the template and save in CSV (Comma Separate Values) format before attaching.,Actualiseren van de template en opslaan in CSV (Comma Gescheiden Waarden) formaat voor het vastmaken. +apps/frappe/frappe/core/page/data_import_tool/data_import_main.html +40,Update the template and save in CSV (Comma Separate Values) format before attaching.,Werk de template bij en sla op CSV (Comma Gescheiden Waarden) formaat om als bijlage bij te voegen. apps/frappe/frappe/custom/doctype/customize_form/customize_form.js +163,Specify the value of the field,Geef de waarde van het veld DocType: Report,Disabled,Uitgezet apps/frappe/frappe/desk/page/activity/activity.js +203,May,Mei @@ -694,7 +694,7 @@ DocType: Website Settings,Hide Footer Signup,Verberg Footer Inschrijven apps/frappe/frappe/core/doctype/report/report.js +16,Write a Python file in the same folder where this is saved and return column and result.,Schrijf een Python bestand in dezelfde map waarin deze is opgeslagen en geef kolom en resultaat. DocType: DocType,Sort Field,Sorteren Veld apps/frappe/frappe/public/js/frappe/ui/filters/filters.js +355,Edit Filter,Filter bewerken -apps/frappe/frappe/templates/pages/404.html +12,"We are very sorry for this, but the page you are looking for is missing (this could be because of a typo in the address) or moved.","We zijn erg jammer voor dit, maar de pagina die u zoekt ontbreekt (dit kan worden als gevolg van een typefout in het adres) of verplaatst." +apps/frappe/frappe/templates/pages/404.html +12,"We are very sorry for this, but the page you are looking for is missing (this could be because of a typo in the address) or moved.","We zijn erg jammer voor dit, maar de pagina die u zoekt ontbreekt (misschien als gevolg van een typefout in het adres) of verplaatst." apps/frappe/frappe/core/doctype/doctype/doctype.py +265,Field {0} of type {1} cannot be mandatory,Veld {0} van type {1} kan niet verplicht zijn DocType: System Settings,"eg. If Apply User Permissions is checked for Report DocType but no User Permissions are defined for Report for a User, then all Reports are shown to that User","bijv. Als Breng Gebruikersmachtigingen wordt gecontroleerd rapport DocType maar geen gebruiker machtigingen worden gedefinieerd voor Rapport voor een gebruiker, dan worden alle rapporten worden aangetoond dat de Gebruiker" DocType: System Settings,Session Expiry Mobile,Session Vervaldatum Mobile @@ -753,13 +753,13 @@ DocType: Async Task,Async Task,Async Task DocType: Workflow State,picture,afbeelding apps/frappe/frappe/templates/pages/complete_signup.html +22,Complete,Compleet DocType: Print Format,Custom HTML Help,Aangepaste HTML Help -apps/frappe/frappe/core/page/user_permissions/user_permissions.js +306,Add A New Restriction,Voeg een nieuwe beperking +apps/frappe/frappe/core/page/user_permissions/user_permissions.js +306,Add A New Restriction,Voeg een nieuwe beperking toe DocType: Workflow Transition,Next State,Volgend Stadium apps/frappe/frappe/public/js/frappe/ui/editor.html +56,Align Left (Ctrl/Cmd+L),Links uitlijnen (Ctrl / Cmd + L) DocType: User,Block Modules,Block Modules apps/frappe/frappe/model/db_schema.py +137,Reverting length to {0} for '{1}' in '{2}'; Setting the length as {3} will cause truncation of data.,Terugdraaien lengte {0} voor '{1}' in '{2}'; Het instellen van de lengte als {3} zal afkappen van gegevens veroorzaken. DocType: Print Format,Custom CSS,Custom CSS -apps/frappe/frappe/public/js/frappe/form/footer/timeline.html +4,Add a comment,Voeg een reactie +apps/frappe/frappe/public/js/frappe/form/footer/timeline.html +4,Add a comment,Voeg een reactie toe apps/frappe/frappe/model/rename_doc.py +350,Ignored: {0} to {1},Genegeerd: {0} tot {1} apps/frappe/frappe/config/setup.py +79,Log of error on automated events (scheduler).,Log van fout op geautomatiseerde evenementen ( scheduler ) . apps/frappe/frappe/utils/csvutils.py +74,Not a valid Comma Separated Value (CSV File),Geen geldige waarde ( CSV-file ) @@ -767,7 +767,7 @@ DocType: Email Account,Default Incoming,Standaard Inkomende DocType: Workflow State,repeat,herhalen DocType: Website Settings,Banner,Banner apps/frappe/frappe/public/js/frappe/ui/toolbar/awesome_bar.js +88,Help on Search,Hulp bij zoeken -DocType: User,Uncheck modules to hide from user's desktop,Haal het vinkje weg modules te verbergen van desktop gebruiker +DocType: User,Uncheck modules to hide from user's desktop,Vink modules af om ze te verbergen van het bureaublad DocType: DocType,Hide Copy,Verberg Copy apps/frappe/frappe/core/doctype/user/user.js +162,Clear all roles,Wis alle rollen apps/frappe/frappe/model/base_document.py +332,{0} must be unique,{0} moet uniek zijn @@ -816,7 +816,7 @@ apps/frappe/frappe/core/doctype/doctype/doctype.py +261,Fieldname {0} appears mu DocType: Bulk Email,Expired,Verlopen DocType: DocType,System,Systeem apps/frappe/frappe/templates/pages/login.html +63,Have an account? Login,Een account hebben? Aanmelden -apps/frappe/frappe/public/js/legacy/print_format.js +144,Unknown Print Format: {0},Onbekend Print Format: {0} +apps/frappe/frappe/public/js/legacy/print_format.js +144,Unknown Print Format: {0},Onbekend afdrukformaat: {0} DocType: Workflow State,arrow-down,arrow-down apps/frappe/frappe/public/js/frappe/ui/tree.js +122,Collapse,ineenstorting apps/frappe/frappe/model/delete_doc.py +133,User not allowed to delete {0}: {1},Gebruiker niet toegestaan om {0} te verwijderen: {1} @@ -995,7 +995,7 @@ DocType: Print Settings,With Letterhead,Met briefhoofd apps/frappe/frappe/email/smtp.py +177,Invalid Outgoing Mail Server or Port,Ongeldige uitgaande Server of Poort DocType: DocPerm,Write,Schrijven apps/frappe/frappe/core/doctype/report/report.py +29,Only Administrator allowed to create Query / Script Reports,Alleen Beheerder toegestaan om Query / Script Rapporten maken -apps/frappe/frappe/public/js/frappe/form/save.js +13,Updating,Updaten +apps/frappe/frappe/public/js/frappe/form/save.js +13,Updating,Bijwerken DocType: File,Preview,Voorbeeld DocType: Customize Form,Use this fieldname to generate title,Gebruik deze veldnaam om de titel te genereren apps/frappe/frappe/public/js/frappe/views/communication.js +80,Select Attachments,Selecteer Bijlagen @@ -1023,13 +1023,13 @@ DocType: Workflow Document State,Update Field,Veld bijwerken apps/frappe/frappe/desk/page/applications/applications.js +50,Regional Extensions,Regionale Extensions apps/frappe/frappe/email/doctype/email_account/email_account.py +348,Leave this conversation,Laat dit gesprek apps/frappe/frappe/model/base_document.py +406,Options not set for link field {0},Opties niet ingesteld voor link veld {0} -apps/frappe/frappe/custom/doctype/customize_form/customize_form.py +151,You cannot unset 'Read Only' for field {0},Je kan niet uitgeschakeld 'Read Only' voor in het veld {0} +apps/frappe/frappe/custom/doctype/customize_form/customize_form.py +151,You cannot unset 'Read Only' for field {0},Je kan 'Alleen lezen' niet uitschakelen voor het veld {0} apps/frappe/frappe/desk/page/setup_wizard/setup_wizard_page.html +18,Complete Setup,Voltooien Setup DocType: Workflow State,asterisk,sterretje apps/frappe/frappe/core/page/data_import_tool/exporter.py +61,Please do not change the template headings.,Gelieve niet de sjabloon rubrieken veranderen. DocType: Communication,Linked,Linked apps/frappe/frappe/public/js/frappe/form/save.js +84,Enter the name of the new {0},Geef de naam van de nieuwe {0} -apps/frappe/frappe/config/desk.py +39,Activity log of all users.,Activiteit logboek van alle gebruikers. +apps/frappe/frappe/config/desk.py +39,Activity log of all users.,Activiteitenlogboek van alle gebruikers. DocType: Workflow State,shopping-cart,shopping-cart DocType: Social Login Keys,Google,Google DocType: Workflow State,Inverse,Omgekeerde @@ -1171,7 +1171,7 @@ apps/frappe/frappe/desk/page/activity/activity.js +73,Build Report,Maak Rapport apps/frappe/frappe/model/rename_doc.py +91,"{0} {1} does not exist, select a new target to merge","{0} {1} bestaat niet, kies een nieuw doel om samen te voegen" apps/frappe/frappe/core/page/user_permissions/user_permissions.py +66,Cannot set permission for DocType: {0} and Name: {1},Kan geen toestemming voor DocType : {0} en Naam : {1} apps/frappe/frappe/public/js/frappe/form/footer/assign_to.js +158,Add to To Do,Toevoegen aan To Do -apps/frappe/frappe/public/js/frappe/list/list_sidebar.html +10,Assigned To Me,Assigned To Me +apps/frappe/frappe/public/js/frappe/list/list_sidebar.html +10,Assigned To Me,Aan mij toegewezen apps/frappe/frappe/public/js/frappe/ui/messages.js +178,Verify Password,Bevestig wachtwoord apps/frappe/frappe/core/page/modules_setup/modules_setup.js +55,There were errors,Er zijn fouten opgetreden. apps/frappe/frappe/core/doctype/communication/communication.js +19,Close,Sluiten @@ -1368,7 +1368,7 @@ DocType: Email Account,Signature,Handtekening apps/frappe/frappe/public/js/frappe/form/share.js +112,Share With,Delen met apps/frappe/frappe/core/doctype/user/user.js +130,Loading,Laden apps/frappe/frappe/config/setup.py +199,"Enter keys to enable login via Facebook, Google, GitHub.","Voer sleutels in om toegang in te schakelen via Facebook, Google, GitHub." -apps/frappe/frappe/public/js/frappe/ui/tags.js +21,Add a tag,Voeg een tag +apps/frappe/frappe/public/js/frappe/ui/tags.js +21,Add a tag,Voeg een tag toe apps/frappe/frappe/public/js/frappe/form/control.js +1000,Please attach a file first.,Eerst een bestand toevoegen. apps/frappe/frappe/model/naming.py +156,"There were some errors setting the name, please contact the administrator","Er zijn fouten opgetreden bij het instellen van de naam, neemt u aub contact op met de beheerder" DocType: Website Slideshow Item,Website Slideshow Item,Website Diashow Item @@ -1421,7 +1421,7 @@ DocType: Workflow,"Different ""States"" this document can exist in. Like ""Open" apps/frappe/frappe/utils/verified_command.py +40,This link is invalid or expired. Please make sure you have pasted correctly.,Deze koppeling is ongeldig of verlopen. Zorg ervoor dat u correct hebt geplakt. DocType: Web Page,Slideshow,Diashow DocType: Workflow State,Search,Zoek -DocType: Web Form,Web Form Fields,Web Form Fields +DocType: Web Form,Web Form Fields,Webformulier invulvelden DocType: Website Theme,Top Bar Text Color,Top Bar Tekst Kleur apps/frappe/frappe/core/doctype/file/file.py +327,File '{0}' not found,Bestand '{0}' niet gevonden apps/frappe/frappe/print/page/print_format_builder/print_format_builder.js +370,Remove Section,Verwijder Sectie @@ -1480,7 +1480,7 @@ DocType: User,Send Notifications for Transactions I Follow,Stuur Meldingen voor apps/frappe/frappe/core/doctype/doctype/doctype.py +497,"{0}: Cannot set Submit, Cancel, Amend without Write","{0} : Kan niet Indienen, Annuleren, Wijzigen zonder te Schrijven" apps/frappe/frappe/public/js/frappe/form/footer/attachments.js +83,Are you sure you want to delete the attachment?,Weet u zeker dat u de bijlage wilt verwijderen? apps/frappe/frappe/core/page/permission_manager/permission_manager_help.html +8,Setup > User,Instellingen > Gebruiker -apps/frappe/frappe/model/base_document.py +483,"{0}: '{1}' will get truncated, as max characters allowed is {2}","{0}: {1} 'zal afgekapt krijgen, als maximum toegestane tekens is {2}" +apps/frappe/frappe/model/base_document.py +483,"{0}: '{1}' will get truncated, as max characters allowed is {2}","{0}: {1} 'zal afgekort worden, het maximum toegestaan aantal tekens is {2}" apps/frappe/frappe/templates/emails/password_reset.html +6,Thank you,Dankjewel apps/frappe/frappe/public/js/frappe/form/save.js +11,Saving,Opslaan DocType: Print Settings,Print Style Preview,Print Stijl Voorbeeld @@ -1540,7 +1540,7 @@ DocType: DocType,Child Tables are shown as a Grid in other DocTypes.,Onderliggen DocType: Website Settings,"If checked, the Home page will be the default Item Group for the website.","Indien aangevinkt, zal de Home pagina zijn de standaard Item Groep voor de website." DocType: Blog Post,"Description for listing page, in plain text, only a couple of lines. (max 140 characters)","Beschrijving van lijst pagina, in platte tekst, slechts een paar regels. (Max 140 tekens)" apps/frappe/frappe/public/js/frappe/ui/toolbar/offcanvas_left_sidebar.html +29,Forums,Forums -apps/frappe/frappe/core/page/user_permissions/user_permissions.js +302,Add A User Restriction,Een gebruiker toevoegen Restriction +apps/frappe/frappe/core/page/user_permissions/user_permissions.js +302,Add A User Restriction,Een gebruikersrestrictie toevoegen DocType: DocType,Name Case,Naam Case apps/frappe/frappe/public/js/frappe/form/share.js +26,Shared with everyone,Gedeeld met iedereen apps/frappe/frappe/model/base_document.py +365,Data missing in table,Data ontbreekt in tabel @@ -1574,9 +1574,9 @@ DocType: DocField,Allow on Submit,Laat op Submit apps/frappe/frappe/core/page/desktop/desktop.js +60,All Applications,Alle Toepassingen DocType: Error Snapshot,Exception Type,Uitzondering Type apps/frappe/frappe/public/js/frappe/views/reports/reportview.js +425,Pick Columns,Kies Kolommen -DocType: Web Page,Add code as <script>,Voeg code toe als